@reticlehq/server 3.7.0 → 3.8.1

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 (578) hide show
  1. package/SKILL.md +59 -68
  2. package/bin/reticle.js +9 -2
  3. package/dist/command/cli/adhoc-suite.js +1 -1
  4. package/dist/command/cli/adhoc-verdict.d.ts +12 -0
  5. package/dist/command/cli/adhoc-verdict.js +62 -4
  6. package/dist/command/cli/answers/gate-hook-message.d.ts +2 -0
  7. package/dist/command/cli/answers/gate-hook-message.js +5 -1
  8. package/dist/command/cli/auth/cloud-session.d.ts +11 -19
  9. package/dist/command/cli/auth/cloud-session.js +23 -0
  10. package/dist/command/cli/auth/device-flow.d.ts +3 -37
  11. package/dist/command/cli/cli-doctor.js +66 -21
  12. package/dist/command/cli/cli-flow-commands.js +53 -11
  13. package/dist/command/cli/cli-kill.d.ts +8 -0
  14. package/dist/command/cli/cli-kill.js +43 -3
  15. package/dist/command/cli/cli-parse-feedback.d.ts +4 -0
  16. package/dist/command/cli/cli-parse-feedback.js +13 -1
  17. package/dist/command/cli/cli-parse-grammar.d.ts +1 -2
  18. package/dist/command/cli/cli-parse-grammar.js +1 -6
  19. package/dist/command/cli/cli-parse-serve.d.ts +24 -0
  20. package/dist/command/cli/cli-parse-serve.js +124 -0
  21. package/dist/command/cli/cli-parse.d.ts +12 -11
  22. package/dist/command/cli/cli-parse.js +100 -123
  23. package/dist/command/cli/cli-usage.d.ts +0 -11
  24. package/dist/command/cli/cli-usage.js +43 -16
  25. package/dist/command/cli/cli-verify.d.ts +1 -1
  26. package/dist/command/cli/cli-verify.js +29 -14
  27. package/dist/command/cli/cloud-cli.js +27 -9
  28. package/dist/command/cli/cloud-kit.js +3 -3
  29. package/dist/command/cli/cloud-link.d.ts +1 -20
  30. package/dist/command/cli/cloud-link.js +2 -0
  31. package/dist/command/cli/cloud-login.d.ts +6 -2
  32. package/dist/command/cli/cloud-login.js +13 -41
  33. package/dist/command/cli/config/checkout.d.ts +10 -0
  34. package/dist/command/cli/config/checkout.js +78 -0
  35. package/dist/command/cli/doctor/doctor-agent-link.d.ts +23 -0
  36. package/dist/command/cli/doctor/doctor-agent-link.js +28 -0
  37. package/dist/command/cli/doctor/doctor-coverage-line.js +1 -7
  38. package/dist/command/cli/doctor/doctor-rows.d.ts +4 -0
  39. package/dist/command/cli/doctor/doctor-rows.js +4 -0
  40. package/dist/command/cli/drive/drive-attach.d.ts +5 -0
  41. package/dist/command/cli/drive/drive-attach.js +21 -1
  42. package/dist/command/cli/hook/codex-transcript.d.ts +20 -0
  43. package/dist/command/cli/hook/codex-transcript.js +224 -0
  44. package/dist/command/cli/hook/episode-structure.d.ts +24 -0
  45. package/dist/command/cli/hook/episode-structure.js +138 -0
  46. package/dist/command/cli/hook/hook-command.d.ts +9 -0
  47. package/dist/command/cli/hook/hook-command.js +211 -0
  48. package/dist/command/cli/hook/hook-fast.d.ts +31 -0
  49. package/dist/command/cli/hook/hook-fast.js +136 -0
  50. package/dist/command/cli/hook/prompt-hook.d.ts +30 -0
  51. package/dist/command/cli/hook/prompt-hook.js +199 -0
  52. package/dist/command/cli/hook/tool-hook.d.ts +21 -0
  53. package/dist/command/cli/hook/tool-hook.js +259 -0
  54. package/dist/command/cli/launch/cli-launch.d.ts +2 -0
  55. package/dist/command/cli/launch/cli-launch.js +22 -2
  56. package/dist/command/cli/lifecycle/daemon-lifecycle.js +28 -2
  57. package/dist/command/cli/mcp-command.d.ts +9 -0
  58. package/dist/command/cli/mcp-command.js +127 -41
  59. package/dist/command/cli/open-navigate.d.ts +43 -0
  60. package/dist/command/cli/open-navigate.js +85 -0
  61. package/dist/command/cli/ports/port-holder.d.ts +16 -4
  62. package/dist/command/cli/ports/port-holder.js +58 -12
  63. package/dist/command/cli/ports/resolve/cli-port.js +18 -2
  64. package/dist/command/cli/project-name.d.ts +1 -7
  65. package/dist/command/cli/project-name.js +1 -0
  66. package/dist/command/cli/report-command.d.ts +8 -2
  67. package/dist/command/cli/report-command.js +95 -18
  68. package/dist/command/cli/status-fields.d.ts +9 -2
  69. package/dist/command/cli/status-fields.js +148 -4
  70. package/dist/command/cli/try-command.d.ts +3 -4
  71. package/dist/command/cli/try-command.js +6 -11
  72. package/dist/command/cli/verify-results.d.ts +4 -1
  73. package/dist/command/cli/verify-results.js +3 -1
  74. package/dist/command/cli.d.ts +1 -7
  75. package/dist/command/cli.js +79 -160
  76. package/dist/command/daemon/daemon-resilience.d.ts +6 -1
  77. package/dist/command/daemon/daemon-resilience.js +31 -18
  78. package/dist/command/daemon/daemon.d.ts +11 -0
  79. package/dist/command/daemon/daemon.js +70 -2
  80. package/dist/command/daemon/lifetime/daemon-usefulness.d.ts +2 -0
  81. package/dist/command/daemon/lifetime/daemon-usefulness.js +13 -2
  82. package/dist/command/daemon/wake-decision.js +4 -2
  83. package/dist/command/daemon/win32-escape.d.ts +32 -0
  84. package/dist/command/daemon/win32-escape.js +119 -0
  85. package/dist/command/setup/agent-configs.d.ts +9 -0
  86. package/dist/command/setup/agent-configs.js +9 -0
  87. package/dist/command/setup/auto-approve.d.ts +10 -3
  88. package/dist/command/setup/auto-approve.js +51 -3
  89. package/dist/command/setup/bringup/dev-server-files.d.ts +1 -9
  90. package/dist/command/setup/bringup/dev-server-wait.js +5 -1
  91. package/dist/command/setup/bringup/ensure-daemon.js +4 -7
  92. package/dist/command/setup/init/init-host.js +6 -0
  93. package/dist/command/setup/init/init-port.js +5 -4
  94. package/dist/command/setup/init/init-runtime.js +7 -1
  95. package/dist/command/setup/node-effects.d.ts +8 -0
  96. package/dist/command/setup/node-effects.js +36 -4
  97. package/dist/command/setup/probe/dev-port.d.ts +26 -0
  98. package/dist/command/setup/probe/dev-port.js +117 -0
  99. package/dist/command/setup/probe/page-probe.d.ts +1 -1
  100. package/dist/command/setup/probe/page-probe.js +11 -3
  101. package/dist/command/setup/remaining-steps.d.ts +0 -7
  102. package/dist/command/setup/remaining-steps.js +3 -2
  103. package/dist/command/setup/run-setup.d.ts +11 -0
  104. package/dist/command/setup/run-setup.js +33 -5
  105. package/dist/command/setup/setup-command.d.ts +2 -0
  106. package/dist/command/setup/setup-command.js +22 -4
  107. package/dist/command/update/updater.d.ts +1 -6
  108. package/dist/command/update/updater.js +4 -5
  109. package/dist/command/update/version-seen.d.ts +24 -0
  110. package/dist/command/update/version-seen.js +65 -0
  111. package/dist/command/version/peer-announce.d.ts +9 -1
  112. package/dist/command/version/peer-announce.js +25 -2
  113. package/dist/command/version/sdk-fix.d.ts +5 -6
  114. package/dist/command/version/sdk-fix.js +17 -32
  115. package/dist/command/version/version-skew.d.ts +16 -1
  116. package/dist/command/version/version-skew.js +84 -10
  117. package/dist/features/crawl/crawl-tools.js +2 -2
  118. package/dist/features/crawl/crawl.js +2 -0
  119. package/dist/features/exhaust/ledger.d.ts +15 -96
  120. package/dist/features/exhaust/ledger.js +3 -3
  121. package/dist/features/harness/drive-runs.d.ts +28 -4
  122. package/dist/features/harness/drive-runs.js +99 -7
  123. package/dist/features/harness/drivers.d.ts +1 -1
  124. package/dist/features/harness/drivers.js +1 -1
  125. package/dist/features/harness/harness.d.ts +5 -0
  126. package/dist/features/harness/harness.js +24 -12
  127. package/dist/features/harness/platform/platform-drives.d.ts +7 -1
  128. package/dist/features/harness/platform/platform-drives.js +12 -7
  129. package/dist/features/harness/platform/refusal.d.ts +1 -1
  130. package/dist/features/harness/platform/refusal.js +4 -4
  131. package/dist/features/harness/platform/remote-drive.js +70 -28
  132. package/dist/features/harness/platform/server-driver.js +22 -1
  133. package/dist/features/harness/platform-config.d.ts +1 -10
  134. package/dist/features/harness/platform-config.js +0 -20
  135. package/dist/features/license/license.d.ts +2 -14
  136. package/dist/features/visual/step-shots.d.ts +33 -1
  137. package/dist/features/visual/step-shots.js +155 -1
  138. package/dist/features/visual/visual-tools.js +12 -4
  139. package/dist/hooks/coding-agents.d.ts +6 -0
  140. package/dist/hooks/coding-agents.js +24 -3
  141. package/dist/hooks/episode-stamp.d.ts +32 -0
  142. package/dist/hooks/episode-stamp.js +61 -0
  143. package/dist/hooks/hook-commands.js +19 -9
  144. package/dist/index.d.ts +5 -1
  145. package/dist/index.js +66 -24
  146. package/dist/judgement/app-graph/journal-steps.d.ts +8 -0
  147. package/dist/judgement/app-graph/journal-steps.js +92 -0
  148. package/dist/judgement/capsule/capsule-store.d.ts +2 -39
  149. package/dist/judgement/domain/domain-model.js +1 -10
  150. package/dist/judgement/domain/domain-tools.js +4 -2
  151. package/dist/judgement/runs/artifact/run-store.d.ts +28 -8
  152. package/dist/judgement/runs/artifact/run-store.js +153 -28
  153. package/dist/judgement/runs/default-run-id.d.ts +3 -1
  154. package/dist/judgement/runs/default-run-id.js +15 -3
  155. package/dist/judgement/runs/drive-run.d.ts +3 -3
  156. package/dist/judgement/runs/drive-run.js +11 -7
  157. package/dist/judgement/runs/run-ledger.d.ts +21 -0
  158. package/dist/judgement/runs/run-ledger.js +143 -0
  159. package/dist/judgement/runs/runner-port.d.ts +1 -1
  160. package/dist/judgement/runs/runner-port.js +8 -2
  161. package/dist/judgement/runs/verification-sync.d.ts +4 -3
  162. package/dist/judgement/runs/verification-sync.js +27 -5
  163. package/dist/language/flows/affected-tools.js +2 -1
  164. package/dist/language/flows/annotate-notes/annotate.js +8 -3
  165. package/dist/language/flows/annotate-tools.js +1 -1
  166. package/dist/language/flows/change/affected.d.ts +8 -0
  167. package/dist/language/flows/change/affected.js +20 -7
  168. package/dist/language/flows/decision.js +19 -4
  169. package/dist/language/flows/fields/flow-secret-field.d.ts +9 -0
  170. package/dist/language/flows/fields/flow-secret-field.js +67 -5
  171. package/dist/language/flows/flow-anchor.d.ts +5 -0
  172. package/dist/language/flows/flow-anchor.js +4 -0
  173. package/dist/language/flows/flow-cross-step.d.ts +7 -1
  174. package/dist/language/flows/flow-cross-step.js +9 -0
  175. package/dist/language/flows/flow-expect-grammar.js +15 -10
  176. package/dist/language/flows/flow-intent.js +6 -1
  177. package/dist/language/flows/flow-journey.d.ts +8 -0
  178. package/dist/language/flows/flow-journey.js +13 -0
  179. package/dist/language/flows/flow-lease.d.ts +27 -0
  180. package/dist/language/flows/flow-lease.js +59 -0
  181. package/dist/language/flows/flow-replay-run.d.ts +1 -87
  182. package/dist/language/flows/flow-replay-run.js +111 -310
  183. package/dist/language/flows/flow-replay.js +21 -19
  184. package/dist/language/flows/flow-replayable.d.ts +38 -0
  185. package/dist/language/flows/flow-replayable.js +179 -0
  186. package/dist/language/flows/flow-start-path.d.ts +108 -0
  187. package/dist/language/flows/flow-start-path.js +313 -0
  188. package/dist/language/flows/flow-step-runners.d.ts +23 -2
  189. package/dist/language/flows/flow-step-runners.js +191 -32
  190. package/dist/language/flows/flow-store-for-session.d.ts +8 -1
  191. package/dist/language/flows/flow-store-for-session.js +6 -0
  192. package/dist/language/flows/flow-tools.d.ts +2 -23
  193. package/dist/language/flows/flow-tools.js +63 -113
  194. package/dist/language/flows/flows.d.ts +4 -6
  195. package/dist/language/flows/flows.js +90 -15
  196. package/dist/language/flows/heal-run.d.ts +10 -4
  197. package/dist/language/flows/heal-run.js +26 -9
  198. package/dist/language/flows/recording/flake.d.ts +3 -27
  199. package/dist/language/flows/recording/flake.js +1 -1
  200. package/dist/language/flows/recording/recording-backtrack.js +1 -4
  201. package/dist/language/flows/recording/tape/recordings.d.ts +11 -1
  202. package/dist/language/flows/recording/tape/recordings.js +9 -3
  203. package/dist/language/flows/replay.d.ts +25 -5
  204. package/dist/language/flows/replay.js +83 -16
  205. package/dist/language/flows/stores/assertion-tiers-store.js +1 -1
  206. package/dist/language/flows/suite/coverage.d.ts +9 -0
  207. package/dist/language/flows/suite/coverage.js +12 -1
  208. package/dist/language/flows/suite-selection.d.ts +25 -0
  209. package/dist/language/flows/suite-selection.js +41 -9
  210. package/dist/machine/git-tracks.d.ts +6 -0
  211. package/dist/machine/git-tracks.js +36 -0
  212. package/dist/memory/cloud/background-sync.d.ts +25 -0
  213. package/dist/memory/cloud/background-sync.js +79 -0
  214. package/dist/memory/cloud/cloud-config.d.ts +12 -1
  215. package/dist/memory/cloud/cloud-config.js +39 -13
  216. package/dist/memory/cloud/cloud-sync.d.ts +3 -24
  217. package/dist/memory/cloud/cloud-sync.js +5 -2
  218. package/dist/memory/cloud/harness-config.d.ts +0 -7
  219. package/dist/memory/cloud/memory-scope.d.ts +19 -0
  220. package/dist/memory/cloud/memory-scope.js +48 -0
  221. package/dist/memory/cloud/sync-answer.d.ts +43 -0
  222. package/dist/memory/cloud/sync-answer.js +42 -0
  223. package/dist/memory/cloud/sync-cycle.d.ts +40 -10
  224. package/dist/memory/cloud/sync-cycle.js +97 -144
  225. package/dist/memory/cloud/sync-daemon.d.ts +50 -3
  226. package/dist/memory/cloud/sync-daemon.js +473 -83
  227. package/dist/memory/cloud/sync-describe.d.ts +28 -0
  228. package/dist/memory/cloud/sync-describe.js +92 -0
  229. package/dist/memory/cloud/sync-disk.d.ts +9 -1
  230. package/dist/memory/cloud/sync-disk.js +137 -33
  231. package/dist/memory/cloud/sync-flow-versions.d.ts +26 -0
  232. package/dist/memory/cloud/sync-flow-versions.js +42 -0
  233. package/dist/memory/impact/impact-store.js +32 -15
  234. package/dist/memory/intent/intent-shard.d.ts +41 -266
  235. package/dist/memory/intent/intent-tools.js +20 -61
  236. package/dist/memory/intent/record-request.d.ts +27 -0
  237. package/dist/memory/intent/record-request.js +88 -0
  238. package/dist/memory/intent/settled-words.js +9 -1
  239. package/dist/memory/journal/drive-flow.d.ts +3 -0
  240. package/dist/memory/journal/drive-flow.js +11 -41
  241. package/dist/memory/journal/envelope-store.js +1 -1
  242. package/dist/memory/journal/envelope.d.ts +6 -154
  243. package/dist/memory/journal/episode-log.d.ts +107 -0
  244. package/dist/memory/journal/episode-log.js +302 -0
  245. package/dist/memory/journal/journal-recorder.d.ts +7 -0
  246. package/dist/memory/journal/journal-recorder.js +22 -9
  247. package/dist/memory/journal/on-disk/ambient-file.d.ts +1 -7
  248. package/dist/memory/journal/on-disk/ambient-file.js +1 -1
  249. package/dist/memory/journal/on-disk/workspace-gitignore.d.ts +24 -3
  250. package/dist/memory/journal/on-disk/workspace-gitignore.js +38 -7
  251. package/dist/memory/journal/on-disk/workspace-tiers.js +7 -0
  252. package/dist/memory/journal/self-observation.js +3 -1
  253. package/dist/memory/journal/session-end.js +23 -9
  254. package/dist/memory/journal/session-journal.js +39 -20
  255. package/dist/memory/project/artifact-root-resolver.d.ts +14 -1
  256. package/dist/memory/project/artifact-root-resolver.js +68 -23
  257. package/dist/memory/project/artifact-root.d.ts +17 -3
  258. package/dist/memory/project/artifact-root.js +47 -9
  259. package/dist/memory/project/fs/fs-port.d.ts +5 -0
  260. package/dist/memory/project/fs/fs-port.js +13 -0
  261. package/dist/memory/project/learned-routes.d.ts +3 -4
  262. package/dist/memory/project/learned-routes.js +3 -11
  263. package/dist/memory/project/link-directory.js +5 -2
  264. package/dist/memory/project/root-claims.d.ts +3 -1
  265. package/dist/memory/project/root-claims.js +41 -7
  266. package/dist/memory/project/session-root.d.ts +1 -1
  267. package/dist/memory/project/session-root.js +1 -15
  268. package/dist/memory/project/sync-status.js +5 -6
  269. package/dist/memory/recall/memory-tools.js +2 -2
  270. package/dist/memory/recall/platform-memory.d.ts +3 -1
  271. package/dist/memory/recall/platform-memory.js +9 -1
  272. package/dist/memory/recall/project-memory.js +15 -19
  273. package/dist/portal/bridge/auth-failure-reason.d.ts +13 -0
  274. package/dist/portal/bridge/auth-failure-reason.js +19 -0
  275. package/dist/portal/bridge/bridge.d.ts +19 -4
  276. package/dist/portal/bridge/bridge.js +150 -177
  277. package/dist/portal/bridge/harness-request.d.ts +15 -0
  278. package/dist/portal/bridge/harness-request.js +19 -0
  279. package/dist/portal/bridge/origin/origin-follow.d.ts +46 -0
  280. package/dist/portal/bridge/origin/origin-follow.js +110 -0
  281. package/dist/portal/bridge/pairing-token.d.ts +6 -0
  282. package/dist/portal/bridge/pairing-token.js +47 -16
  283. package/dist/portal/bridge/protocol-skew.d.ts +27 -2
  284. package/dist/portal/bridge/protocol-skew.js +66 -2
  285. package/dist/portal/bridge/session-nonces.d.ts +46 -0
  286. package/dist/portal/bridge/session-nonces.js +72 -0
  287. package/dist/portal/input/viewport-tools.d.ts +31 -0
  288. package/dist/portal/input/viewport-tools.js +106 -15
  289. package/dist/portal/pool/bounded-close.d.ts +23 -0
  290. package/dist/portal/pool/bounded-close.js +38 -0
  291. package/dist/portal/pool/browser-pool.d.ts +44 -39
  292. package/dist/portal/pool/browser-pool.js +247 -95
  293. package/dist/portal/pool/context-permissions.d.ts +9 -1
  294. package/dist/portal/pool/context-permissions.js +26 -0
  295. package/dist/portal/pool/lease-emulation.d.ts +37 -0
  296. package/dist/portal/pool/lease-emulation.js +29 -0
  297. package/dist/portal/pool/playwright-launcher.d.ts +6 -0
  298. package/dist/portal/pool/playwright-launcher.js +74 -7
  299. package/dist/portal/pool/pool-contract.d.ts +23 -1
  300. package/dist/portal/pool/pool-lease.d.ts +128 -0
  301. package/dist/portal/pool/pool-lease.js +49 -0
  302. package/dist/portal/pool/zero-install.d.ts +8 -1
  303. package/dist/portal/pool/zero-install.js +24 -2
  304. package/dist/portal/production/production-activation.d.ts +136 -0
  305. package/dist/portal/production/production-activation.js +173 -0
  306. package/dist/portal/production/production-drive.d.ts +52 -0
  307. package/dist/portal/production/production-drive.js +301 -0
  308. package/dist/portal/production/production-hello.d.ts +23 -0
  309. package/dist/portal/production/production-hello.js +23 -0
  310. package/dist/portal/realm/web-realm.js +42 -15
  311. package/dist/portal/session/control-envelope.d.ts +1 -1
  312. package/dist/portal/session/dev-server/served-document.d.ts +0 -5
  313. package/dist/portal/session/dev-server/served-document.js +6 -8
  314. package/dist/portal/session/facts/handshake-facts.d.ts +8 -1
  315. package/dist/portal/session/first-run-wiring.d.ts +3 -36
  316. package/dist/portal/session/first-run-wiring.js +10 -103
  317. package/dist/portal/session/live-control-tools.js +61 -19
  318. package/dist/portal/session/no-session-next-action.d.ts +11 -0
  319. package/dist/portal/session/no-session-next-action.js +40 -15
  320. package/dist/portal/session/no-session-watch.d.ts +7 -0
  321. package/dist/portal/session/no-session-watch.js +67 -23
  322. package/dist/portal/session/output-budget.d.ts +10 -0
  323. package/dist/portal/session/output-budget.js +16 -0
  324. package/dist/portal/session/presence/session-lease.d.ts +2 -0
  325. package/dist/portal/session/presence/session-lease.js +8 -0
  326. package/dist/portal/session/recorded-gaps.d.ts +15 -11
  327. package/dist/portal/session/recorded-gaps.js +39 -18
  328. package/dist/portal/session/serving-directory.d.ts +24 -2
  329. package/dist/portal/session/serving-directory.js +93 -5
  330. package/dist/portal/session/session-info.d.ts +26 -0
  331. package/dist/portal/session/session-info.js +20 -0
  332. package/dist/portal/session/session-manager.d.ts +35 -3
  333. package/dist/portal/session/session-manager.js +69 -14
  334. package/dist/portal/session/session-successor.js +1 -9
  335. package/dist/portal/session/session-tools.js +22 -4
  336. package/dist/portal/session/session.d.ts +10 -10
  337. package/dist/portal/session/session.js +37 -29
  338. package/dist/portal/session/zero-install-first-call.d.ts +7 -2
  339. package/dist/portal/session/zero-install-first-call.js +43 -20
  340. package/dist/start-wiring.d.ts +2 -2
  341. package/dist/start-wiring.js +17 -3
  342. package/dist/status-payload.d.ts +11 -1
  343. package/dist/status-payload.js +7 -1
  344. package/dist/surface/agent-presence-grace.d.ts +11 -0
  345. package/dist/surface/agent-presence-grace.js +34 -0
  346. package/dist/surface/http-server.d.ts +12 -1
  347. package/dist/surface/http-server.js +64 -15
  348. package/dist/surface/mcp/faults/mcp-outage.d.ts +12 -2
  349. package/dist/surface/mcp/faults/mcp-outage.js +19 -1
  350. package/dist/surface/mcp/mcp-proxy.d.ts +17 -74
  351. package/dist/surface/mcp/mcp-proxy.js +194 -267
  352. package/dist/surface/mcp/mcp.d.ts +20 -3
  353. package/dist/surface/mcp/mcp.js +88 -25
  354. package/dist/surface/mcp/proxy/drive-calls.d.ts +44 -0
  355. package/dist/surface/mcp/proxy/drive-calls.js +114 -5
  356. package/dist/surface/mcp/proxy/proxy-boot.d.ts +11 -0
  357. package/dist/surface/mcp/proxy/proxy-boot.js +1 -0
  358. package/dist/surface/mcp/proxy/proxy-daemon-probe.d.ts +6 -0
  359. package/dist/surface/mcp/proxy/proxy-daemon-probe.js +14 -1
  360. package/dist/surface/mcp/proxy/proxy-handshake.d.ts +34 -2
  361. package/dist/surface/mcp/proxy/proxy-handshake.js +76 -8
  362. package/dist/surface/mcp/server-instructions.js +35 -16
  363. package/dist/surface/mcp/shared-params.d.ts +8 -0
  364. package/dist/surface/mcp/shared-params.js +15 -1
  365. package/dist/surface/mcp/sse-frame-parser.d.ts +11 -0
  366. package/dist/surface/mcp/sse-frame-parser.js +18 -0
  367. package/dist/surface/mcp/surface-vocabulary.d.ts +2 -0
  368. package/dist/surface/mcp/surface-vocabulary.js +13 -0
  369. package/dist/surface/mcp/tool-catalog-cache.d.ts +2 -0
  370. package/dist/surface/mcp/tool-catalog-cache.js +14 -4
  371. package/dist/surface/tools/account-tool.d.ts +4 -3
  372. package/dist/surface/tools/account-tool.js +20 -31
  373. package/dist/surface/tools/act/act-danger.d.ts +2 -0
  374. package/dist/surface/tools/act/act-danger.js +41 -14
  375. package/dist/surface/tools/act/act-observation.d.ts +11 -0
  376. package/dist/surface/tools/act/act-observation.js +33 -0
  377. package/dist/surface/tools/act/act-preflight.js +10 -3
  378. package/dist/surface/tools/act/act-sequence-retry.js +2 -1
  379. package/dist/surface/tools/act/act-target.js +19 -5
  380. package/dist/surface/tools/act/durable.js +1 -1
  381. package/dist/surface/tools/act/navigation/navigate-arrival.d.ts +9 -7
  382. package/dist/surface/tools/act/navigation/navigate-arrival.js +11 -14
  383. package/dist/surface/tools/act/unsettled-find.d.ts +36 -0
  384. package/dist/surface/tools/act/unsettled-find.js +71 -0
  385. package/dist/surface/tools/act-sequence-tool.js +53 -24
  386. package/dist/surface/tools/act-tools.d.ts +2 -3
  387. package/dist/surface/tools/act-tools.js +49 -47
  388. package/dist/surface/tools/agent/compact-envelope.d.ts +2 -2
  389. package/dist/surface/tools/agent/for-the-agent.js +41 -3
  390. package/dist/surface/tools/assert/assert-grade.js +8 -3
  391. package/dist/surface/tools/assert/assert-verdict.js +4 -2
  392. package/dist/surface/tools/browser-tools.js +7 -4
  393. package/dist/surface/tools/chat-drives.js +50 -25
  394. package/dist/surface/tools/coverage-tools.js +1 -1
  395. package/dist/surface/tools/dynamic-tools.d.ts +8 -0
  396. package/dist/surface/tools/dynamic-tools.js +89 -34
  397. package/dist/surface/tools/empty-session-list.d.ts +18 -25
  398. package/dist/surface/tools/empty-session-list.js +67 -38
  399. package/dist/surface/tools/error-recovery.d.ts +17 -7
  400. package/dist/surface/tools/error-recovery.js +53 -20
  401. package/dist/surface/tools/explore-tools.d.ts +10 -0
  402. package/dist/surface/tools/explore-tools.js +72 -19
  403. package/dist/surface/tools/feedback-tools.js +23 -2
  404. package/dist/surface/tools/gap-novelty.d.ts +6 -0
  405. package/dist/surface/tools/gap-novelty.js +9 -0
  406. package/dist/surface/tools/gaps/capability-absences.js +4 -3
  407. package/dist/surface/tools/harness-explore.d.ts +1 -1
  408. package/dist/surface/tools/harness-explore.js +6 -4
  409. package/dist/surface/tools/harness-gate.d.ts +43 -21
  410. package/dist/surface/tools/harness-gate.js +55 -81
  411. package/dist/surface/tools/harness-script.d.ts +2 -0
  412. package/dist/surface/tools/harness-script.js +11 -6
  413. package/dist/surface/tools/harness-toolset.js +3 -4
  414. package/dist/surface/tools/invoke-tool.d.ts +0 -8
  415. package/dist/surface/tools/invoke-tool.js +164 -178
  416. package/dist/surface/tools/lease-hint.d.ts +9 -0
  417. package/dist/surface/tools/lease-hint.js +22 -3
  418. package/dist/surface/tools/lease-permissions.d.ts +1 -1
  419. package/dist/surface/tools/lease-readiness.d.ts +55 -0
  420. package/dist/surface/tools/lease-readiness.js +150 -2
  421. package/dist/surface/tools/lease-tools.d.ts +3 -75
  422. package/dist/surface/tools/lease-tools.js +124 -188
  423. package/dist/surface/tools/map-tools.d.ts +20 -0
  424. package/dist/surface/tools/map-tools.js +145 -0
  425. package/dist/surface/tools/merge-tools.js +11 -7
  426. package/dist/surface/tools/next-step.js +6 -3
  427. package/dist/surface/tools/observe-tools.js +46 -35
  428. package/dist/surface/tools/platform-moment.d.ts +3 -12
  429. package/dist/surface/tools/platform-moment.js +12 -24
  430. package/dist/surface/tools/read/complete-snapshot.d.ts +7 -1
  431. package/dist/surface/tools/read/complete-snapshot.js +13 -2
  432. package/dist/surface/tools/read/query-paginate.js +6 -0
  433. package/dist/surface/tools/read/query-shape.d.ts +9 -0
  434. package/dist/surface/tools/read/query-shape.js +15 -0
  435. package/dist/surface/tools/read/snapshot-unmounted-note.d.ts +1 -0
  436. package/dist/surface/tools/read/snapshot-unmounted-note.js +73 -0
  437. package/dist/surface/tools/read-tools.js +5 -5
  438. package/dist/surface/tools/real-input-attempt.d.ts +11 -0
  439. package/dist/surface/tools/real-input-attempt.js +206 -38
  440. package/dist/surface/tools/reconcile-tools.js +21 -8
  441. package/dist/surface/tools/reticle-result.d.ts +3 -0
  442. package/dist/surface/tools/reticle-result.js +8 -1
  443. package/dist/surface/tools/run-report.d.ts +22 -0
  444. package/dist/surface/tools/run-report.js +141 -0
  445. package/dist/surface/tools/session-ports.d.ts +57 -0
  446. package/dist/surface/tools/session-ports.js +102 -0
  447. package/dist/surface/tools/tool-kit.d.ts +58 -4
  448. package/dist/surface/tools/tool-kit.js +140 -6
  449. package/dist/surface/tools/tool-surface.d.ts +2 -0
  450. package/dist/surface/tools/tool-surface.js +45 -0
  451. package/dist/surface/tools/tools.js +49 -87
  452. package/dist/telemetry/automation-hint.d.ts +5 -0
  453. package/dist/telemetry/automation-hint.js +7 -0
  454. package/dist/telemetry/cli-telemetry.d.ts +22 -0
  455. package/dist/telemetry/cli-telemetry.js +80 -11
  456. package/dist/telemetry/daemon-telemetry.d.ts +3 -1
  457. package/dist/telemetry/daemon-telemetry.js +9 -2
  458. package/dist/telemetry/feedback-cli.d.ts +1 -1
  459. package/dist/telemetry/feedback-cli.js +8 -3
  460. package/dist/telemetry/feedback.d.ts +1 -1
  461. package/dist/telemetry/feedback.js +51 -4
  462. package/dist/telemetry/harness-run.d.ts +3 -3
  463. package/dist/telemetry/harness-run.js +18 -7
  464. package/dist/telemetry/hud-events.d.ts +1 -1
  465. package/dist/telemetry/hud-metrics.d.ts +6 -3
  466. package/dist/telemetry/hud-metrics.js +20 -8
  467. package/dist/telemetry/install-source.js +1 -1
  468. package/dist/telemetry/mcp-connection.d.ts +1 -1
  469. package/dist/telemetry/mcp-connection.js +21 -2
  470. package/dist/telemetry/onboarding-firsts.d.ts +6 -1
  471. package/dist/telemetry/onboarding-firsts.js +41 -1
  472. package/dist/telemetry/proxy-telemetry.d.ts +42 -0
  473. package/dist/telemetry/proxy-telemetry.js +70 -1
  474. package/dist/telemetry/session-metrics.d.ts +1 -3
  475. package/dist/telemetry/session-metrics.js +16 -12
  476. package/dist/telemetry/telemetry.d.ts +9 -1
  477. package/dist/telemetry/telemetry.js +16 -1
  478. package/dist/telemetry/verification-of.d.ts +3 -1
  479. package/dist/telemetry/verification-of.js +7 -1
  480. package/dist/wire-journal.js +12 -2
  481. package/docs/README.md +4 -2
  482. package/docs/actions.mdx +7 -6
  483. package/docs/adapters.md +2 -1
  484. package/docs/agent-cheatsheet.md +19 -5
  485. package/docs/architecture.md +13 -10
  486. package/docs/autodrive.md +6 -5
  487. package/docs/benchmarks.md +2 -2
  488. package/docs/capabilities.mdx +1 -1
  489. package/docs/cli/affected.mdx +1 -1
  490. package/docs/cli/cloud.mdx +6 -6
  491. package/docs/cli/doctor.mdx +3 -1
  492. package/docs/cli/feedback.mdx +11 -7
  493. package/docs/cli/gate.mdx +1 -1
  494. package/docs/cli/help.mdx +1 -1
  495. package/docs/cli/init.mdx +20 -16
  496. package/docs/cli/mcp.mdx +5 -2
  497. package/docs/cli/open.mdx +5 -2
  498. package/docs/cli/report.mdx +1 -1
  499. package/docs/cli/restart.mdx +1 -1
  500. package/docs/cli/rollback.mdx +4 -4
  501. package/docs/cli/serve.mdx +7 -5
  502. package/docs/cli/setup.mdx +1 -1
  503. package/docs/cli/status.mdx +6 -2
  504. package/docs/cli/stop.mdx +3 -3
  505. package/docs/cli/telemetry.mdx +5 -1
  506. package/docs/cli/try.mdx +8 -8
  507. package/docs/cli/update.mdx +8 -5
  508. package/docs/cli/verify.mdx +12 -5
  509. package/docs/cli/version.mdx +1 -1
  510. package/docs/cli.mdx +10 -6
  511. package/docs/debugging.md +1 -1
  512. package/docs/deploy-checks.md +8 -6
  513. package/docs/desktop.mdx +14 -18
  514. package/docs/enterprise.md +6 -6
  515. package/docs/environment.mdx +5 -3
  516. package/docs/faq.mdx +9 -6
  517. package/docs/first-drive.md +19 -9
  518. package/docs/flows.md +3 -4
  519. package/docs/for-agents.md +1 -1
  520. package/docs/frameworks.mdx +34 -11
  521. package/docs/getting-started.md +46 -29
  522. package/docs/http-transport.md +2 -2
  523. package/docs/human-control.md +8 -8
  524. package/docs/index.mdx +2 -2
  525. package/docs/install-agentic.mdx +18 -19
  526. package/docs/install-manual.mdx +8 -4
  527. package/docs/integration-patterns.md +5 -5
  528. package/docs/multi-agent-testing.md +7 -5
  529. package/docs/packages/browser.mdx +34 -2
  530. package/docs/packages/core.mdx +2 -1
  531. package/docs/packages/electron.mdx +15 -3
  532. package/docs/packages/eslint-plugin.mdx +1 -1
  533. package/docs/packages/next.mdx +17 -5
  534. package/docs/packages/react.mdx +8 -1
  535. package/docs/packages/server.mdx +3 -3
  536. package/docs/packages/tauri.mdx +3 -3
  537. package/docs/packages/vite-plugin.mdx +1 -1
  538. package/docs/packages.mdx +19 -6
  539. package/docs/platform-integration.md +12 -4
  540. package/docs/predicates.mdx +18 -7
  541. package/docs/production-mode.md +108 -0
  542. package/docs/prompt-capture.md +99 -0
  543. package/docs/quickstart.mdx +14 -12
  544. package/docs/recipes.mdx +9 -8
  545. package/docs/required-checks.md +3 -2
  546. package/docs/skill-file.mdx +4 -3
  547. package/docs/skill-setup.md +2 -2
  548. package/docs/skill.md +62 -70
  549. package/docs/state-files.md +1 -0
  550. package/docs/state-management.mdx +11 -9
  551. package/docs/system-map.md +14 -13
  552. package/docs/telemetry.md +32 -24
  553. package/docs/testing.md +9 -5
  554. package/docs/tools/act-and-wait.mdx +17 -13
  555. package/docs/tools/act-sequence.mdx +40 -66
  556. package/docs/tools/act.mdx +7 -5
  557. package/docs/tools/assert.mdx +1 -1
  558. package/docs/tools/look.mdx +1 -1
  559. package/docs/tools/navigate.mdx +1 -1
  560. package/docs/tools/network.mdx +13 -11
  561. package/docs/tools/overview.mdx +3 -3
  562. package/docs/tools/query.mdx +3 -3
  563. package/docs/tools/session-and-feedback.mdx +9 -6
  564. package/docs/tools/sessions.mdx +7 -0
  565. package/docs/tools/snapshot.mdx +9 -7
  566. package/docs/tools/tools-and-run.mdx +11 -10
  567. package/docs/tools/verify.mdx +1 -1
  568. package/docs/troubleshooting.mdx +21 -9
  569. package/docs/usage.md +58 -43
  570. package/docs/use-cases.mdx +2 -2
  571. package/docs/vs-chrome-devtools-mcp.mdx +5 -5
  572. package/docs/vs-playwright-mcp.mdx +5 -4
  573. package/docs/what-is-recorded.md +12 -7
  574. package/docs/what-is-reticle.mdx +2 -2
  575. package/docs/why-reticle.mdx +1 -1
  576. package/package.json +9 -12
  577. package/dist/command/dev/stale-issue-guard.d.ts +0 -34
  578. package/dist/command/dev/stale-issue-guard.js +0 -69
