@synap-core/cli 1.12.2 → 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 (358) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +38 -11
  3. package/dist/build-info.json +2 -3
  4. package/dist/commands/agents.d.ts +0 -1
  5. package/dist/commands/agents.js +13 -3
  6. package/dist/commands/agents.js.map +1 -1
  7. package/dist/commands/app.js +2 -1
  8. package/dist/commands/app.js.map +1 -1
  9. package/dist/commands/automation.js +46 -41
  10. package/dist/commands/automation.js.map +1 -1
  11. package/dist/commands/box.d.ts +42 -0
  12. package/dist/commands/box.js +89 -0
  13. package/dist/commands/box.js.map +1 -0
  14. package/dist/commands/bridge-setup.js +3 -1
  15. package/dist/commands/bridge-setup.js.map +1 -1
  16. package/dist/commands/capability.d.ts +87 -1
  17. package/dist/commands/capability.js +174 -64
  18. package/dist/commands/capability.js.map +1 -1
  19. package/dist/commands/close-questions.d.ts +27 -0
  20. package/dist/commands/close-questions.js +49 -0
  21. package/dist/commands/close-questions.js.map +1 -0
  22. package/dist/commands/close-questions.test.d.ts +1 -0
  23. package/dist/commands/close-questions.test.js +52 -0
  24. package/dist/commands/close-questions.test.js.map +1 -0
  25. package/dist/commands/connect.d.ts +1 -3
  26. package/dist/commands/connect.js +2 -2
  27. package/dist/commands/connect.js.map +1 -1
  28. package/dist/commands/context.js +74 -44
  29. package/dist/commands/context.js.map +1 -1
  30. package/dist/commands/data-extra.d.ts +13 -0
  31. package/dist/commands/data-extra.js +35 -6
  32. package/dist/commands/data-extra.js.map +1 -1
  33. package/dist/commands/data.js +2 -1
  34. package/dist/commands/data.js.map +1 -1
  35. package/dist/commands/doctor.d.ts +39 -0
  36. package/dist/commands/doctor.js +136 -14
  37. package/dist/commands/doctor.js.map +1 -1
  38. package/dist/commands/hooks.d.ts +19 -0
  39. package/dist/commands/hooks.js +70 -0
  40. package/dist/commands/hooks.js.map +1 -0
  41. package/dist/commands/import.d.ts +25 -0
  42. package/dist/commands/import.js +98 -12
  43. package/dist/commands/import.js.map +1 -1
  44. package/dist/commands/init.d.ts +14 -0
  45. package/dist/commands/init.js +63 -21
  46. package/dist/commands/init.js.map +1 -1
  47. package/dist/commands/keys-request.d.ts +48 -0
  48. package/dist/commands/keys-request.js +236 -0
  49. package/dist/commands/keys-request.js.map +1 -0
  50. package/dist/commands/keys-request.test.d.ts +1 -0
  51. package/dist/commands/keys-request.test.js +176 -0
  52. package/dist/commands/keys-request.test.js.map +1 -0
  53. package/dist/commands/knowledge.d.ts +42 -5
  54. package/dist/commands/knowledge.js +94 -29
  55. package/dist/commands/knowledge.js.map +1 -1
  56. package/dist/commands/lens.js +2 -1
  57. package/dist/commands/lens.js.map +1 -1
  58. package/dist/commands/market-authoring.js +1 -1
  59. package/dist/commands/market-authoring.js.map +1 -1
  60. package/dist/commands/market.d.ts +89 -31
  61. package/dist/commands/market.js +215 -222
  62. package/dist/commands/market.js.map +1 -1
  63. package/dist/commands/mcp.d.ts +1 -1
  64. package/dist/commands/mcp.js +14 -9
  65. package/dist/commands/mcp.js.map +1 -1
  66. package/dist/commands/observe.category.test.d.ts +1 -0
  67. package/dist/commands/observe.category.test.js +59 -0
  68. package/dist/commands/observe.category.test.js.map +1 -0
  69. package/dist/commands/observe.d.ts +3 -0
  70. package/dist/commands/observe.js +7 -5
  71. package/dist/commands/observe.js.map +1 -1
  72. package/dist/commands/observe.title.test.d.ts +1 -0
  73. package/dist/commands/observe.title.test.js +37 -0
  74. package/dist/commands/observe.title.test.js.map +1 -0
  75. package/dist/commands/playbook.js +9 -0
  76. package/dist/commands/playbook.js.map +1 -1
  77. package/dist/commands/pods.d.ts +6 -1
  78. package/dist/commands/pods.js +38 -17
  79. package/dist/commands/pods.js.map +1 -1
  80. package/dist/commands/proposals-actions.js +7 -1
  81. package/dist/commands/proposals-actions.js.map +1 -1
  82. package/dist/commands/proton-setup.js +3 -1
  83. package/dist/commands/proton-setup.js.map +1 -1
  84. package/dist/commands/providers.d.ts +22 -6
  85. package/dist/commands/providers.js +39 -32
  86. package/dist/commands/providers.js.map +1 -1
  87. package/dist/commands/raycast.d.ts +15 -0
  88. package/dist/commands/raycast.js +36 -10
  89. package/dist/commands/raycast.js.map +1 -1
  90. package/dist/commands/session-feed-wait.d.ts +48 -0
  91. package/dist/commands/session-feed-wait.js +261 -0
  92. package/dist/commands/session-feed-wait.js.map +1 -0
  93. package/dist/commands/session-post.d.ts +40 -0
  94. package/dist/commands/session-post.js +96 -0
  95. package/dist/commands/session-post.js.map +1 -0
  96. package/dist/commands/session-wait.d.ts +9 -4
  97. package/dist/commands/session-wait.js +20 -5
  98. package/dist/commands/session-wait.js.map +1 -1
  99. package/dist/commands/sessions.d.ts +2 -0
  100. package/dist/commands/sessions.js +23 -0
  101. package/dist/commands/sessions.js.map +1 -1
  102. package/dist/commands/skills-commands.d.ts +2 -0
  103. package/dist/commands/skills-commands.js +9 -1
  104. package/dist/commands/skills-commands.js.map +1 -1
  105. package/dist/commands/skills-commands.test.d.ts +1 -0
  106. package/dist/commands/skills-commands.test.js +57 -0
  107. package/dist/commands/skills-commands.test.js.map +1 -0
  108. package/dist/commands/status.js +13 -7
  109. package/dist/commands/status.js.map +1 -1
  110. package/dist/commands/statusline.backoff.test.js +13 -3
  111. package/dist/commands/statusline.backoff.test.js.map +1 -1
  112. package/dist/commands/statusline.d.ts +104 -9
  113. package/dist/commands/statusline.js +392 -148
  114. package/dist/commands/statusline.js.map +1 -1
  115. package/dist/commands/statusline.line2.test.d.ts +15 -0
  116. package/dist/commands/statusline.line2.test.js +226 -0
  117. package/dist/commands/statusline.line2.test.js.map +1 -0
  118. package/dist/commands/statusline.needs-you.test.d.ts +1 -0
  119. package/dist/commands/statusline.needs-you.test.js +17 -0
  120. package/dist/commands/statusline.needs-you.test.js.map +1 -0
  121. package/dist/commands/statusline.now.test.d.ts +10 -0
  122. package/dist/commands/statusline.now.test.js +250 -0
  123. package/dist/commands/statusline.now.test.js.map +1 -0
  124. package/dist/commands/tracks.d.ts +68 -6
  125. package/dist/commands/tracks.js +272 -16
  126. package/dist/commands/tracks.js.map +1 -1
  127. package/dist/commands/upload.js +12 -0
  128. package/dist/commands/upload.js.map +1 -1
  129. package/dist/commands/wait.d.ts +124 -0
  130. package/dist/commands/wait.js +384 -0
  131. package/dist/commands/wait.js.map +1 -0
  132. package/dist/commands/wait.test.d.ts +8 -0
  133. package/dist/commands/wait.test.js +308 -0
  134. package/dist/commands/wait.test.js.map +1 -0
  135. package/dist/commands/whoami.d.ts +7 -0
  136. package/dist/commands/whoami.js +17 -0
  137. package/dist/commands/whoami.js.map +1 -1
  138. package/dist/commands/worker-accounts.d.ts +149 -0
  139. package/dist/commands/worker-accounts.js +339 -0
  140. package/dist/commands/worker-accounts.js.map +1 -0
  141. package/dist/commands/worker-accounts.test.d.ts +1 -0
  142. package/dist/commands/worker-accounts.test.js +224 -0
  143. package/dist/commands/worker-accounts.test.js.map +1 -0
  144. package/dist/commands/worker-github-app.d.ts +63 -0
  145. package/dist/commands/worker-github-app.js +161 -0
  146. package/dist/commands/worker-github-app.js.map +1 -0
  147. package/dist/commands/worker-github-app.test.d.ts +1 -0
  148. package/dist/commands/worker-github-app.test.js +102 -0
  149. package/dist/commands/worker-github-app.test.js.map +1 -0
  150. package/dist/commands/worker-github-broker.d.ts +39 -0
  151. package/dist/commands/worker-github-broker.js +106 -0
  152. package/dist/commands/worker-github-broker.js.map +1 -0
  153. package/dist/commands/worker-github-broker.test.d.ts +1 -0
  154. package/dist/commands/worker-github-broker.test.js +90 -0
  155. package/dist/commands/worker-github-broker.test.js.map +1 -0
  156. package/dist/commands/worker-runs.test.d.ts +1 -0
  157. package/dist/commands/worker-runs.test.js +150 -0
  158. package/dist/commands/worker-runs.test.js.map +1 -0
  159. package/dist/commands/worker-worktrees.d.ts +34 -0
  160. package/dist/commands/worker-worktrees.js +87 -0
  161. package/dist/commands/worker-worktrees.js.map +1 -0
  162. package/dist/commands/worker.d.ts +406 -10
  163. package/dist/commands/worker.js +1180 -126
  164. package/dist/commands/worker.js.map +1 -1
  165. package/dist/commands/worker.test.js +588 -11
  166. package/dist/commands/worker.test.js.map +1 -1
  167. package/dist/index.js +220 -28
  168. package/dist/index.js.map +1 -1
  169. package/dist/lib/agent-door.d.ts +1 -3
  170. package/dist/lib/agent-door.js +10 -7
  171. package/dist/lib/agent-door.js.map +1 -1
  172. package/dist/lib/agents-config.d.ts +9 -0
  173. package/dist/lib/agents-config.js +20 -0
  174. package/dist/lib/agents-config.js.map +1 -1
  175. package/dist/lib/atomic-file.d.ts +20 -1
  176. package/dist/lib/atomic-file.js +100 -2
  177. package/dist/lib/atomic-file.js.map +1 -1
  178. package/dist/lib/auth.d.ts +28 -2
  179. package/dist/lib/auth.js +52 -12
  180. package/dist/lib/auth.js.map +1 -1
  181. package/dist/lib/box/egress.d.ts +82 -0
  182. package/dist/lib/box/egress.js +264 -0
  183. package/dist/lib/box/egress.js.map +1 -0
  184. package/dist/lib/box/evidence.d.ts +86 -0
  185. package/dist/lib/box/evidence.js +121 -0
  186. package/dist/lib/box/evidence.js.map +1 -0
  187. package/dist/lib/box/job-server.d.ts +72 -0
  188. package/dist/lib/box/job-server.js +250 -0
  189. package/dist/lib/box/job-server.js.map +1 -0
  190. package/dist/lib/box/provisioner.d.ts +83 -0
  191. package/dist/lib/box/provisioner.js +312 -0
  192. package/dist/lib/box/provisioner.js.map +1 -0
  193. package/dist/lib/box/proxmox.d.ts +112 -0
  194. package/dist/lib/box/proxmox.js +211 -0
  195. package/dist/lib/box/proxmox.js.map +1 -0
  196. package/dist/lib/box/wire.d.ts +98 -0
  197. package/dist/lib/box/wire.js +70 -0
  198. package/dist/lib/box/wire.js.map +1 -0
  199. package/dist/lib/bridge-invocation.test.d.ts +1 -0
  200. package/dist/lib/bridge-invocation.test.js +75 -0
  201. package/dist/lib/bridge-invocation.test.js.map +1 -0
  202. package/dist/lib/bridge-status.d.ts +144 -0
  203. package/dist/lib/bridge-status.js +227 -0
  204. package/dist/lib/bridge-status.js.map +1 -0
  205. package/dist/lib/bridge-status.test.d.ts +6 -0
  206. package/dist/lib/bridge-status.test.js +197 -0
  207. package/dist/lib/bridge-status.test.js.map +1 -0
  208. package/dist/lib/client-header.test.d.ts +1 -0
  209. package/dist/lib/client-header.test.js +103 -0
  210. package/dist/lib/client-header.test.js.map +1 -0
  211. package/dist/lib/conversation-headers.d.ts +89 -9
  212. package/dist/lib/conversation-headers.js +156 -3
  213. package/dist/lib/conversation-headers.js.map +1 -1
  214. package/dist/lib/conversation-headers.test.d.ts +1 -0
  215. package/dist/lib/conversation-headers.test.js +78 -0
  216. package/dist/lib/conversation-headers.test.js.map +1 -0
  217. package/dist/lib/credential-class.d.ts +40 -2
  218. package/dist/lib/credential-class.js +48 -6
  219. package/dist/lib/credential-class.js.map +1 -1
  220. package/dist/lib/device-connect.d.ts +45 -0
  221. package/dist/lib/device-connect.js +60 -0
  222. package/dist/lib/device-connect.js.map +1 -1
  223. package/dist/lib/exporter-coverage.d.ts +1 -1
  224. package/dist/lib/exporter-coverage.js +1 -1
  225. package/dist/lib/goal-words.d.ts +38 -0
  226. package/dist/lib/goal-words.js +115 -0
  227. package/dist/lib/goal-words.js.map +1 -0
  228. package/dist/lib/hub-client.d.ts +87 -8
  229. package/dist/lib/hub-client.js +205 -70
  230. package/dist/lib/hub-client.js.map +1 -1
  231. package/dist/lib/init-handoff.d.ts +8 -0
  232. package/dist/lib/init-handoff.js +9 -2
  233. package/dist/lib/init-handoff.js.map +1 -1
  234. package/dist/lib/key-locations.d.ts +3 -3
  235. package/dist/lib/key-locations.js +3 -39
  236. package/dist/lib/key-locations.js.map +1 -1
  237. package/dist/lib/key-source.d.ts +3 -1
  238. package/dist/lib/key-source.js +7 -4
  239. package/dist/lib/key-source.js.map +1 -1
  240. package/dist/lib/knowledge-title.d.ts +3 -2
  241. package/dist/lib/knowledge-title.js +3 -2
  242. package/dist/lib/knowledge-title.js.map +1 -1
  243. package/dist/lib/machine-instance.d.ts +7 -5
  244. package/dist/lib/machine-instance.js +7 -5
  245. package/dist/lib/machine-instance.js.map +1 -1
  246. package/dist/lib/mcp-bridge.d.ts +50 -0
  247. package/dist/lib/mcp-bridge.js +232 -11
  248. package/dist/lib/mcp-bridge.js.map +1 -1
  249. package/dist/lib/mcp-bridge.test.js +224 -4
  250. package/dist/lib/mcp-bridge.test.js.map +1 -1
  251. package/dist/lib/mcp-call.d.ts +5 -1
  252. package/dist/lib/mcp-call.js +7 -6
  253. package/dist/lib/mcp-call.js.map +1 -1
  254. package/dist/lib/mcp-connector-url.test.d.ts +1 -0
  255. package/dist/lib/mcp-connector-url.test.js +13 -0
  256. package/dist/lib/mcp-connector-url.test.js.map +1 -0
  257. package/dist/lib/mcp-snippets.d.ts +16 -0
  258. package/dist/lib/mcp-snippets.js +20 -2
  259. package/dist/lib/mcp-snippets.js.map +1 -1
  260. package/dist/lib/now-line.d.ts +66 -0
  261. package/dist/lib/now-line.js +193 -0
  262. package/dist/lib/now-line.js.map +1 -0
  263. package/dist/lib/now-line.test.d.ts +5 -0
  264. package/dist/lib/now-line.test.js +177 -0
  265. package/dist/lib/now-line.test.js.map +1 -0
  266. package/dist/lib/package-updates.d.ts +66 -0
  267. package/dist/lib/package-updates.js +76 -0
  268. package/dist/lib/package-updates.js.map +1 -0
  269. package/dist/lib/pod-moved.d.ts +70 -0
  270. package/dist/lib/pod-moved.js +146 -0
  271. package/dist/lib/pod-moved.js.map +1 -0
  272. package/dist/lib/pod-reach.d.ts +39 -0
  273. package/dist/lib/pod-reach.js +117 -0
  274. package/dist/lib/pod-reach.js.map +1 -0
  275. package/dist/lib/pod-reach.test.d.ts +1 -0
  276. package/dist/lib/pod-reach.test.js +67 -0
  277. package/dist/lib/pod-reach.test.js.map +1 -0
  278. package/dist/lib/pod.d.ts +8 -4
  279. package/dist/lib/pod.js +12 -10
  280. package/dist/lib/pod.js.map +1 -1
  281. package/dist/lib/register-claude-code-mcp.test.d.ts +1 -0
  282. package/dist/lib/register-claude-code-mcp.test.js +97 -0
  283. package/dist/lib/register-claude-code-mcp.test.js.map +1 -0
  284. package/dist/lib/review-credential.js +3 -1
  285. package/dist/lib/review-credential.js.map +1 -1
  286. package/dist/lib/safe-open.d.ts +5 -3
  287. package/dist/lib/safe-open.js +9 -8
  288. package/dist/lib/safe-open.js.map +1 -1
  289. package/dist/lib/self-host.d.ts +17 -0
  290. package/dist/lib/self-host.js +24 -0
  291. package/dist/lib/self-host.js.map +1 -0
  292. package/dist/lib/session-feed.d.ts +185 -0
  293. package/dist/lib/session-feed.js +257 -0
  294. package/dist/lib/session-feed.js.map +1 -0
  295. package/dist/lib/targets.d.ts +52 -3
  296. package/dist/lib/targets.js +150 -209
  297. package/dist/lib/targets.js.map +1 -1
  298. package/dist/lib/template-lifecycle.d.ts +0 -31
  299. package/dist/lib/template-lifecycle.js +0 -74
  300. package/dist/lib/template-lifecycle.js.map +1 -1
  301. package/dist/lib/term.d.ts +24 -0
  302. package/dist/lib/term.js +52 -0
  303. package/dist/lib/term.js.map +1 -0
  304. package/dist/lib/term.test.d.ts +1 -0
  305. package/dist/lib/term.test.js +29 -0
  306. package/dist/lib/term.test.js.map +1 -0
  307. package/dist/lib/transcript-index.d.ts +94 -0
  308. package/dist/lib/transcript-index.js +321 -0
  309. package/dist/lib/transcript-index.js.map +1 -0
  310. package/dist/lib/transcript-index.test.d.ts +10 -0
  311. package/dist/lib/transcript-index.test.js +200 -0
  312. package/dist/lib/transcript-index.test.js.map +1 -0
  313. package/dist/lib/wait-help.d.ts +11 -0
  314. package/dist/lib/wait-help.js +25 -0
  315. package/dist/lib/wait-help.js.map +1 -0
  316. package/dist/lib/wait-state.d.ts +57 -0
  317. package/dist/lib/wait-state.js +114 -0
  318. package/dist/lib/wait-state.js.map +1 -0
  319. package/dist/lib/wake-hook-settings.d.ts +57 -0
  320. package/dist/lib/wake-hook-settings.js +153 -0
  321. package/dist/lib/wake-hook-settings.js.map +1 -0
  322. package/dist/lib/wake-state.d.ts +65 -0
  323. package/dist/lib/wake-state.js +122 -0
  324. package/dist/lib/wake-state.js.map +1 -0
  325. package/package.json +5 -2
  326. package/skills/README.md +1 -1
  327. package/skills/agent-os/SKILL.md +8 -8
  328. package/skills/synap/SKILL.md +188 -94
  329. package/skills/synap/code-skills.md +84 -0
  330. package/skills/synap/concepts.md +38 -20
  331. package/skills/synap/creative-loop.md +1 -1
  332. package/skills/synap/document-embeds.md +17 -1
  333. package/skills/synap/focus-sessions.md +17 -8
  334. package/skills/synap/from-intent.md +33 -17
  335. package/skills/synap/governance-rules.md +3 -1
  336. package/skills/synap/hand-off.md +10 -6
  337. package/skills/synap/lenses.md +4 -4
  338. package/skills/synap/linking.md +2 -2
  339. package/skills/synap/mental-model.md +1 -1
  340. package/skills/synap/operating-mode-rules.md +1 -1
  341. package/skills/synap/quick-reference.md +2 -1
  342. package/skills/synap/reflexes.md +8 -8
  343. package/skills/synap/viewframe-cells.md +1 -1
  344. package/skills/synap/work-model.md +24 -10
  345. package/skills/synap/workspace-design.md +5 -5
  346. package/skills/synap/writes.md +16 -9
  347. package/skills/synap/writing-titles.md +7 -0
  348. package/skills/synap-app/SKILL.md +148 -66
  349. package/skills/synap-app/creating-the-base-app.md +12 -7
  350. package/skills/synap-app/governance.md +27 -16
  351. package/skills/synap-app/install-commands.md +18 -9
  352. package/skills/synap-app/overview.md +16 -9
  353. package/skills/synap-app/using-the-sdk.md +75 -25
  354. package/skills/synap-market/SKILL.md +1 -1
  355. package/skills/synap-market/governance-and-catalog.md +1 -1
  356. package/skills/synap-schema/SKILL.md +24 -21
  357. package/skills/synap-schema/intent-vocabulary-ssot.md +24 -21
  358. package/templates/box/runner.py +206 -0
