@vibe-commit/capture 0.6.1 → 0.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (143) hide show
  1. package/README.md +80 -5
  2. package/dist/agent_hooks.d.ts +8 -0
  3. package/dist/agent_hooks.js +31 -1
  4. package/dist/agent_hooks.js.map +1 -1
  5. package/dist/agents/claude_code.d.ts +34 -0
  6. package/dist/agents/claude_code.js +141 -8
  7. package/dist/agents/claude_code.js.map +1 -1
  8. package/dist/agents/codex_cli.d.ts +13 -0
  9. package/dist/agents/codex_cli.js +241 -2
  10. package/dist/agents/codex_cli.js.map +1 -1
  11. package/dist/agents/cursor.d.ts +34 -0
  12. package/dist/agents/cursor.js +115 -1
  13. package/dist/agents/cursor.js.map +1 -1
  14. package/dist/agents/session_listing.d.ts +29 -0
  15. package/dist/agents/session_listing.js +49 -0
  16. package/dist/agents/session_listing.js.map +1 -0
  17. package/dist/agents/types.d.ts +118 -8
  18. package/dist/agents/types.js +17 -3
  19. package/dist/agents/types.js.map +1 -1
  20. package/dist/commands/approval_pending.d.ts +9 -0
  21. package/dist/commands/approval_pending.js +23 -0
  22. package/dist/commands/approval_pending.js.map +1 -0
  23. package/dist/commands/auth.js +31 -11
  24. package/dist/commands/auth.js.map +1 -1
  25. package/dist/commands/backfill.d.ts +160 -0
  26. package/dist/commands/backfill.js +748 -0
  27. package/dist/commands/backfill.js.map +1 -0
  28. package/dist/commands/browser_credential.d.ts +2 -0
  29. package/dist/commands/browser_credential.js +31 -14
  30. package/dist/commands/browser_credential.js.map +1 -1
  31. package/dist/commands/connect.d.ts +137 -0
  32. package/dist/commands/connect.js +203 -109
  33. package/dist/commands/connect.js.map +1 -1
  34. package/dist/commands/connect_picker.d.ts +27 -0
  35. package/dist/commands/connect_picker.js +415 -0
  36. package/dist/commands/connect_picker.js.map +1 -0
  37. package/dist/commands/context.d.ts +16 -0
  38. package/dist/commands/context.js +27 -0
  39. package/dist/commands/context.js.map +1 -1
  40. package/dist/commands/credential_problem.d.ts +15 -4
  41. package/dist/commands/credential_problem.js +29 -22
  42. package/dist/commands/credential_problem.js.map +1 -1
  43. package/dist/commands/device_credential.d.ts +2 -0
  44. package/dist/commands/device_credential.js +16 -14
  45. package/dist/commands/device_credential.js.map +1 -1
  46. package/dist/commands/finalize.d.ts +95 -0
  47. package/dist/commands/finalize.js +249 -74
  48. package/dist/commands/finalize.js.map +1 -1
  49. package/dist/commands/finish_mint.d.ts +2 -6
  50. package/dist/commands/finish_mint.js +10 -2
  51. package/dist/commands/finish_mint.js.map +1 -1
  52. package/dist/commands/report.js +38 -30
  53. package/dist/commands/report.js.map +1 -1
  54. package/dist/commands/scan.d.ts +162 -0
  55. package/dist/commands/scan.js +507 -0
  56. package/dist/commands/scan.js.map +1 -0
  57. package/dist/commands/status.js +119 -22
  58. package/dist/commands/status.js.map +1 -1
  59. package/dist/commands/status_hooks.d.ts +14 -0
  60. package/dist/commands/status_hooks.js +81 -0
  61. package/dist/commands/status_hooks.js.map +1 -0
  62. package/dist/commands/status_machine.d.ts +18 -0
  63. package/dist/commands/status_machine.js +149 -0
  64. package/dist/commands/status_machine.js.map +1 -0
  65. package/dist/commands/why.js +44 -31
  66. package/dist/commands/why.js.map +1 -1
  67. package/dist/consent.d.ts +111 -0
  68. package/dist/consent.js +203 -1
  69. package/dist/consent.js.map +1 -1
  70. package/dist/copy/error_codes.d.ts +222 -0
  71. package/dist/copy/error_codes.js +105 -0
  72. package/dist/copy/error_codes.js.map +1 -0
  73. package/dist/copy/index.d.ts +2 -2
  74. package/dist/copy/index.js +2 -2
  75. package/dist/copy/index.js.map +1 -1
  76. package/dist/copy/strings.d.ts +497 -29
  77. package/dist/copy/strings.js +601 -35
  78. package/dist/copy/strings.js.map +1 -1
  79. package/dist/copy/time.d.ts +11 -0
  80. package/dist/copy/time.js +18 -0
  81. package/dist/copy/time.js.map +1 -1
  82. package/dist/credential.d.ts +5 -1
  83. package/dist/credential.js +2 -2
  84. package/dist/credential.js.map +1 -1
  85. package/dist/git.d.ts +43 -0
  86. package/dist/git.js +95 -0
  87. package/dist/git.js.map +1 -1
  88. package/dist/hooks/entry.d.ts +18 -1
  89. package/dist/hooks/entry.js +110 -13
  90. package/dist/hooks/entry.js.map +1 -1
  91. package/dist/hooks/post_commit.js +3 -3
  92. package/dist/hooks/post_commit.js.map +1 -1
  93. package/dist/hooks/post_rewrite.js +6 -4
  94. package/dist/hooks/post_rewrite.js.map +1 -1
  95. package/dist/hooks/session_start.d.ts +93 -0
  96. package/dist/hooks/session_start.js +199 -0
  97. package/dist/hooks/session_start.js.map +1 -0
  98. package/dist/index.d.ts +1 -1
  99. package/dist/index.js +56 -8
  100. package/dist/index.js.map +1 -1
  101. package/dist/install.d.ts +57 -0
  102. package/dist/install.js +54 -20
  103. package/dist/install.js.map +1 -1
  104. package/dist/json.d.ts +32 -9
  105. package/dist/json.js +35 -8
  106. package/dist/json.js.map +1 -1
  107. package/dist/machine_state.d.ts +52 -0
  108. package/dist/machine_state.js +63 -0
  109. package/dist/machine_state.js.map +1 -0
  110. package/dist/oauth/session.d.ts +1 -0
  111. package/dist/org_pending.d.ts +52 -0
  112. package/dist/org_pending.js +109 -0
  113. package/dist/org_pending.js.map +1 -0
  114. package/dist/paths.d.ts +50 -0
  115. package/dist/paths.js +64 -0
  116. package/dist/paths.js.map +1 -1
  117. package/dist/picker.d.ts +180 -0
  118. package/dist/picker.js +477 -0
  119. package/dist/picker.js.map +1 -0
  120. package/dist/picker_checklist.d.ts +125 -0
  121. package/dist/picker_checklist.js +375 -0
  122. package/dist/picker_checklist.js.map +1 -0
  123. package/dist/policy.d.ts +54 -0
  124. package/dist/policy.js +47 -0
  125. package/dist/policy.js.map +1 -1
  126. package/dist/post.d.ts +50 -16
  127. package/dist/post.js +220 -16
  128. package/dist/post.js.map +1 -1
  129. package/dist/state.d.ts +6 -0
  130. package/dist/state.js +38 -1
  131. package/dist/state.js.map +1 -1
  132. package/dist/system_message.d.ts +8 -1
  133. package/dist/system_message.js +19 -1
  134. package/dist/system_message.js.map +1 -1
  135. package/dist/term.d.ts +28 -2
  136. package/dist/term.js +23 -2
  137. package/dist/term.js.map +1 -1
  138. package/dist/verb_help.d.ts +13 -0
  139. package/dist/verb_help.js +40 -0
  140. package/dist/verb_help.js.map +1 -0
  141. package/dist/version.d.ts +1 -1
  142. package/dist/version.js +1 -1
  143. package/package.json +5 -9
