@synap-core/cli 1.13.0 → 1.13.1-next.20261102.246dc73
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.
- package/README.md +13 -3
- package/dist/build-info.json +2 -3
- package/dist/commands/agents.js +12 -2
- package/dist/commands/agents.js.map +1 -1
- package/dist/commands/capability.d.ts +86 -0
- package/dist/commands/capability.js +117 -30
- package/dist/commands/capability.js.map +1 -1
- package/dist/commands/context.js +2 -1
- package/dist/commands/context.js.map +1 -1
- package/dist/commands/data-extra.d.ts +13 -0
- package/dist/commands/data-extra.js +23 -2
- package/dist/commands/data-extra.js.map +1 -1
- package/dist/commands/doctor.d.ts +18 -0
- package/dist/commands/doctor.js +28 -1
- package/dist/commands/doctor.js.map +1 -1
- package/dist/commands/init.js +4 -2
- package/dist/commands/init.js.map +1 -1
- package/dist/commands/keys-request.d.ts +48 -0
- package/dist/commands/keys-request.js +236 -0
- package/dist/commands/keys-request.js.map +1 -0
- package/dist/commands/keys-request.test.d.ts +1 -0
- package/dist/commands/keys-request.test.js +176 -0
- package/dist/commands/keys-request.test.js.map +1 -0
- package/dist/commands/knowledge.d.ts +42 -5
- package/dist/commands/knowledge.js +90 -27
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/market.d.ts +89 -31
- package/dist/commands/market.js +215 -222
- package/dist/commands/market.js.map +1 -1
- package/dist/commands/mcp.d.ts +1 -1
- package/dist/commands/mcp.js +14 -9
- package/dist/commands/mcp.js.map +1 -1
- package/dist/commands/pods.js +6 -2
- package/dist/commands/pods.js.map +1 -1
- package/dist/commands/proposals-actions.js +7 -1
- package/dist/commands/proposals-actions.js.map +1 -1
- package/dist/commands/providers.d.ts +22 -6
- package/dist/commands/providers.js +39 -32
- package/dist/commands/providers.js.map +1 -1
- package/dist/commands/raycast.d.ts +15 -0
- package/dist/commands/raycast.js +36 -10
- package/dist/commands/raycast.js.map +1 -1
- package/dist/commands/status.js +12 -6
- package/dist/commands/status.js.map +1 -1
- package/dist/commands/statusline.backoff.test.js +13 -3
- package/dist/commands/statusline.backoff.test.js.map +1 -1
- package/dist/commands/statusline.d.ts +104 -9
- package/dist/commands/statusline.js +392 -148
- package/dist/commands/statusline.js.map +1 -1
- package/dist/commands/statusline.line2.test.d.ts +15 -0
- package/dist/commands/statusline.line2.test.js +226 -0
- package/dist/commands/statusline.line2.test.js.map +1 -0
- package/dist/commands/statusline.needs-you.test.d.ts +1 -0
- package/dist/commands/statusline.needs-you.test.js +17 -0
- package/dist/commands/statusline.needs-you.test.js.map +1 -0
- package/dist/commands/statusline.now.test.d.ts +10 -0
- package/dist/commands/statusline.now.test.js +250 -0
- package/dist/commands/statusline.now.test.js.map +1 -0
- package/dist/commands/tracks.d.ts +1 -0
- package/dist/commands/tracks.js +4 -0
- package/dist/commands/tracks.js.map +1 -1
- package/dist/commands/upload.js +12 -0
- package/dist/commands/upload.js.map +1 -1
- package/dist/commands/wait.d.ts +124 -0
- package/dist/commands/wait.js +384 -0
- package/dist/commands/wait.js.map +1 -0
- package/dist/commands/wait.test.d.ts +8 -0
- package/dist/commands/wait.test.js +308 -0
- package/dist/commands/wait.test.js.map +1 -0
- package/dist/commands/worker-github-app.d.ts +63 -0
- package/dist/commands/worker-github-app.js +161 -0
- package/dist/commands/worker-github-app.js.map +1 -0
- package/dist/commands/worker-github-app.test.d.ts +1 -0
- package/dist/commands/worker-github-app.test.js +102 -0
- package/dist/commands/worker-github-app.test.js.map +1 -0
- package/dist/commands/worker-github-broker.d.ts +39 -0
- package/dist/commands/worker-github-broker.js +106 -0
- package/dist/commands/worker-github-broker.js.map +1 -0
- package/dist/commands/worker-github-broker.test.d.ts +1 -0
- package/dist/commands/worker-github-broker.test.js +90 -0
- package/dist/commands/worker-github-broker.test.js.map +1 -0
- package/dist/commands/worker-runs.test.d.ts +1 -0
- package/dist/commands/worker-runs.test.js +150 -0
- package/dist/commands/worker-runs.test.js.map +1 -0
- package/dist/commands/worker-worktrees.d.ts +34 -0
- package/dist/commands/worker-worktrees.js +87 -0
- package/dist/commands/worker-worktrees.js.map +1 -0
- package/dist/commands/worker.d.ts +192 -5
- package/dist/commands/worker.js +467 -45
- package/dist/commands/worker.js.map +1 -1
- package/dist/commands/worker.test.js +269 -3
- package/dist/commands/worker.test.js.map +1 -1
- package/dist/index.js +59 -4
- package/dist/index.js.map +1 -1
- package/dist/lib/agents-config.d.ts +9 -0
- package/dist/lib/agents-config.js +20 -0
- package/dist/lib/agents-config.js.map +1 -1
- package/dist/lib/atomic-file.d.ts +20 -1
- package/dist/lib/atomic-file.js +100 -2
- package/dist/lib/atomic-file.js.map +1 -1
- package/dist/lib/auth.d.ts +25 -0
- package/dist/lib/auth.js +49 -9
- package/dist/lib/auth.js.map +1 -1
- package/dist/lib/box/job-server.js +4 -0
- package/dist/lib/box/job-server.js.map +1 -1
- package/dist/lib/bridge-invocation.test.d.ts +1 -0
- package/dist/lib/bridge-invocation.test.js +75 -0
- package/dist/lib/bridge-invocation.test.js.map +1 -0
- package/dist/lib/bridge-status.d.ts +144 -0
- package/dist/lib/bridge-status.js +227 -0
- package/dist/lib/bridge-status.js.map +1 -0
- package/dist/lib/bridge-status.test.d.ts +6 -0
- package/dist/lib/bridge-status.test.js +197 -0
- package/dist/lib/bridge-status.test.js.map +1 -0
- package/dist/lib/client-header.test.js +19 -1
- package/dist/lib/client-header.test.js.map +1 -1
- package/dist/lib/conversation-headers.d.ts +67 -2
- package/dist/lib/conversation-headers.js +122 -6
- package/dist/lib/conversation-headers.js.map +1 -1
- package/dist/lib/conversation-headers.test.d.ts +1 -0
- package/dist/lib/conversation-headers.test.js +78 -0
- package/dist/lib/conversation-headers.test.js.map +1 -0
- package/dist/lib/credential-class.d.ts +12 -1
- package/dist/lib/credential-class.js +20 -0
- package/dist/lib/credential-class.js.map +1 -1
- package/dist/lib/device-connect.d.ts +45 -0
- package/dist/lib/device-connect.js +60 -0
- package/dist/lib/device-connect.js.map +1 -1
- package/dist/lib/goal-words.js +6 -3
- package/dist/lib/goal-words.js.map +1 -1
- package/dist/lib/hub-client.d.ts +59 -1
- package/dist/lib/hub-client.js +130 -36
- package/dist/lib/hub-client.js.map +1 -1
- package/dist/lib/key-locations.d.ts +3 -3
- package/dist/lib/key-locations.js +3 -39
- package/dist/lib/key-locations.js.map +1 -1
- package/dist/lib/machine-instance.d.ts +7 -5
- package/dist/lib/machine-instance.js +7 -5
- package/dist/lib/machine-instance.js.map +1 -1
- package/dist/lib/mcp-bridge.d.ts +43 -0
- package/dist/lib/mcp-bridge.js +199 -11
- package/dist/lib/mcp-bridge.js.map +1 -1
- package/dist/lib/mcp-bridge.test.js +194 -2
- package/dist/lib/mcp-bridge.test.js.map +1 -1
- package/dist/lib/mcp-call.d.ts +5 -1
- package/dist/lib/mcp-call.js +7 -6
- package/dist/lib/mcp-call.js.map +1 -1
- package/dist/lib/mcp-connector-url.test.d.ts +1 -0
- package/dist/lib/mcp-connector-url.test.js +13 -0
- package/dist/lib/mcp-connector-url.test.js.map +1 -0
- package/dist/lib/mcp-snippets.d.ts +16 -0
- package/dist/lib/mcp-snippets.js +20 -2
- package/dist/lib/mcp-snippets.js.map +1 -1
- package/dist/lib/now-line.d.ts +66 -0
- package/dist/lib/now-line.js +193 -0
- package/dist/lib/now-line.js.map +1 -0
- package/dist/lib/now-line.test.d.ts +5 -0
- package/dist/lib/now-line.test.js +177 -0
- package/dist/lib/now-line.test.js.map +1 -0
- package/dist/lib/package-updates.d.ts +66 -0
- package/dist/lib/package-updates.js +76 -0
- package/dist/lib/package-updates.js.map +1 -0
- package/dist/lib/pod.d.ts +0 -4
- package/dist/lib/pod.js +0 -7
- package/dist/lib/pod.js.map +1 -1
- package/dist/lib/register-claude-code-mcp.test.js +19 -0
- package/dist/lib/register-claude-code-mcp.test.js.map +1 -1
- package/dist/lib/safe-open.d.ts +5 -3
- package/dist/lib/safe-open.js +9 -8
- package/dist/lib/safe-open.js.map +1 -1
- package/dist/lib/self-host.d.ts +17 -0
- package/dist/lib/self-host.js +24 -0
- package/dist/lib/self-host.js.map +1 -0
- package/dist/lib/targets.d.ts +31 -0
- package/dist/lib/targets.js +100 -104
- package/dist/lib/targets.js.map +1 -1
- package/dist/lib/template-lifecycle.d.ts +0 -31
- package/dist/lib/template-lifecycle.js +0 -74
- package/dist/lib/template-lifecycle.js.map +1 -1
- package/dist/lib/term.d.ts +24 -0
- package/dist/lib/term.js +52 -0
- package/dist/lib/term.js.map +1 -0
- package/dist/lib/term.test.d.ts +1 -0
- package/dist/lib/term.test.js +29 -0
- package/dist/lib/term.test.js.map +1 -0
- package/dist/lib/transcript-index.d.ts +94 -0
- package/dist/lib/transcript-index.js +321 -0
- package/dist/lib/transcript-index.js.map +1 -0
- package/dist/lib/transcript-index.test.d.ts +10 -0
- package/dist/lib/transcript-index.test.js +200 -0
- package/dist/lib/transcript-index.test.js.map +1 -0
- package/dist/lib/wait-help.d.ts +11 -0
- package/dist/lib/wait-help.js +25 -0
- package/dist/lib/wait-help.js.map +1 -0
- package/dist/lib/wait-state.d.ts +57 -0
- package/dist/lib/wait-state.js +114 -0
- package/dist/lib/wait-state.js.map +1 -0
- package/package.json +2 -2
- package/skills/synap/SKILL.md +81 -44
- package/skills/synap/code-skills.md +15 -1
- package/skills/synap/concepts.md +36 -26
- package/skills/synap/document-embeds.md +15 -1
- package/skills/synap/focus-sessions.md +4 -4
- package/skills/synap/from-intent.md +2 -2
- package/skills/synap/governance-rules.md +2 -0
- package/skills/synap/hand-off.md +10 -6
- package/skills/synap/reflexes.md +4 -4
- package/skills/synap/work-model.md +1 -1
- package/skills/synap/writing-titles.md +7 -0
- package/skills/synap-app/SKILL.md +2 -2
- package/skills/synap-app/overview.md +2 -2
- package/skills/synap-market/SKILL.md +1 -1
- package/skills/synap-market/governance-and-catalog.md +1 -1
- package/skills/synap-schema/SKILL.md +4 -1
- package/skills/synap-schema/intent-vocabulary-ssot.md +4 -1
- package/dist/commands/template.d.ts +0 -42
- package/dist/commands/template.js +0 -191
- package/dist/commands/template.js.map +0 -1
- package/dist/lib/browser-auth.d.ts +0 -35
- package/dist/lib/browser-auth.js +0 -170
- package/dist/lib/browser-auth.js.map +0 -1
- package/dist/lib/openclaw.d.ts +0 -32
- package/dist/lib/openclaw.js +0 -165
- package/dist/lib/openclaw.js.map +0 -1
- package/dist/lib/seed.d.ts +0 -13
- package/dist/lib/seed.js +0 -135
- package/dist/lib/seed.js.map +0 -1
package/dist/lib/term.js
ADDED
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The status line's terminal vocabulary: the ANSI colours, the OSC 8 link,
|
|
3
|
+
* and the one scrub every pod string goes through before it is printed.
|
|
4
|
+
*
|
|
5
|
+
* One home, so `statusline.ts`, `bridge-status.ts` and `now-line.ts` draw with
|
|
6
|
+
* the same codes and none of them prints a pod string raw.
|
|
7
|
+
*/
|
|
8
|
+
export const GREEN = "\x1b[32m";
|
|
9
|
+
export const RED = "\x1b[31m";
|
|
10
|
+
export const CYAN = "\x1b[36m";
|
|
11
|
+
export const AMBER = "\x1b[33m";
|
|
12
|
+
export const MAGENTA = "\x1b[35m";
|
|
13
|
+
export const BOLD_GREEN = "\x1b[01;32m";
|
|
14
|
+
export const BOLD_YELLOW = "\x1b[01;33m";
|
|
15
|
+
export const BOLD_RED = "\x1b[01;31m";
|
|
16
|
+
export const BOLD_BLUE = "\x1b[01;34m";
|
|
17
|
+
export const DIM = "\x1b[2m";
|
|
18
|
+
export const RESET = "\x1b[0m";
|
|
19
|
+
/**
|
|
20
|
+
* C0 (ESC, BEL, BS, …), DEL, C1 (CSI, OSC, ST as single bytes), and the bidi
|
|
21
|
+
* overrides and isolates. A pod string holding any of them could recolour the
|
|
22
|
+
* line, open an OSC 8 link of its own, set the window title or reorder what
|
|
23
|
+
* the person reads. Line breaks and tabs become one space.
|
|
24
|
+
*/
|
|
25
|
+
// eslint-disable-next-line no-control-regex
|
|
26
|
+
const CONTROL = /[\u0000-\u0008\u000b\u000c\u000e-\u001f\u007f-\u009f--]/g;
|
|
27
|
+
const BREAKS = /[\t\n\r]+/g;
|
|
28
|
+
/** A string from the pod (or any file) as the terminal may show it: no control characters. */
|
|
29
|
+
export function safeText(s) {
|
|
30
|
+
return s.replace(BREAKS, " ").replace(CONTROL, "");
|
|
31
|
+
}
|
|
32
|
+
/** Every string inside a parsed JSON value, scrubbed with {@link safeText}; the shape is kept. */
|
|
33
|
+
export function scrubStrings(value) {
|
|
34
|
+
if (typeof value === "string")
|
|
35
|
+
return safeText(value);
|
|
36
|
+
if (Array.isArray(value))
|
|
37
|
+
return value.map(scrubStrings);
|
|
38
|
+
if (value && typeof value === "object") {
|
|
39
|
+
const out = {};
|
|
40
|
+
for (const [k, v] of Object.entries(value))
|
|
41
|
+
out[k] = scrubStrings(v);
|
|
42
|
+
return out;
|
|
43
|
+
}
|
|
44
|
+
return value;
|
|
45
|
+
}
|
|
46
|
+
/** An OSC 8 hyperlink; plain text when there is no URL. Both parts are scrubbed. */
|
|
47
|
+
export function osc8(url, text) {
|
|
48
|
+
const safe = safeText(text);
|
|
49
|
+
const href = url ? safeText(url) : "";
|
|
50
|
+
return href ? `\x1b]8;;${href}\x1b\\${safe}\x1b]8;;\x1b\\` : safe;
|
|
51
|
+
}
|
|
52
|
+
//# sourceMappingURL=term.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"term.js","sourceRoot":"","sources":["../../src/lib/term.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAC;AAChC,MAAM,CAAC,MAAM,GAAG,GAAG,UAAU,CAAC;AAC9B,MAAM,CAAC,MAAM,IAAI,GAAG,UAAU,CAAC;AAC/B,MAAM,CAAC,MAAM,KAAK,GAAG,UAAU,CAAC;AAChC,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC;AAClC,MAAM,CAAC,MAAM,UAAU,GAAG,aAAa,CAAC;AACxC,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC;AACzC,MAAM,CAAC,MAAM,QAAQ,GAAG,aAAa,CAAC;AACtC,MAAM,CAAC,MAAM,SAAS,GAAG,aAAa,CAAC;AACvC,MAAM,CAAC,MAAM,GAAG,GAAG,SAAS,CAAC;AAC7B,MAAM,CAAC,MAAM,KAAK,GAAG,SAAS,CAAC;AAE/B;;;;;GAKG;AACH,4CAA4C;AAC5C,MAAM,OAAO,GAAG,gEAAgE,CAAC;AACjF,MAAM,MAAM,GAAG,YAAY,CAAC;AAE5B,8FAA8F;AAC9F,MAAM,UAAU,QAAQ,CAAC,CAAS;IAChC,OAAO,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;AACrD,CAAC;AAED,kGAAkG;AAClG,MAAM,UAAU,YAAY,CAAI,KAAQ;IACtC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC,KAAK,CAAM,CAAC;IAC3D,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC;QAAE,OAAO,KAAK,CAAC,GAAG,CAAC,YAAY,CAAM,CAAC;IAC9D,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACvC,MAAM,GAAG,GAA4B,EAAE,CAAC;QACxC,KAAK,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC;YAAE,GAAG,CAAC,CAAC,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC;QACrE,OAAO,GAAQ,CAAC;IAClB,CAAC;IACD,OAAO,KAAK,CAAC;AACf,CAAC;AAED,oFAAoF;AACpF,MAAM,UAAU,IAAI,CAAC,GAA8B,EAAE,IAAY;IAC/D,MAAM,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,MAAM,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACtC,OAAO,IAAI,CAAC,CAAC,CAAC,WAAW,IAAI,SAAS,IAAI,gBAAgB,CAAC,CAAC,CAAC,IAAI,CAAC;AACpE,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { describe, it, expect } from "vitest";
|
|
2
|
+
import { osc8, safeText, scrubStrings } from "./term.js";
|
|
3
|
+
describe("safeText: what a pod string may put on the terminal", () => {
|
|
4
|
+
it("drops ESC, BEL and the rest of C0, DEL and C1, so no sequence can start", () => {
|
|
5
|
+
expect(safeText("a\x1b[31mb\x07c\x00d\x7fe\x9b2Jf\x9dg")).toBe("a[31mbcde2Jfg");
|
|
6
|
+
});
|
|
7
|
+
it("drops the bidi overrides and isolates", () => {
|
|
8
|
+
expect(safeText("abcdef")).toBe("abcdef");
|
|
9
|
+
});
|
|
10
|
+
it("turns line breaks and tabs into one space, and keeps ordinary text whole", () => {
|
|
11
|
+
expect(safeText("one\r\n\ttwo")).toBe("one two");
|
|
12
|
+
expect(safeText("Café · ⏳ 3 — «ok» 日本")).toBe("Café · ⏳ 3 — «ok» 日本");
|
|
13
|
+
});
|
|
14
|
+
});
|
|
15
|
+
describe("scrubStrings", () => {
|
|
16
|
+
it("scrubs every string at any depth and keeps the shape and the other values", () => {
|
|
17
|
+
expect(scrubStrings({ a: "x\x1b", b: [1, "y\x07", null, { c: "z\x9b" }], d: true })).toEqual({ a: "x", b: [1, "y", null, { c: "z" }], d: true });
|
|
18
|
+
});
|
|
19
|
+
});
|
|
20
|
+
describe("osc8", () => {
|
|
21
|
+
it("wraps a link, scrubbing both its URL and its text", () => {
|
|
22
|
+
expect(osc8("https://a.test/\x1b\\x", "n\x1b]8;;https://evil\x1b\\")).toBe("\x1b]8;;https://a.test/\\x\x1b\\n]8;;https://evil\\\x1b]8;;\x1b\\");
|
|
23
|
+
});
|
|
24
|
+
it("is plain text with no URL", () => {
|
|
25
|
+
expect(osc8("", "name\x07")).toBe("name");
|
|
26
|
+
expect(osc8(null, "name")).toBe("name");
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
//# sourceMappingURL=term.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"term.test.js","sourceRoot":"","sources":["../../src/lib/term.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,IAAI,EAAE,QAAQ,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEzD,QAAQ,CAAC,qDAAqD,EAAE,GAAG,EAAE;IACnE,EAAE,CAAC,yEAAyE,EAAE,GAAG,EAAE;QACjF,MAAM,CAAC,QAAQ,CAAC,uCAAuC,CAAC,CAAC,CAAC,IAAI,CAAC,eAAe,CAAC,CAAC;IAClF,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,0EAA0E,EAAE,GAAG,EAAE;QAClF,MAAM,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QACjD,MAAM,CAAC,QAAQ,CAAC,sBAAsB,CAAC,CAAC,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACxE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,cAAc,EAAE,GAAG,EAAE;IAC5B,EAAE,CAAC,2EAA2E,EAAE,GAAG,EAAE;QACnF,MAAM,CAAC,YAAY,CAAC,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC;IACnJ,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,MAAM,EAAE,GAAG,EAAE;IACpB,EAAE,CAAC,mDAAmD,EAAE,GAAG,EAAE;QAC3D,MAAM,CAAC,IAAI,CAAC,wBAAwB,EAAE,6BAA6B,CAAC,CAAC,CAAC,IAAI,CAAC,mEAAmE,CAAC,CAAC;IAClJ,CAAC,CAAC,CAAC;IACH,EAAE,CAAC,2BAA2B,EAAE,GAAG,EAAE;QACnC,MAAM,CAAC,IAAI,CAAC,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAC1C,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC1C,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small incremental index of what a Claude Code conversation has running in
|
|
3
|
+
* the background, built from its transcript JSONL.
|
|
4
|
+
*
|
|
5
|
+
* The transcript is append-only and can pass 50 MB, so it is never re-read:
|
|
6
|
+
* the index keeps the byte offset it has read up to, and each update reads only
|
|
7
|
+
* what was appended since. Most lines are skipped by a substring test before
|
|
8
|
+
* any JSON.parse. A file smaller than the offset (truncated or replaced) is
|
|
9
|
+
* read again from 0.
|
|
10
|
+
*
|
|
11
|
+
* What opens and closes a background task (Claude Code 2.1.x transcripts):
|
|
12
|
+
* - a `tool_use` (Bash, Agent, Monitor), then its `tool_result` line whose
|
|
13
|
+
* `toolUseResult` names the task: Bash `backgroundTaskId` (also a command
|
|
14
|
+
* moved to the background by its timeout), Agent `status: "async_launched"`
|
|
15
|
+
* + `agentId`, Agent `status: "teammate_spawned"` (a teammate, keyed by
|
|
16
|
+
* agent id and known by name), Monitor `taskId`;
|
|
17
|
+
* - a `<task-notification>` (`<task-id>`, `<status>`, `<summary>`), in a
|
|
18
|
+
* user message or, when it arrives while a turn runs, in a
|
|
19
|
+
* `queue-operation` `enqueue` line (every notice is enqueued first; on
|
|
20
|
+
* 2026-10-30, 79 of 153 in one transcript were never written in another
|
|
21
|
+
* form). It can name several tasks and can fire more than once for one
|
|
22
|
+
* agent: the last event wins;
|
|
23
|
+
* - a `TaskStop` tool_use (`input.task_id`);
|
|
24
|
+
* - a teammate goes idle with an `idle_notification` teammate message, and is
|
|
25
|
+
* busy again after a SendMessage to it succeeds; a SendMessage result with
|
|
26
|
+
* `resumedAgentId` reopens that agent.
|
|
27
|
+
*
|
|
28
|
+
* Pure apart from `loadIndex` / `saveIndex` / `updateIndex`, which touch only
|
|
29
|
+
* `~/.synap/statusline/` and the transcript. Never the network.
|
|
30
|
+
*/
|
|
31
|
+
export type TaskKind = "bash" | "agent" | "monitor" | "teammate";
|
|
32
|
+
export interface OpenTask {
|
|
33
|
+
kind: TaskKind;
|
|
34
|
+
description: string;
|
|
35
|
+
command?: string;
|
|
36
|
+
toolUseId: string;
|
|
37
|
+
startedAt: number;
|
|
38
|
+
name?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface ClosedTask extends OpenTask {
|
|
41
|
+
taskId: string;
|
|
42
|
+
status: string;
|
|
43
|
+
closedAt: number;
|
|
44
|
+
}
|
|
45
|
+
interface PendingLaunch {
|
|
46
|
+
name: string;
|
|
47
|
+
description: string;
|
|
48
|
+
command?: string;
|
|
49
|
+
to?: string;
|
|
50
|
+
at: number;
|
|
51
|
+
}
|
|
52
|
+
export interface TranscriptIndex {
|
|
53
|
+
v: 1;
|
|
54
|
+
path: string;
|
|
55
|
+
offset: number;
|
|
56
|
+
size: number;
|
|
57
|
+
open: Record<string, OpenTask>;
|
|
58
|
+
recentlyClosed: ClosedTask[];
|
|
59
|
+
/** tool_use ids still waiting for their tool_result (capped). */
|
|
60
|
+
pending: Record<string, PendingLaunch>;
|
|
61
|
+
/** teammate name → agent id, so a later SendMessage or idle notice finds it. */
|
|
62
|
+
teammates: Record<string, string>;
|
|
63
|
+
lastEventAt: number;
|
|
64
|
+
}
|
|
65
|
+
export declare function emptyIndex(transcriptPath: string): TranscriptIndex;
|
|
66
|
+
export declare function indexDir(): string;
|
|
67
|
+
export declare function indexPath(sessionId: string): string;
|
|
68
|
+
export declare function indexLockPath(sessionId: string): string;
|
|
69
|
+
/**
|
|
70
|
+
* Where Claude Code keeps a conversation's transcript when stdin does not say:
|
|
71
|
+
* `~/.claude/projects/<cwd with / and . replaced by ->/<session_id>.jsonl`.
|
|
72
|
+
*/
|
|
73
|
+
export declare function defaultTranscriptPath(cwd: string, sessionId: string): string;
|
|
74
|
+
export declare function loadIndex(sessionId: string): TranscriptIndex | null;
|
|
75
|
+
export declare function saveIndex(sessionId: string, idx: TranscriptIndex): void;
|
|
76
|
+
/** Apply one transcript line to the index. Cheap for the lines that matter to nothing. */
|
|
77
|
+
export declare function applyLine(idx: TranscriptIndex, line: string, now?: number): void;
|
|
78
|
+
export interface UpdateResult {
|
|
79
|
+
index: TranscriptIndex;
|
|
80
|
+
changed: boolean;
|
|
81
|
+
/** Bytes still unread: more than `maxBytes` were pending, so nothing was read. */
|
|
82
|
+
behind: number;
|
|
83
|
+
}
|
|
84
|
+
/**
|
|
85
|
+
* Bring `prev` up to date with the transcript at `transcriptPath`, reading at
|
|
86
|
+
* most `maxBytes` new bytes (render) or everything (the detached refresh,
|
|
87
|
+
* `maxBytes: Infinity`, in 4 MB chunks). Complete lines only: a half-written
|
|
88
|
+
* last line is left for the next update.
|
|
89
|
+
*/
|
|
90
|
+
export declare function updateIndex(prev: TranscriptIndex | null, transcriptPath: string, opts: {
|
|
91
|
+
maxBytes: number;
|
|
92
|
+
now?: number;
|
|
93
|
+
}): UpdateResult;
|
|
94
|
+
export {};
|
|
@@ -0,0 +1,321 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A small incremental index of what a Claude Code conversation has running in
|
|
3
|
+
* the background, built from its transcript JSONL.
|
|
4
|
+
*
|
|
5
|
+
* The transcript is append-only and can pass 50 MB, so it is never re-read:
|
|
6
|
+
* the index keeps the byte offset it has read up to, and each update reads only
|
|
7
|
+
* what was appended since. Most lines are skipped by a substring test before
|
|
8
|
+
* any JSON.parse. A file smaller than the offset (truncated or replaced) is
|
|
9
|
+
* read again from 0.
|
|
10
|
+
*
|
|
11
|
+
* What opens and closes a background task (Claude Code 2.1.x transcripts):
|
|
12
|
+
* - a `tool_use` (Bash, Agent, Monitor), then its `tool_result` line whose
|
|
13
|
+
* `toolUseResult` names the task: Bash `backgroundTaskId` (also a command
|
|
14
|
+
* moved to the background by its timeout), Agent `status: "async_launched"`
|
|
15
|
+
* + `agentId`, Agent `status: "teammate_spawned"` (a teammate, keyed by
|
|
16
|
+
* agent id and known by name), Monitor `taskId`;
|
|
17
|
+
* - a `<task-notification>` (`<task-id>`, `<status>`, `<summary>`), in a
|
|
18
|
+
* user message or, when it arrives while a turn runs, in a
|
|
19
|
+
* `queue-operation` `enqueue` line (every notice is enqueued first; on
|
|
20
|
+
* 2026-10-30, 79 of 153 in one transcript were never written in another
|
|
21
|
+
* form). It can name several tasks and can fire more than once for one
|
|
22
|
+
* agent: the last event wins;
|
|
23
|
+
* - a `TaskStop` tool_use (`input.task_id`);
|
|
24
|
+
* - a teammate goes idle with an `idle_notification` teammate message, and is
|
|
25
|
+
* busy again after a SendMessage to it succeeds; a SendMessage result with
|
|
26
|
+
* `resumedAgentId` reopens that agent.
|
|
27
|
+
*
|
|
28
|
+
* Pure apart from `loadIndex` / `saveIndex` / `updateIndex`, which touch only
|
|
29
|
+
* `~/.synap/statusline/` and the transcript. Never the network.
|
|
30
|
+
*/
|
|
31
|
+
import fs from "node:fs";
|
|
32
|
+
import os from "node:os";
|
|
33
|
+
import path from "node:path";
|
|
34
|
+
const MAX_PENDING = 100;
|
|
35
|
+
const MAX_OPEN = 50;
|
|
36
|
+
const MAX_CLOSED = 20;
|
|
37
|
+
const CHUNK = 4 * 1024 * 1024;
|
|
38
|
+
export function emptyIndex(transcriptPath) {
|
|
39
|
+
return { v: 1, path: transcriptPath, offset: 0, size: 0, open: {}, recentlyClosed: [], pending: {}, teammates: {}, lastEventAt: 0 };
|
|
40
|
+
}
|
|
41
|
+
export function indexDir() {
|
|
42
|
+
return path.join(os.homedir(), ".synap", "statusline");
|
|
43
|
+
}
|
|
44
|
+
function safeId(sessionId) {
|
|
45
|
+
return sessionId.replace(/[^A-Za-z0-9_-]/g, "") || "_nosession";
|
|
46
|
+
}
|
|
47
|
+
export function indexPath(sessionId) {
|
|
48
|
+
return path.join(indexDir(), `${safeId(sessionId)}.json`);
|
|
49
|
+
}
|
|
50
|
+
export function indexLockPath(sessionId) {
|
|
51
|
+
return path.join(indexDir(), `${safeId(sessionId)}.lock`);
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Where Claude Code keeps a conversation's transcript when stdin does not say:
|
|
55
|
+
* `~/.claude/projects/<cwd with / and . replaced by ->/<session_id>.jsonl`.
|
|
56
|
+
*/
|
|
57
|
+
export function defaultTranscriptPath(cwd, sessionId) {
|
|
58
|
+
return path.join(os.homedir(), ".claude", "projects", cwd.replace(/[/.]/g, "-"), `${sessionId}.jsonl`);
|
|
59
|
+
}
|
|
60
|
+
export function loadIndex(sessionId) {
|
|
61
|
+
try {
|
|
62
|
+
const idx = JSON.parse(fs.readFileSync(indexPath(sessionId), "utf-8"));
|
|
63
|
+
return idx && idx.v === 1 && typeof idx.offset === "number" ? idx : null;
|
|
64
|
+
}
|
|
65
|
+
catch {
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
export function saveIndex(sessionId, idx) {
|
|
70
|
+
fs.mkdirSync(indexDir(), { recursive: true });
|
|
71
|
+
const target = indexPath(sessionId);
|
|
72
|
+
const tmp = `${target}.${process.pid}.tmp`;
|
|
73
|
+
fs.writeFileSync(tmp, JSON.stringify(idx));
|
|
74
|
+
fs.renameSync(tmp, target);
|
|
75
|
+
}
|
|
76
|
+
// ── Line parsing ───────────────────────────────────────────────────────
|
|
77
|
+
function tsOf(o, fallback) {
|
|
78
|
+
const t = typeof o.timestamp === "string" ? Date.parse(o.timestamp) : NaN;
|
|
79
|
+
return Number.isFinite(t) ? t : fallback;
|
|
80
|
+
}
|
|
81
|
+
function textOf(content) {
|
|
82
|
+
if (typeof content === "string")
|
|
83
|
+
return content;
|
|
84
|
+
if (Array.isArray(content)) {
|
|
85
|
+
return content
|
|
86
|
+
.map((c) => (c && typeof c === "object" && typeof c.text === "string" ? c.text : ""))
|
|
87
|
+
.join("\n");
|
|
88
|
+
}
|
|
89
|
+
return "";
|
|
90
|
+
}
|
|
91
|
+
function oneLine(s, max) {
|
|
92
|
+
const t = s.replace(/\s+/g, " ").trim();
|
|
93
|
+
return t.length > max ? `${t.slice(0, max - 1)}…` : t;
|
|
94
|
+
}
|
|
95
|
+
function close(idx, taskId, status, at) {
|
|
96
|
+
const task = idx.open[taskId] ?? idx.recentlyClosed.find((c) => c.taskId === taskId);
|
|
97
|
+
delete idx.open[taskId];
|
|
98
|
+
if (!task)
|
|
99
|
+
return;
|
|
100
|
+
idx.recentlyClosed = idx.recentlyClosed.filter((c) => c.taskId !== taskId);
|
|
101
|
+
const { kind, description, command, toolUseId, startedAt, name } = task;
|
|
102
|
+
idx.recentlyClosed.push({ kind, description, command, toolUseId, startedAt, name, taskId, status, closedAt: at });
|
|
103
|
+
if (idx.recentlyClosed.length > MAX_CLOSED)
|
|
104
|
+
idx.recentlyClosed.splice(0, idx.recentlyClosed.length - MAX_CLOSED);
|
|
105
|
+
}
|
|
106
|
+
function open(idx, taskId, task) {
|
|
107
|
+
idx.recentlyClosed = idx.recentlyClosed.filter((c) => c.taskId !== taskId);
|
|
108
|
+
idx.open[taskId] = task;
|
|
109
|
+
const ids = Object.keys(idx.open);
|
|
110
|
+
if (ids.length > MAX_OPEN) {
|
|
111
|
+
ids.sort((a, b) => idx.open[a].startedAt - idx.open[b].startedAt);
|
|
112
|
+
for (const id of ids.slice(0, ids.length - MAX_OPEN))
|
|
113
|
+
delete idx.open[id];
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
/** Reopen a closed task (a resumed agent, a teammate given work), keeping what it was. */
|
|
117
|
+
function reopen(idx, taskId, at) {
|
|
118
|
+
if (idx.open[taskId])
|
|
119
|
+
return;
|
|
120
|
+
const prev = idx.recentlyClosed.find((c) => c.taskId === taskId);
|
|
121
|
+
if (!prev)
|
|
122
|
+
return;
|
|
123
|
+
const { kind, description, command, toolUseId, name } = prev;
|
|
124
|
+
open(idx, taskId, { kind, description, command, toolUseId, name, startedAt: at });
|
|
125
|
+
}
|
|
126
|
+
function addPending(idx, id, p) {
|
|
127
|
+
idx.pending[id] = p;
|
|
128
|
+
const ids = Object.keys(idx.pending);
|
|
129
|
+
if (ids.length > MAX_PENDING) {
|
|
130
|
+
ids.sort((a, b) => idx.pending[a].at - idx.pending[b].at);
|
|
131
|
+
for (const x of ids.slice(0, ids.length - MAX_PENDING))
|
|
132
|
+
delete idx.pending[x];
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
const NOTIFICATION = /<task-notification>([\s\S]*?)<\/task-notification>/g;
|
|
136
|
+
const TEAMMATE_MSG = /<teammate-message\b[^>]*>([\s\S]*?)<\/teammate-message>/g;
|
|
137
|
+
function applyNotifications(idx, text, at) {
|
|
138
|
+
for (const m of text.matchAll(NOTIFICATION)) {
|
|
139
|
+
const body = m[1];
|
|
140
|
+
const status = /<status>([\s\S]*?)<\/status>/.exec(body)?.[1]?.trim() || "completed";
|
|
141
|
+
for (const t of body.matchAll(/<task-id>([\s\S]*?)<\/task-id>/g)) {
|
|
142
|
+
const id = t[1].trim();
|
|
143
|
+
if (id && !id.startsWith("__"))
|
|
144
|
+
close(idx, id, status, at); // "__orphan_summary…" is a scan marker
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
for (const m of text.matchAll(TEAMMATE_MSG)) {
|
|
148
|
+
const first = m[1].trim().split("\n")[0];
|
|
149
|
+
if (!first.startsWith("{"))
|
|
150
|
+
continue;
|
|
151
|
+
try {
|
|
152
|
+
const msg = JSON.parse(first);
|
|
153
|
+
const agentId = msg.from ? idx.teammates[msg.from] : undefined;
|
|
154
|
+
if (agentId && msg.type === "idle_notification")
|
|
155
|
+
close(idx, agentId, "idle", at);
|
|
156
|
+
}
|
|
157
|
+
catch {
|
|
158
|
+
/* a teammate message that only looks like JSON */
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/** Apply one transcript line to the index. Cheap for the lines that matter to nothing. */
|
|
163
|
+
export function applyLine(idx, line, now = Date.now()) {
|
|
164
|
+
const isAssistantToolUse = line.includes('"type":"assistant"') && line.includes('"type":"tool_use"');
|
|
165
|
+
const isNotification = line.includes("<task-notification>") || line.includes("idle_notification");
|
|
166
|
+
let isResult = false;
|
|
167
|
+
if (!isAssistantToolUse && !isNotification && line.includes('"tool_result"')) {
|
|
168
|
+
for (const id in idx.pending) {
|
|
169
|
+
if (line.includes(id)) {
|
|
170
|
+
isResult = true;
|
|
171
|
+
break;
|
|
172
|
+
}
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
if (!isAssistantToolUse && !isNotification && !isResult)
|
|
176
|
+
return;
|
|
177
|
+
let o;
|
|
178
|
+
try {
|
|
179
|
+
o = JSON.parse(line);
|
|
180
|
+
}
|
|
181
|
+
catch {
|
|
182
|
+
return; // a torn or foreign line
|
|
183
|
+
}
|
|
184
|
+
const at = tsOf(o, now);
|
|
185
|
+
if (at > idx.lastEventAt)
|
|
186
|
+
idx.lastEventAt = at;
|
|
187
|
+
const message = (o.message ?? {});
|
|
188
|
+
if (o.type === "assistant" && Array.isArray(message.content)) {
|
|
189
|
+
for (const c of message.content) {
|
|
190
|
+
if (!c || c.type !== "tool_use" || typeof c.id !== "string")
|
|
191
|
+
continue;
|
|
192
|
+
const input = (c.input ?? {});
|
|
193
|
+
const str = (k) => (typeof input[k] === "string" ? input[k] : "");
|
|
194
|
+
switch (c.name) {
|
|
195
|
+
case "Bash":
|
|
196
|
+
addPending(idx, c.id, { name: "Bash", description: oneLine(str("description") || str("command"), 80), command: str("command").slice(0, 2000), at });
|
|
197
|
+
break;
|
|
198
|
+
case "Agent":
|
|
199
|
+
addPending(idx, c.id, { name: "Agent", description: oneLine(str("description") || str("name") || "agent", 80), to: str("name") || undefined, at });
|
|
200
|
+
break;
|
|
201
|
+
case "Monitor":
|
|
202
|
+
addPending(idx, c.id, { name: "Monitor", description: oneLine(str("description") || str("command") || "monitor", 80), command: str("command").slice(0, 2000), at });
|
|
203
|
+
break;
|
|
204
|
+
case "SendMessage":
|
|
205
|
+
if (str("to"))
|
|
206
|
+
addPending(idx, c.id, { name: "SendMessage", description: "", to: str("to"), at });
|
|
207
|
+
break;
|
|
208
|
+
case "TaskStop": {
|
|
209
|
+
const id = str("task_id") || str("shell_id");
|
|
210
|
+
if (id)
|
|
211
|
+
close(idx, idx.teammates[id] ?? id, "stopped", at);
|
|
212
|
+
break;
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
return;
|
|
217
|
+
}
|
|
218
|
+
// A notice that arrives while a turn runs is queued: its `enqueue` line is
|
|
219
|
+
// the first (and often the only) record of it, before any user message.
|
|
220
|
+
if (o.type === "queue-operation") {
|
|
221
|
+
if (isNotification && o.operation === "enqueue" && typeof o.content === "string")
|
|
222
|
+
applyNotifications(idx, o.content, at);
|
|
223
|
+
return;
|
|
224
|
+
}
|
|
225
|
+
if (o.type !== "user")
|
|
226
|
+
return;
|
|
227
|
+
if (Array.isArray(message.content)) {
|
|
228
|
+
const tr = (o.toolUseResult ?? {});
|
|
229
|
+
for (const c of message.content) {
|
|
230
|
+
if (!c || c.type !== "tool_result" || typeof c.tool_use_id !== "string")
|
|
231
|
+
continue;
|
|
232
|
+
const p = idx.pending[c.tool_use_id];
|
|
233
|
+
if (!p)
|
|
234
|
+
continue;
|
|
235
|
+
delete idx.pending[c.tool_use_id];
|
|
236
|
+
const base = { description: p.description, command: p.command, toolUseId: c.tool_use_id, startedAt: p.at };
|
|
237
|
+
if (p.name === "Bash" && typeof tr.backgroundTaskId === "string") {
|
|
238
|
+
open(idx, tr.backgroundTaskId, { kind: "bash", ...base });
|
|
239
|
+
}
|
|
240
|
+
else if (p.name === "Monitor" && typeof tr.taskId === "string") {
|
|
241
|
+
open(idx, tr.taskId, { kind: "monitor", ...base });
|
|
242
|
+
}
|
|
243
|
+
else if (p.name === "Agent" && tr.status === "async_launched" && typeof tr.agentId === "string") {
|
|
244
|
+
open(idx, tr.agentId, { kind: "agent", ...base, name: p.to });
|
|
245
|
+
}
|
|
246
|
+
else if (p.name === "Agent" && tr.status === "teammate_spawned" && typeof tr.agentId === "string") {
|
|
247
|
+
const name = typeof tr.name === "string" ? tr.name : p.to;
|
|
248
|
+
if (name)
|
|
249
|
+
idx.teammates[name] = tr.agentId;
|
|
250
|
+
open(idx, tr.agentId, { kind: "teammate", ...base, description: name ? `@${name}` : p.description, name });
|
|
251
|
+
}
|
|
252
|
+
else if (p.name === "SendMessage" && tr.success === true) {
|
|
253
|
+
if (typeof tr.resumedAgentId === "string")
|
|
254
|
+
reopen(idx, tr.resumedAgentId, at);
|
|
255
|
+
const target = p.to ? idx.teammates[p.to.replace(/^@/, "")] ?? p.to : undefined;
|
|
256
|
+
if (target)
|
|
257
|
+
reopen(idx, target, at);
|
|
258
|
+
}
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
if (isNotification)
|
|
262
|
+
applyNotifications(idx, textOf(message.content), at);
|
|
263
|
+
}
|
|
264
|
+
/**
|
|
265
|
+
* Bring `prev` up to date with the transcript at `transcriptPath`, reading at
|
|
266
|
+
* most `maxBytes` new bytes (render) or everything (the detached refresh,
|
|
267
|
+
* `maxBytes: Infinity`, in 4 MB chunks). Complete lines only: a half-written
|
|
268
|
+
* last line is left for the next update.
|
|
269
|
+
*/
|
|
270
|
+
export function updateIndex(prev, transcriptPath, opts) {
|
|
271
|
+
const now = opts.now ?? Date.now();
|
|
272
|
+
let size;
|
|
273
|
+
try {
|
|
274
|
+
size = fs.statSync(transcriptPath).size;
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
return { index: prev ?? emptyIndex(transcriptPath), changed: false, behind: 0 };
|
|
278
|
+
}
|
|
279
|
+
let idx = prev && prev.path === transcriptPath && size >= prev.offset ? prev : emptyIndex(transcriptPath);
|
|
280
|
+
const rescanned = idx !== prev;
|
|
281
|
+
const pending = size - idx.offset;
|
|
282
|
+
if (pending <= 0)
|
|
283
|
+
return { index: idx, changed: rescanned, behind: 0 };
|
|
284
|
+
if (pending > opts.maxBytes)
|
|
285
|
+
return { index: idx, changed: rescanned, behind: pending };
|
|
286
|
+
idx = structuredClone(idx);
|
|
287
|
+
let fd;
|
|
288
|
+
try {
|
|
289
|
+
fd = fs.openSync(transcriptPath, "r");
|
|
290
|
+
}
|
|
291
|
+
catch {
|
|
292
|
+
return { index: idx, changed: rescanned, behind: pending };
|
|
293
|
+
}
|
|
294
|
+
try {
|
|
295
|
+
let pos = idx.offset;
|
|
296
|
+
let carry = Buffer.alloc(0);
|
|
297
|
+
while (pos < size) {
|
|
298
|
+
const buf = Buffer.alloc(Math.min(CHUNK, size - pos));
|
|
299
|
+
const n = fs.readSync(fd, buf, 0, buf.length, pos);
|
|
300
|
+
if (n <= 0)
|
|
301
|
+
break;
|
|
302
|
+
pos += n;
|
|
303
|
+
const data = carry.length ? Buffer.concat([carry, buf.subarray(0, n)]) : buf.subarray(0, n);
|
|
304
|
+
let start = 0;
|
|
305
|
+
for (let nl = data.indexOf(0x0a, start); nl !== -1; nl = data.indexOf(0x0a, start)) {
|
|
306
|
+
const line = data.toString("utf-8", start, nl);
|
|
307
|
+
if (line)
|
|
308
|
+
applyLine(idx, line, now);
|
|
309
|
+
start = nl + 1;
|
|
310
|
+
}
|
|
311
|
+
idx.offset += start; // up to the last complete line of this chunk
|
|
312
|
+
carry = Buffer.from(data.subarray(start));
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
finally {
|
|
316
|
+
fs.closeSync(fd);
|
|
317
|
+
}
|
|
318
|
+
idx.size = size;
|
|
319
|
+
return { index: idx, changed: true, behind: 0 };
|
|
320
|
+
}
|
|
321
|
+
//# sourceMappingURL=transcript-index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-index.js","sourceRoot":"","sources":["../../src/lib/transcript-index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AAEH,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAyC7B,MAAM,WAAW,GAAG,GAAG,CAAC;AACxB,MAAM,QAAQ,GAAG,EAAE,CAAC;AACpB,MAAM,UAAU,GAAG,EAAE,CAAC;AACtB,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAE9B,MAAM,UAAU,UAAU,CAAC,cAAsB;IAC/C,OAAO,EAAE,CAAC,EAAE,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE,cAAc,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,EAAE,EAAE,WAAW,EAAE,CAAC,EAAE,CAAC;AACtI,CAAC;AAED,MAAM,UAAU,QAAQ;IACtB,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,YAAY,CAAC,CAAC;AACzD,CAAC;AAED,SAAS,MAAM,CAAC,SAAiB;IAC/B,OAAO,SAAS,CAAC,OAAO,CAAC,iBAAiB,EAAE,EAAE,CAAC,IAAI,YAAY,CAAC;AAClE,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAiB;IACzC,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED,MAAM,UAAU,aAAa,CAAC,SAAiB;IAC7C,OAAO,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,EAAE,GAAG,MAAM,CAAC,SAAS,CAAC,OAAO,CAAC,CAAC;AAC5D,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,qBAAqB,CAAC,GAAW,EAAE,SAAiB;IAClE,OAAO,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,UAAU,EAAE,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,SAAS,QAAQ,CAAC,CAAC;AACzG,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAiB;IACzC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,SAAS,CAAC,EAAE,OAAO,CAAC,CAAoB,CAAC;QAC1F,OAAO,GAAG,IAAI,GAAG,CAAC,CAAC,KAAK,CAAC,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC;IAC3E,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,MAAM,UAAU,SAAS,CAAC,SAAiB,EAAE,GAAoB;IAC/D,EAAE,CAAC,SAAS,CAAC,QAAQ,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;IAC9C,MAAM,MAAM,GAAG,SAAS,CAAC,SAAS,CAAC,CAAC;IACpC,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,MAAM,CAAC;IAC3C,EAAE,CAAC,aAAa,CAAC,GAAG,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3C,EAAE,CAAC,UAAU,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;AAC7B,CAAC;AAED,0EAA0E;AAE1E,SAAS,IAAI,CAAC,CAA0B,EAAE,QAAgB;IACxD,MAAM,CAAC,GAAG,OAAO,CAAC,CAAC,SAAS,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;IAC1E,OAAO,MAAM,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC3C,CAAC;AAED,SAAS,MAAM,CAAC,OAAgB;IAC9B,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO;aACX,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAQ,CAAwB,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAE,CAAsB,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;aAClI,IAAI,CAAC,IAAI,CAAC,CAAC;IAChB,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC;AAED,SAAS,OAAO,CAAC,CAAS,EAAE,GAAW;IACrC,MAAM,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACxC,OAAO,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;AACxD,CAAC;AAED,SAAS,KAAK,CAAC,GAAoB,EAAE,MAAc,EAAE,MAAc,EAAE,EAAU;IAC7E,MAAM,IAAI,GAAG,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,IAAI,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACrF,OAAO,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IACxB,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC3E,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IACxE,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,EAAE,EAAE,CAAC,CAAC;IAClH,IAAI,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,UAAU;QAAE,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,EAAE,GAAG,CAAC,cAAc,CAAC,MAAM,GAAG,UAAU,CAAC,CAAC;AACnH,CAAC;AAED,SAAS,IAAI,CAAC,GAAoB,EAAE,MAAc,EAAE,IAAc;IAChE,GAAG,CAAC,cAAc,GAAG,GAAG,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IAC3E,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC;IACxB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IAClC,IAAI,GAAG,CAAC,MAAM,GAAG,QAAQ,EAAE,CAAC;QAC1B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC;QAClE,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,QAAQ,CAAC;YAAE,OAAO,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC5E,CAAC;AACH,CAAC;AAED,0FAA0F;AAC1F,SAAS,MAAM,CAAC,GAAoB,EAAE,MAAc,EAAE,EAAU;IAC9D,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QAAE,OAAO;IAC7B,MAAM,IAAI,GAAG,GAAG,CAAC,cAAc,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,KAAK,MAAM,CAAC,CAAC;IACjE,IAAI,CAAC,IAAI;QAAE,OAAO;IAClB,MAAM,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC;IAC7D,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;AACpF,CAAC;AAED,SAAS,UAAU,CAAC,GAAoB,EAAE,EAAU,EAAE,CAAgB;IACpE,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC;IACpB,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;IACrC,IAAI,GAAG,CAAC,MAAM,GAAG,WAAW,EAAE,CAAC;QAC7B,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;QAC1D,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,WAAW,CAAC;YAAE,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC;IAChF,CAAC;AACH,CAAC;AAED,MAAM,YAAY,GAAG,qDAAqD,CAAC;AAC3E,MAAM,YAAY,GAAG,0DAA0D,CAAC;AAEhF,SAAS,kBAAkB,CAAC,GAAoB,EAAE,IAAY,EAAE,EAAU;IACxE,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5C,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAClB,MAAM,MAAM,GAAG,8BAA8B,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,WAAW,CAAC;QACrF,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,iCAAiC,CAAC,EAAE,CAAC;YACjE,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACvB,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,IAAI,CAAC;gBAAE,KAAK,CAAC,GAAG,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,uCAAuC;QACrG,CAAC;IACH,CAAC;IACD,KAAK,MAAM,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,YAAY,CAAC,EAAE,CAAC;QAC5C,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QACzC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC;YAAE,SAAS;QACrC,IAAI,CAAC;YACH,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAqC,CAAC;YAClE,MAAM,OAAO,GAAG,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;YAC/D,IAAI,OAAO,IAAI,GAAG,CAAC,IAAI,KAAK,mBAAmB;gBAAE,KAAK,CAAC,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;QACnF,CAAC;QAAC,MAAM,CAAC;YACP,kDAAkD;QACpD,CAAC;IACH,CAAC;AACH,CAAC;AAED,0FAA0F;AAC1F,MAAM,UAAU,SAAS,CAAC,GAAoB,EAAE,IAAY,EAAE,GAAG,GAAG,IAAI,CAAC,GAAG,EAAE;IAC5E,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,oBAAoB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IACrG,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,qBAAqB,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,CAAC;IAClG,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,CAAC,kBAAkB,IAAI,CAAC,cAAc,IAAI,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,EAAE,CAAC;QAC7E,KAAK,MAAM,EAAE,IAAI,GAAG,CAAC,OAAO,EAAE,CAAC;YAC7B,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;gBACtB,QAAQ,GAAG,IAAI,CAAC;gBAChB,MAAM;YACR,CAAC;QACH,CAAC;IACH,CAAC;IACD,IAAI,CAAC,kBAAkB,IAAI,CAAC,cAAc,IAAI,CAAC,QAAQ;QAAE,OAAO;IAEhE,IAAI,CAA0B,CAAC;IAC/B,IAAI,CAAC;QACH,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAA4B,CAAC;IAClD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,CAAC,yBAAyB;IACnC,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;IACxB,IAAI,EAAE,GAAG,GAAG,CAAC,WAAW;QAAE,GAAG,CAAC,WAAW,GAAG,EAAE,CAAC;IAC/C,MAAM,OAAO,GAAG,CAAC,CAAC,CAAC,OAAO,IAAI,EAAE,CAA0B,CAAC;IAE3D,IAAI,CAAC,CAAC,IAAI,KAAK,WAAW,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC7D,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAyC,EAAE,CAAC;YAClE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ;gBAAE,SAAS;YACtE,MAAM,KAAK,GAAG,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAA4B,CAAC;YACzD,MAAM,GAAG,GAAG,CAAC,CAAS,EAAE,EAAE,CAAC,CAAC,OAAO,KAAK,CAAC,CAAC,CAAC,KAAK,QAAQ,CAAC,CAAC,CAAE,KAAK,CAAC,CAAC,CAAY,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;YACtF,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;gBACf,KAAK,MAAM;oBACT,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBACpJ,MAAM;gBACR,KAAK,OAAO;oBACV,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,MAAM,CAAC,IAAI,OAAO,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,GAAG,CAAC,MAAM,CAAC,IAAI,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;oBACnJ,MAAM;gBACR,KAAK,SAAS;oBACZ,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,IAAI,GAAG,CAAC,SAAS,CAAC,IAAI,SAAS,EAAE,EAAE,CAAC,EAAE,OAAO,EAAE,GAAG,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBACpK,MAAM;gBACR,KAAK,aAAa;oBAChB,IAAI,GAAG,CAAC,IAAI,CAAC;wBAAE,UAAU,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,aAAa,EAAE,WAAW,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC;oBAClG,MAAM;gBACR,KAAK,UAAU,CAAC,CAAC,CAAC;oBAChB,MAAM,EAAE,GAAG,GAAG,CAAC,SAAS,CAAC,IAAI,GAAG,CAAC,UAAU,CAAC,CAAC;oBAC7C,IAAI,EAAE;wBAAE,KAAK,CAAC,GAAG,EAAE,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,EAAE,CAAC,CAAC;oBAC3D,MAAM;gBACR,CAAC;YACH,CAAC;QACH,CAAC;QACD,OAAO;IACT,CAAC;IAED,2EAA2E;IAC3E,wEAAwE;IACxE,IAAI,CAAC,CAAC,IAAI,KAAK,iBAAiB,EAAE,CAAC;QACjC,IAAI,cAAc,IAAI,CAAC,CAAC,SAAS,KAAK,SAAS,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ;YAAE,kBAAkB,CAAC,GAAG,EAAE,CAAC,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;QACzH,OAAO;IACT,CAAC;IAED,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM;QAAE,OAAO;IAE9B,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACnC,MAAM,EAAE,GAAG,CAAC,CAAC,CAAC,aAAa,IAAI,EAAE,CAA4B,CAAC;QAC9D,KAAK,MAAM,CAAC,IAAI,OAAO,CAAC,OAAyC,EAAE,CAAC;YAClE,IAAI,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ;gBAAE,SAAS;YAClF,MAAM,CAAC,GAAG,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YACrC,IAAI,CAAC,CAAC;gBAAE,SAAS;YACjB,OAAO,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;YAClC,MAAM,IAAI,GAAG,EAAE,WAAW,EAAE,CAAC,CAAC,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,SAAS,EAAE,CAAC,CAAC,WAAW,EAAE,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC;YAC3G,IAAI,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,EAAE,CAAC,gBAAgB,KAAK,QAAQ,EAAE,CAAC;gBACjE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,gBAAgB,EAAE,EAAE,IAAI,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;YAC5D,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,SAAS,IAAI,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;gBACjE,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,MAAM,EAAE,EAAE,IAAI,EAAE,SAAS,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;YACrD,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,EAAE,CAAC,MAAM,KAAK,gBAAgB,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBAClG,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YAChE,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,EAAE,CAAC,MAAM,KAAK,kBAAkB,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ,EAAE,CAAC;gBACpG,MAAM,IAAI,GAAG,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC1D,IAAI,IAAI;oBAAE,GAAG,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,OAAO,CAAC;gBAC3C,IAAI,CAAC,GAAG,EAAE,EAAE,CAAC,OAAO,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI,EAAE,WAAW,EAAE,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC,CAAC;YAC7G,CAAC;iBAAM,IAAI,CAAC,CAAC,IAAI,KAAK,aAAa,IAAI,EAAE,CAAC,OAAO,KAAK,IAAI,EAAE,CAAC;gBAC3D,IAAI,OAAO,EAAE,CAAC,cAAc,KAAK,QAAQ;oBAAE,MAAM,CAAC,GAAG,EAAE,EAAE,CAAC,cAAc,EAAE,EAAE,CAAC,CAAC;gBAC9E,MAAM,MAAM,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBAChF,IAAI,MAAM;oBAAE,MAAM,CAAC,GAAG,EAAE,MAAM,EAAE,EAAE,CAAC,CAAC;YACtC,CAAC;QACH,CAAC;IACH,CAAC;IAED,IAAI,cAAc;QAAE,kBAAkB,CAAC,GAAG,EAAE,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,EAAE,CAAC,CAAC;AAC3E,CAAC;AAWD;;;;;GAKG;AACH,MAAM,UAAU,WAAW,CACzB,IAA4B,EAC5B,cAAsB,EACtB,IAAwC;IAExC,MAAM,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;IACnC,IAAI,IAAY,CAAC;IACjB,IAAI,CAAC;QACH,IAAI,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,CAAC,CAAC,IAAI,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,IAAI,IAAI,UAAU,CAAC,cAAc,CAAC,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IAClF,CAAC;IACD,IAAI,GAAG,GAAG,IAAI,IAAI,IAAI,CAAC,IAAI,KAAK,cAAc,IAAI,IAAI,IAAI,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,cAAc,CAAC,CAAC;IAC1G,MAAM,SAAS,GAAG,GAAG,KAAK,IAAI,CAAC;IAC/B,MAAM,OAAO,GAAG,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC;IAClC,IAAI,OAAO,IAAI,CAAC;QAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;IACvE,IAAI,OAAO,GAAG,IAAI,CAAC,QAAQ;QAAE,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAExF,GAAG,GAAG,eAAe,CAAC,GAAG,CAAC,CAAC;IAC3B,IAAI,EAAU,CAAC;IACf,IAAI,CAAC;QACH,EAAE,GAAG,EAAE,CAAC,QAAQ,CAAC,cAAc,EAAE,GAAG,CAAC,CAAC;IACxC,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC;IAC7D,CAAC;IACD,IAAI,CAAC;QACH,IAAI,GAAG,GAAG,GAAG,CAAC,MAAM,CAAC;QACrB,IAAI,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAC5B,OAAO,GAAG,GAAG,IAAI,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;YACtD,MAAM,CAAC,GAAG,EAAE,CAAC,QAAQ,CAAC,EAAE,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;YACnD,IAAI,CAAC,IAAI,CAAC;gBAAE,MAAM;YAClB,GAAG,IAAI,CAAC,CAAC;YACT,MAAM,IAAI,GAAG,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;YAC5F,IAAI,KAAK,GAAG,CAAC,CAAC;YACd,KAAK,IAAI,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,EAAE,CAAC;gBACnF,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,CAAC,CAAC;gBAC/C,IAAI,IAAI;oBAAE,SAAS,CAAC,GAAG,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;gBACpC,KAAK,GAAG,EAAE,GAAG,CAAC,CAAC;YACjB,CAAC;YACD,GAAG,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,6CAA6C;YAClE,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QAC5C,CAAC;IACH,CAAC;YAAS,CAAC;QACT,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IACnB,CAAC;IACD,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IAChB,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC;AAClD,CAAC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The transcript index: what a conversation has running in the background,
|
|
3
|
+
* from the transcript JSONL, read incrementally.
|
|
4
|
+
*
|
|
5
|
+
* Fixture lines mirror Claude Code 2.1.x transcripts (shapes taken from real
|
|
6
|
+
* transcripts on 2026-10-29: a Bash `backgroundTaskId` result, an Agent
|
|
7
|
+
* `async_launched` result, a `teammate_spawned` result, `<task-notification>`
|
|
8
|
+
* user messages, a SendMessage `resumedAgentId` result, a TaskStop).
|
|
9
|
+
*/
|
|
10
|
+
export {};
|