@@ -0,0 +1,48 @@
1
+ /**
2
+ * `synap session wait [sessionId] --events <kinds>` and `--hook`.
3
+ *
4
+ * `--events` waits on the session CHANGE FEED (`lib/session-feed.ts`) instead
5
+ * of answers only: answers, decided proposals, stage moves, the owner's room
6
+ * messages and — on pods that deliver them — messages from another session's
7
+ * agent (`session_message`). It prints each event's FENCED text, its intent
8
+ * and its sender session, and the exact reply (with `--cause`).
9
+ *
10
+ * `--hook` is the same wait shaped for a Claude Code `asyncRewake` Stop hook
11
+ * (installed by `synap hooks install-wake` / `synap init`): it blocks until a
12
+ * wake-worthy event, prints the message on stderr and exits 2 — the code
13
+ * Claude Code reads as "wake the model with this" — and exits 0 on everything
14
+ * else (timeout, no attached session, a newer waiter, a failure), so a hook
15
+ * can never wake an agent with an error and loop. The contract it relies on is
16
+ * documented in `lib/wake-hook-settings.ts`.
17
+ */
18
+ import { type HubConfig } from "../lib/hub-client.js";
19
+ import { type WaitSessionOpts } from "./session-wait.js";
20
+ export interface WaitSessionFeedOpts extends WaitSessionOpts {
21
+ events?: string;
22
+ once?: boolean;
23
+ wakeOnly?: boolean;
24
+ peek?: boolean;
25
+ hook?: boolean;
26
+ }
27
+ /** What `--hook` exits with — Claude Code's asyncRewake reads 2 as "wake". */
28
+ export declare const WAKE_HOOK_EXIT: {
29
+ readonly WAKE: 2;
30
+ readonly IDLE: 0;
31
+ };
32
+ export declare function waitSessionFeedCommand(sessionIdArg: string | undefined, opts: WaitSessionFeedOpts): Promise<void>;
33
+ /**
34
+ * The hook's whole decision, without the process around it — what the tests
35
+ * drive. Returns the exit code and the stderr text.
36
+ */
37
+ export declare function runWakeHook(sessionId: string, cfg: HubConfig, p: {
38
+ kinds: string[];
39
+ timeoutMs: number;
40
+ conversationId: string | undefined;
41
+ limit?: number;
42
+ pollSeconds?: number;
43
+ retryDelayMs?: number;
44
+ }): Promise<{
45
+ code: number;
46
+ message: string;
47
+ }>;
48
+ export declare function waitSessionHookCommand(sessionIdArg: string | undefined, opts: WaitSessionFeedOpts): Promise<void>;
@@ -0,0 +1,261 @@
1
+ /**
2
+ * `synap session wait [sessionId] --events <kinds>` and `--hook`.
3
+ *
4
+ * `--events` waits on the session CHANGE FEED (`lib/session-feed.ts`) instead
5
+ * of answers only: answers, decided proposals, stage moves, the owner's room
6
+ * messages and — on pods that deliver them — messages from another session's
7
+ * agent (`session_message`). It prints each event's FENCED text, its intent
8
+ * and its sender session, and the exact reply (with `--cause`).
9
+ *
10
+ * `--hook` is the same wait shaped for a Claude Code `asyncRewake` Stop hook
11
+ * (installed by `synap hooks install-wake` / `synap init`): it blocks until a
12
+ * wake-worthy event, prints the message on stderr and exits 2 — the code
13
+ * Claude Code reads as "wake the model with this" — and exits 0 on everything
14
+ * else (timeout, no attached session, a newer waiter, a failure), so a hook
15
+ * can never wake an agent with an error and loop. The contract it relies on is
16
+ * documented in `lib/wake-hook-settings.ts`.
17
+ */
18
+ import chalk from "chalk";
19
+ import { log } from "../utils/logger.js";
20
+ import { resolveHubConfig, resolveActiveSessionId, renderHubError, } from "../lib/hub-client.js";
21
+ import { getClaudeSessionId } from "../lib/session-lens.js";
22
+ import { isUuid, requireFullId } from "../lib/id.js";
23
+ import { parseDuration } from "./proposals-await.js";
24
+ import { SESSION_MESSAGE_KIND, SessionMessagesUnsupportedError, WAKE_HOOK_DEFAULT_KINDS, isWakeEvent, parseEventKinds, renderFeedEvent, renderWakeMessage, waitForSessionFeed, } from "../lib/session-feed.js";
25
+ import { claimWake, isWakeOwner, readWakeState, recordRead, takeDelivery, wakeStatePath, } from "../lib/wake-state.js";
26
+ import { SESSION_WAIT_EXIT } from "./session-wait.js";
27
+ /** What `--hook` exits with — Claude Code's asyncRewake reads 2 as "wake". */
28
+ export const WAKE_HOOK_EXIT = { WAKE: 2, IDLE: 0 };
29
+ const DEFAULT_TIMEOUT_MS = 30 * 60_000;
30
+ function parseLimit(raw) {
31
+ if (raw === undefined)
32
+ return undefined;
33
+ const n = Number(raw);
34
+ return Number.isInteger(n) && n >= 1 && n <= 100 ? n : null;
35
+ }
36
+ // ─── --events ─────────────────────────────────────────────────────────────────
37
+ export async function waitSessionFeedCommand(sessionIdArg, opts) {
38
+ const fail = (msg) => {
39
+ console.error(chalk.red(msg));
40
+ process.exit(SESSION_WAIT_EXIT.FAILURE);
41
+ };
42
+ let kinds;
43
+ try {
44
+ kinds = opts.events ? parseEventKinds(opts.events) : [...WAKE_HOOK_DEFAULT_KINDS];
45
+ }
46
+ catch (e) {
47
+ return fail(e.message);
48
+ }
49
+ const timeoutMs = parseDuration(opts.timeout, DEFAULT_TIMEOUT_MS);
50
+ if (timeoutMs === null) {
51
+ return fail("Unparseable duration. Use a number with a unit: 500ms, 30s, 15m, 2h (bare number = seconds).");
52
+ }
53
+ const limit = parseLimit(opts.limit);
54
+ if (limit === null)
55
+ return fail("--limit must be a whole number between 1 and 100.");
56
+ let cfg;
57
+ let sessionId;
58
+ let result;
59
+ try {
60
+ cfg = await resolveHubConfig(opts);
61
+ const resolved = sessionIdArg ?? resolveActiveSessionId(cfg.podUrl);
62
+ if (!resolved) {
63
+ return fail("No session given and none attached to this terminal. Pass one, or run: synap session attach <id>");
64
+ }
65
+ requireFullId(resolved, "session", chalk, log);
66
+ sessionId = resolved;
67
+ if (!opts.json) {
68
+ log.dim(`Waiting on session ${sessionId.slice(0, 8)} for ${kinds.join(", ")}${opts.wakeOnly ? " (wake-worthy only)" : ""} — up to ${timeoutMs < 120_000 ? `${Math.round(timeoutMs / 1000)}s` : `${Math.round(timeoutMs / 60_000)}m`}.`);
69
+ }
70
+ result = await waitForSessionFeed(sessionId, cfg, {
71
+ kinds,
72
+ // No --since: the pod's UNREAD mode — answers not picked up and mail not
73
+ // read yet, of any age, so a message that landed before this wait counts.
74
+ since: opts.since,
75
+ timeoutMs,
76
+ limit,
77
+ stamp: !opts.peek,
78
+ once: opts.once,
79
+ ...(opts.wakeOnly ? { accept: isWakeEvent } : {}),
80
+ });
81
+ }
82
+ catch (e) {
83
+ if (e instanceof SessionMessagesUnsupportedError)
84
+ return fail(e.message);
85
+ renderHubError(e);
86
+ process.exit(SESSION_WAIT_EXIT.FAILURE);
87
+ return;
88
+ }
89
+ const resume = `synap session wait ${sessionId} --events ${kinds.join(",")}${opts.wakeOnly ? " --wake-only" : ""} --since ${result.nextSince ?? "<cursor>"}`;
90
+ if (opts.json) {
91
+ console.log(JSON.stringify({
92
+ sessionId,
93
+ since: result.nextSince,
94
+ events: result.events,
95
+ state: result.state,
96
+ hasMore: result.hasMore,
97
+ skipped: result.skipped,
98
+ ...(result.events.length === 0 ? { timedOut: true, elapsedMs: result.elapsedMs } : {}),
99
+ }, null, 2));
100
+ }
101
+ else if (result.events.length === 0) {
102
+ log.error(`Timed out after ${Math.round(result.elapsedMs / 1000)}s — nothing new.`);
103
+ if (result.skipped > 0)
104
+ log.hint(`${result.skipped} event(s) read that do not wake (--wake-only).`);
105
+ log.hint(`Resume → ${resume}`);
106
+ }
107
+ else {
108
+ for (const e of result.events) {
109
+ const [head, ...rest] = renderFeedEvent(e);
110
+ log.success(head ?? e.kind);
111
+ for (const line of rest)
112
+ console.log(line);
113
+ }
114
+ if (result.skipped > 0)
115
+ log.dim(`${result.skipped} other event(s) read that do not wake (--wake-only).`);
116
+ if (result.hasMore)
117
+ log.dim("More waiting: run the cursor line again.");
118
+ log.dim(`Cursor → ${resume}`);
119
+ }
120
+ process.exit(result.events.length > 0 ? SESSION_WAIT_EXIT.ANSWERED : SESSION_WAIT_EXIT.TIMEOUT);
121
+ }
122
+ // ─── --hook ───────────────────────────────────────────────────────────────────
123
+ /** The Stop hook's stdin (`session_id`, `cwd`, …); `{}` when there is none. */
124
+ async function readHookInput(timeoutMs = 1_000) {
125
+ if (process.stdin.isTTY)
126
+ return {};
127
+ return new Promise((resolve) => {
128
+ let raw = "";
129
+ const done = () => {
130
+ process.stdin.removeAllListeners();
131
+ process.stdin.pause();
132
+ try {
133
+ const v = JSON.parse(raw);
134
+ resolve(v && typeof v === "object" ? v : {});
135
+ }
136
+ catch {
137
+ resolve({});
138
+ }
139
+ };
140
+ const timer = setTimeout(done, timeoutMs);
141
+ timer.unref();
142
+ process.stdin.setEncoding("utf8");
143
+ process.stdin.on("data", (chunk) => (raw += chunk));
144
+ process.stdin.on("end", () => {
145
+ clearTimeout(timer);
146
+ done();
147
+ });
148
+ process.stdin.on("error", () => {
149
+ clearTimeout(timer);
150
+ done();
151
+ });
152
+ });
153
+ }
154
+ /** Write to stderr, THEN exit: a pipe write is async, and exit would cut it. */
155
+ function finishHook(code, message = "") {
156
+ return new Promise(() => {
157
+ if (!message)
158
+ process.exit(code);
159
+ process.stderr.write(message, () => process.exit(code));
160
+ });
161
+ }
162
+ /**
163
+ * The hook's whole decision, without the process around it — what the tests
164
+ * drive. Returns the exit code and the stderr text.
165
+ */
166
+ export async function runWakeHook(sessionId, cfg, p) {
167
+ const file = wakeStatePath(p.conversationId, sessionId);
168
+ const owner = claimWake(file);
169
+ let kinds = p.kinds;
170
+ let note = "";
171
+ const deadline = Date.now() + p.timeoutMs;
172
+ for (;;) {
173
+ let result;
174
+ try {
175
+ result = await waitForSessionFeed(sessionId, cfg, {
176
+ kinds,
177
+ since: readWakeState(file).since ?? undefined,
178
+ timeoutMs: Math.max(deadline - Date.now(), 1_000),
179
+ limit: p.limit,
180
+ pollSeconds: p.pollSeconds,
181
+ retryDelayMs: p.retryDelayMs,
182
+ accept: isWakeEvent,
183
+ onCursor: (since) => recordRead(file, { since }),
184
+ onSkipped: (carry) => recordRead(file, { since: null, carry }),
185
+ shouldStop: () => !isWakeOwner(file, owner),
186
+ });
187
+ }
188
+ catch (e) {
189
+ if (e instanceof SessionMessagesUnsupportedError && kinds.includes(SESSION_MESSAGE_KIND)) {
190
+ kinds = kinds.filter((k) => k !== SESSION_MESSAGE_KIND);
191
+ note = `[synap wake] ${e.message} Waiting on ${kinds.join(", ") || "nothing"} only.\n`;
192
+ if (kinds.length === 0)
193
+ return { code: WAKE_HOOK_EXIT.IDLE, message: note };
194
+ continue;
195
+ }
196
+ // Never wake an agent with an error: a hook that exits 2 on a failure
197
+ // would wake it, stop, re-arm and fail again, forever.
198
+ return {
199
+ code: WAKE_HOOK_EXIT.IDLE,
200
+ message: `${note}[synap wake] not waiting: ${e.message}\n`,
201
+ };
202
+ }
203
+ if (result.stopped)
204
+ return { code: WAKE_HOOK_EXIT.IDLE, message: `${note}[synap wake] a newer wait took over.\n` };
205
+ if (result.events.length === 0)
206
+ return { code: WAKE_HOOK_EXIT.IDLE, message: `${note}[synap wake] timed out, nothing new.\n` };
207
+ const delivery = takeDelivery(file, { events: result.events, since: result.nextSince });
208
+ if (delivery.events.length === 0) {
209
+ return { code: WAKE_HOOK_EXIT.IDLE, message: `${note}[synap wake] already delivered by another wait.\n` };
210
+ }
211
+ return {
212
+ code: WAKE_HOOK_EXIT.WAKE,
213
+ message: note + renderWakeMessage(sessionId, delivery.events, delivery.carried),
214
+ };
215
+ }
216
+ }
217
+ export async function waitSessionHookCommand(sessionIdArg, opts) {
218
+ // `claude -p` (and the SDK without streaming input) runs an asyncRewake hook
219
+ // in the FOREGROUND (Claude Code 2.1.309: backgrounded only when interactive
220
+ // or with streaming input), so a wait here would hold the whole run open.
221
+ const entrypoint = process.env.CLAUDE_CODE_ENTRYPOINT;
222
+ if (entrypoint?.startsWith("sdk-")) {
223
+ return finishHook(WAKE_HOOK_EXIT.IDLE, `[synap wake] not waiting: a non-interactive run (${entrypoint}) would block on this hook.\n`);
224
+ }
225
+ const input = await readHookInput();
226
+ // The hook's stdin names the conversation; the lens and the conversation
227
+ // header read it from the same variable the statusline uses.
228
+ if (input.session_id && !getClaudeSessionId())
229
+ process.env.SYNAP_LENS_SESSION = input.session_id;
230
+ let kinds;
231
+ try {
232
+ kinds = opts.events ? parseEventKinds(opts.events) : [...WAKE_HOOK_DEFAULT_KINDS];
233
+ }
234
+ catch (e) {
235
+ return finishHook(WAKE_HOOK_EXIT.IDLE, `[synap wake] ${e.message}\n`);
236
+ }
237
+ const timeoutMs = parseDuration(opts.timeout, DEFAULT_TIMEOUT_MS);
238
+ const limit = parseLimit(opts.limit);
239
+ if (timeoutMs === null || limit === null) {
240
+ return finishHook(WAKE_HOOK_EXIT.IDLE, "[synap wake] bad --timeout or --limit.\n");
241
+ }
242
+ let cfg;
243
+ try {
244
+ cfg = await resolveHubConfig(opts);
245
+ }
246
+ catch (e) {
247
+ return finishHook(WAKE_HOOK_EXIT.IDLE, `[synap wake] no pod: ${e.message}\n`);
248
+ }
249
+ const sessionId = sessionIdArg ?? resolveActiveSessionId(cfg.podUrl);
250
+ if (!sessionId || !isUuid(sessionId)) {
251
+ return finishHook(WAKE_HOOK_EXIT.IDLE, "[synap wake] no session attached to this terminal (synap session attach <id>), nothing to wait on.\n");
252
+ }
253
+ const { code, message } = await runWakeHook(sessionId, cfg, {
254
+ kinds,
255
+ timeoutMs,
256
+ conversationId: getClaudeSessionId(),
257
+ limit,
258
+ });
259
+ return finishHook(code, message);
260
+ }
261
+ //# sourceMappingURL=session-feed-wait.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-feed-wait.js","sourceRoot":"","sources":["../../src/commands/session-feed-wait.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,40 @@
1
+ /**
2
+ * `synap session post <toSessionId> <text>` — an agent's typed message to
3
+ * ANOTHER session (a coordination post): `--intent blocked_on_you | handoff |
4
+ * done | fyi`, the reply's `--cause`, `--ref` pointers to the state behind it.
5
+ *
6
+ * The CLI twin of MCP `synap_post_message` with `toSessionId`. It goes through
7
+ * the Hub door `POST /threads/<target room>/messages` with `intent`, so the
8
+ * pod's ONE codec (`session-post.ts` in synap-backend) decides the sender
9
+ * session (this terminal's bound session, or `--from`), the target and the
10
+ * wake — only blocked_on_you and handoff may wake the other agent, a reply
11
+ * chain wakes at most once, at most 3 wakes per session pair per 10 minutes.
12
+ * The CLI decides none of it and only reports what the pod stamped.
13
+ *
14
+ * `--cause` is how a reply made inside a wake turn names the message that
15
+ * woke it (the feed event id `synap session wait --hook` prints): the pod's
16
+ * hop guard counts on it to stop two agents waking each other forever.
17
+ *
18
+ * A pod that predates coordination posts drops `intent` without a word and
19
+ * stores a plain room post; the reply then carries no `sessionPost`, and this
20
+ * command says so (exit 1) instead of reporting a delivery that did not happen.
21
+ */
22
+ import { type BaseOpts } from "./data.js";
23
+ export interface SessionPostOpts extends BaseOpts {
24
+ intent?: string;
25
+ cause?: string;
26
+ from?: string;
27
+ ref?: string[];
28
+ }
29
+ /** `kind:id` or `kind:id:label` → the pod's ref shape. The pod validates kind and id. */
30
+ export declare function parseRef(raw: string): {
31
+ kind: string;
32
+ id: string;
33
+ label?: string;
34
+ };
35
+ export declare const SESSION_POST_EXIT: {
36
+ readonly DELIVERED: 0;
37
+ readonly NOT_ADDRESSED: 1;
38
+ readonly FAILURE: 2;
39
+ };
40
+ export declare function sessionPostCommand(toSessionId: string, textParts: string[], opts: SessionPostOpts): Promise<void>;
@@ -0,0 +1,96 @@
1
+ /**
2
+ * `synap session post <toSessionId> <text>` — an agent's typed message to
3
+ * ANOTHER session (a coordination post): `--intent blocked_on_you | handoff |
4
+ * done | fyi`, the reply's `--cause`, `--ref` pointers to the state behind it.
5
+ *
6
+ * The CLI twin of MCP `synap_post_message` with `toSessionId`. It goes through
7
+ * the Hub door `POST /threads/<target room>/messages` with `intent`, so the
8
+ * pod's ONE codec (`session-post.ts` in synap-backend) decides the sender
9
+ * session (this terminal's bound session, or `--from`), the target and the
10
+ * wake — only blocked_on_you and handoff may wake the other agent, a reply
11
+ * chain wakes at most once, at most 3 wakes per session pair per 10 minutes.
12
+ * The CLI decides none of it and only reports what the pod stamped.
13
+ *
14
+ * `--cause` is how a reply made inside a wake turn names the message that
15
+ * woke it (the feed event id `synap session wait --hook` prints): the pod's
16
+ * hop guard counts on it to stop two agents waking each other forever.
17
+ *
18
+ * A pod that predates coordination posts drops `intent` without a word and
19
+ * stores a plain room post; the reply then carries no `sessionPost`, and this
20
+ * command says so (exit 1) instead of reporting a delivery that did not happen.
21
+ */
22
+ import chalk from "chalk";
23
+ import { log } from "../utils/logger.js";
24
+ import { resolveHubConfig, resolveUserId, hubGet, hubPost, renderHubError, } from "../lib/hub-client.js";
25
+ import { requireFullId } from "../lib/id.js";
26
+ /** `kind:id` or `kind:id:label` → the pod's ref shape. The pod validates kind and id. */
27
+ export function parseRef(raw) {
28
+ const [kind, id, ...label] = raw.split(":");
29
+ if (!kind || !id)
30
+ throw new Error(`--ref ${JSON.stringify(raw)}: use kind:id or kind:id:label (e.g. session:<id>).`);
31
+ return label.length > 0 ? { kind, id, label: label.join(":") } : { kind, id };
32
+ }
33
+ export const SESSION_POST_EXIT = { DELIVERED: 0, NOT_ADDRESSED: 1, FAILURE: 2 };
34
+ export async function sessionPostCommand(toSessionId, textParts, opts) {
35
+ requireFullId(toSessionId, "session", chalk, log);
36
+ const text = textParts.join(" ").trim();
37
+ if (!text) {
38
+ console.error(chalk.red("Say something: synap session post <sessionId> \"<text>\""));
39
+ process.exit(SESSION_POST_EXIT.FAILURE);
40
+ }
41
+ let refs;
42
+ try {
43
+ refs = opts.ref?.length ? opts.ref.map(parseRef) : undefined;
44
+ }
45
+ catch (e) {
46
+ console.error(chalk.red(e.message));
47
+ process.exit(SESSION_POST_EXIT.FAILURE);
48
+ }
49
+ let res;
50
+ try {
51
+ const cfg = await resolveHubConfig(opts);
52
+ // The target's room: every post to a session lands there.
53
+ const target = (await hubGet(`/focus-sessions/${toSessionId}`, {}, cfg));
54
+ if (!target?.channelId) {
55
+ console.error(chalk.red(`Session ${toSessionId} has no room yet, so it cannot receive a message.`));
56
+ process.exit(SESSION_POST_EXIT.FAILURE);
57
+ }
58
+ const userId = await resolveUserId(cfg);
59
+ res = (await hubPost(`/threads/${target.channelId}/messages`, {
60
+ role: "assistant",
61
+ content: text,
62
+ userId,
63
+ intent: opts.intent ?? "fyi",
64
+ ...(opts.from ? { fromSessionId: opts.from } : {}),
65
+ ...(refs ? { refs } : {}),
66
+ ...(opts.cause ? { cause: opts.cause } : {}),
67
+ }, cfg));
68
+ }
69
+ catch (e) {
70
+ renderHubError(e);
71
+ process.exit(SESSION_POST_EXIT.FAILURE);
72
+ return;
73
+ }
74
+ if (opts.json) {
75
+ console.log(JSON.stringify(res, null, 2));
76
+ process.exit(res.sessionPost ? SESSION_POST_EXIT.DELIVERED : SESSION_POST_EXIT.NOT_ADDRESSED);
77
+ }
78
+ const sp = res.sessionPost;
79
+ if (!sp) {
80
+ log.warn("This pod does not deliver agent messages yet: the text landed in that session's room as a plain post, addressed to no one, waking no one.");
81
+ if (res.messageId)
82
+ log.hint(`Message ${res.messageId}`);
83
+ process.exit(SESSION_POST_EXIT.NOT_ADDRESSED);
84
+ }
85
+ log.success(`${sp.intent} sent to session ${sp.to.sessionId.slice(0, 8)}` +
86
+ (sp.wake ? " — it may wake that session's agent." : " — delivered without waking anyone."));
87
+ if (res.note)
88
+ log.dim(res.note);
89
+ if (!sp.from.sessionId) {
90
+ log.dim("No sender session: this terminal is bound to none, so the other agent cannot reply. Pass --from <your session id>.");
91
+ }
92
+ if (res.messageId)
93
+ log.dim(`Message ${res.messageId}`);
94
+ process.exit(SESSION_POST_EXIT.DELIVERED);
95
+ }
96
+ //# sourceMappingURL=session-post.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"session-post.js","sourceRoot":"","sources":["../../src/commands/session-post.ts"],"names":[],"mappings":"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"}
@@ -6,9 +6,8 @@
6
6
  * into the session room (`synap_post_message` / the room), then calls this