package/README.md CHANGED
@@ -25,9 +25,11 @@ the approved direction points at `Vibe-Commit/claude-plugin`, which vendors the
25
25
 
26
26
  | Command | What it does |
27
27
  |---|---|
28
- | `vibecommit connect` | Connect this repo and capture the current session. On a machine with no credential it signs you in through the browser first. |
29
- | `vibecommit auth` | Replace this machine's credential: sign in through the browser, or `--paste` one you made in Settings. Run it again whenever `status` or a hook says the credential is no longer accepted. Inside a git repo it then goes on to `connect` that repo; outside one it only saves the credential. |
30
- | `vibecommit status` | Show whether capture is on for this repo and when it last succeeded. |
28
+ | `vibecommit connect` | Choose the repositories to capture, from any folder, and connect them: whole owners, including repos you clone later, or single repos. It shows what is uploaded and asks before it signs in, adds commit hooks to each clone, and offers to upload sessions still on this machine. A repo with no remote keeps the one-repo flow. `--typed` uses the typed prompt instead of the arrow-key list. On a machine with no credential it signs you in through the browser first. |
29
+ | `vibecommit auth` | Replace this machine's credential: sign in through the browser, or `--paste` one you made in Settings. Run it again whenever `status` or a hook says the credential is no longer accepted. On a terminal it then goes on to `connect`: inside a git repo, or outside one on a machine that captures nothing yet; with `--stdin` or no terminal it only saves the credential. |
30
+ | `vibecommit scan [--json]` | List the repositories you have used a coding agent in on this machine, from the agents' folder names and Codex's thread index. It opens no session file, uploads nothing and changes no setting. Exit `4` when none is found; `--json` prints one document, including what it could not list and why. |
31
+ | `vibecommit backfill` | Upload the earlier coding-agent sessions still on this machine, for the repositories you chose. It lists them first and asks (default no); a Claude Code session is sent only after reading one value from its transcript, the folder it started in, to check it belongs to that repository. Sessions arrive without commit links. Not offered: Cursor sessions (Cursor does not record that folder), sessions over 50 MiB, and sessions in a clone with no reflog. It asks again about each repository as it goes, so `vibecommit off` stops the rest of that repository. **Exit codes:** `0` done, declined at the question, or interrupted with Ctrl+C (sessions held for an organization's approval are done too), `1` stopped with the resume fix (the server asked to wait, could not be reached, or refused this machine's credential) or could not run, `2` no terminal, or an argument was given, `3` not connected, `4` nothing to upload. **Resuming:** a stopped or interrupted run loses nothing already sent; run it again and it offers only the sessions not yet uploaded. |
32
+ | `vibecommit status` | Show whether capture is on for this repo, or for this machine from outside a repo, and when it last succeeded. Inside a repo it also says why it is on (`basis`). |
31
33
  | `vibecommit off` | Stop capturing for this repo. |
32
34
  | `vibecommit why <file>:<line>` | Show the conversation turns recorded against the commit that last changed this line. |
33
35
  | `vibecommit report --since <when>` | Summarise capture coverage over a time window. |
@@ -68,7 +70,10 @@ vibecommit finalize --session <session_id> # or --latest when only one sessio
68
70
  Exit `0` — the server confirmed the last turn is recorded. Exit `5` — the data was delivered
69
71
  but the server did not confirm it (a server older than this command): treat as **not** closed.
70
72
  Exit `2` — nothing was sent (bad arguments, an unknown or still-running session, or several
71
- recent sessions for `--latest`). Exit `3` — this repo is not connected. It is safe to run twice.
73
+ recent sessions for `--latest`). Exit `3` — this repo is not connected, this machine has no credential, or its
74
+ credential can't be used (it is not an ingest credential, its file is readable by other accounts, or it can't be read).
75
+ Exit `1` — it was not confirmed closed for any other reason: the folder is not a git repository, the transcript cannot
76
+ be found or read, the credential is no longer accepted, or the delivery failed. It is safe to run twice.
72
77
  Resuming the session afterwards opens a new turn; nothing already recorded is changed.
73
78
 
74
79
  `finalize` refuses a session whose transcript changed in the last few seconds. `--force` skips that check,
@@ -163,7 +168,7 @@ ask `connect`'s consent question; outside a repository, with `--stdin`, or with
163
168
  credential, exactly as before, and a refused replacement (`declined`) still exits 1 without connecting. The chained
164
169
  `connect` never opens a second sign-in. `vibecommit connect` in a repository where Claude Code has not run yet now
165
170
  installs the git and agent hooks and exits 0 (it used to exit 1 and install neither); its "no Claude Code session"