@@ -0,0 +1,259 @@
1
+ /**
2
+ * `reticle hook tool --agent <id>`: keep one of the coding agent's own tool calls.
3
+ *
4
+ * The agent's shell commands, file edits and web fetches never pass through Reticle's MCP tools,
5
+ * so the daemon's episode log never saw them. The agent's post-tool hook hands each one over here.
6
+ * It goes into the same `.reticle/episodes/` folder, one file per agent session
7
+ * (`agent-<session>.jsonl`): the tool, its arguments, a head of its result and the result's size,
8
+ * whether it failed, its exit code, and its timing. Every string passes the secret redaction first.
9
+ *
10
+ * LOCAL ONLY, under the same rules as the episode log: gitignored, swept by retention, never sent
11
+ * as a file (a synced run takes only the model and the closing message from it). Off with the
12
+ * one agent-capture switch (`RETICLE_PROMPT_CAPTURE=0`, `"promptCapture": false`), and off with the
13
+ * journal (`RETICLE_JOURNAL=0`, `"journal": false`). Reticle's own MCP tools are skipped, because
14
+ * the daemon already keeps them in full. Never throws.
15
+ */
16
+ import { appendFileSync, mkdirSync } from 'node:fs';
17
+ import { dirname, join } from 'node:path';
18
+ import { ReticleDir, ReticleEnv } from '@reticlehq/core';
19
+ import { projectSetting, redactSecrets } from '../../../memory/intent/record-request.js';
20
+ import { AGENT_FILE_PREFIX, AgentRecordKind, EPISODE_FILE_VERSION, } from '../../../memory/journal/episode-log.js';
21
+ import { agentCaptureOff, agentCaptureOffIn, captureRoots } from './prompt-hook.js';
22
+ import { CODEX_AGENT, codexHome, codexTranscriptPath, codexWebSearches, newCodexSearches, readTranscript, } from './codex-transcript.js';
23
+ /** The `kind` of a record this hook writes, beside the daemon's `start` and `call`. */
24
+ export const AGENT_TOOL_RECORD = AgentRecordKind.TOOL;
25
+ /** The `kind` of a record that only names the agent's model (Claude Code's session start). */
26
+ export const AGENT_MODEL_RECORD = AgentRecordKind.MODEL;
27
+ /** The `kind` of the agent's closing message at the end of a turn. */
28
+ export const AGENT_STOP_RECORD = AgentRecordKind.STOP;
29
+ /**
30
+ * The end-of-turn events whose payload carries the final message, and the field that holds it,
31
+ * from each vendor's hook reference (2026-10-18). Copilot CLI's `agentStop` and Factory Droid's
32
+ * `Stop` carry no message text, so they are not here.
33
+ */
34
+ const STOP_MESSAGE_FIELD = {
35
+ // Claude Code and Codex.
36
+ Stop: 'last_assistant_message',
37
+ // Cursor.
38
+ afterAgentResponse: 'text',
39
+ // Gemini CLI.
40
+ AfterAgent: 'prompt_response',
41
+ };
42
+ /** Windsurf names its event in `agent_action_name`, and puts the text in `response`. */
43
+ const WINDSURF_STOP = 'post_cascade_response';
44
+ /** A result keeps this many characters; its full size is kept beside it. */
45
+ export const MAX_TOOL_TEXT = 4_000;
46
+ /** One argument string (a whole file a Write sends) keeps this many characters. */
47
+ const MAX_ARG_TEXT = 100_000;
48
+ /** Reticle's own tools, by the MCP name prefix every agent gives them. */
49
+ const RETICLE_TOOL = /^mcp__reticle/i;
50
+ const EXIT_CODE = /^Exit code (\d+)/;
51
+ const OFF_VALUES = new Set(['0', 'false', 'off', 'no']);
52
+ const JOURNAL_SETTING = 'journal';
53
+ const UNKNOWN_SESSION = 'unknown';
54
+ const BASH = 'Bash';
55
+ /**
56
+ * Codex documents no error field on PostToolUse (2026-10-19): a failed shell command arrives like a
57
+ * passing one, so the absence of an error says nothing about its exit code.
58
+ */
59
+ const NO_FAILURE_SIGNAL = new Set(['codex']);
60
+ const COPILOT_SUCCESS = 'success';
61
+ const UNKNOWN_MODEL = 'Unknown';
62
+ const isObject = (value) => 'object' === typeof value && null !== value && !Array.isArray(value);
63
+ const text = (value) => 'string' === typeof value && 0 < value.length ? value : undefined;
64
+ /**
65
+ * Every string redacted and capped, at any depth. Says whether any string was cut. Paths inside the
66
+ * project are made relative to it first: the redaction removes an absolute path whole, because a
67
+ * home folder names a person, and the file an edit touched is the point of the record.
68
+ */
69
+ function redacted(value, cut, base) {
70
+ if ('string' === typeof value) {
71
+ if (value.length > MAX_ARG_TEXT) {
72
+ cut.any = true;
73
+ }
74
+ return redactSecrets(value.split(`${base}/`).join(''), MAX_ARG_TEXT);
75
+ }
76
+ if (Array.isArray(value)) {
77
+ return value.map((item) => redacted(item, cut, base));
78
+ }
79
+ if (!isObject(value)) {
80
+ return value;
81
+ }
82
+ return Object.fromEntries(Object.entries(value).map(([k, v]) => [k, redacted(v, cut, base)]));
83
+ }
84
+ /** A result as kept: its redacted head, its full size, and whether the head is all of it. */
85
+ function resultOf(value, base) {
86
+ const full = 'string' === typeof value ? value : JSON.stringify(value ?? null);
87
+ return {
88
+ head: redactSecrets(full.split(`${base}/`).join(''), MAX_TOOL_TEXT),
89
+ chars: full.length,
90
+ truncated: full.length > MAX_TOOL_TEXT,
91
+ };
92
+ }
93
+ /**
94
+ * The fields each agent names differently, read into one shape. From each vendor's hook reference
95
+ * on 2026-10-18: Claude Code (`tool_response`, `error`, `duration_ms`, `session_id`), Cursor
96
+ * (`tool_output`, `error_message`, `failure_type`, `duration` with no stated unit,
97
+ * `conversation_id`, `model` on every hook), Codex (`tool_response`, `model` on every hook) and
98
+ * Gemini CLI (`tool_response` with an optional `error` inside it; no model).
99
+ */
100
+ function readPayload(payload) {
101
+ // Copilot CLI's camelCase result: `{ resultType, textResultForLlm }`, a failure unless `success`.
102
+ const copilot = isObject(payload['toolResult']) ? payload['toolResult'] : undefined;
103
+ const response = payload['tool_response'] ?? payload['tool_output'] ?? copilot;
104
+ const inner = isObject(response) ? response['error'] : undefined;
105
+ const innerError = text(inner) ?? (isObject(inner) ? text(inner['message']) : undefined);
106
+ const copilotError = copilot !== undefined && COPILOT_SUCCESS !== copilot['resultType']
107
+ ? (text(copilot['textResultForLlm']) ?? String(copilot['resultType']))
108
+ : undefined;
109
+ // Windsurf names the action, not a tool, and says "Unknown" when it does not know the model.
110
+ const windsurfModel = text(payload['model_name']);
111
+ const windsurfTool = isObject(payload['tool_info'])
112
+ ? text(payload['agent_action_name'])
113
+ : undefined;
114
+ return {
115
+ session: text(payload['session_id']) ??
116
+ text(payload['conversation_id']) ??
117
+ text(payload['sessionId']) ??
118
+ text(payload['trajectory_id']),
119
+ // `to_model` is Claude Code's PostModelSwitch; `model` is everyone else's.
120
+ model: text(payload['model']) ??
121
+ text(payload['to_model']) ??
122
+ (UNKNOWN_MODEL === windsurfModel ? undefined : windsurfModel),
123
+ tool: text(payload['tool_name']) ?? text(payload['toolName']) ?? windsurfTool,
124
+ input: payload['tool_input'] ?? payload['toolArgs'] ?? payload['tool_info'] ?? {},
125
+ response,
126
+ error: text(payload['error']) ?? text(payload['error_message']) ?? innerError ?? copilotError,
127
+ };
128
+ }
129
+ /** One record from a post-tool payload, or from a payload that only names the model. */
130
+ export function toolRecordFrom(agent, payload, now, base) {
131
+ if (!isObject(payload)) {
132
+ return undefined;
133
+ }
134
+ const { session, model, tool, input, response, error } = readPayload(payload);
135
+ const who = {
136
+ v: EPISODE_FILE_VERSION,
137
+ agent,
138
+ ...(session === undefined ? {} : { agentSession: session }),
139
+ ...(model === undefined ? {} : { model }),
140
+ };
141
+ const event = text(payload['hook_event_name']);
142
+ const field = event === undefined ? undefined : STOP_MESSAGE_FIELD[event];
143
+ const info = isObject(payload['tool_info']) ? payload['tool_info'] : {};
144
+ const windsurfStop = WINDSURF_STOP === payload['agent_action_name'];
145
+ if (field !== undefined || windsurfStop) {
146
+ const message = windsurfStop
147
+ ? (text(payload['response']) ?? text(info['response']))
148
+ : text(field === undefined ? undefined : payload[field]);
149
+ // A stop with no message (Codex sends null when it has none) is still the end of the turn.
150
+ return {
151
+ ...who,
152
+ kind: AGENT_STOP_RECORD,
153
+ ...(message === undefined ? {} : { message: resultOf(message, base) }),
154
+ at: now,
155
+ };
156
+ }
157
+ if (tool === undefined) {
158
+ // Claude Code names its model only at session start and on a switch, with no tool.
159
+ return model === undefined ? undefined : { ...who, kind: AGENT_MODEL_RECORD, at: now };
160
+ }
161
+ if (RETICLE_TOOL.test(tool)) {
162
+ return undefined;
163
+ }
164
+ const ok = error === undefined;
165
+ const duration = payload['duration_ms'];
166
+ const durationMs = 'number' === typeof duration && duration >= 0 ? duration : undefined;
167
+ const reported = payload['duration'];
168
+ const exit = error === undefined ? undefined : EXIT_CODE.exec(error)?.[1];
169
+ const cut = { any: false };
170
+ const args = redacted(input, cut, base);
171
+ // A payload that carries no result (Windsurf's) gets none: an invented `null` reads as an answer.
172
+ let outcome = {};
173
+ if (!ok) {
174
+ outcome = { error: resultOf(error, base) };
175
+ }
176
+ else if (response !== undefined) {
177
+ outcome = { result: resultOf(response, base) };
178
+ }
179
+ let exitCode = {};
180
+ if (exit !== undefined) {
181
+ exitCode = { exitCode: Number(exit) };
182
+ }
183
+ else if (ok && BASH === tool && !NO_FAILURE_SIGNAL.has(agent)) {
184
+ exitCode = { exitCode: 0 };
185
+ }
186
+ return {
187
+ ...who,
188
+ kind: AGENT_TOOL_RECORD,
189
+ ...(text(payload['tool_use_id']) === undefined ? {} : { toolUseId: payload['tool_use_id'] }),
190
+ tool,
191
+ args,
192
+ ...(cut.any ? { argsTruncated: true } : {}),
193
+ ok,
194
+ ...outcome,
195
+ ...(text(payload['failure_type']) === undefined
196
+ ? {}
197
+ : { failureType: payload['failure_type'] }),
198
+ ...exitCode,
199
+ ...(true === payload['is_interrupt'] ? { interrupted: true } : {}),
200
+ ...(durationMs === undefined ? {} : { startedAt: now - durationMs, durationMs }),
201
+ // A duration whose unit the vendor does not state is kept as given, never converted.
202
+ ...('number' === typeof reported ? { reportedDuration: reported } : {}),
203
+ endedAt: now,
204
+ };
205
+ }
206
+ export { toolHookAck } from './hook-fast.js';
207
+ /** Keep one tool call. Never throws: the `.reticle` roots it wrote to, or none. */
208
+ export function captureToolCall(agent, raw, io) {
209
+ try {
210
+ if (agentCaptureOff(io.env) ||
211
+ OFF_VALUES.has((io.env[ReticleEnv.JOURNAL] ?? '').toLowerCase())) {
212
+ return { written: [] };
213
+ }
214
+ const payload = JSON.parse(raw);
215
+ if (!isObject(payload)) {
216
+ return { written: [] };
217
+ }
218
+ const roots = Array.isArray(payload['workspace_roots']) ? payload['workspace_roots'] : [];
219
+ // Windsurf puts the folder inside `tool_info` for a command, and nowhere for an edit: its hook
220
+ // runs in the workspace root, which is `io.cwd`.
221
+ const info = isObject(payload['tool_info']) ? payload['tool_info'] : {};
222
+ const cwd = text(payload['cwd']) ?? text(roots[0]) ?? text(info['cwd']) ?? io.cwd;
223
+ const record = toolRecordFrom(agent, payload, io.now(), cwd);
224
+ const given = readPayload(payload).session;
225
+ // Codex's web search reaches no hook: any Codex hook imports it from Codex's own transcript.
226
+ const transcript = CODEX_AGENT === agent && given !== undefined
227
+ ? codexTranscriptPath(payload, codexHome(io.env))
228
+ : undefined;
229
+ const body = transcript === undefined ? undefined : readTranscript(transcript);
230
+ const searches = given === undefined || body === undefined ? [] : codexWebSearches(body, given, cwd);
231
+ if (record === undefined && 0 === searches.length) {
232
+ return { written: [] };
233
+ }
234
+ const session = (given ?? UNKNOWN_SESSION).replace(/[^\w-]/g, '_');
235
+ const written = [];
236
+ for (const root of captureRoots(cwd)) {
237
+ const projectDir = dirname(root);
238
+ if (agentCaptureOffIn(projectDir) || false === projectSetting(projectDir, JOURNAL_SETTING)) {
239
+ continue;
240
+ }
241
+ const dir = join(root, ReticleDir.EPISODES_SUBDIR);
242
+ mkdirSync(dir, { recursive: true });
243
+ const file = join(dir, `${AGENT_FILE_PREFIX}${session}.jsonl`);
244
+ const lines = [
245
+ ...newCodexSearches(searches, file),
246
+ ...(record === undefined ? [] : [record]),
247
+ ];
248
+ if (0 === lines.length) {
249
+ continue;
250
+ }
251
+ appendFileSync(file, lines.map((line) => `${JSON.stringify(line)}\n`).join(''));
252
+ written.push(root);
253
+ }
254
+ return { written };
255
+ }
256
+ catch {
257
+ return { written: [] };
258
+ }
259
+ }
@@ -29,6 +29,7 @@ type OpenDecision = {
29
29
  action: 'left-as-is';
30
30
  url: string;
31
31
  requested: string;
32
+ sessionId?: string;
32
33
  } | {
33
34
  action: 'open';
34
35
  url: string;
@@ -53,6 +54,7 @@ type OpenDecision = {
53
54
  */
54
55
  export declare function decideOpen(all: {
55
56
  url: string;
57
+ sessionId?: string;
56
58
  unresponsive?: boolean;
57
59
  hidden?: boolean;
58
60
  lastSeenMs?: number;
@@ -21,6 +21,20 @@ function statusField(payload, key) {
21
21
  const value = payload[key];
22
22
  return 'string' === typeof value && value.length > 0 ? value : undefined;
23
23
  }
24
+ /**
25
+ * SDK version of each connected page, from `/status`.
26
+ *
27
+ * A missing field is an older daemon: treat it as no pages, which keeps the restart advice.
28
+ * A non-string entry is a page that did not report a version, and that page does not match.
29
+ */
30
+ function pageSdkVersionsOf(payload) {
31
+ if (typeof payload !== 'object' || null === payload)
32
+ return [];
33
+ const raw = payload['pageSdkVersions'];
34
+ if (!Array.isArray(raw))
35
+ return [];
36
+ return raw.map((value) => ('string' === typeof value && 0 < value.length ? value : undefined));
37
+ }
24
38
  /**
25
39
  * Warn when the daemon already on this port is a different version than this CLI, and attach anyway.
26
40
  *
@@ -46,7 +60,7 @@ export function daemonSkew(status) {
46
60
  version: daemonVersion,
47
61
  contract: statusField(status, 'contract'),
48
62
  // The daemon is the peer here and this process is the agent side.
49
- fix: daemonFix(daemonVersion, SERVER_VERSION),
63
+ fix: daemonFix(daemonVersion, SERVER_VERSION, pageSdkVersionsOf(status)),
50
64
  }, { version: SERVER_VERSION, contract: CONTRACT_FINGERPRINT });
51
65
  }
52
66
  function sameOrigin(a, b) {
@@ -114,7 +128,13 @@ export function decideOpen(all, url) {
114
128
  return { action: 'reuse', url: exact.url };
115
129
  const onOrigin = sessions.find((s) => sameOrigin(s.url, url));
116
130
  return onOrigin !== undefined
117
- ? { action: 'left-as-is', url: onOrigin.url, requested: url }
131
+ ? {
132
+ action: 'left-as-is',
133
+ url: onOrigin.url,
134
+ requested: url,
135
+ // Which tab, so `--navigate` can move THAT one rather than whichever the daemon picks.
136
+ ...(onOrigin.sessionId === undefined ? {} : { sessionId: onOrigin.sessionId }),
137
+ }
118
138
  : { action: 'open', url };
119
139
  }
120
140
  /**
@@ -24,7 +24,8 @@ import { readDaemonStartupCause } from '../../daemon/lifetime/startup-failure.js
24
24
  import { PortPresence, probePresence, describePresence, } from '../../daemon/binding/port-presence.js';
25
25
  import { daemonSpawnArgs } from '../daemon-start-options.js';
26
26
  import { fetchStatus } from '../../daemon/binding/daemon-status-probe.js';
27
- import { runKill } from '../cli-kill.js';
27
+ import { requestShutdown, runKill } from '../cli-kill.js';
28
+ import { RETICLE_DEFAULT_PORT } from '@reticlehq/core';
28
29
  export function handleServe(parsed) {
29
30
  void serveWithHonestExit(parsed);
30
31
  }
@@ -59,6 +60,21 @@ async function serveWithHonestExit(parsed) {
59
60
  return;
60
61
  }
61
62
  }
63
+ if (undefined !== parsed.driveUrl) {
64
+ // `drive` deliberately does not accept --port: use its existing RETICLE_PORT input.
65
+ // Quote the URL so copying the suggestion preserves its query string.
66
+ const safeUrlArg = `'${parsed.driveUrl.replace(/'/g, String.raw `'\''`)}'`;
67
+ const driveCommand = `reticle drive ${safeUrlArg}`;
68
+ const runnableCommand = RETICLE_DEFAULT_PORT === parsed.port
69
+ ? driveCommand
70
+ : `RETICLE_PORT=${String(parsed.port)} ${driveCommand}`;
71
+ const reason = 'a Reticle daemon is already running. `serve --drive` cannot open a tab in it. ' +
72
+ `Use \`${runnableCommand}\` instead.`;
73
+ log('reticle_daemon_start_refused', { port: parsed.port, reason });
74
+ process.stderr.write(`${reason}\n`);
75
+ process.exit(1);
76
+ return;
77
+ }
62
78
  log('reticle_daemon_already_running', { port: parsed.port });
63
79
  return;
64
80
  }
@@ -134,7 +150,17 @@ export function handleStop(port, quiet) {
134
150
  });
135
151
  return;
136
152
  }
137
- process.kill(pid, 'SIGTERM');
153
+ // Ask the daemon first, on every OS: on Windows a signal ends it at once, with no shutdown path
154
+ // and no stop event. The signal is the fallback for an older daemon or a refused request.
155
+ void requestShutdown(port).then((asked) => {
156
+ if (!asked) {
157
+ process.kill(pid, 'SIGTERM');
158
+ }
159
+ waitForStop(port, pid, quiet);
160
+ });
161
+ }
162
+ /** Poll until `pid` is gone: SIGKILL after the graceful window, give up after the forced one. */
163
+ function waitForStop(port, pid, quiet) {
138
164
  const started = Date.now();
139
165
  let escalated = false;
140
166
  const poll = setInterval(() => {
@@ -13,6 +13,15 @@
13
13
  * person never asked for, on a port nothing records. Only the requested port gets the default.
14
14
  */
15
15
  export declare function spawnsHeadless(headless: boolean, requested: number, resolved: number): boolean;
16
+ /**
17
+ * Should a proxy stop the older daemon it found, and start its own release?
18
+ *
19
+ * Only an OLDER daemon, read from `/status`, with no tab attached and no other agent attached. A
20
+ * tab or an agent can have a call in flight, so that daemon stays and the skew is described as
21
+ * before. A daemon before `MCP_PEERS_SINCE` does not report its agents, so it stays too. A status
22
+ * that does not parse, or a version that does not compare, keeps the daemon.
23
+ */
24
+ export declare function retiresOlderDaemon(status: unknown, proxyVersion: string): boolean;
16
25
  /**
17
26
  * MCP proxy mode: ensures the daemon is running, then bridges Claude Code's
18
27
  * stdin/stdout to the daemon's SSE endpoint. This is the recommended way to