7
7
  * command instead of a hand-rolled sleep loop or a blind re-invocation. It
8
8
  * polls `GET /api/hub/focus-sessions/:id/answers` (owner-floored; `since`
9
- * exclusive; contract in
10
- * `~/.claude/projects/-Users-antoine-Documents-Code-synap/memory/
11
- * scratch-lane-answer-loop-2026-09-25.md`) and exits the moment a reply
9
+ * exclusive; contract in pod document
10
+ * `db390250-3a74-4707-bb29-5832a454d194`) and exits the moment a reply
12
11
  * arrives, printing it so the calling agent (Claude Code or any shell agent)
13
12
  * can read it back and continue.
14
13
  *
@@ -107,5 +106,11 @@ export interface WaitSessionOpts extends BaseOpts {
107
106
  timeout?: string;
108
107
  interval?: string;
109
108
  limit?: string;
109
+ /** The change feed instead of answers only (`session-feed-wait.ts`). */
110
+ events?: string;
111
+ once?: boolean;
112
+ wakeOnly?: boolean;
113
+ peek?: boolean;
114
+ hook?: boolean;
110
115
  }
111
- export declare function waitSessionCommand(sessionId: string, opts: WaitSessionOpts): Promise<void>;
116
+ export declare function waitSessionCommand(sessionIdArg: string | undefined, opts: WaitSessionOpts): Promise<void>;
@@ -6,9 +6,8 @@
6
6
  * into the session room (`synap_post_message` / the room), then calls this
