@synap-core/cli 1.13.0 → 1.13.1-next.20261102.3a66eb1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (227) hide show
  1. package/README.md +13 -3
  2. package/dist/build-info.json +2 -3
  3. package/dist/commands/agents.js +12 -2
  4. package/dist/commands/agents.js.map +1 -1
  5. package/dist/commands/capability.d.ts +86 -0
  6. package/dist/commands/capability.js +117 -30
  7. package/dist/commands/capability.js.map +1 -1
  8. package/dist/commands/context.js +2 -1
  9. package/dist/commands/context.js.map +1 -1
  10. package/dist/commands/data-extra.d.ts +13 -0
  11. package/dist/commands/data-extra.js +23 -2
  12. package/dist/commands/data-extra.js.map +1 -1
  13. package/dist/commands/doctor.d.ts +18 -0
  14. package/dist/commands/doctor.js +28 -1
  15. package/dist/commands/doctor.js.map +1 -1
  16. package/dist/commands/init.js +4 -2
  17. package/dist/commands/init.js.map +1 -1
  18. package/dist/commands/keys-request.d.ts +48 -0
  19. package/dist/commands/keys-request.js +236 -0
  20. package/dist/commands/keys-request.js.map +1 -0
  21. package/dist/commands/keys-request.test.d.ts +1 -0
  22. package/dist/commands/keys-request.test.js +176 -0
  23. package/dist/commands/keys-request.test.js.map +1 -0
  24. package/dist/commands/knowledge.d.ts +42 -5
  25. package/dist/commands/knowledge.js +90 -27
  26. package/dist/commands/knowledge.js.map +1 -1
  27. package/dist/commands/market.d.ts +89 -31
  28. package/dist/commands/market.js +215 -222
  29. package/dist/commands/market.js.map +1 -1
  30. package/dist/commands/mcp.d.ts +1 -1
  31. package/dist/commands/mcp.js +14 -9
  32. package/dist/commands/mcp.js.map +1 -1
  33. package/dist/commands/pods.js +6 -2
  34. package/dist/commands/pods.js.map +1 -1
  35. package/dist/commands/proposals-actions.js +7 -1
  36. package/dist/commands/proposals-actions.js.map +1 -1
  37. package/dist/commands/providers.d.ts +22 -6
  38. package/dist/commands/providers.js +39 -32
  39. package/dist/commands/providers.js.map +1 -1
  40. package/dist/commands/raycast.d.ts +15 -0
  41. package/dist/commands/raycast.js +36 -10
  42. package/dist/commands/raycast.js.map +1 -1
  43. package/dist/commands/status.js +12 -6
  44. package/dist/commands/status.js.map +1 -1
  45. package/dist/commands/statusline.backoff.test.js +13 -3
  46. package/dist/commands/statusline.backoff.test.js.map +1 -1
  47. package/dist/commands/statusline.d.ts +104 -9
  48. package/dist/commands/statusline.js +392 -148
  49. package/dist/commands/statusline.js.map +1 -1
  50. package/dist/commands/statusline.line2.test.d.ts +15 -0
  51. package/dist/commands/statusline.line2.test.js +226 -0
  52. package/dist/commands/statusline.line2.test.js.map +1 -0
  53. package/dist/commands/statusline.needs-you.test.d.ts +1 -0
  54. package/dist/commands/statusline.needs-you.test.js +17 -0
  55. package/dist/commands/statusline.needs-you.test.js.map +1 -0
  56. package/dist/commands/statusline.now.test.d.ts +10 -0
  57. package/dist/commands/statusline.now.test.js +250 -0
  58. package/dist/commands/statusline.now.test.js.map +1 -0
  59. package/dist/commands/tracks.d.ts +1 -0
  60. package/dist/commands/tracks.js +4 -0
  61. package/dist/commands/tracks.js.map +1 -1
  62. package/dist/commands/upload.js +12 -0
  63. package/dist/commands/upload.js.map +1 -1
  64. package/dist/commands/wait.d.ts +124 -0
  65. package/dist/commands/wait.js +384 -0
  66. package/dist/commands/wait.js.map +1 -0
  67. package/dist/commands/wait.test.d.ts +8 -0
  68. package/dist/commands/wait.test.js +308 -0
  69. package/dist/commands/wait.test.js.map +1 -0
  70. package/dist/commands/worker-github-app.d.ts +63 -0
  71. package/dist/commands/worker-github-app.js +161 -0
  72. package/dist/commands/worker-github-app.js.map +1 -0
  73. package/dist/commands/worker-github-app.test.d.ts +1 -0
  74. package/dist/commands/worker-github-app.test.js +102 -0
  75. package/dist/commands/worker-github-app.test.js.map +1 -0
  76. package/dist/commands/worker-github-broker.d.ts +39 -0
  77. package/dist/commands/worker-github-broker.js +106 -0
  78. package/dist/commands/worker-github-broker.js.map +1 -0
  79. package/dist/commands/worker-github-broker.test.d.ts +1 -0
  80. package/dist/commands/worker-github-broker.test.js +90 -0
  81. package/dist/commands/worker-github-broker.test.js.map +1 -0
  82. package/dist/commands/worker-runs.test.d.ts +1 -0
  83. package/dist/commands/worker-runs.test.js +150 -0
  84. package/dist/commands/worker-runs.test.js.map +1 -0
  85. package/dist/commands/worker-worktrees.d.ts +34 -0
  86. package/dist/commands/worker-worktrees.js +87 -0
  87. package/dist/commands/worker-worktrees.js.map +1 -0
  88. package/dist/commands/worker.d.ts +207 -5
  89. package/dist/commands/worker.js +540 -46
  90. package/dist/commands/worker.js.map +1 -1
  91. package/dist/commands/worker.test.js +269 -3
  92. package/dist/commands/worker.test.js.map +1 -1
  93. package/dist/index.js +60 -4
  94. package/dist/index.js.map +1 -1
  95. package/dist/lib/agents-config.d.ts +9 -0
  96. package/dist/lib/agents-config.js +20 -0
  97. package/dist/lib/agents-config.js.map +1 -1
  98. package/dist/lib/atomic-file.d.ts +20 -1
  99. package/dist/lib/atomic-file.js +100 -2
  100. package/dist/lib/atomic-file.js.map +1 -1
  101. package/dist/lib/auth.d.ts +25 -0
  102. package/dist/lib/auth.js +49 -9
  103. package/dist/lib/auth.js.map +1 -1
  104. package/dist/lib/box/job-server.js +4 -0
  105. package/dist/lib/box/job-server.js.map +1 -1
  106. package/dist/lib/bridge-invocation.test.d.ts +1 -0
  107. package/dist/lib/bridge-invocation.test.js +75 -0
  108. package/dist/lib/bridge-invocation.test.js.map +1 -0
  109. package/dist/lib/bridge-status.d.ts +144 -0
  110. package/dist/lib/bridge-status.js +227 -0
  111. package/dist/lib/bridge-status.js.map +1 -0
  112. package/dist/lib/bridge-status.test.d.ts +6 -0
  113. package/dist/lib/bridge-status.test.js +197 -0
  114. package/dist/lib/bridge-status.test.js.map +1 -0
  115. package/dist/lib/client-header.test.js +19 -1
  116. package/dist/lib/client-header.test.js.map +1 -1
  117. package/dist/lib/conversation-headers.d.ts +67 -2
  118. package/dist/lib/conversation-headers.js +122 -6
  119. package/dist/lib/conversation-headers.js.map +1 -1
  120. package/dist/lib/conversation-headers.test.d.ts +1 -0
  121. package/dist/lib/conversation-headers.test.js +78 -0
  122. package/dist/lib/conversation-headers.test.js.map +1 -0
  123. package/dist/lib/credential-class.d.ts +12 -1
  124. package/dist/lib/credential-class.js +20 -0
  125. package/dist/lib/credential-class.js.map +1 -1
  126. package/dist/lib/device-connect.d.ts +45 -0
  127. package/dist/lib/device-connect.js +60 -0
  128. package/dist/lib/device-connect.js.map +1 -1
  129. package/dist/lib/goal-words.js +6 -3
  130. package/dist/lib/goal-words.js.map +1 -1
  131. package/dist/lib/hub-client.d.ts +59 -1
  132. package/dist/lib/hub-client.js +130 -36
  133. package/dist/lib/hub-client.js.map +1 -1
  134. package/dist/lib/key-locations.d.ts +3 -3
  135. package/dist/lib/key-locations.js +3 -39
  136. package/dist/lib/key-locations.js.map +1 -1
  137. package/dist/lib/machine-instance.d.ts +7 -5
  138. package/dist/lib/machine-instance.js +7 -5
  139. package/dist/lib/machine-instance.js.map +1 -1
  140. package/dist/lib/mcp-bridge.d.ts +43 -0
  141. package/dist/lib/mcp-bridge.js +199 -11
  142. package/dist/lib/mcp-bridge.js.map +1 -1
  143. package/dist/lib/mcp-bridge.test.js +194 -2
  144. package/dist/lib/mcp-bridge.test.js.map +1 -1
  145. package/dist/lib/mcp-call.d.ts +5 -1
  146. package/dist/lib/mcp-call.js +7 -6
  147. package/dist/lib/mcp-call.js.map +1 -1
  148. package/dist/lib/mcp-connector-url.test.d.ts +1 -0
  149. package/dist/lib/mcp-connector-url.test.js +13 -0
  150. package/dist/lib/mcp-connector-url.test.js.map +1 -0
  151. package/dist/lib/mcp-snippets.d.ts +16 -0
  152. package/dist/lib/mcp-snippets.js +20 -2
  153. package/dist/lib/mcp-snippets.js.map +1 -1
  154. package/dist/lib/now-line.d.ts +66 -0
  155. package/dist/lib/now-line.js +193 -0
  156. package/dist/lib/now-line.js.map +1 -0
  157. package/dist/lib/now-line.test.d.ts +5 -0
  158. package/dist/lib/now-line.test.js +177 -0
  159. package/dist/lib/now-line.test.js.map +1 -0
  160. package/dist/lib/package-updates.d.ts +66 -0
  161. package/dist/lib/package-updates.js +76 -0
  162. package/dist/lib/package-updates.js.map +1 -0
  163. package/dist/lib/pod.d.ts +0 -4
  164. package/dist/lib/pod.js +0 -7
  165. package/dist/lib/pod.js.map +1 -1
  166. package/dist/lib/register-claude-code-mcp.test.js +19 -0
  167. package/dist/lib/register-claude-code-mcp.test.js.map +1 -1
  168. package/dist/lib/safe-open.d.ts +5 -3
  169. package/dist/lib/safe-open.js +9 -8
  170. package/dist/lib/safe-open.js.map +1 -1
  171. package/dist/lib/self-host.d.ts +17 -0
  172. package/dist/lib/self-host.js +24 -0
  173. package/dist/lib/self-host.js.map +1 -0
  174. package/dist/lib/targets.d.ts +31 -0
  175. package/dist/lib/targets.js +100 -104
  176. package/dist/lib/targets.js.map +1 -1
  177. package/dist/lib/template-lifecycle.d.ts +0 -31
  178. package/dist/lib/template-lifecycle.js +0 -74
  179. package/dist/lib/template-lifecycle.js.map +1 -1
  180. package/dist/lib/term.d.ts +24 -0
  181. package/dist/lib/term.js +52 -0
  182. package/dist/lib/term.js.map +1 -0
  183. package/dist/lib/term.test.d.ts +1 -0
  184. package/dist/lib/term.test.js +29 -0
  185. package/dist/lib/term.test.js.map +1 -0
  186. package/dist/lib/transcript-index.d.ts +94 -0
  187. package/dist/lib/transcript-index.js +321 -0
  188. package/dist/lib/transcript-index.js.map +1 -0
  189. package/dist/lib/transcript-index.test.d.ts +10 -0
  190. package/dist/lib/transcript-index.test.js +200 -0
  191. package/dist/lib/transcript-index.test.js.map +1 -0
  192. package/dist/lib/wait-help.d.ts +11 -0
  193. package/dist/lib/wait-help.js +25 -0
  194. package/dist/lib/wait-help.js.map +1 -0
  195. package/dist/lib/wait-state.d.ts +57 -0
  196. package/dist/lib/wait-state.js +114 -0
  197. package/dist/lib/wait-state.js.map +1 -0
  198. package/package.json +2 -2
  199. package/skills/synap/SKILL.md +81 -44
  200. package/skills/synap/code-skills.md +15 -1
  201. package/skills/synap/concepts.md +36 -26
  202. package/skills/synap/document-embeds.md +15 -1
  203. package/skills/synap/focus-sessions.md +4 -4
  204. package/skills/synap/from-intent.md +2 -2
  205. package/skills/synap/governance-rules.md +2 -0
  206. package/skills/synap/hand-off.md +10 -6
  207. package/skills/synap/reflexes.md +4 -4
  208. package/skills/synap/work-model.md +1 -1
  209. package/skills/synap/writing-titles.md +7 -0
  210. package/skills/synap-app/SKILL.md +2 -2
  211. package/skills/synap-app/overview.md +2 -2
  212. package/skills/synap-market/SKILL.md +1 -1
  213. package/skills/synap-market/governance-and-catalog.md +1 -1
  214. package/skills/synap-schema/SKILL.md +4 -1
  215. package/skills/synap-schema/intent-vocabulary-ssot.md +4 -1
  216. package/dist/commands/template.d.ts +0 -42
  217. package/dist/commands/template.js +0 -191
  218. package/dist/commands/template.js.map +0 -1
  219. package/dist/lib/browser-auth.d.ts +0 -35
  220. package/dist/lib/browser-auth.js +0 -170
  221. package/dist/lib/browser-auth.js.map +0 -1
  222. package/dist/lib/openclaw.d.ts +0 -32
  223. package/dist/lib/openclaw.js +0 -165
  224. package/dist/lib/openclaw.js.map +0 -1
  225. package/dist/lib/seed.d.ts +0 -13
  226. package/dist/lib/seed.js +0 -135
  227. package/dist/lib/seed.js.map +0 -1