166
- warning is on stdout, and a `vibecommit` command on PATH that is not this one still exits 1. An organisation that
171
+ warning is on stdout, and a `vibecommit` command on PATH that is not this one still exits 1. An organization that
167
172
  has not approved capture yet now gets its hooks installed too: the "capture is armed" screen was previously
168
173
  printed without them. The ending reports hook setup first, then prints "Connected." and, when the server's reply
169
174
  names the recorded session, a link to that session's page (`/app/conversations/<id>`), falling back to the
@@ -174,6 +179,76 @@ server's reply; the hooks never read a successful response body.
174
179
  error's body at 64 KiB even when the server does not declare its length; it used to buffer the whole body before
175
180
  checking. The hooks still never read a successful response body.
176
181
 
182
+ 0.7.0 lets you connect from any folder, adds `scan` and `backfill`, puts a stable code on every error, and changes
183
+ the contracts below. The hooks still never read a successful response body.
184
+
185
+ *Connecting.* `vibecommit connect` no longer needs a git work tree. It lists the repositories you have used a coding
186
+ agent in (Claude Code, Codex CLI and Cursor) from the agents' folder names and Codex's thread index, without opening
187
+ a session file, and you choose whole owners, including repositories you clone later, or single repositories. The
188
+ disclosure's heading now says "coding-agent transcripts"; its paragraphs are unchanged. Your choices are saved in
189
+ `~/.vibecommit/grants.json`; consent given per clone by 0.6.x keeps working beside it, and a `grants.json` that cannot
190
+ be read stops capture for every repository with a remote until it is fixed. A 0.7.0 command that rewrites it keeps any
191
+ fields it doesn't recognize, so a newer client's state survives it. After "Capture is on", `connect` offers to
192
+ upload the earlier sessions still on this machine, a separate question that defaults to no. Inside a repository it
193
+ shows the same list with that repository ticked, and a repository with no remote keeps the 0.6.0 flow. A repository
194
+ with a remote and no Claude Code session yet ends on "Capture is on" and the dashboard, not 0.6.0's "no Claude Code
195
+ session" warning; the hooks are still installed and the exit is still 0. With no terminal, `connect` refuses with exit
196
+ `2` and the code `CONSENT_NEEDS_TTY`; the disclosure still prints first. A terminal `vibecommit auth` now continues
197
+ into this flow, inside a git repository or outside one on a machine that captures nothing yet, so it may also offer to
198
+ upload earlier sessions (default no); with `--stdin` or no terminal it still only saves the credential. That replaces
199
+ the "outside a repository" clause of the 0.6.0 paragraph above; its `--stdin` and no-terminal clauses, and "The
200
+ chained `connect` never opens a second sign-in", still hold.
201
+
202
+ *New verbs and changed ones.* `vibecommit scan [--json]` lists repositories and exits `4` when it finds none.
203
+ `vibecommit backfill` uploads earlier sessions for the repositories you chose, after two yeses and without commit
204
+ links; its exit codes are in the table above. `vibecommit status` now answers from any folder; `status --json` gains
205
+ `scope` and `basis` on a repository's document (`basis` is `owner`, `repo` or `per_clone`, or `null` when it is off),
206
+ a machine document with its own keys, and `org_pending`: `{at_ms}` or `null` inside a repository, and the list of
207
+ waiting repositories at machine level. `status` names a repository whose organization has not approved capture yet,
208
+ from inside it or from any folder. `vibecommit off` turns the repository off by its name, for every clone of it on
209
+ this machine.
210
+
211
+ *Delivery.* A 413 no longer writes off the span. A span goes in deltas of at most 8 MiB cut on a record boundary, a
212
+ 413 halves the delta and retries, and only a single record that alone exceeds a limit (8 MiB raw, or 960 KiB
213
+ compressed) is skipped and counted; `status` reports it as "skipped … will not be sent later". A hook sends further
214
+ deltas only while its existing budget lasts and leaves the rest for its next event or `vibecommit finalize`. The test
215
+ capture in `connect` sends at most one hook budget and its first upload times out after about 3 seconds (it was 5).
216
+
217
+ *Hooks.* Claude Code, Codex and Cursor now register a `SessionStart` hook. In a clone you have granted, it installs the
218
+ commit hooks once, by plain writes only (if either slot holds someone else's hook it writes nothing, and `status`
219
+ says so), says so in one short notice, and uploads nothing, opens no transcript and makes no request. Notices show only
220
+ in the agents' terminal interfaces, so `status` is the record in `claude -p` and `codex exec`; Cursor's `sessionStart`
221
+ has no way to show one, and that hook is registered from reading Cursor's code, not from watching it run. Codex asks you to trust new hooks the next time it starts — until you do, it will not run them. The new `SessionStart` entry arrives untrusted, so
222
+ existing Codex users see one review after upgrading and running `connect`, and again whenever the path of the
223
+ `vibecommit` binary changes (an nvm switch, a plugin update). The Claude Code plugin installs no git hooks, including
224
+ from `SessionStart`.
225
+
226
+ *Errors.* Every error block now carries a stable code on its own muted line before the fix, with a link:
227
+ `NOT_A_REPO · vibecommit.ai/docs/errors#not-a-repo`. There are 61 codes (`test/error-codes.golden.txt`); a code names
228
+ a condition and carries no exit code. `UNKNOWN_COMMAND` replaces the help dump for an unknown verb: it prints a block
229
+ that points to `vibecommit --help`, and the exit is still `2`. `CONSENT_NEEDS_TTY` is now on its own code line, not in
230
+ parentheses in the sentence. A `--json` failure of `status`, `why` or `report`, and an unexpected error under `scan --json`, is now one document
231
+ on stdout and nothing on stderr, where 0.6.x left stdout empty: `{ schema, verb, outcome: "error", error: { code, what, why, fix } }`.
232
+ `fix` is `null` only when the block has no fix label at all; a label with nothing to type is `{ "label": …,
233
+ "commands": [] }`. Every fix command, in the text and in `--json`, follows the install channel: a machine that has only
234
+ the Claude Code plugin is told `node <path> …`, not a `vibecommit` it does not have. `vibecommit <verb> --help` now
235
+ prints usage, options and exit codes for `connect`, `auth`, `scan`, `status`, `why`, `report`, `finalize` and
236
+ `backfill`. `finalize` outside a git repository still exits `1`, and the README now says so. When `finalize` finds no
237
+ credential it says "This machine isn't connected." (`NO_CREDENTIAL`); a credential that is present but unusable gets
238
+ the same precise block `status` and `connect` print, and both exit `3`. A credential the server rejects still
239
+ reaches the send and exits `1`. `auth` with an empty or wrong-kind credential now puts the settings link first and the
240
+ commands last. Commands written inside a sentence, such as "run `vibecommit connect` to add them", follow the install
241
+ channel too. `CLIENT_TOO_OLD` (the server sent an answer this version is too old to show) now tells an npm install to
242
+ "Update VibeCommit to pick up the current client, then run this again:" with `npm install -g @vibe-commit/capture@latest`;
243
+ the plugin's reinstall line is unchanged. When the folder that holds the credential file, `~/.vibecommit`, is open to
244
+ other accounts, `CREDENTIAL_FILE_INSECURE` names the folder and gives `chmod 700 ~/.vibecommit`, not the file's
245
+ `chmod 600`. The package's `homepage` is `https://www.vibecommit.ai/install`, its `bugs` link is the plugin's
246
+ issues page, and `repository` is dropped, because this repository is private.
247
+
248
+ *A 0.6.x defect fixed.* For a repository whose path held an `_`, a space or another character outside letters and
249
+ digits, `connect`'s test capture looked in a Claude Code folder that does not exist and skipped the upload; it now
250
+ spells the folder name as Claude Code does.
251
+
177
252
  ## Status
