Commit 1cd581f
parser: capture sessionKind and promptSource from Claude Code transcripts (#1253)
## What
Capture two Claude Code launch/prompt-provenance fields that the indexer
currently reads past and discards:
- **`sessionKind`** — session-level (e.g. `"bg"`). Present on
background/headless sessions, absent on interactive ones. Lands in a new
`session_kind` column on `sessions`.
- **`promptSource`** — per user turn (e.g. `"typed"`, `"queued"`,
`"system"`, `"sdk"`). Marks whether a turn was a human-typed prompt or a
queued/system/SDK-injected one. Lands in a new `prompt_source` column on
`messages`.
## Why
Both signals exist on essentially every current Claude Code transcript
but are thrown away at parse time, so the archive can't answer two
questions it otherwise has the data for: was a session interactive or
headless, and was a given prompt typed by a human or injected. This
mirrors the recently-added `entrypoint` capture — same shape of
information, same reason to keep it.
## How
The change follows the existing `entrypoint` / `agent_label` and
`source_type` / `is_sidechain` handling rather than inventing a new
pattern:
- `sessionKind` is treated as a session-identity field alongside
`entrypoint`: first-non-empty-wins across the file, wired into the
incremental identity-escalation check, and blanked by the Cowork and
Qoder parsers that reuse the Claude parse body (exactly as they blank
`entrypoint`).
- `promptSource` is treated as a per-message source column alongside
`source_type`/`is_sidechain`, including the retained-field whitelist in
`compactClaudeEntry` and the message token fingerprints the PG/DuckDB
push fast-paths compare against.
Both columns are `NOT NULL DEFAULT ''`, so transcripts that predate the
fields and other agents that never emit them read empty and are
otherwise untouched. A `dataVersion` bump (79) triggers the standard
reparse so existing Claude rows backfill both fields. Capture is
mirrored across the SQLite, Postgres, and DuckDB stores (mirror
`SchemaVersion` 9) and the artifact wire format, where the manifest
advances to v3 and message segments to v2: older artifacts still decode
with the fields empty, while pre-provenance peers park new artifacts
behind the existing future-version gate instead of silently dropping the
fields. The fields also round-trip through artifact import, re-enqueue a
published session's export when only `session_kind` changes, and count
toward the export preflight's message-byte bound.
## Scope / limitations
- Pure field capture — no counting, aggregation, health-signal, or
automation-classification logic is touched.
- `session_kind`/`prompt_source` backfill via the dataVersion-79
reparse; rows whose source files no longer exist stay empty.
- No new API/CLI surface or UI is added; the columns are available for
consumers that read the archive directly.
## Where to look
- `internal/parser/claude.go` — the capture site (`sessionKind` next to
`entrypoint`; `promptSource` next to `isSidechain`) and the
`compactClaudeEntry` retained-field whitelist.
- `internal/parser/claude_provider.go`, `provider.go`,
`internal/sync/engine.go` — incremental identity threading for
`sessionKind`.
- `internal/db/{schema.sql,db.go,sessions.go,messages.go}` — SQLite
columns, migrations, and read/write plumbing.
- `internal/postgres/*` and `internal/duckdb/*` — the mirrored columns
and fingerprints.
The source of truth for both fields is the Claude Code transcript
format, where `sessionKind` and `promptSource` appear as top-level keys
on session JSONL entries.
---------
Co-authored-by: Matthew Jacobs <mjacobs@apache.org>1 parent 5bc9617 commit 1cd581f
56 files changed
Lines changed: 635 additions & 146 deletions
File tree
- docs/internal
- frontend/src/lib/api/generated/models
- internal
- artifact
- db
- duckdb
- parser
- postgres
- server
- sync
Some content is hidden
Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
103 | 103 | | |
104 | 104 | | |
105 | 105 | | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
106 | 113 | | |
107 | 114 | | |
108 | 115 | | |
| |||
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
Lines changed: 1 addition & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
97 | 97 | | |
98 | 98 | | |
99 | 99 | | |
100 | | - | |
| 100 | + | |
101 | 101 | | |
102 | 102 | | |
103 | | - | |
| 103 | + | |
104 | 104 | | |
105 | 105 | | |
106 | 106 | | |
| |||
122 | 122 | | |
123 | 123 | | |
124 | 124 | | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
| 152 | + | |
| 153 | + | |
| 154 | + | |
| 155 | + | |
125 | 156 | | |
126 | 157 | | |
127 | 158 | | |
| |||
177 | 208 | | |
178 | 209 | | |
179 | 210 | | |
180 | | - | |
| 211 | + | |
181 | 212 | | |
182 | 213 | | |
183 | 214 | | |
184 | 215 | | |
185 | 216 | | |
186 | | - | |
| 217 | + | |
| 218 | + | |
| 219 | + | |
| 220 | + | |
| 221 | + | |
| 222 | + | |
| 223 | + | |
| 224 | + | |
| 225 | + | |
| 226 | + | |
| 227 | + | |
| 228 | + | |
| 229 | + | |
| 230 | + | |
| 231 | + | |
| 232 | + | |
| 233 | + | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
187 | 244 | | |
188 | 245 | | |
189 | 246 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
72 | 72 | | |
73 | 73 | | |
74 | 74 | | |
75 | | - | |
| 75 | + | |
76 | 76 | | |
77 | 77 | | |
78 | 78 | | |
79 | 79 | | |
80 | 80 | | |
81 | 81 | | |
82 | | - | |
| 82 | + | |
83 | 83 | | |
84 | 84 | | |
85 | 85 | | |
86 | 86 | | |
87 | | - | |
| 87 | + | |
88 | 88 | | |
89 | 89 | | |
90 | 90 | | |
91 | 91 | | |
92 | 92 | | |
93 | 93 | | |
94 | | - | |
| 94 | + | |
95 | 95 | | |
96 | 96 | | |
97 | 97 | | |
98 | 98 | | |
99 | 99 | | |
100 | 100 | | |
101 | 101 | | |
102 | | - | |
| 102 | + | |
103 | 103 | | |
104 | 104 | | |
105 | 105 | | |
| |||
110 | 110 | | |
111 | 111 | | |
112 | 112 | | |
113 | | - | |
| 113 | + | |
114 | 114 | | |
115 | 115 | | |
116 | 116 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
159 | 159 | | |
160 | 160 | | |
161 | 161 | | |
162 | | - | |
| 162 | + | |
163 | 163 | | |
164 | 164 | | |
165 | 165 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
143 | 143 | | |
144 | 144 | | |
145 | 145 | | |
146 | | - | |
| 146 | + | |
147 | 147 | | |
148 | 148 | | |
149 | 149 | | |
| |||
165 | 165 | | |
166 | 166 | | |
167 | 167 | | |
168 | | - | |
| 168 | + | |
169 | 169 | | |
170 | 170 | | |
171 | 171 | | |
| |||
191 | 191 | | |
192 | 192 | | |
193 | 193 | | |
194 | | - | |
| 194 | + | |
195 | 195 | | |
196 | 196 | | |
197 | 197 | | |
| |||
202 | 202 | | |
203 | 203 | | |
204 | 204 | | |
205 | | - | |
| 205 | + | |
206 | 206 | | |
207 | 207 | | |
208 | 208 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
217 | 217 | | |
218 | 218 | | |
219 | 219 | | |
220 | | - | |
| 220 | + | |
221 | 221 | | |
222 | 222 | | |
223 | | - | |
| 223 | + | |
| 224 | + | |
224 | 225 | | |
225 | 226 | | |
226 | | - | |
| 227 | + | |
227 | 228 | | |
228 | 229 | | |
229 | 230 | | |
230 | 231 | | |
231 | 232 | | |
232 | 233 | | |
233 | 234 | | |
234 | | - | |
| 235 | + | |
235 | 236 | | |
236 | 237 | | |
237 | 238 | | |
| |||
240 | 241 | | |
241 | 242 | | |
242 | 243 | | |
243 | | - | |
| 244 | + | |
| 245 | + | |
244 | 246 | | |
245 | 247 | | |
246 | 248 | | |
247 | | - | |
| 249 | + | |
248 | 250 | | |
249 | 251 | | |
250 | 252 | | |
| |||
343 | 345 | | |
344 | 346 | | |
345 | 347 | | |
346 | | - | |
| 348 | + | |
347 | 349 | | |
348 | 350 | | |
349 | 351 | | |
| |||
405 | 407 | | |
406 | 408 | | |
407 | 409 | | |
408 | | - | |
| 410 | + | |
409 | 411 | | |
410 | 412 | | |
411 | 413 | | |
412 | 414 | | |
413 | 415 | | |
414 | 416 | | |
415 | 417 | | |
416 | | - | |
| 418 | + | |
417 | 419 | | |
418 | 420 | | |
419 | 421 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
16 | 16 | | |
17 | 17 | | |
18 | 18 | | |
| 19 | + | |
19 | 20 | | |
20 | 21 | | |
21 | 22 | | |
| |||
95 | 96 | | |
96 | 97 | | |
97 | 98 | | |
| 99 | + | |
98 | 100 | | |
99 | 101 | | |
100 | 102 | | |
| |||
155 | 157 | | |
156 | 158 | | |
157 | 159 | | |
| 160 | + | |
158 | 161 | | |
159 | 162 | | |
160 | 163 | | |
| |||
0 commit comments