7
7
  * command instead of a hand-rolled sleep loop or a blind re-invocation. It
8
8
  * polls `GET /api/hub/focus-sessions/:id/answers` (owner-floored; `since`
9
- * exclusive; contract in
10
- * `~/.claude/projects/-Users-antoine-Documents-Code-synap/memory/
11
- * scratch-lane-answer-loop-2026-09-25.md`) and exits the moment a reply
9
+ * exclusive; contract in pod document
10
+ * `db390250-3a74-4707-bb29-5832a454d194`) and exits the moment a reply
12
11
  * arrives, printing it so the calling agent (Claude Code or any shell agent)
13
12
  * can read it back and continue.
14
13
  *
@@ -24,7 +23,7 @@
24
23
  */
25
24
  import chalk from "chalk";
26
25
  import { log } from "../utils/logger.js";
27
- import { resolveHubConfig, hubGet, renderHubError, } from "../lib/hub-client.js";
26
+ import { resolveHubConfig, resolveActiveSessionId, hubGet, renderHubError, } from "../lib/hub-client.js";
28
27
  import { requireFullId } from "../lib/id.js";
29
28
  import { pollForApproval } from "../lib/approval-poll.js";
30
29
  import { parseDuration } from "./proposals-await.js";
@@ -137,7 +136,23 @@ export const SESSION_WAIT_EXIT = {
137
136
  TIMEOUT: 1,
138
137
  FAILURE: 2,
139
138
  };