178
253
 
179
254
  **Implemented**, not a scaffold. All six commands above have real bodies — OAuth sign-in
@@ -146,6 +146,14 @@ export declare function mergeHookDocument(raw: string | null, shape: HookDocShap
146
146
  * and costs at most a duplicate. `writeAgentHooks` passes `existsSync`.
147
147
  */
148
148
  binaryExists?: (path: string) => boolean): MergeOutcome;
149
+ /**
150
+ * Is one of OUR entries registered for this event in `raw`? Read-only, for `status` (0.7.0): a 0.6.x machine has
151
+ * `Stop`, `PreCompact` and `SessionEnd` but no `SessionStart`, and `npm i -g` alone never adds one.
152
+ *
153
+ * Unparseable, absent or the wrong shape all answer false — "not registered" is the honest reading of a file
154
+ * this client cannot use, and `connect` is the verb that explains a refusal.
155
+ */
156
+ export declare function hasRegistration(raw: string | null, shape: HookDocShape, registration: HookRegistration, binaryExists?: (path: string) => boolean): boolean;
149
157
  export type AgentHookInstall = {
150
158
  readonly kind: "installed";
151
159
  readonly path: string;
@@ -268,6 +268,28 @@ function isOurs(entry, shape, registration, binaryExists) {
268
268
  typeof inner.command === "string" &&
269
269
  commandIsOurs(inner.command, registration.command, binaryExists));
270
270
  }
