@synap-core/cli 1.13.0 → 1.13.1-next.20261102.ec3d166
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/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 +6 -0
- package/dist/commands/knowledge.js +9 -1
- package/dist/commands/knowledge.js.map +1 -1
- package/dist/commands/market.d.ts +61 -4
- package/dist/commands/market.js +106 -48
- 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/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 +71 -38
- 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/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
|
@@ -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":"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"}
|
|
@@ -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 {};
|
|
@@ -0,0 +1,200 @@
|
|
|
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
|
+
import fs from "node:fs";
|
|
11
|
+
import os from "node:os";
|
|
12
|
+
import path from "node:path";
|
|
13
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
14
|
+
import { applyLine, emptyIndex, updateIndex } from "./transcript-index.js";
|
|
15
|
+
const T0 = Date.parse("2026-10-29T10:00:00.000Z");
|
|
16
|
+
const iso = (s) => new Date(T0 + s * 1000).toISOString();
|
|
17
|
+
function toolUse(id, name, input, s = 0) {
|
|
18
|
+
return JSON.stringify({
|
|
19
|
+
type: "assistant",
|
|
20
|
+
timestamp: iso(s),
|
|
21
|
+
message: { role: "assistant", content: [{ type: "tool_use", id, name, input }] },
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
function toolResult(id, toolUseResult, text = "ok", s = 1) {
|
|
25
|
+
return JSON.stringify({
|
|
26
|
+
type: "user",
|
|
27
|
+
timestamp: iso(s),
|
|
28
|
+
message: { role: "user", content: [{ type: "tool_result", tool_use_id: id, content: text }] },
|
|
29
|
+
toolUseResult,
|
|
30
|
+
});
|
|
31
|
+
}
|
|
32
|
+
function notification(taskIds, status, s, summary = "done") {
|
|
33
|
+
const ids = taskIds.map((t) => `<task-id>${t}</task-id>`).join("\n");
|
|
34
|
+
return JSON.stringify({
|
|
35
|
+
type: "user",
|
|
36
|
+
timestamp: iso(s),
|
|
37
|
+
message: { role: "user", content: `<task-notification>\n${ids}\n<status>${status}</status>\n<summary>${summary}</summary>\n</task-notification>` },
|
|
38
|
+
});
|
|
39
|
+
}
|
|
40
|
+
/** A notice that arrived while a turn ran: Claude Code queues it (shape from a real transcript, 2026-10-30). */
|
|
41
|
+
function queued(operation, taskIds, status, s) {
|
|
42
|
+
const ids = taskIds.map((t) => `<task-id>${t}</task-id>`).join("\n");
|
|
43
|
+
return JSON.stringify({
|
|
44
|
+
type: "queue-operation",
|
|
45
|
+
operation,
|
|
46
|
+
timestamp: iso(s),
|
|
47
|
+
sessionId: "s1",
|
|
48
|
+
content: `<task-notification>\n${ids}\n<tool-use-id>toolu_x</tool-use-id>\n<status>${status}</status>\n<summary>done</summary>\n</task-notification>`,
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
function teammateIdle(from, s) {
|
|
52
|
+
const body = JSON.stringify({ type: "idle_notification", from, timestamp: iso(s), idleReason: "available" });
|
|
53
|
+
return JSON.stringify({
|
|
54
|
+
type: "user",
|
|
55
|
+
timestamp: iso(s),
|
|
56
|
+
message: { role: "user", content: `<teammate-message teammate_id="${from}" color="blue">\n${body}\n</teammate-message>` },
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
function apply(lines, idx = emptyIndex("/t.jsonl")) {
|
|
60
|
+
for (const l of lines)
|
|
61
|
+
applyLine(idx, l, T0);
|
|
62
|
+
return idx;
|
|
63
|
+
}
|
|
64
|
+
describe("background tasks open and close", () => {
|
|
65
|
+
it("a Bash launch opens on its backgroundTaskId result and closes on its notification", () => {
|
|
66
|
+
const idx = apply([
|
|
67
|
+
toolUse("toolu_1", "Bash", { command: "synap wait devbox w7", description: "Wait for w7", run_in_background: true }),
|
|
68
|
+
toolResult("toolu_1", { stdout: "", backgroundTaskId: "bx1" }, "Command running in background with ID: bx1."),
|
|
69
|
+
]);
|
|
70
|
+
expect(Object.keys(idx.open)).toEqual(["bx1"]);
|
|
71
|
+
expect(idx.open.bx1).toMatchObject({ kind: "bash", description: "Wait for w7", command: "synap wait devbox w7", startedAt: T0 });
|
|
72
|
+
expect(idx.pending).toEqual({});
|
|
73
|
+
apply([notification(["bx1"], "completed", 60)], idx);
|
|
74
|
+
expect(idx.open).toEqual({});
|
|
75
|
+
expect(idx.recentlyClosed.at(-1)).toMatchObject({ taskId: "bx1", status: "completed", closedAt: T0 + 60_000 });
|
|
76
|
+
});
|
|
77
|
+
it("a notification queued while a turn runs closes its task at the enqueue", () => {
|
|
78
|
+
const launch = [
|
|
79
|
+
toolUse("toolu_q", "Bash", { command: "sleep 600", description: "Wait for the gate", run_in_background: true }),
|
|
80
|
+
toolResult("toolu_q", { backgroundTaskId: "bq1" }),
|
|
81
|
+
];
|
|
82
|
+
const idx = apply([...launch, queued("remove", ["bq1"], "completed", 30)]);
|
|
83
|
+
expect(Object.keys(idx.open)).toEqual(["bq1"]); // a remove is the queue draining, not news
|
|
84
|
+
apply([queued("enqueue", ["bq1"], "completed", 40)], idx);
|
|
85
|
+
expect(idx.open).toEqual({});
|
|
86
|
+
expect(idx.recentlyClosed.at(-1)).toMatchObject({ taskId: "bq1", status: "completed", closedAt: T0 + 40_000 });
|
|
87
|
+
});
|
|
88
|
+
it("a foreground Bash that finishes normally opens nothing", () => {
|
|
89
|
+
const idx = apply([toolUse("toolu_2", "Bash", { command: "ls" }), toolResult("toolu_2", { stdout: "a\nb" })]);
|
|
90
|
+
expect(idx.open).toEqual({});
|
|
91
|
+
expect(idx.pending).toEqual({});
|
|
92
|
+
});
|
|
93
|
+
it("a foreground Bash moved to the background by its timeout opens too", () => {
|
|
94
|
+
const idx = apply([
|
|
95
|
+
toolUse("toolu_3", "Bash", { command: "pnpm test", description: "Run tests" }),
|
|
96
|
+
toolResult("toolu_3", { stdout: "", backgroundTaskId: "bmoved" }, "Command did not complete within its 120s timeout and was moved to the background"),
|
|
97
|
+
]);
|
|
98
|
+
expect(idx.open.bmoved?.description).toBe("Run tests");
|
|
99
|
+
});
|
|
100
|
+
it("an async Agent opens on async_launched and a TaskStop closes it", () => {
|
|
101
|
+
const idx = apply([
|
|
102
|
+
toolUse("toolu_4", "Agent", { description: "Audit the flow", prompt: "…" }),
|
|
103
|
+
toolResult("toolu_4", { isAsync: true, status: "async_launched", agentId: "a5ceb" }),
|
|
104
|
+
]);
|
|
105
|
+
expect(idx.open.a5ceb).toMatchObject({ kind: "agent", description: "Audit the flow" });
|
|
106
|
+
apply([toolUse("toolu_5", "TaskStop", { task_id: "a5ceb" }, 30)], idx);
|
|
107
|
+
expect(idx.open).toEqual({});
|
|
108
|
+
expect(idx.recentlyClosed.at(-1)).toMatchObject({ taskId: "a5ceb", status: "stopped" });
|
|
109
|
+
});
|
|
110
|
+
it("a resumed agent is open again, and its next notification closes it again (last event wins)", () => {
|
|
111
|
+
const idx = apply([
|
|
112
|
+
toolUse("toolu_6", "Agent", { description: "Draft the plan" }),
|
|
113
|
+
toolResult("toolu_6", { status: "async_launched", agentId: "a48ea" }),
|
|
114
|
+
notification(["a48ea"], "completed", 100),
|
|
115
|
+
// Addressed by name: only the result's `resumedAgentId` says which task this is.
|
|
116
|
+
toolUse("toolu_7", "SendMessage", { to: "drafter", message: "one more thing" }, 200),
|
|
117
|
+
toolResult("toolu_7", { success: true, message: "Resuming agent a48ea", resumedAgentId: "a48ea" }, "ok", 201),
|
|
118
|
+
]);
|
|
119
|
+
expect(idx.open.a48ea).toMatchObject({ kind: "agent", description: "Draft the plan", startedAt: T0 + 201_000 });
|
|
120
|
+
apply([notification(["a48ea"], "completed", 300)], idx);
|
|
121
|
+
expect(idx.open).toEqual({});
|
|
122
|
+
expect(idx.recentlyClosed.filter((c) => c.taskId === "a48ea")).toHaveLength(1);
|
|
123
|
+
});
|
|
124
|
+
it("one notification can close several tasks, and its scan marker is not a task", () => {
|
|
125
|
+
const idx = apply([
|
|
126
|
+
toolUse("toolu_8", "Bash", { command: "sleep 100", run_in_background: true }),
|
|
127
|
+
toolResult("toolu_8", { backgroundTaskId: "b1" }),
|
|
128
|
+
toolUse("toolu_9", "Bash", { command: "sleep 200", run_in_background: true }),
|
|
129
|
+
toolResult("toolu_9", { backgroundTaskId: "b2" }),
|
|
130
|
+
notification(["b1", "b2", "__orphan_summary__:shell"], "stopped", 50),
|
|
131
|
+
]);
|
|
132
|
+
expect(idx.open).toEqual({});
|
|
133
|
+
expect(idx.recentlyClosed.map((c) => c.taskId)).toEqual(["b1", "b2"]);
|
|
134
|
+
});
|
|
135
|
+
it("a teammate is open while busy, closed on its idle notice, open again once messaged", () => {
|
|
136
|
+
const idx = apply([
|
|
137
|
+
toolUse("toolu_10", "Agent", { name: "nowline", description: "Build the now line" }),
|
|
138
|
+
toolResult("toolu_10", { status: "teammate_spawned", agentId: "anowline-1", name: "nowline" }),
|
|
139
|
+
]);
|
|
140
|
+
expect(idx.open["anowline-1"]).toMatchObject({ kind: "teammate", description: "@nowline" });
|
|
141
|
+
apply([teammateIdle("nowline", 90)], idx);
|
|
142
|
+
expect(idx.open).toEqual({});
|
|
143
|
+
apply([
|
|
144
|
+
toolUse("toolu_11", "SendMessage", { to: "nowline", message: "next" }, 120),
|
|
145
|
+
toolResult("toolu_11", { success: true, message: "Message sent to nowline's inbox" }, "ok", 121),
|
|
146
|
+
], idx);
|
|
147
|
+
expect(idx.open["anowline-1"]?.startedAt).toBe(T0 + 121_000);
|
|
148
|
+
});
|
|
149
|
+
});
|
|
150
|
+
describe("incremental read", () => {
|
|
151
|
+
let dir;
|
|
152
|
+
let file;
|
|
153
|
+
beforeEach(() => {
|
|
154
|
+
dir = fs.mkdtempSync(path.join(os.tmpdir(), "synap-ti-"));
|
|
155
|
+
file = path.join(dir, "s.jsonl");
|
|
156
|
+
});
|
|
157
|
+
const launch = (n) => [
|
|
158
|
+
toolUse(`toolu_${n}`, "Bash", { command: `job ${n}`, description: `job ${n}`, run_in_background: true }),
|
|
159
|
+
toolResult(`toolu_${n}`, { backgroundTaskId: `b${n}` }),
|
|
160
|
+
];
|
|
161
|
+
it("reads only what was appended, and leaves a half-written line for next time", () => {
|
|
162
|
+
fs.writeFileSync(file, launch(1).join("\n") + "\n");
|
|
163
|
+
const first = updateIndex(null, file, { maxBytes: Infinity });
|
|
164
|
+
expect(Object.keys(first.index.open)).toEqual(["b1"]);
|
|
165
|
+
expect(first.index.offset).toBe(fs.statSync(file).size);
|
|
166
|
+
const [use, result] = launch(2);
|
|
167
|
+
fs.appendFileSync(file, use + "\n" + result.slice(0, 20)); // the result is mid-write
|
|
168
|
+
const second = updateIndex(first.index, file, { maxBytes: Infinity });
|
|
169
|
+
expect(second.index.pending.toolu_2).toBeDefined();
|
|
170
|
+
expect(second.index.open.b2).toBeUndefined();
|
|
171
|
+
fs.appendFileSync(file, result.slice(20) + "\n");
|
|
172
|
+
const third = updateIndex(second.index, file, { maxBytes: Infinity });
|
|
173
|
+
expect(Object.keys(third.index.open).sort()).toEqual(["b1", "b2"]);
|
|
174
|
+
expect(third.index.offset).toBe(fs.statSync(file).size);
|
|
175
|
+
});
|
|
176
|
+
it("a transcript smaller than the offset (truncated or replaced) is read again from 0", () => {
|
|
177
|
+
fs.writeFileSync(file, [...launch(1), ...launch(2)].join("\n") + "\n");
|
|
178
|
+
const before = updateIndex(null, file, { maxBytes: Infinity });
|
|
179
|
+
expect(Object.keys(before.index.open)).toHaveLength(2);
|
|
180
|
+
fs.writeFileSync(file, launch(3).join("\n") + "\n"); // shorter
|
|
181
|
+
const after = updateIndex(before.index, file, { maxBytes: Infinity });
|
|
182
|
+
expect(Object.keys(after.index.open)).toEqual(["b3"]);
|
|
183
|
+
});
|
|
184
|
+
it("a backlog bigger than maxBytes is not read by render: it says how far behind it is", () => {
|
|
185
|
+
fs.writeFileSync(file, launch(1).join("\n") + "\n");
|
|
186
|
+
const r = updateIndex(null, file, { maxBytes: 10 });
|
|
187
|
+
expect(r.behind).toBe(fs.statSync(file).size);
|
|
188
|
+
expect(r.index.offset).toBe(0);
|
|
189
|
+
expect(r.index.open).toEqual({});
|
|
190
|
+
});
|
|
191
|
+
it("reads a multi-chunk transcript line by line (lines straddling the 4 MB chunk edge)", () => {
|
|
192
|
+
const filler = JSON.stringify({ type: "user", message: { content: "x".repeat(1_000_000) } });
|
|
193
|
+
const lines = [...launch(1), filler, filler, filler, filler, filler, ...launch(2)];
|
|
194
|
+
fs.writeFileSync(file, lines.join("\n") + "\n");
|
|
195
|
+
const r = updateIndex(null, file, { maxBytes: Infinity });
|
|
196
|
+
expect(Object.keys(r.index.open).sort()).toEqual(["b1", "b2"]);
|
|
197
|
+
expect(r.index.offset).toBe(fs.statSync(file).size);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
//# sourceMappingURL=transcript-index.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript-index.test.js","sourceRoot":"","sources":["../../src/lib/transcript-index.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `synap wait`'s exit codes and help text: kept apart from the command so the
|
|
3
|
+
* CLI entry can show the help without loading the command module.
|
|
4
|
+
*/
|
|
5
|
+
export declare const WAIT_EXIT: {
|
|
6
|
+
readonly PASSED: 0;
|
|
7
|
+
readonly FAILED: 1;
|
|
8
|
+
readonly TIMEOUT: 2;
|
|
9
|
+
readonly INFRA: 3;
|
|
10
|
+
};
|
|
11
|
+
export declare const WAIT_HELP = "\nWhat each kind waits for:\n devbox <job> the devbox job of that name (gate.sh, q.sh, runlocked.sh) to finish a\n run that ended after the wait started (see --since). Reads\n `ssh devbox python3 ~/wt/devbox-status.py --name <job>` every 30 s.\n pr <repo>#<n> --for checks (default): every check on the PR (or the --checks list) to\n complete. --for merged: the PR to be merged or closed. A bare repo name\n means Synap-core/<repo>. Reads `gh pr view` every 60 s.\n run <url|id> a GitHub Actions run to complete. Reads `gh run view` every 60 s.\n\nIt prints one line per state change and a final summary, and keeps its state in\n~/.synap/waits/<conversation>/<id>.json, which the Claude Code status line shows.\n\nExit codes:\n 0 passed (devbox green; every check success/skipped/neutral; merged; run success)\n 1 failed (a red gate; a failed or cancelled check; closed unmerged; run failed)\n 2 timeout (--timeout, default 4h)\n 3 infra (devbox infra / died / refused / NOT-RUN), or the probe kept failing until the timeout\n";
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* `synap wait`'s exit codes and help text: kept apart from the command so the
|
|
3
|
+
* CLI entry can show the help without loading the command module.
|
|
4
|
+
*/
|
|
5
|
+
export const WAIT_EXIT = { PASSED: 0, FAILED: 1, TIMEOUT: 2, INFRA: 3 };
|
|
6
|
+
export const WAIT_HELP = `
|
|
7
|
+
What each kind waits for:
|
|
8
|
+
devbox <job> the devbox job of that name (gate.sh, q.sh, runlocked.sh) to finish a
|
|
9
|
+
run that ended after the wait started (see --since). Reads
|
|
10
|
+
\`ssh devbox python3 ~/wt/devbox-status.py --name <job>\` every 30 s.
|
|
11
|
+
pr <repo>#<n> --for checks (default): every check on the PR (or the --checks list) to
|
|
12
|
+
complete. --for merged: the PR to be merged or closed. A bare repo name
|
|
13
|
+
means Synap-core/<repo>. Reads \`gh pr view\` every 60 s.
|
|
14
|
+
run <url|id> a GitHub Actions run to complete. Reads \`gh run view\` every 60 s.
|
|
15
|
+
|
|
16
|
+
It prints one line per state change and a final summary, and keeps its state in
|
|
17
|
+
~/.synap/waits/<conversation>/<id>.json, which the Claude Code status line shows.
|
|
18
|
+
|
|
19
|
+
Exit codes:
|
|
20
|
+
0 passed (devbox green; every check success/skipped/neutral; merged; run success)
|
|
21
|
+
1 failed (a red gate; a failed or cancelled check; closed unmerged; run failed)
|
|
22
|
+
2 timeout (--timeout, default 4h)
|
|
23
|
+
3 infra (devbox infra / died / refused / NOT-RUN), or the probe kept failing until the timeout
|
|
24
|
+
`;
|
|
25
|
+
//# sourceMappingURL=wait-help.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wait-help.js","sourceRoot":"","sources":["../../src/lib/wait-help.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,CAAC,MAAM,SAAS,GAAG,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAW,CAAC;AAEjF,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;CAkBxB,CAAC"}
|