140
- export async function waitSessionCommand(sessionId, opts) {
139
+ export async function waitSessionCommand(sessionIdArg, opts) {
140
+ // The change feed and the Claude Code hook ride the long-poll feed door;
141
+ // the answer-only wait below keeps its own poll, unchanged.
142
+ if (opts.hook) {
143
+ const { waitSessionHookCommand } = await import("./session-feed-wait.js");
144
+ return waitSessionHookCommand(sessionIdArg, opts);
145
+ }
146
+ if (opts.events || opts.wakeOnly || opts.once || opts.peek) {
147
+ const { waitSessionFeedCommand } = await import("./session-feed-wait.js");
148
+ return waitSessionFeedCommand(sessionIdArg, opts);
149
+ }
150
+ const sessionId = sessionIdArg ?? resolveActiveSessionId();
151
+ if (!sessionId) {
152
+ console.error(chalk.red("No session given and none attached to this terminal. Pass one, or run: synap session attach <id>"));
153
+ process.exit(SESSION_WAIT_EXIT.FAILURE);
154
+ return;
155
+ }
141
156
  requireFullId(sessionId, "session", chalk, log);
142
157
  const timeoutMs = parseDuration(opts.timeout, DEFAULT_TIMEOUT_MS);
143
158
  const intervalMs = parseDuration(opts.interval, DEFAULT_INTERVAL_MS);
@@ -1 +1 @@
1
- {"version":3,"file":"session-wait.js","sourceRoot":"","sources":["../../src/commands/session-wait.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"session-wait.js","sourceRoot":"","sources":["../../src/commands/session-wait.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;AAEH,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,GAAG,EAAE,MAAM,oBAAoB,CAAC;AACzC,OAAO,EACL,gBAAgB,EAChB,sBAAsB,EACtB,MAAM,EACN,cAAc,GAEf,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAsCrD,SAAS,aAAa,CAAC,IAAa;IAClC,OAAO,CACL,CAAC,CAAC,IAAI;QACN,OAAO,IAAI,KAAK,QAAQ;QACxB,KAAK,CAAC,OAAO,CAAE,IAA8B,CAAC,OAAO,CAAC,CACvD,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,OAAO,sBAAuB,SAAQ,KAAK;CAAG;AAEpD;;;;;GAKG;AACH,MAAM,yBAAyB,GAAG,CAAC,CAAC;AAiBpC,SAAS,UAAU,CACjB,SAAiB,EACjB,GAAc,EACd,KAAyB,EACzB,KAAyB;IAEzB,MAAM,CAAC,GAAG,IAAI,GAAG,CACf,GAAG,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,2BAA2B,SAAS,UAAU,CAChF,CAAC;IACF,IAAI,KAAK;QAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC9C,IAAI,KAAK;QAAE,CAAC,CAAC,YAAY,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtD,OAAO,CAAC,CAAC,QAAQ,EAAE,CAAC;AACtB,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc,CAClC,SAAiB,EACjB,GAAc,EACd,IAA2B;IAE3B,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IAE7B,MAAM,KAAK,GAAG,CAAC,MAAM,MAAM,CACzB,mBAAmB,SAAS,UAAU,EACtC,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,EACxC,GAAG,CACJ,CAAY,CAAC;IACd,IAAI,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,CAAC;QAC1B,MAAM,IAAI,sBAAsB,CAC9B,wDAAwD,CACzD,CAAC;IACJ,CAAC;IACD,IAAI,KAAK,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,OAAO;YACL,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SAClC,CAAC;IACJ,CAAC;IAED,2EAA2E;IAC3E,4EAA4E;IAC5E,IAAI,MAAM,GAAG,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC;IACnD,IAAI,mBAAmB,GAAG,CAAC,CAAC;IAC5B,MAAM,WAAW,GAAG,IAAI,CAAC,SAAS,GAAG,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC,CAAC;IAE9D,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,eAAe,CAAc;YAC9C,GAAG,EAAE,UAAU,CAAC,SAAS,EAAE,GAAG,EAAE,MAAM,IAAI,SAAS,EAAE,IAAI,CAAC,KAAK,CAAC;YAChE,OAAO,EAAE,EAAE,aAAa,EAAE,UAAU,GAAG,CAAC,MAAM,EAAE,EAAE;YAClD,UAAU,EAAE,IAAI,CAAC,UAAU;YAC3B,SAAS,EAAE,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC,CAAC;YACnC,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC;YAC3D,UAAU,EAAE,GAAG,EAAE,CAAC,KAAK;YACvB,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAgB;YACnC,MAAM,EAAE,CAAC,EAAE,IAAI,EAAE,EAAE,EAAE;gBACnB,IAAI,IAAI,KAAK,IAAI,EAAE,CAAC;oBAClB,mBAAmB,EAAE,CAAC;oBACtB,IAAI,mBAAmB,IAAI,yBAAyB,EAAE,CAAC;wBACrD,MAAM,IAAI,sBAAsB,CAC9B,8BAA8B,mBAAmB,0BAA0B,CAC5E,CAAC;oBACJ,CAAC;oBACD,OAAO;gBACT,CAAC;gBACD,mBAAmB,GAAG,CAAC,CAAC;gBACxB,IAAI,aAAa,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,SAAS;oBAAE,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC;YACrE,CAAC;SACF,CAAC,CAAC;QACH,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,OAAO;YACrB,SAAS,EAAE,IAAI,CAAC,SAAS;YACzB,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS;SAClC,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,IAAI,CAAC,YAAY,sBAAsB;YAAE,MAAM,CAAC,CAAC;QACjD,0EAA0E;QAC1E,OAAO,EAAE,OAAO,EAAE,EAAE,EAAE,SAAS,EAAE,MAAM,EAAE,SAAS,EAAE,IAAI,CAAC,GAAG,EAAE,GAAG,SAAS,EAAE,CAAC;IAC/E,CAAC;AACH,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,UAAU,CAAC,CAAgB;IACzC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,CAAC;IAClB,IAAI,CAAC,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ;QAAE,OAAO,IAAI,CAAC;IAC3E,OAAO,CAAC,CAAC,IAAI,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;AACtC,CAAC;AAED,iFAAiF;AAEjF,MAAM,kBAAkB,GAAG,EAAE,GAAG,MAAM,CAAC;AACvC,MAAM,mBAAmB,GAAG,MAAM,CAAC;AAEnC,wEAAwE;AACxE,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,QAAQ,EAAE,CAAC;IACX,OAAO,EAAE,CAAC;IACV,OAAO,EAAE,CAAC;CACF,CAAC;AAeX,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAAgC,EAChC,IAAqB;IAErB,yEAAyE;IACzE,4DAA4D;IAC5D,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAC1E,OAAO,sBAAsB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,QAAQ,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QAC3D,MAAM,EAAE,sBAAsB,EAAE,GAAG,MAAM,MAAM,CAAC,wBAAwB,CAAC,CAAC;QAC1E,OAAO,sBAAsB,CAAC,YAAY,EAAE,IAAI,CAAC,CAAC;IACpD,CAAC;IACD,MAAM,SAAS,GAAG,YAAY,IAAI,sBAAsB,EAAE,CAAC;IAC3D,IAAI,CAAC,SAAS,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CAAC,kGAAkG,CAAC,CAC9G,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IACD,aAAa,CAAC,SAAS,EAAE,SAAS,EAAE,KAAK,EAAE,GAAG,CAAC,CAAC;IAEhD,MAAM,SAAS,GAAG,aAAa,CAAC,IAAI,CAAC,OAAO,EAAE,kBAAkB,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,aAAa,CAAC,IAAI,CAAC,QAAQ,EAAE,mBAAmB,CAAC,CAAC;IACrE,IAAI,SAAS,KAAK,IAAI,IAAI,UAAU,KAAK,IAAI,EAAE,CAAC;QAC9C,OAAO,CAAC,KAAK,CACX,KAAK,CAAC,GAAG,CACP,8FAA8F,CAC/F,CACF,CAAC;QACF,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,IAAI,KAAyB,CAAC;IAC9B,IAAI,IAAI,CAAC,KAAK,KAAK,SAAS,EAAE,CAAC;QAC7B,KAAK,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC3B,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,KAAK,GAAG,CAAC,IAAI,KAAK,GAAG,GAAG,EAAE,CAAC;YACzD,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,mDAAmD,CAAC,CAAC,CAAC;YAC9E,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;YACxC,OAAO;QACT,CAAC;IACH,CAAC;IAED,2EAA2E;IAC3E,qEAAqE;IACrE,qEAAqE;IACrE,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,IAAI,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAErD,IAAI,GAAc,CAAC;IACnB,IAAI,MAA4B,CAAC;IACjC,IAAI,CAAC;QACH,GAAG,GAAG,MAAM,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YACf,GAAG,CAAC,GAAG,CACL,kCAAkC,SAAS,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,qBAAqB,IAAI,CAAC,KAAK,CAAC,UAAU,GAAG,IAAI,CAAC,YAAY,IAAI,CAAC,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,IAAI,CACxJ,CAAC;QACJ,CAAC;QACD,MAAM,GAAG,MAAM,cAAc,CAAC,SAAS,EAAE,GAAG,EAAE,EAAE,KAAK,EAAE,SAAS,EAAE,UAAU,EAAE,KAAK,EAAE,CAAC,CAAC;IACzF,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,cAAc,CAAC,CAAC,CAAC,CAAC;QAClB,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAChC,MAAM,MAAM,GAAG,MAAM,CAAC,SAAS,IAAI,KAAK,CAAC;QACzC,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,EACtF,IAAI,EACJ,CAAC,CACF,CACF,CAAC;QACJ,CAAC;aAAM,CAAC;YACN,GAAG,CAAC,KAAK,CAAC,mBAAmB,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,mBAAmB,CAAC,CAAC;YACrF,GAAG,CAAC,GAAG,CAAC,mCAAmC,SAAS,YAAY,MAAM,EAAE,CAAC,CAAC;QAC5E,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,OAAO,CAAC,CAAC;QACxC,OAAO;IACT,CAAC;IAED,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CACZ,EAAE,SAAS,EAAE,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,OAAO,EAAE,MAAM,CAAC,OAAO,EAAE,EAC/D,IAAI,EACJ,CAAC,CACF,CACF,CAAC;IACJ,CAAC;SAAM,CAAC;QACN,KAAK,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YAC/B,MAAM,KAAK,GAAG,CAAC,CAAC,QAAQ,EAAE,IAAI,IAAI,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC;YACnD,IAAI,KAAK;gBAAE,GAAG,CAAC,GAAG,CAAC,YAAY,KAAK,EAAE,CAAC,CAAC;YACxC,oEAAoE;YACpE,uEAAuE;YACvE,mEAAmE;YACnE,+BAA+B;YAC/B,GAAG,CAAC,OAAO,CAAC,cAAc,CAAC,CAAC,UAAU,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC;YACrD,MAAM,KAAK,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC5B,IAAI,KAAK;gBAAE,GAAG,CAAC,GAAG,CAAC,YAAY,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QAC1D,CAAC;QACD,GAAG,CAAC,GAAG,CAAC,mCAAmC,SAAS,YAAY,MAAM,CAAC,SAAS,EAAE,CAAC,CAAC;IACtF,CAAC;IACD,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,QAAQ,CAAC,CAAC;AAC3C,CAAC"}
@@ -56,6 +56,8 @@ export declare function closeSession(id: string, opts: BaseOpts & {
56
56
  workspace?: string;
57
57
  recap?: string;
58
58
  as?: string;
59
+ withdraw?: string[];
60
+ keepOwed?: string[];
59
61
  }): Promise<void>;
60
62
  /**
61
63
  * `synap session evidence <key> --passed|--failed [--detail "…"]`
@@ -1,6 +1,7 @@
1
1
  import chalk from "chalk";
2
2
  import { log } from "../utils/logger.js";
3
3
  import { resolveHubConfig, hubGet, hubPatch, hubPost, attachActiveSessionId, detachActiveSessionId, resolveActiveSessionId, renderHubError, HubError, } from "../lib/hub-client.js";
4
+ import { closeQuestionDispositions, openQuestionsRefusal, } from "./close-questions.js";
4
5
  import { readFileSync, existsSync } from "fs";
5
6
  import { resolve } from "path";
6
7
  /**
@@ -484,6 +485,11 @@ export function sessionStatus(opts) {
484
485
  * from the row (workspaceId body is back-compat only).
485
486
  */
486
487
  export async function closeSession(id, opts) {
488
+ const settled = closeQuestionDispositions(opts);
489
+ if (!settled.ok) {
490
+ console.error(chalk.red(`Error: ${settled.error}`));
491
+ process.exit(1);
492
+ }
487
493
  try {
488
494
  const cfg = await resolveHubConfig(opts);
489
495
  const wsId = opts.workspace || cfg.workspaceId;
@@ -500,6 +506,8 @@ export async function closeSession(id, opts) {
500
506
  // and being rejected by a zod enum the user cannot see.
501
507
  if (opts.as)
502
508
  body.terminalStatus = opts.as;
509
+ if (settled.dispositions.length > 0)
510
+ body.questionDispositions = settled.dispositions;
503
511
  pack = (await hubPost(`/focus-sessions/${id}/complete`, body, cfg));
504
512
  usedPack = true;
505
513
  }
@@ -568,6 +576,21 @@ export async function closeSession(id, opts) {
568
576
  }
569
577
  }
570
578
  catch (e) {
579
+ const refusal = openQuestionsRefusal(e);
580
+ if (refusal) {
581
+ if (opts.json) {
582
+ console.log(JSON.stringify({ ok: false, status: "refused", ...refusal }, null, 2));
583
+ }
584
+ else {
585
+ log.error("Not closed: questions you asked in this session are still open.");
586
+ for (const q of refusal.openQuestions) {
587
+ console.log(` ${chalk.white(q.shortId ?? q.messageId.slice(0, 8))} ${q.text} ${chalk.dim(q.messageId)}`);
588
+ }
589
+ log.dim(" Relay the person's chat answer first (relay_answer), or close again with " +
590
+ "--withdraw <messageId>=<why> or --keep-owed <messageId> for each.");
591
+ }
592
+ process.exit(1);
593
+ }
571
594
  renderHubError(e);
572
595
  process.exit(1);
573
596
  }