271
+ /**
272
+ * Is one of OUR entries registered for this event in `raw`? Read-only, for `status` (0.7.0): a 0.6.x machine has
273
+ * `Stop`, `PreCompact` and `SessionEnd` but no `SessionStart`, and `npm i -g` alone never adds one.
274
+ *
275
+ * Unparseable, absent or the wrong shape all answer false — "not registered" is the honest reading of a file
276
+ * this client cannot use, and `connect` is the verb that explains a refusal.
277
+ */
278
+ export function hasRegistration(raw, shape, registration, binaryExists = existsSync) {
279
+ if (raw === null)
280
+ return false;
281
+ let doc;
282
+ try {
283
+ doc = JSON.parse(raw);
284
+ }
285
+ catch {
286
+ return false;
287
+ }
288
+ if (!isRecord(doc) || !isRecord(doc.hooks))
289
+ return false;
290
+ const entries = doc.hooks[registration.event];
291
+ return Array.isArray(entries) && entries.some((e) => isOurs(e, shape, registration, binaryExists));
292
+ }
271
293
  /**
272
294
  * ⛔ **THE WHOLE STRING, NEVER A SUBSTRING — the trap `TODOS[138]` names.**
273
295
  *
@@ -368,6 +390,15 @@ export function writeAgentHooks(path, shape, registrations) {
368
390
  const merged = mergeHookDocument(raw, shape, registrations, existsSync);
369
391
  if (merged.kind === "refused")
370
392
  return { kind: "refused", path, why: merged.why };
393
+ const events = registrations.map((registration) => registration.event);
394
+ // ⛔ **A BYTE-IDENTICAL RESULT IS NOT WRITTEN AT ALL** (0.7.0, VQ ruling). Codex hashes each hook's normalized
395
+ // config (event, matcher, command, timeout) and runs a user-level hook only while a persisted hash matches, so
396
+ // the entry this client writes is something the user has to APPROVE. A re-`connect` with the same binary path
397
+ // rebuilds the same entry; rewriting the file anyway churns its mtime for nothing and invites every tool that
398
+ // watches it to react. A MOVED binary path still lands here as different text and is refreshed, because a stale
399
+ // path is worse than a fresh review — the hook would point at a binary that is gone.
400
+ if (raw !== null && merged.text === raw)
401
+ return { kind: "already", path, events };
371
402
  const temp = join(dirname(path), `.${AGENT_HOOK_MARKER.replace(/\W+/g, "-")}.tmp`);
372
403
  try {
373
404
  mkdirSync(dirname(path), { recursive: true });
@@ -379,7 +410,6 @@ export function writeAgentHooks(path, shape, registrations) {
379
410
  catch (error) {
380
411
  return { kind: "failed", path, why: error instanceof Error ? error.message : "write failed" };
381
412
  }
382
- const events = registrations.map((registration) => registration.event);
383
413
  // "already" is not "nothing happened" — the command was still refreshed. It is
384
414
  // the answer to *did this connect ADD anything*, which is what a user reads.
385
415
  return merged.added.length === 0
@@ -1 +1 @@
1
- {"version":3,"file":"agent_hooks.js","sourceRoot":"","sources":["../src/agent_hooks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"agent_hooks.js","sourceRoot":"","sources":["../src/agent_hooks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAuEG;AAEH,OAAO,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAC9G,OAAO,EAAE,QAAQ,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAIpD;;;;;;;;;GASG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG,4BAA4B,CAAC;AAE9D,oFAAoF;AACpF,MAAM,UAAU,GAAG,aAAa,CAAC;AAKjC,+DAA+D;AAC/D,MAAM,qBAAqB,GAAG,CAAC,CAAC;AAEhC;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,UAAU,WAAW,CAAC,OAAe,EAAE,OAAgB;IAC3D,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,iBAAiB,OAAO,EAAE,CAAC;AACrD,CAAC;AAED,6DAA6D;AAC7D,SAAS,KAAK,CAAC,KAAa;IAC1B,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,MAAM,CAAC,GAAG,CAAC;AACpD,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,YAAY,GAAG,8DAA8D,CAAC;AAEpF,+EAA+E;AAC/E,SAAS,gBAAgB,CAAC,OAAe;IACvC,MAAM,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACzC,IAAI,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IAChC,OAAO,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,cAAc,EAAE,IAAI,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;AAChF,CAAC;AAyBD;;;;;;;;GAQG;AACH,MAAM,UAAU,iBAAiB,CAC/B,GAAkB,EAClB,KAAmB,EACnB,aAA0C;AAC1C;;;;;GAKG;AACH,eAA0C,GAAG,EAAE,CAAC,IAAI;IAEpD,IAAI,GAA4B,CAAC;IAEjC,IAAI,GAAG,KAAK,IAAI,IAAI,GAAG,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE,CAAC;QACtC,GAAG,GAAG,EAAE,CAAC;IACX,CAAC;SAAM,CAAC;QACN,IAAI,MAAe,CAAC;QACpB,IAAI,CAAC;YACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;QAC3B,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,yEAAyE;YACzE,oDAAoD;YACpD,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,GAAG,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,gBAAgB;aAC/D,CAAC;QACJ,CAAC;QACD,IAAI,MAAM,KAAK,IAAI,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3E,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,mCAAmC,EAAE,CAAC;QACvE,CAAC;QACD,GAAG,GAAG,EAAE,GAAI,MAAkC,EAAE,CAAC;IACnD,CAAC;IAED,2EAA2E;IAC3E,+EAA+E;IAC/E,8EAA8E;IAC9E,IAAI,KAAK,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;QACpD,GAAG,CAAC,OAAO,GAAG,qBAAqB,CAAC;IACtC,CAAC;IAED,MAAM,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC;IAChC,IAAI,aAAa,KAAK,SAAS,EAAE,CAAC;QAChC,IAAI,aAAa,KAAK,IAAI,IAAI,OAAO,aAAa,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;YAChG,4EAA4E;YAC5E,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,EAAE,yCAAyC,EAAE,CAAC;QAC7E,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAA4B;QACrC,GAAG,CAAE,aAAqD,IAAI,EAAE,CAAC;KAClE,CAAC;IAEF,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,OAAO,GAAG,CAAC,CAAC;IAEhB,KAAK,MAAM,YAAY,IAAI,aAAa,EAAE,CAAC;QACzC,MAAM,OAAO,GAAG,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QAC1C,IAAI,OAAO,KAAK,SAAS,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;YACrD,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,GAAG,EAAE,WAAW,YAAY,CAAC,KAAK,mCAAmC;aACtE,CAAC;QACJ,CAAC;QACD,MAAM,OAAO,GAAG,CAAC,GAAG,CAAE,OAAiC,IAAI,EAAE,CAAC,CAAC,CAAC;QAChE,MAAM,IAAI,GAAG,QAAQ,CAAC,KAAK,EAAE,YAAY,CAAC,CAAC;QAE3C,MAAM,IAAI,GAAG,CAAC,KAAc,EAAW,EAAE,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC;QAC3F,MAAM,EAAE,GAAG,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;YACZ,yEAAyE;YACzE,2EAA2E;YAC3E,wDAAwD;YACxD,OAAO,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC;YACnB,uEAAuE;YACvE,2EAA2E;YAC3E,4EAA4E;YAC5E,2EAA2E;YAC3E,2EAA2E;YAC3E,4EAA4E;YAC5E,KAAK,IAAI,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC;gBAChD,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;oBAAE,OAAO,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACnC,CAAC;aAAM,CAAC;YACN,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACnB,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1D,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC;IACtC,CAAC;IAED,GAAG,CAAC,KAAK,GAAG,KAAK,CAAC;IAClB,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC;AAChG,CAAC;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,SAAS,MAAM,CACb,KAAc,EACd,KAAmB,EACnB,YAA8B,EAC9B,YAAuC;IAEvC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACnC,IAAI,KAAK,CAAC,UAAU,CAAC,KAAK,iBAAiB;QAAE,OAAO,IAAI,CAAC;IAEzD,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,OAAO,CACL,WAAW,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAC;YAC1C,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;YACjC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CACjE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC9F,OAAO,KAAK,CAAC;IACf,CAAC;IACD,MAAM,KAAK,GAAY,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtC,OAAO,CACL,QAAQ,CAAC,KAAK,CAAC;QACf,WAAW,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,SAAS,EAAE,SAAS,CAAC,CAAC;QAClD,KAAK,CAAC,IAAI,KAAK,SAAS;QACxB,OAAO,KAAK,CAAC,OAAO,KAAK,QAAQ;QACjC,aAAa,CAAC,KAAK,CAAC,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,YAAY,CAAC,CACjE,CAAC;AACJ,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,eAAe,CAC7B,GAAkB,EAClB,KAAmB,EACnB,YAA8B,EAC9B,eAA0C,UAAU;IAEpD,IAAI,GAAG,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IAC/B,IAAI,GAAY,CAAC;IACjB,IAAI,CAAC;QACH,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC;IACzD,MAAM,OAAO,GAAG,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAC9C,OAAO,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,EAAE,KAAK,EAAE,YAAY,EAAE,YAAY,CAAC,CAAC,CAAC;AACrG,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAiCG;AACH,SAAS,aAAa,CACpB,SAAiB,EACjB,IAAY,EACZ,YAAuC;IAEvC,IAAI,SAAS,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC;IACpC,MAAM,MAAM,GAAG,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC3C,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;IACpC,IAAI,MAAM,KAAK,IAAI,IAAI,IAAI,KAAK,IAAI;QAAE,OAAO,KAAK,CAAC;IACnD,OAAO,CACL,MAAM,CAAC,OAAO,KAAK,IAAI,CAAC,OAAO;QAC/B,QAAQ,CAAC,MAAM,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC;QACnD,CAAC,YAAY,CAAC,MAAM,CAAC,OAAO,CAAC,CAC9B,CAAC;AACJ,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,KAAK,KAAK,IAAI,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,SAAS,WAAW,CAAC,KAA8B,EAAE,OAA0B;IAC7E,OAAO,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,sEAAsE;AACtE,SAAS,QAAQ,CAAC,KAAmB,EAAE,YAA8B;IACnE,IAAI,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvB,0EAA0E;QAC1E,6EAA6E;QAC7E,wCAAwC;QACxC,OAAO;YACL,CAAC,UAAU,CAAC,EAAE,iBAAiB;YAC/B,OAAO,EAAE,YAAY,CAAC,OAAO;YAC7B,OAAO,EAAE,YAAY,CAAC,UAAU;SACjC,CAAC;IACJ,CAAC;IACD,6EAA6E;IAC7E,0EAA0E;IAC1E,6BAA6B;IAC7B,OAAO;QACL,CAAC,UAAU,CAAC,EAAE,iBAAiB;QAC/B,KAAK,EAAE;YACL,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,YAAY,CAAC,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,UAAU,EAAE;SACrF;KACF,CAAC;AACJ,CAAC;AAQD;;;;;;;;;;;GAWG;AACH,MAAM,UAAU,eAAe,CAC7B,IAAY,EACZ,KAAmB,EACnB,aAA0C;IAE1C,IAAI,GAAG,GAAkB,IAAI,CAAC;IAC9B,IAAI,IAAwB,CAAC;IAC7B,IAAI,CAAC;QACH,GAAG,GAAG,YAAY,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACjC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,KAAK,CAAC;IACrC,CAAC;IAAC,MAAM,CAAC;QACP,4EAA4E;QAC5E,qDAAqD;QACrD,GAAG,GAAG,IAAI,CAAC;IACb,CAAC;IAED,MAAM,MAAM,GAAG,iBAAiB,CAAC,GAAG,EAAE,KAAK,EAAE,aAAa,EAAE,UAAU,CAAC,CAAC;IACxE,IAAI,MAAM,CAAC,IAAI,KAAK,SAAS;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,CAAC,GAAG,EAAE,CAAC;IAEjF,MAAM,MAAM,GAAG,aAAa,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC;IAEvE,8GAA8G;IAC9G,+GAA+G;IAC/G,8GAA8G;IAC9G,8GAA8G;IAC9G,gHAAgH;IAChH,qFAAqF;IACrF,IAAI,GAAG,KAAK,IAAI,IAAI,MAAM,CAAC,IAAI,KAAK,GAAG;QAAE,OAAO,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAElF,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,IAAI,iBAAiB,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACnF,IAAI,CAAC;QACH,SAAS,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,aAAa,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,IAAI,KAAK,EAAE,CAAC,CAAC;QAC1D,IAAI,IAAI,KAAK,SAAS;YAAE,SAAS,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAC9C,UAAU,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACzB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,cAAc,EAAE,CAAC;IAChG,CAAC;IAED,+EAA+E;IAC/E,6EAA6E;IAC7E,OAAO,MAAM,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC;QAC9B,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE;QACnC,CAAC,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;AAC1C,CAAC"}
@@ -8,4 +8,38 @@
8
8
  * confinement call, which now runs against the registry's union.
9
9
  */