@@ -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"}
@@ -0,0 +1,57 @@
1
+ /**
2
+ * The state files `synap wait` writes, and the status line reads.
3
+ *
4
+ * One file per wait: `~/.synap/waits/<conversation>/<id>.json`, where the
5
+ * conversation is the Claude Code session id the wait ran under
6
+ * (`CLAUDE_CODE_SESSION_ID`, set in every Bash command an agent runs) or
7
+ * `_nosession`. The wait rewrites its file after every probe (tmp + rename,
8
+ * so a reader never sees half a file); the status line only ever reads.
9
+ *
10
+ * Local files only, no network: the status line renders from these.
11
+ */
12
+ export type WaitKind = "devbox" | "pr" | "run";
13
+ /** A wait is over once it carries `exitCode` (and `finishedAt`); `error` can be either. */
14
+ export type WaitState = "pending" | "queued" | "running" | "passed" | "failed" | "infra" | "error" | "timeout";
15
+ export declare function isFinal(w: Pick<WaitRecord, "exitCode">): boolean;
16
+ export interface WaitRecord {
17
+ id: string;
18
+ kind: WaitKind;
19
+ /** Normalised target: the devbox job name, `owner/repo#n`, `owner/repo run <id>`. */
20
+ ref: string;
21
+ label: string;
22
+ pid: number;
23
+ startedAt: number;
24
+ probedAt: number;
25
+ changedAt: number;
26
+ state: WaitState;
27
+ detail: string;
28
+ /** 1 + the earlier waits in this conversation for the same kind+ref: the "looping" signal. */
29
+ attempt: number;
30
+ probeErrors: number;
31
+ exitCode?: number;
32
+ finishedAt?: number;
33
+ }
34
+ export declare function waitsRoot(): string;
35
+ /** A session id as a directory name: anything outside [A-Za-z0-9_-] is dropped. */
36
+ export declare function safeSessionDir(sessionId: string | undefined): string;
37
+ export declare function waitsDir(sessionId: string | undefined): string;
38
+ /** Every readable wait file of one conversation. A file that does not parse is skipped. */
39
+ export declare function readWaits(sessionId: string | undefined): WaitRecord[];
40
+ /** Atomic: write a sibling tmp file, then rename it over the target. */
41
+ export declare function writeWait(sessionId: string | undefined, rec: WaitRecord): void;
42
+ /** 1 + the earlier waits (any state) in this conversation for the same kind+ref. */
43
+ export declare function attemptFor(existing: WaitRecord[], kind: WaitKind, ref: string): number;
44
+ /**
45
+ * Remove waits that finished more than 24 h ago, and non-final ones whose
46
+ * process is gone and whose last probe is that old. Best-effort.
47
+ */
48
+ export declare function pruneWaits(sessionId: string | undefined, now?: number): void;
49
+ export declare function pidAlive(pid: number): boolean;
50
+ /** How a wait is named on screen: its label, else kind + target without the Synap-core owner. */
51
+ export declare function waitName(w: Pick<WaitRecord, "kind" | "ref" | "label">): string;
52
+ /**
53
+ * A state and its detail in one phrase, never saying the state twice:
54
+ * "running (be-file · 1/2 done)", but "queued 2nd (light)" and
55
+ * "Release gate running · 2/4 done" as they are.
56
+ */
57
+ export declare function stateAndDetail(state: string, detail: string): string;
@@ -0,0 +1,114 @@
1
+ /**
2
+ * The state files `synap wait` writes, and the status line reads.
3
+ *
4
+ * One file per wait: `~/.synap/waits/<conversation>/<id>.json`, where the
5
+ * conversation is the Claude Code session id the wait ran under
6
+ * (`CLAUDE_CODE_SESSION_ID`, set in every Bash command an agent runs) or
7
+ * `_nosession`. The wait rewrites its file after every probe (tmp + rename,
8
+ * so a reader never sees half a file); the status line only ever reads.
9
+ *
10
+ * Local files only, no network: the status line renders from these.
11
+ */
12
+ import fs from "node:fs";
13
+ import os from "node:os";
14
+ import path from "node:path";
15
+ export function isFinal(w) {
16
+ return typeof w.exitCode === "number";
17
+ }
18
+ const PRUNE_AFTER_MS = 24 * 60 * 60_000;
19
+ export function waitsRoot() {
20
+ return path.join(os.homedir(), ".synap", "waits");
21
+ }
22
+ /** A session id as a directory name: anything outside [A-Za-z0-9_-] is dropped. */
23
+ export function safeSessionDir(sessionId) {
24
+ const clean = (sessionId ?? "").replace(/[^A-Za-z0-9_-]/g, "");
25
+ return clean || "_nosession";
26
+ }
27
+ export function waitsDir(sessionId) {
28
+ return path.join(waitsRoot(), safeSessionDir(sessionId));
29
+ }
30
+ /** Every readable wait file of one conversation. A file that does not parse is skipped. */
31
+ export function readWaits(sessionId) {
32
+ const dir = waitsDir(sessionId);
33
+ let names;
34
+ try {
35
+ names = fs.readdirSync(dir);
36
+ }
37
+ catch {
38
+ return [];
39
+ }
40
+ const out = [];
41
+ for (const n of names) {
42
+ if (!n.endsWith(".json"))
43
+ continue;
44
+ try {
45
+ const rec = JSON.parse(fs.readFileSync(path.join(dir, n), "utf-8"));
46
+ if (rec && typeof rec.id === "string" && typeof rec.state === "string")
47
+ out.push(rec);
48
+ }
49
+ catch {
50
+ /* a file mid-write by an older writer, or not ours */
51
+ }
52
+ }
53
+ return out;
54
+ }
55
+ /** Atomic: write a sibling tmp file, then rename it over the target. */
56
+ export function writeWait(sessionId, rec) {
57
+ const dir = waitsDir(sessionId);
58
+ fs.mkdirSync(dir, { recursive: true });
59
+ const target = path.join(dir, `${rec.id}.json`);
60
+ const tmp = `${target}.${process.pid}.tmp`;
61
+ fs.writeFileSync(tmp, JSON.stringify(rec));
62
+ fs.renameSync(tmp, target);
63
+ }
64
+ /** 1 + the earlier waits (any state) in this conversation for the same kind+ref. */
65
+ export function attemptFor(existing, kind, ref) {
66
+ return 1 + existing.filter((w) => w.kind === kind && w.ref === ref).length;
67
+ }
68
+ /**
69
+ * Remove waits that finished more than 24 h ago, and non-final ones whose
70
+ * process is gone and whose last probe is that old. Best-effort.
71
+ */
72
+ export function pruneWaits(sessionId, now = Date.now()) {
73
+ const dir = waitsDir(sessionId);
74
+ for (const w of readWaits(sessionId)) {
75
+ const old = isFinal(w)
76
+ ? now - (w.finishedAt ?? w.probedAt) > PRUNE_AFTER_MS
77
+ : now - w.probedAt > PRUNE_AFTER_MS && !pidAlive(w.pid);
78
+ if (!old)
79
+ continue;
80
+ try {
81
+ fs.unlinkSync(path.join(dir, `${w.id}.json`));
82
+ }
83
+ catch {
84
+ /* already gone */
85
+ }
86
+ }
87
+ }
88
+ export function pidAlive(pid) {
89
+ if (!Number.isInteger(pid) || pid <= 0)
90
+ return false;
91
+ try {
92
+ process.kill(pid, 0);
93
+ return true;
94
+ }
95
+ catch (e) {
96
+ // EPERM: the process exists, it is just not ours to signal.
97
+ return e.code === "EPERM";
98
+ }
99
+ }
100
+ /** How a wait is named on screen: its label, else kind + target without the Synap-core owner. */
101
+ export function waitName(w) {
102
+ return w.label || `${w.kind} ${w.ref.replace(/^Synap-core\//, "")}`;
103
+ }
104
+ /**
105
+ * A state and its detail in one phrase, never saying the state twice:
106
+ * "running (be-file · 1/2 done)", but "queued 2nd (light)" and
107
+ * "Release gate running · 2/4 done" as they are.
108
+ */
109
+ export function stateAndDetail(state, detail) {
110
+ if (!detail)
111
+ return state;
112
+ return new RegExp(`\\b${state}\\b`).test(detail) ? detail : `${state} (${detail})`;
113
+ }
114
+ //# sourceMappingURL=wait-state.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait-state.js","sourceRoot":"","sources":["../../src/lib/wait-state.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@synap-core/cli",
3
- "version": "1.13.0",
3
+ "version": "1.13.1-next.20261102.3a66eb1",
4
4
  "description": "Connect any AI agent (Claude Code, Codex, Cursor and more) to your own Synap data pod: shared memory, structured data and human-approved changes.",
5
5
  "type": "module",
6
6
  "bin": {
@@ -19,7 +19,7 @@
19
19
  },
20
20
  "dependencies": {
21
21
  "@synap-core/hub-rest-client": "^1.1.1",
22
- "@synap-core/types": "^1.12.1",
22
+ "@synap-core/types": "^1.12.4",
23
23
  "@synap-core/workspace-templates": ">=0.12.0 <1.0.0",
24
24
  "chalk": "^5.4.0",
25
25
  "commander": "^13.0.0",