@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.
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 +192 -5
  89. package/dist/commands/worker.js +467 -45
  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 +59 -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,308 @@
1
+ /**
2
+ * `synap wait`: the probe mappers from fixture devbox / gh JSON (shapes
3
+ * captured on 2026-10-29 from `devbox-status.py --name`, `gh pr view --json
4
+ * state,isDraft,statusCheckRollup` and `gh run view --json
5
+ * status,conclusion,name,jobs`), and the poll loop with an injected probe and
6
+ * clock. No network, no ssh, no gh.
7
+ */
8
+ import fs from "node:fs";
9
+ import { describe, it, expect, beforeEach } from "vitest";
10
+ import { mapDevbox, mapPrChecks, mapPrMerged, mapRun, parsePrRef, parseRunRef, waitLoop, } from "./wait.js";
11
+ import { readWaits, waitsDir, writeWait } from "../lib/wait-state.js";
12
+ const START = Date.parse("2026-10-29T12:00:00Z");
13
+ const at = (m) => new Date(START + m * 60_000).toISOString();
14
+ const GRACE = 120_000;
15
+ // ── devbox ─────────────────────────────────────────────────────────────
16
+ const gate = (id, status, extra = {}) => ({ id, status, exit: status === "green" ? 0 : 1, ...extra });
17
+ describe("mapDevbox", () => {
18
+ it("queued: its place and lane", () => {
19
+ const d = { status: "queued", gates: [], job: { state: "queued", position: 2, queue: "light", gates: ["relay-file", "src/a.test.ts"] } };
20
+ expect(mapDevbox(d, START, GRACE)).toEqual({ state: "queued", detail: "queued 2nd (light)" });
21
+ });
22
+ it("queued, waiting for disk", () => {
23
+ const d = { status: "queued", job: { state: "queued", position: 1, queue: "heavy", waiting_for: "disk", disk_wait: { since: at(-5), free_gb: 12, min_gb: 15 } } };
24
+ expect(mapDevbox(d, START, GRACE)).toEqual({ state: "queued", detail: "waiting for disk" });
25
+ });
26
+ it("running: the current gate and gates done n/m (paths after a *-file gate are not gates)", () => {
27
+ const d = {
28
+ status: "running",
29
+ started: at(1),
30
+ gates: [gate("be-jobs-tsc", "green")],
31
+ job: { state: "running", gates: ["be-jobs-tsc", "be-file", "packages/api/src/x.test.ts"], activity: "node (vitest 2)" },
32
+ };
33
+ expect(mapDevbox(d, START, GRACE)).toEqual({ state: "running", detail: "be-file · 1/2 done" });
34
+ });
35
+ it("running: a gate that expands (app-tsc → app-tsc-headless…) counts as done once its parts are", () => {
36
+ const d = {
37
+ status: "running",
38
+ gates: [gate("app-tsc-headless", "green"), gate("app-tsc-hooks", "green"), gate("app-tsc-web", "green")],
39
+ job: { state: "running", gates: ["app-tsc", "app-file", "packages/web/src/x"], activity: "node (vitest 2)" },
40
+ };
41
+ expect(mapDevbox(d, START, GRACE)).toEqual({ state: "running", detail: "app-file · 3 done" });
42
+ });
43
+ it("running, a red gate already: says so", () => {
44
+ const d = {
45
+ status: "running",
46
+ gates: [gate("be-file", "red", { tests_failed: 3 })],
47
+ job: { state: "running", gates: ["be-file", "be-touched"] },
48
+ };
49
+ expect(mapDevbox(d, START, GRACE).detail).toBe("be-touched · 1/2 done · red so far: be-file (3 tests)");
50
+ });
51
+ it("passed: a green run that finished after the wait started → exit 0", () => {
52
+ const d = { status: "green", started: at(1), done: at(9), gates: [gate("be-file", "green"), gate("be-touched", "green")], job: null };
53
+ expect(mapDevbox(d, START, GRACE)).toEqual({ state: "passed", detail: "2 gates green", exitCode: 0 });
54
+ });
55
+ it("failed: the red gates and their failed tests → exit 1", () => {
56
+ const d = {
57
+ status: "red",
58
+ done: at(9),
59
+ gates: [gate("app-tsc-web", "green"), gate("app-file", "red", { tests_failed: 2 }), gate("app-check:hex", "red-uncounted"), gate("be-types", "red", { ts_errors: 4 })],
60
+ };
61
+ expect(mapDevbox(d, START, GRACE)).toEqual({
62
+ state: "failed",
63
+ detail: "red: app-file (2 tests), app-check:hex, be-types (4 ts errors)",
64
+ exitCode: 1,
65
+ });
66
+ });
67
+ it("infra, NOT-RUN, died, refused → exit 3", () => {
68
+ expect(mapDevbox({ status: "infra", done: at(3), infra: "NOT-RUN (disk): 9 GB free < 15" }, START, GRACE)).toEqual({
69
+ state: "infra",
70
+ detail: "NOT-RUN (disk): 9 GB free < 15",
71
+ exitCode: 3,
72
+ });
73
+ expect(mapDevbox({ status: "died", started: at(1), mtime: at(4), gates: [] }, START, GRACE)).toMatchObject({ state: "infra", exitCode: 3 });
74
+ expect(mapDevbox({ status: "refused", mtime: at(0), refused: "a full suite in a lane" }, START, GRACE)).toEqual({
75
+ state: "infra",
76
+ detail: "refused: a full suite in a lane",
77
+ exitCode: 3,
78
+ });
79
+ });
80
+ it("a run that finished BEFORE the wait started is the previous run: keep waiting", () => {
81
+ const d = { status: "red", started: at(-40), done: at(-30), gates: [gate("be-file", "red")] };
82
+ expect(mapDevbox(d, START, GRACE)).toEqual({ state: "pending", detail: "not on the devbox yet (last run red at " + hhmm(at(-30)) + ")" });
83
+ });
84
+ it("…but one that finished within the grace window counts (a fast-path job that beat the wait)", () => {
85
+ const d = { status: "green", done: new Date(START - 60_000).toISOString(), gates: [gate("be-file", "green")] };
86
+ expect(mapDevbox(d, START, GRACE).exitCode).toBe(0);
87
+ expect(mapDevbox(d, START, 0).state).toBe("pending");
88
+ });
89
+ it("an unknown name is pending", () => {
90
+ expect(mapDevbox({ status: "unknown", gates: [] }, START, GRACE)).toEqual({ state: "pending", detail: "not on the devbox yet" });
91
+ });
92
+ });
93
+ function hhmm(iso) {
94
+ const d = new Date(iso);
95
+ return `${String(d.getHours()).padStart(2, "0")}:${String(d.getMinutes()).padStart(2, "0")}`;
96
+ }
97
+ // ── gh ─────────────────────────────────────────────────────────────────
98
+ const check = (name, status, conclusion = "", startedAt = at(0)) => ({ __typename: "CheckRun", name, status, conclusion, startedAt, workflowName: "CI" });
99
+ describe("mapPrChecks", () => {
100
+ it("running: the running check and n/m done", () => {
101
+ const pr = { state: "OPEN", statusCheckRollup: [check("Preflight", "COMPLETED", "SUCCESS"), check("Release gate", "IN_PROGRESS"), check("API e2e", "COMPLETED", "SKIPPED"), check("Full suite", "QUEUED")] };
102
+ expect(mapPrChecks(pr, null)).toEqual({ state: "running", detail: "Release gate running · 2/4 done" });
103
+ });
104
+ it("--checks: only those, and one not reported yet is still waited for", () => {
105
+ const pr = { statusCheckRollup: [check("Release gate", "COMPLETED", "SUCCESS"), check("Other", "IN_PROGRESS")] };
106
+ expect(mapPrChecks(pr, ["Release gate", "Full suite"])).toEqual({ state: "queued", detail: "1 queued · 1/2 done" });
107
+ });
108
+ it("all completed, success / skipped / neutral → exit 0", () => {
109
+ const pr = { statusCheckRollup: [check("A", "COMPLETED", "SUCCESS"), check("B", "COMPLETED", "SKIPPED"), check("C", "COMPLETED", "NEUTRAL")] };
110
+ expect(mapPrChecks(pr, null)).toEqual({ state: "passed", detail: "3 checks green", exitCode: 0 });
111
+ });
112
+ it("any failure (or cancel) → exit 1, named", () => {
113
+ const pr = { statusCheckRollup: [check("A", "COMPLETED", "SUCCESS"), check("Full suite", "COMPLETED", "FAILURE"), check("E2E", "COMPLETED", "CANCELLED")] };
114
+ expect(mapPrChecks(pr, null)).toEqual({ state: "failed", detail: "failed: Full suite (failure), E2E (cancelled)", exitCode: 1 });
115
+ });
116
+ it("a re-run replaces the older run of the same check", () => {
117
+ const pr = { statusCheckRollup: [check("A", "COMPLETED", "FAILURE", at(0)), check("A", "IN_PROGRESS", "", at(5))] };
118
+ expect(mapPrChecks(pr, null)).toEqual({ state: "running", detail: "A running · 0/1 done" });
119
+ });
120
+ it("a legacy status context counts too", () => {
121
+ const pr = { statusCheckRollup: [{ __typename: "StatusContext", context: "ci/legacy", state: "PENDING" }] };
122
+ expect(mapPrChecks(pr, null)).toEqual({ state: "queued", detail: "1 queued · 0/1 done" });
123
+ });
124
+ it("no checks yet is pending", () => {
125
+ expect(mapPrChecks({ statusCheckRollup: [] }, null)).toEqual({ state: "pending", detail: "no checks reported yet" });
126
+ });
127
+ });
128
+ describe("mapPrMerged and mapRun", () => {
129
+ it("merged → 0, closed unmerged → 1, open keeps waiting", () => {
130
+ expect(mapPrMerged({ state: "MERGED" })).toMatchObject({ state: "passed", exitCode: 0 });
131
+ expect(mapPrMerged({ state: "CLOSED" })).toMatchObject({ state: "failed", exitCode: 1 });
132
+ expect(mapPrMerged({ state: "OPEN", isDraft: true })).toEqual({ state: "queued", detail: "open (draft)" });
133
+ });
134
+ it("a run: queued, running, passed, failed", () => {
135
+ expect(mapRun({ status: "queued", jobs: [] })).toEqual({ state: "queued", detail: "queued" });
136
+ expect(mapRun({ status: "in_progress", jobs: [{ name: "Preflight", status: "completed", conclusion: "success" }, { name: "Full suite (shard 1/4)", status: "in_progress", conclusion: "" }] })).toEqual({ state: "running", detail: "Full suite (shard 1/4) running · 1/2 jobs done" });
137
+ expect(mapRun({ status: "completed", conclusion: "success", name: "CI" })).toEqual({ state: "passed", detail: "CI success", exitCode: 0 });
138
+ expect(mapRun({ status: "completed", conclusion: "failure", jobs: [{ name: "Lint", status: "completed", conclusion: "failure" }, { name: "Build", status: "completed", conclusion: "success" }] })).toEqual({
139
+ state: "failed",
140
+ detail: "failure: Lint",
141
+ exitCode: 1,
142
+ });
143
+ });
144
+ });
145
+ describe("targets", () => {
146
+ it("a bare repo means Synap-core/<repo>", () => {
147
+ expect(parsePrRef("backend#412")).toEqual({ repo: "Synap-core/backend", number: 412 });
148
+ expect(parsePrRef("acme/web#7")).toEqual({ repo: "acme/web", number: 7 });
149
+ expect(parsePrRef("https://github.com/Synap-core/synap-cli/pull/42")).toEqual({ repo: "Synap-core/synap-cli", number: 42 });
150
+ expect(parsePrRef("backend")).toBeNull();
151
+ });
152
+ it("a run URL or an id", () => {
153
+ expect(parseRunRef("https://github.com/Synap-core/backend/actions/runs/40872525519")).toEqual({ repo: "Synap-core/backend", id: "40872525519" });
154
+ expect(parseRunRef("40872525519", "backend")).toEqual({ repo: "Synap-core/backend", id: "40872525519" });
155
+ expect(parseRunRef("40872525519")).toEqual({ repo: undefined, id: "40872525519" });
156
+ expect(parseRunRef("main")).toBeNull();
157
+ });
158
+ });
159
+ // ── the loop ───────────────────────────────────────────────────────────
160
+ function clock(startMs) {
161
+ let t = startMs;
162
+ return { now: () => t, sleep: async (ms) => void (t += ms) };
163
+ }
164
+ function scripted(results) {
165
+ let i = 0;
166
+ return async () => {
167
+ const r = results[Math.min(i++, results.length - 1)];
168
+ if (r instanceof Error)
169
+ throw r;
170
+ return r;
171
+ };
172
+ }
173
+ describe("waitLoop", () => {
174
+ beforeEach(() => {
175
+ fs.rmSync(waitsDir("conv-1"), { recursive: true, force: true });
176
+ });
177
+ it("prints one line per state change and a summary, and leaves a final state file", async () => {
178
+ const c = clock(START);
179
+ const lines = [];
180
+ const code = await waitLoop({
181
+ kind: "devbox",
182
+ ref: "w7-regen",
183
+ intervalMs: 30_000,
184
+ timeoutMs: 3_600_000,
185
+ sessionId: "conv-1",
186
+ now: c.now,
187
+ sleep: c.sleep,
188
+ print: (l) => lines.push(l.replace(/^\d\d:\d\d /, "")),
189
+ probe: scripted([
190
+ { state: "queued", detail: "queued 2nd (light)" },
191
+ { state: "queued", detail: "queued 2nd (light)" },
192
+ { state: "running", detail: "tsc · 0/2 done" },
193
+ { state: "passed", detail: "2 gates green", exitCode: 0 },
194
+ ]),
195
+ });
196
+ expect(code).toBe(0);
197
+ expect(lines).toEqual([
198
+ "devbox w7-regen: queued 2nd (light)",
199
+ "devbox w7-regen: queued 2nd (light) → running (tsc · 0/2 done)",
200
+ "devbox w7-regen: running (tsc · 0/2 done) → passed (2 gates green)",
201
+ "devbox w7-regen: passed after 1m · 2 gates green · exit 0",
202
+ ]);
203
+ const [rec] = readWaits("conv-1");
204
+ expect(rec).toMatchObject({ kind: "devbox", ref: "w7-regen", state: "passed", exitCode: 0, attempt: 1, probeErrors: 0, pid: process.pid });
205
+ expect(rec.finishedAt).toBe(START + 90_000);
206
+ expect(rec.changedAt).toBe(START + 90_000);
207
+ });
208
+ it("3 failed probes in a row → error, it keeps polling, and a timeout on error exits 3", async () => {
209
+ const c = clock(START);
210
+ const code = await waitLoop({
211
+ kind: "pr",
212
+ ref: "Synap-core/backend#412",
213
+ intervalMs: 60_000,
214
+ timeoutMs: 10 * 60_000,
215
+ sessionId: "conv-1",
216
+ now: c.now,
217
+ sleep: c.sleep,
218
+ print: () => { },
219
+ probe: scripted([new Error("gh: HTTP 502")]),
220
+ });
221
+ expect(code).toBe(3);
222
+ const [rec] = readWaits("conv-1");
223
+ expect(rec.state).toBe("error");
224
+ expect(rec.detail).toBe("probe failed 3× in a row: gh: HTTP 502");
225
+ expect(rec.probeErrors).toBeGreaterThan(3);
226
+ });
227
+ it("a probe that recovers clears the error count", async () => {
228
+ const c = clock(START);
229
+ const code = await waitLoop({
230
+ kind: "run",
231
+ ref: ". run 1",
232
+ intervalMs: 60_000,
233
+ timeoutMs: 3_600_000,
234
+ sessionId: "conv-1",
235
+ now: c.now,
236
+ sleep: c.sleep,
237
+ print: () => { },
238
+ probe: scripted([new Error("x"), new Error("x"), { state: "passed", detail: "CI success", exitCode: 0 }]),
239
+ });
240
+ expect(code).toBe(0);
241
+ expect(readWaits("conv-1")[0]).toMatchObject({ state: "passed", probeErrors: 0 });
242
+ });
243
+ it("the timeout exits 2 with state timeout", async () => {
244
+ const c = clock(START);
245
+ const lines = [];
246
+ const code = await waitLoop({
247
+ kind: "devbox",
248
+ ref: "slow",
249
+ intervalMs: 30_000,
250
+ timeoutMs: 2 * 60_000,
251
+ sessionId: "conv-1",
252
+ now: c.now,
253
+ sleep: c.sleep,
254
+ print: (l) => lines.push(l),
255
+ probe: scripted([{ state: "queued", detail: "queued 9th (heavy)" }]),
256
+ });
257
+ expect(code).toBe(2);
258
+ expect(readWaits("conv-1")[0]).toMatchObject({ state: "timeout", exitCode: 2, detail: "gave up after 2m at queued 9th (heavy)" });
259
+ expect(lines.at(-1)).toMatch(/timeout \(gave up after 2m at queued 9th \(heavy\)\) · exit 2$/);
260
+ });
261
+ it("attempt counts the earlier waits on the same target in this conversation; finished ones older than 24 h are pruned", async () => {
262
+ const base = {
263
+ id: "old",
264
+ kind: "devbox",
265
+ ref: "w7-regen",
266
+ label: "",
267
+ pid: 1,
268
+ startedAt: START - 60_000,
269
+ probedAt: START - 60_000,
270
+ changedAt: START - 60_000,
271
+ state: "failed",
272
+ detail: "",
273
+ attempt: 1,
274
+ probeErrors: 0,
275
+ exitCode: 1,
276
+ finishedAt: START - 30_000,
277
+ };
278
+ writeWait("conv-1", base);
279
+ writeWait("conv-1", { ...base, id: "old2", attempt: 2 });
280
+ writeWait("conv-1", { ...base, id: "other", ref: "another-job" });
281
+ writeWait("conv-1", { ...base, id: "ancient", finishedAt: START - 25 * 3_600_000 });
282
+ const c = clock(START);
283
+ const lines = [];
284
+ await waitLoop({
285
+ kind: "devbox",
286
+ ref: "w7-regen",
287
+ intervalMs: 30_000,
288
+ timeoutMs: 3_600_000,
289
+ sessionId: "conv-1",
290
+ now: c.now,
291
+ sleep: c.sleep,
292
+ print: (l) => lines.push(l),
293
+ probe: scripted([{ state: "passed", detail: "ok", exitCode: 0 }]),
294
+ });
295
+ const recs = readWaits("conv-1");
296
+ expect(recs.map((r) => r.id).sort()).not.toContain("ancient");
297
+ const mine = recs.find((r) => !["old", "old2", "other"].includes(r.id));
298
+ expect(mine.attempt).toBe(3);
299
+ expect(lines[0]).toMatch(/3rd wait on this target/);
300
+ });
301
+ it("a wait with no Claude session writes under _nosession", async () => {
302
+ const c = clock(START);
303
+ await waitLoop({ kind: "devbox", ref: "x", intervalMs: 1000, timeoutMs: 60_000, sessionId: undefined, now: c.now, sleep: c.sleep, print: () => { }, probe: scripted([{ state: "passed", detail: "", exitCode: 0 }]) });
304
+ expect(waitsDir(undefined).endsWith("/_nosession")).toBe(true);
305
+ expect(readWaits(undefined).length).toBeGreaterThan(0);
306
+ });
307
+ });
308
+ //# sourceMappingURL=wait.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"wait.test.js","sourceRoot":"","sources":["../../src/commands/wait.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ /**
2
+ * The worker's GitHub identity: a GitHub App installation, never a person.
3
+ *
4
+ * An unattended run has Bash, so whatever `gh` and `git push` authenticate as
5
+ * is what a prompt injection can use. The founder's login is an org admin (it
6
+ * can `gh pr merge --admin` past the ruleset); the "Synap Agent" App has no
7
+ * administration, members or bypass permission (see docs/synap-agent-app.md).
8
+ *
9
+ * The App's id and private key live in an owner-only env file
10
+ * (default ~/.config/synap-agent-app.env):
11
+ *
12
+ * GITHUB_APP_ID=123456
13
+ * GITHUB_APP_PRIVATE_KEY_FILE=/home/me/.config/synap-agent-app.pem (0600)
14
+ * GITHUB_APP_INSTALLATION_ID=7890123 # optional: the org's installation
15
+ *
16
+ * Each launch mints an installation token (valid 1 h, cached until 5 min
17
+ * before it ends) and puts it in the run's GH_TOKEN. Neither the key nor a
18
+ * token is ever logged or written to state.
19
+ */
20
+ export interface GithubAppConfig {
21
+ appId: string;
22
+ privateKey: string;
23
+ installationId?: string;
24
+ }
25
+ export declare function defaultGithubAppFile(): string;
26
+ /** `KEY=value` lines, `#` comments, optional quotes. */
27
+ export declare function parseEnvFile(text: string): Record<string, string>;
28
+ /**
29
+ * `undefined`: no env file (the caller warns, loudly). Throws when the file is
30
+ * there but unusable, so a half-set-up App never silently falls back to a
31
+ * person's login.
32
+ */
33
+ export declare function loadGithubAppConfig(file?: string): GithubAppConfig | undefined;
34
+ /** The files a person must keep owner-only: any that others can read. */
35
+ export declare function githubAppFilesTooOpen(file?: string): string[];
36
+ /** The App JWT (RS256): 10 minutes at most, issued 60 s in the past for clock skew. */
37
+ export declare function signAppJwt(appId: string, privateKey: string, nowMs: number): string;
38
+ export interface InstallationTokenSource {
39
+ /** A token valid now; mints a new one when the cached one is near its end. Throws on failure. */
40
+ get(): Promise<string>;
41
+ }
42
+ export declare function createInstallationTokenSource(config: GithubAppConfig, o?: {
43
+ fetchImpl?: typeof fetch;
44
+ now?: () => number;
45
+ }): InstallationTokenSource;
46
+ export interface GithubRunEnv {
47
+ /** A token valid at launch: what a caller that skips the helpers (an absolute /usr/bin/gh) gets for its first hour. */
48
+ token: string;
49
+ /** The worker's token broker socket (worker-github-broker.ts). */
50
+ sock: string;
51
+ /** Holds the `gh` wrapper and the git credential helper; first on the run's PATH. */
52
+ binDir: string;
53
+ gitHelper: string;
54
+ /** An EMPTY folder: `gh` never reads the person's hosts.yml. */
55
+ ghConfigDir: string;
56
+ }
57
+ /**
58
+ * The environment that makes `gh` AND `git push` (https) act as the App for
59
+ * the whole run: both ask the broker for a fresh token each time, and the
60
+ * credential-helper list is reset first, so a helper holding a person's login
61
+ * is never asked.
62
+ */
63
+ export declare function githubRunEnv(g: GithubRunEnv, basePath: string | undefined): NodeJS.ProcessEnv;
@@ -0,0 +1,161 @@
1
+ /**
2
+ * The worker's GitHub identity: a GitHub App installation, never a person.
3
+ *
4
+ * An unattended run has Bash, so whatever `gh` and `git push` authenticate as
5
+ * is what a prompt injection can use. The founder's login is an org admin (it
6
+ * can `gh pr merge --admin` past the ruleset); the "Synap Agent" App has no
7
+ * administration, members or bypass permission (see docs/synap-agent-app.md).
8
+ *
9
+ * The App's id and private key live in an owner-only env file
10
+ * (default ~/.config/synap-agent-app.env):
11
+ *
12
+ * GITHUB_APP_ID=123456
13
+ * GITHUB_APP_PRIVATE_KEY_FILE=/home/me/.config/synap-agent-app.pem (0600)
14
+ * GITHUB_APP_INSTALLATION_ID=7890123 # optional: the org's installation
15
+ *
16
+ * Each launch mints an installation token (valid 1 h, cached until 5 min
17
+ * before it ends) and puts it in the run's GH_TOKEN. Neither the key nor a
18
+ * token is ever logged or written to state.
19
+ */
20
+ import { createSign } from "node:crypto";
21
+ import fs from "node:fs";
22
+ import os from "node:os";
23
+ import path from "node:path";
24
+ export function defaultGithubAppFile() {
25
+ return path.join(os.homedir(), ".config", "synap-agent-app.env");
26
+ }
27
+ /** `KEY=value` lines, `#` comments, optional quotes. */
28
+ export function parseEnvFile(text) {
29
+ const out = {};
30
+ for (const line of text.split("\n")) {
31
+ const m = /^\s*(?:export\s+)?([A-Z0-9_]+)\s*=\s*(.*?)\s*$/.exec(line);
32
+ if (!m || line.trimStart().startsWith("#"))
33
+ continue;
34
+ out[m[1]] = m[2].replace(/^(["'])(.*)\1$/, "$2");
35
+ }
36
+ return out;
37
+ }
38
+ /**
39
+ * `undefined`: no env file (the caller warns, loudly). Throws when the file is
40
+ * there but unusable, so a half-set-up App never silently falls back to a
41
+ * person's login.
42
+ */
43
+ export function loadGithubAppConfig(file = defaultGithubAppFile()) {
44
+ let text;
45
+ try {
46
+ text = fs.readFileSync(file, "utf8");
47
+ }
48
+ catch (err) {
49
+ if (err.code === "ENOENT")
50
+ return undefined;
51
+ throw new Error(`GitHub App file ${file} could not be read: ${err.message}`);
52
+ }
53
+ const env = parseEnvFile(text);
54
+ const appId = env.GITHUB_APP_ID;
55
+ const keyFile = env.GITHUB_APP_PRIVATE_KEY_FILE;
56
+ if (!appId || !keyFile)
57
+ throw new Error(`GitHub App file ${file} needs GITHUB_APP_ID and GITHUB_APP_PRIVATE_KEY_FILE`);
58
+ const keyPath = keyFile.startsWith("~/") ? path.join(os.homedir(), keyFile.slice(2)) : keyFile;
59
+ let privateKey;
60
+ try {
61
+ privateKey = fs.readFileSync(keyPath, "utf8");
62
+ }
63
+ catch (err) {
64
+ throw new Error(`GitHub App private key ${keyPath} could not be read: ${err.message}`);
65
+ }
66
+ return { appId, privateKey, installationId: env.GITHUB_APP_INSTALLATION_ID || undefined };
67
+ }
68
+ /** The files a person must keep owner-only: any that others can read. */
69
+ export function githubAppFilesTooOpen(file = defaultGithubAppFile()) {
70
+ const open = [];
71
+ const check = (f) => {
72
+ try {
73
+ if ((fs.statSync(f).mode & 0o077) !== 0)
74
+ open.push(f);
75
+ }
76
+ catch {
77
+ /* missing: loadGithubAppConfig reports it */
78
+ }
79
+ };
80
+ check(file);
81
+ try {
82
+ const keyFile = parseEnvFile(fs.readFileSync(file, "utf8")).GITHUB_APP_PRIVATE_KEY_FILE;
83
+ if (keyFile)
84
+ check(keyFile.startsWith("~/") ? path.join(os.homedir(), keyFile.slice(2)) : keyFile);
85
+ }
86
+ catch {
87
+ /* unreadable: loadGithubAppConfig reports it */
88
+ }
89
+ return open;
90
+ }
91
+ const b64url = (b) => Buffer.from(b).toString("base64url");
92
+ /** The App JWT (RS256): 10 minutes at most, issued 60 s in the past for clock skew. */
93
+ export function signAppJwt(appId, privateKey, nowMs) {
94
+ const iat = Math.floor(nowMs / 1000) - 60;
95
+ const head = b64url(JSON.stringify({ alg: "RS256", typ: "JWT" }));
96
+ const body = b64url(JSON.stringify({ iat, exp: iat + 9 * 60, iss: appId }));
97
+ const sig = createSign("RSA-SHA256").update(`${head}.${body}`).sign(privateKey);
98
+ return `${head}.${body}.${b64url(sig)}`;
99
+ }
100
+ const API = "https://api.github.com";
101
+ const REFRESH_BEFORE_MS = 5 * 60_000;
102
+ export function createInstallationTokenSource(config, o = {}) {
103
+ const doFetch = o.fetchImpl ?? fetch;
104
+ const now = o.now ?? Date.now;
105
+ let cached;
106
+ let installationId = config.installationId;
107
+ const call = async (method, url) => {
108
+ const res = await doFetch(`${API}${url}`, {
109
+ method,
110
+ headers: {
111
+ Authorization: `Bearer ${signAppJwt(config.appId, config.privateKey, now())}`,
112
+ Accept: "application/vnd.github+json",
113
+ "X-GitHub-Api-Version": "2022-11-28",
114
+ "User-Agent": "synap-worker",
115
+ },
116
+ });
117
+ if (!res.ok)
118
+ throw new Error(`GitHub ${method} ${url} answered ${res.status}`);
119
+ return res.json();
120
+ };
121
+ return {
122
+ async get() {
123
+ if (cached && cached.expiresAt - now() > REFRESH_BEFORE_MS)
124
+ return cached.token;
125
+ if (!installationId) {
126
+ const list = (await call("GET", "/app/installations"));
127
+ if (!Array.isArray(list) || list.length !== 1) {
128
+ throw new Error(`the App has ${Array.isArray(list) ? list.length : "an unreadable number of"} installations — set GITHUB_APP_INSTALLATION_ID`);
129
+ }
130
+ installationId = String(list[0].id);
131
+ }
132
+ const r = (await call("POST", `/app/installations/${installationId}/access_tokens`));
133
+ if (!r.token || !r.expires_at)
134
+ throw new Error("GitHub answered no installation token");
135
+ cached = { token: r.token, expiresAt: Date.parse(r.expires_at) };
136
+ return r.token;
137
+ },
138
+ };
139
+ }
140
+ /**
141
+ * The environment that makes `gh` AND `git push` (https) act as the App for
142
+ * the whole run: both ask the broker for a fresh token each time, and the
143
+ * credential-helper list is reset first, so a helper holding a person's login
144
+ * is never asked.
145
+ */
146
+ export function githubRunEnv(g, basePath) {
147
+ return {
148
+ PATH: [g.binDir, basePath].filter(Boolean).join(path.delimiter),
149
+ SYNAP_GH_SOCK: g.sock,
150
+ GH_CONFIG_DIR: g.ghConfigDir,
151
+ GH_TOKEN: g.token,
152
+ GITHUB_TOKEN: g.token,
153
+ GIT_TERMINAL_PROMPT: "0",
154
+ GIT_CONFIG_COUNT: "2",
155
+ GIT_CONFIG_KEY_0: "credential.helper",
156
+ GIT_CONFIG_VALUE_0: "",
157
+ GIT_CONFIG_KEY_1: "credential.helper",
158
+ GIT_CONFIG_VALUE_1: `!${g.gitHelper}`,
159
+ };
160
+ }
161
+ //# sourceMappingURL=worker-github-app.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"worker-github-app.js","sourceRoot":"","sources":["../../src/commands/worker-github-app.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export {};