10
10
  import type { TranscriptDialect } from "./types.js";
11
+ /**
12
+ * The longest folder name Claude Code writes verbatim.
13
+ *
14
+ * ⛔ **MEASURED (Open Question 3, VS, 2026-10-24).** An encoded path that would
15
+ * pass 200 characters is cut to 200, then `-`, then 6 hash characters (a
16
+ * measured name was 207 long, `…-x911fg`). The hash is not invertible from here,
17
+ * so such a folder cannot be matched to a path — and so a name LONGER than this
18
+ * is always a hashed one, since a verbatim name never exceeds it.
19
+ */
20
+ export declare const CLAUDE_NAME_LIMIT = 200;
21
+ /**
22
+ * The folder name Claude Code gives a project path — Open Question 3.
23
+ *
24
+ * ⛔ **EVERY UTF-16 CODE UNIT OUTSIDE `[A-Za-z0-9]` BECOMES ONE `-`.** Measured by
25
+ * running throwaway sessions in folders named with `. _`, a space, `@ + ~ ( ) ' =
26
+ * , # % &`, `é` and an emoji: all of them, and the emoji TWICE, because the
27
+ * regular expression below runs over code units (no `u` flag) and an emoji is
28
+ * two. Runs do NOT collapse (`501/-Users` gave `501--Users`), a literal `-` stays
29
+ * itself, case is kept, and a leading `/` gives a leading `-`.
30
+ *
31
+ * ⚠ **This replaces `/[/.]/g`, which was the rule the first version of
32
+ * `locateCurrentTranscript` derived from 17 folders none of which held anything
33
+ * else.** For a repo whose path held an `_` or a space, `connect`'s test capture
34
+ * looked in a folder that does not exist and skipped the beat (a 0.6.x defect;
35
+ * `test/scan-encodings.test.ts` carries its regression cell).
36
+ *
37
+ * ⚠ **It returns the FULL encoding even past the limit**, and the callers decide
38
+ * what that means: `locateCurrentTranscript` cannot find a hashed folder, and the
39
+ * scan's walk compares PREFIXES of a name that is itself at most the limit, so a
40
+ * longer prefix simply never matches. One function, no second spelling of the rule.
41
+ */
42
+ export declare function encodeProjectPath(path: string): string;
43
+ /** Is this folder name one Claude Code cut and hashed? See `CLAUDE_NAME_LIMIT`. */
44
+ export declare function isHashedProjectName(name: string): boolean;
11
45
  export declare const CLAUDE_CODE: TranscriptDialect;
@@ -7,9 +7,10 @@
7
7
  * `commands/connect.ts`'s own `findCurrentTranscript` verbatim except for the
8
8
  * confinement call, which now runs against the registry's union.
9
9
  */
10
- import { readdirSync, statSync } from "node:fs";
10
+ import { readdirSync, readFileSync, statSync } from "node:fs";
11
11
  import { basename, join } from "node:path";
12
- import { claudeSettingsPath, isInside, isTranscriptFile, transcriptRoot } from "../paths.js";
12
+ import { claudeConfigPath, claudeSettingsPath, isInside, isTranscriptFile, transcriptRoot, } from "../paths.js";
13
+ import { readEntries, sessionFile, subdirectories } from "./session_listing.js";
13
14
  /**
14
15
  * The client-side backstop, per event.
15
16
  *
@@ -38,16 +39,66 @@ const CLAUDE_CLIENT_BUDGET_MS = 5_000;
38
39
  const CLAUDE_REGISTERED_STOP_MS = 8_000;
39
40
  const CLAUDE_REGISTERED_PRECOMPACT_MS = 8_000;
40
41
  const CLAUDE_REGISTERED_SESSION_END_MS = 10_000;
42
+ /**
43
+ * `SessionStart` reuses `Stop`'s two clocks and has no fast path of its own.
44
+ *
45
+ * ⛔ **A logged shortcut** — gstack-shortcut(dec-e650afbf), eng review D7 · B,
46
+ * Alexander's choice over a 1.5 s cap. The ceiling: a hung `SessionStart` can
47
+ * hold a session's start up by as long as the REGISTERED timeout (8 s here).
48
+ * Upgrade when a measurement or a user report shows session-start delay, or
49
+ * before slice 2's grants fetch is built into this handler.
50
+ */
51
+ const CLAUDE_REGISTERED_SESSION_START_MS = CLAUDE_REGISTERED_STOP_MS; // gstack-shortcut(dec-e650afbf)
52
+ /**
53
+ * The longest folder name Claude Code writes verbatim.
54
+ *
55
+ * ⛔ **MEASURED (Open Question 3, VS, 2026-10-24).** An encoded path that would
56
+ * pass 200 characters is cut to 200, then `-`, then 6 hash characters (a
57
+ * measured name was 207 long, `…-x911fg`). The hash is not invertible from here,
58
+ * so such a folder cannot be matched to a path — and so a name LONGER than this
59
+ * is always a hashed one, since a verbatim name never exceeds it.
60
+ */
61
+ export const CLAUDE_NAME_LIMIT = 200;
62
+ /**
63
+ * The folder name Claude Code gives a project path — Open Question 3.
64
+ *
65
+ * ⛔ **EVERY UTF-16 CODE UNIT OUTSIDE `[A-Za-z0-9]` BECOMES ONE `-`.** Measured by
66
+ * running throwaway sessions in folders named with `. _`, a space, `@ + ~ ( ) ' =
67
+ * , # % &`, `é` and an emoji: all of them, and the emoji TWICE, because the
68
+ * regular expression below runs over code units (no `u` flag) and an emoji is
69
+ * two. Runs do NOT collapse (`501/-Users` gave `501--Users`), a literal `-` stays
70
+ * itself, case is kept, and a leading `/` gives a leading `-`.
71
+ *
72
+ * ⚠ **This replaces `/[/.]/g`, which was the rule the first version of
73
+ * `locateCurrentTranscript` derived from 17 folders none of which held anything
74
+ * else.** For a repo whose path held an `_` or a space, `connect`'s test capture
75
+ * looked in a folder that does not exist and skipped the beat (a 0.6.x defect;
76
+ * `test/scan-encodings.test.ts` carries its regression cell).
77
+ *
78
+ * ⚠ **It returns the FULL encoding even past the limit**, and the callers decide
79
+ * what that means: `locateCurrentTranscript` cannot find a hashed folder, and the
80
+ * scan's walk compares PREFIXES of a name that is itself at most the limit, so a
81
+ * longer prefix simply never matches. One function, no second spelling of the rule.
82
+ */
83
+ export function encodeProjectPath(path) {
84
+ return path.replace(/[^A-Za-z0-9]/g, "-");
85
+ }
86
+ /** Is this folder name one Claude Code cut and hashed? See `CLAUDE_NAME_LIMIT`. */
87
+ export function isHashedProjectName(name) {
88
+ return name.length > CLAUDE_NAME_LIMIT;
89
+ }
41
90
  /**
42
91
  * The transcript for the session running right now.
43
92
  *
44
93
  * A hook is HANDED `transcript_path` on stdin. `connect` is typed by a human and
45
94
  * gets nothing, so it has to find one: Claude Code stores transcripts at
46
95
  * `<transcriptRoot>/<encoded-project-path>/<session-id>.jsonl`, where the
47
- * encoding replaces `/` and `.` with `-`. That was derived by comparing every
48
- * directory on this machine against the `cwd` its transcripts record — 15 of 17
49
- * matched exactly, and both misses were sessions whose `cwd` MOVED mid-session,
50
- * not a different encoding.
96
+ * encoding is `encodeProjectPath` above. The first version of that was derived
97
+ * by comparing every directory on this machine against the `cwd` its transcripts
98
+ * record — 15 of 17 matched exactly, and both misses were sessions whose `cwd`
99
+ * MOVED mid-session, not a different encoding. ⚠ Seventeen folders cannot
100
+ * contain a character none of them had: see `encodeProjectPath` for what that
101
+ * assumption cost.
51
102
  *
52
103
  * Which is also why this looks up the directory for THIS project rather than
53
104
  * taking the newest transcript anywhere: a session that started in another
@@ -70,7 +121,13 @@ const CLAUDE_REGISTERED_SESSION_END_MS = 10_000;
70
121
  */
71
122
  function locateCurrentTranscript(home, env, projectKey) {
72
123
  const root = transcriptRoot(home, env);
73
- const dir = join(root, projectKey.replace(/[/.]/g, "-"));
124
+ const name = encodeProjectPath(projectKey);
125
+ // A hashed folder name cannot be derived from the path, so there is nothing to
126
+ // look in. `connect` then skips the test-capture beat, as it does for an agent
127
+ // with no locator, rather than guessing a sibling.
128
+ if (isHashedProjectName(name))
129
+ return null;
130
+ const dir = join(root, name);
74
131
  let entries;
75
132
  try {
76
133
  entries = readdirSync(dir);
@@ -129,6 +186,70 @@ function claudeSessionIdFromEnv(env) {
129
186
  const value = raw.trim();
130
187
  return value === "" ? null : value;
131
188
  }
189
+ /**
190
+ * The folders Claude Code has recorded running in: the KEYS of `~/.claude.json`'s
191
+ * `projects` map, and nothing else.
192
+ *
193
+ * ⛔ **Keys only.** The file also holds account and onboarding state, none of
194
+ * which this client has any use for. Nothing but the key strings leaves this
195
+ * function, and a failure of any kind is an empty list: the signal then simply
196
+ * does not fire, which skips less. ⚠ **No error is ever surfaced or logged** — Node
197
+ * 22's `JSON.parse` message quotes the text it failed on, and this file is not
198
+ * one whose text belongs on a screen.
199
+ */
200
+ function recordedProjectPaths(home, env) {
201
+ try {
202
+ const parsed = JSON.parse(readFileSync(claudeConfigPath(home, env), "utf8"));
203
+ const projects = typeof parsed === "object" && parsed !== null
204
+ ? parsed.projects
205
+ : undefined;
206
+ return typeof projects === "object" && projects !== null ? Object.keys(projects) : [];
207
+ }
208
+ catch {
209
+ return [];
210
+ }
211
+ }
212
+ /**
213
+ * Claude Code's sessions, by folder — `D11 · A`, `scan`.
214
+ *
215
+ * `<root>/<encoded path>/<session-id>.jsonl`. Only the files DIRECTLY in a
216
+ * project folder are sessions: `<session-id>/subagents/…` holds delegated work
217
+ * that belongs to a parent session (`CR-124`), and counting it would turn one
218
+ * session into several. A legacy `agent-*.jsonl` sidechain at this level is
219
+ * excluded for the same reason.
220
+ *
221
+ * ⛔ **Names and times only.** The folder name is returned still ENCODED; whether
222
+ * it resolves to a path is the scan engine's walk, against the filesystem, never
223
+ * against a transcript's own `cwd` record (D60 §D6).
224
+ */
225
+ function claudeSessionSource(home, env) {
226
+ const root = transcriptRoot(home, env);
227
+ const folders = [];
228
+ try {
229
+ for (const folder of subdirectories(root)) {
230
+ const sessions = [];
231
+ for (const entry of readEntries(folder.path) ?? []) {
232
+ if (!entry.name.endsWith(".jsonl") || entry.name.startsWith("agent-"))
233
+ continue;
234
+ const session = sessionFile(join(folder.path, entry.name));
235
+ if (session !== null)
236
+ sessions.push(session);
237
+ }
238
+ if (sessions.length > 0)
239
+ folders.push({ name: folder.name, sessions });
240
+ }
241
+ }
242
+ catch {
243
+ return { kind: "unreadable", reason: "unreadable" };
244
+ }
245
+ return {
246
+ kind: "folders",
247
+ folders,
248
+ encode: encodeProjectPath,
249
+ isHashed: isHashedProjectName,
250
+ recorded: recordedProjectPaths(home, env),
251
+ };
252
+ }
132
253
  export const CLAUDE_CODE = {
133
254
  id: "claude-code",
134
255
  transport: "ndjson",
@@ -143,7 +264,12 @@ export const CLAUDE_CODE = {
143
264
  // agent the client was built for. Declared explicitly rather than defaulted so
144
265
  // that a dialect added later must ANSWER the question; a default would let a
145
266
  // camelCase agent inherit Claude's spellings and match nothing (`CR-195`).
146
- eventNames: { Stop: "Stop", PreCompact: "PreCompact", SessionEnd: "SessionEnd" },
267
+ eventNames: {
268
+ Stop: "Stop",
269
+ PreCompact: "PreCompact",
270
+ SessionEnd: "SessionEnd",
271
+ SessionStart: "SessionStart",
272
+ },
147
273
  // ⛔ `~/.claude/settings.json`, honouring `CLAUDE_CONFIG_DIR`. ⚠ This is the
148
274
  // file the PLUGIN path does not need — the plugin ships its own `hooks.json`
149
275
  // — and the npm path had no writer at all, which is the defect `/install`
@@ -162,12 +288,19 @@ export const CLAUDE_CODE = {
162
288
  registeredTimeoutMs: CLAUDE_REGISTERED_SESSION_END_MS,
163
289
  clientBudgetMs: CLAUDE_CLIENT_BUDGET_MS,
164
290
  },
291
+ // MEASURED (Open Question 1, 2.1.309): fires before the first prompt in `-p`
292
+ // and the TUI, and accepts `systemMessage`. gstack-shortcut(dec-e650afbf).
293
+ SessionStart: {
294
+ registeredTimeoutMs: CLAUDE_REGISTERED_SESSION_START_MS,
295
+ clientBudgetMs: CLAUDE_CLIENT_BUDGET_MS,
296
+ },
165
297
  },
166
298
  // `<session>/subagents/agent-*.jsonl`, globbed — the paths are never handed
167
299
  // over. `CR-124`, D76.
168
300
  delegatedTranscripts: "discover",
169
301
  redaction: "claude-code",
170
302
  sessionIdFromEnv: claudeSessionIdFromEnv,
303
+ sessionSource: claudeSessionSource,
171
304
  locateCurrentTranscript,
172
305
  };
173
306
  //# sourceMappingURL=claude_code.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"claude_code.js","sourceRoot":"","sources":["../../src/agents/claude_code.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"claude_code.js","sourceRoot":"","sources":["../../src/agents/claude_code.ts"],"names":[],"mappings":"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"}
@@ -12,4 +12,17 @@
12
12
  * reader can check them against the product rather than against this file.
13
13
  */
14
14
  import type { TranscriptDialect } from "./types.js";
15
+ /**
16
+ * ⛔ **THE FOUR COLUMNS, AND NO OTHER — `D11 · A`, Alexander's approved read.**
17
+ *
18
+ * The thread index also holds `first_user_message`, `title`, `preview` and more,
19
+ * which are CONTENT. Selecting one would turn a metadata read into a transcript
20
+ * read, so the statement names exactly these four and `test/scan-codex-index.test.ts`
21
+ * asserts the SQL carries nothing else. ⚠ **`archived` is not here either, on
22
+ * purpose** (VQ, 2026-10-24): an archived thread's `rollout_path` is decided by
23
+ * the admission below, and a fifth column would change the approved read surface.
24
+ */
25
+ export declare const CODEX_INDEX_COLUMNS: readonly ["cwd", "git_origin_url", "rollout_path", "created_at"];
26
+ /** The one statement the adapter runs against a thread row. */
27
+ export declare const CODEX_INDEX_SQL: string;
15
28
  export declare const CODEX_CLI: TranscriptDialect;