@gajae-code/coding-agent 0.17.1 → 0.17.4

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 (375) hide show
  1. package/CHANGELOG.md +266 -0
  2. package/dist/types/async/job-manager.d.ts +7 -6
  3. package/dist/types/cli/daemon-cli.d.ts +3 -1
  4. package/dist/types/cli/github-release.d.ts +17 -0
  5. package/dist/types/cli/public-command-entry.d.ts +56 -0
  6. package/dist/types/cli/public-command-errors.d.ts +126 -0
  7. package/dist/types/cli/public-command-evidence.d.ts +99 -0
  8. package/dist/types/cli/public-command-help.d.ts +65 -0
  9. package/dist/types/cli/public-command-registry.d.ts +69 -0
  10. package/dist/types/cli/session-picker.d.ts +1 -1
  11. package/dist/types/cli/setup-cli.d.ts +1 -0
  12. package/dist/types/cli/skills-cli.d.ts +5 -0
  13. package/dist/types/cli.d.ts +3 -0
  14. package/dist/types/commands/daemon.d.ts +4 -50
  15. package/dist/types/commands/sdk.d.ts +20 -37
  16. package/dist/types/commands/setup.d.ts +3 -0
  17. package/dist/types/commands/skills.d.ts +9 -0
  18. package/dist/types/config/autorouting-tier-map.d.ts +24 -0
  19. package/dist/types/config/file-lock.d.ts +10 -1
  20. package/dist/types/config/model-profile-activation.d.ts +63 -4
  21. package/dist/types/config/model-registry.d.ts +20 -2
  22. package/dist/types/config/settings-schema.d.ts +11 -0
  23. package/dist/types/coordinator-mcp/question-state.d.ts +6 -1
  24. package/dist/types/coordinator-mcp/server.d.ts +3 -0
  25. package/dist/types/daemon/operator-contract.d.ts +5 -1
  26. package/dist/types/eval/js/worker-protocol.d.ts +2 -0
  27. package/dist/types/extensibility/extensions/types.d.ts +12 -0
  28. package/dist/types/extensibility/gjc-plugins/registry.d.ts +4 -0
  29. package/dist/types/extensibility/runtime-skill-discovery.d.ts +18 -0
  30. package/dist/types/extensibility/shared-events.d.ts +3 -1
  31. package/dist/types/gjc-runtime/session-state-lock.d.ts +61 -0
  32. package/dist/types/internal-urls/embedded-protocol.d.ts +9 -0
  33. package/dist/types/internal-urls/index.d.ts +1 -0
  34. package/dist/types/internal-urls/parse.d.ts +9 -1
  35. package/dist/types/main.d.ts +22 -0
  36. package/dist/types/modes/acp/acp-agent.d.ts +94 -1
  37. package/dist/types/modes/acp/startup-provenance.d.ts +16 -0
  38. package/dist/types/modes/components/custom-provider-wizard.d.ts +19 -1
  39. package/dist/types/modes/components/session-selector.d.ts +5 -2
  40. package/dist/types/modes/components/thinking-selector.d.ts +2 -1
  41. package/dist/types/modes/components/user-message-selector.d.ts +5 -2
  42. package/dist/types/modes/controllers/command-controller.d.ts +1 -1
  43. package/dist/types/modes/controllers/selector-controller.d.ts +1 -1
  44. package/dist/types/modes/interactive-mode.d.ts +1 -1
  45. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +11 -1
  46. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +14 -1
  47. package/dist/types/modes/types.d.ts +2 -2
  48. package/dist/types/runtime/process-lifecycle.d.ts +2 -0
  49. package/dist/types/runtime-mcp/manager.d.ts +56 -0
  50. package/dist/types/runtime-mcp/pool.d.ts +17 -0
  51. package/dist/types/runtime-mcp/redaction.d.ts +20 -0
  52. package/dist/types/runtime-mcp/startup-policy.d.ts +6 -0
  53. package/dist/types/runtime-mcp/tool-bridge.d.ts +9 -0
  54. package/dist/types/runtime-mcp/transports/http.d.ts +11 -0
  55. package/dist/types/sdk/acp/adapter.d.ts +27 -0
  56. package/dist/types/sdk/acp/final-text.d.ts +8 -0
  57. package/dist/types/sdk/broker/broker.d.ts +13 -2
  58. package/dist/types/sdk/broker/ensure.d.ts +46 -1
  59. package/dist/types/sdk/broker/identity.d.ts +3 -1
  60. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +23 -3
  61. package/dist/types/sdk/broker/lifecycle.d.ts +15 -8
  62. package/dist/types/sdk/broker/runtime.d.ts +1 -1
  63. package/dist/types/sdk/broker/session-index.d.ts +22 -3
  64. package/dist/types/sdk/broker/spawn-authority.d.ts +4 -0
  65. package/dist/types/sdk/broker/stderr-drainer.d.ts +13 -0
  66. package/dist/types/sdk/bus/index.d.ts +19 -0
  67. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +3 -1
  68. package/dist/types/sdk/bus/telegram-daemon.d.ts +5 -0
  69. package/dist/types/sdk/cli/master-cli.d.ts +6 -10
  70. package/dist/types/sdk/cli/rows.d.ts +19 -1
  71. package/dist/types/sdk/cli/session-cli.d.ts +22 -5
  72. package/dist/types/sdk/client/client.d.ts +2 -0
  73. package/dist/types/sdk/guides/cli.d.ts +3 -4
  74. package/dist/types/sdk/guides/verify.d.ts +2 -0
  75. package/dist/types/sdk/host/host.d.ts +9 -0
  76. package/dist/types/sdk/host/session-runtime.d.ts +31 -0
  77. package/dist/types/sdk/host/types.d.ts +10 -0
  78. package/dist/types/sdk/index.d.ts +1 -0
  79. package/dist/types/sdk/prompt-deadline-flush.d.ts +83 -0
  80. package/dist/types/sdk/prompt-deadline-manager.d.ts +38 -1
  81. package/dist/types/sdk/prompt-failure.d.ts +30 -1
  82. package/dist/types/sdk/prompt-status.d.ts +8 -0
  83. package/dist/types/sdk/prompt-tool-boundary.d.ts +73 -0
  84. package/dist/types/sdk/router/replay-retention-gap-cache.d.ts +13 -0
  85. package/dist/types/sdk/router/session-router.d.ts +2 -0
  86. package/dist/types/sdk/startup-capability.d.ts +2 -0
  87. package/dist/types/sdk/transport/relay.d.ts +1 -0
  88. package/dist/types/sdk/transport/serve-cli.d.ts +73 -2
  89. package/dist/types/sdk/transport/stdio.d.ts +5 -1
  90. package/dist/types/session/agent-session.d.ts +168 -21
  91. package/dist/types/session/fallback-chain-controller.d.ts +6 -6
  92. package/dist/types/session/fold-coordinator.d.ts +17 -3
  93. package/dist/types/session/internal/managed-session-storage.d.ts +7 -1
  94. package/dist/types/session/session-manager.d.ts +64 -1
  95. package/dist/types/session/session-work-lease.d.ts +14 -0
  96. package/dist/types/setup/model-onboarding-guidance.d.ts +1 -1
  97. package/dist/types/setup/provider-onboarding.d.ts +81 -1
  98. package/dist/types/thinking.d.ts +3 -1
  99. package/dist/types/tools/bash.d.ts +37 -11
  100. package/dist/types/tools/job.d.ts +1 -1
  101. package/dist/types/tools/steer-fold.d.ts +31 -0
  102. package/dist/types/utils/git.d.ts +28 -2
  103. package/dist/types/utils/mupdf-embedded.d.ts +2 -0
  104. package/dist/types/utils/mupdf-wasm-embedded.d.ts +2 -0
  105. package/dist/types/utils/mupdf.d.ts +4 -0
  106. package/dist/types/utils/session-title-generation.d.ts +6 -0
  107. package/dist/types/utils/title-generator.d.ts +11 -2
  108. package/dist/types/web/scrapers/types.d.ts +3 -0
  109. package/package.json +18 -10
  110. package/scripts/build-binary.ts +9 -3
  111. package/scripts/compile-args.ts +0 -9
  112. package/scripts/embed-mupdf.ts +52 -0
  113. package/scripts/generate-sdk-operation-inventory.ts +31 -1
  114. package/scripts/vendor-markit.ts +196 -0
  115. package/src/async/job-manager.ts +60 -9
  116. package/src/cli/daemon-cli.ts +53 -18
  117. package/src/cli/github-release.ts +87 -5
  118. package/src/cli/mcp-cli.ts +38 -4
  119. package/src/cli/public-command-entry.ts +450 -0
  120. package/src/cli/public-command-errors.ts +581 -0
  121. package/src/cli/public-command-evidence.ts +717 -0
  122. package/src/cli/public-command-help.ts +360 -0
  123. package/src/cli/public-command-registry.ts +535 -0
  124. package/src/cli/session-picker.ts +2 -1
  125. package/src/cli/setup-cli.ts +9 -1
  126. package/src/cli/skills-cli.ts +46 -2
  127. package/src/cli.ts +61 -1
  128. package/src/commands/daemon.ts +65 -69
  129. package/src/commands/sdk.ts +232 -100
  130. package/src/commands/setup.ts +2 -0
  131. package/src/commands/skills.ts +11 -0
  132. package/src/config/autorouting-tier-map.ts +16 -0
  133. package/src/config/file-lock.ts +199 -68
  134. package/src/config/model-profile-activation.ts +406 -53
  135. package/src/config/model-registry.ts +204 -25
  136. package/src/config/settings-schema.ts +26 -2
  137. package/src/coordinator-mcp/policy.ts +10 -5
  138. package/src/coordinator-mcp/question-gate-codec.ts +17 -0
  139. package/src/coordinator-mcp/question-state.ts +175 -8
  140. package/src/coordinator-mcp/server.ts +528 -87
  141. package/src/coordinator-mcp/session-reaper.ts +6 -4
  142. package/src/crash/record-loader.ts +6 -2
  143. package/src/daemon/operator-contract.ts +26 -12
  144. package/src/debug/report-bundle.ts +114 -24
  145. package/src/defaults/gjc/skills/ultragoal/SKILL.md +1 -1
  146. package/src/eval/js/context-manager.ts +8 -8
  147. package/src/eval/js/worker-core.ts +9 -4
  148. package/src/eval/js/worker-protocol.ts +2 -0
  149. package/src/extensibility/extensions/runner.ts +52 -4
  150. package/src/extensibility/extensions/types.ts +10 -0
  151. package/src/extensibility/gjc-plugins/registry.ts +196 -37
  152. package/src/extensibility/runtime-skill-discovery.ts +61 -3
  153. package/src/extensibility/shared-events.ts +3 -1
  154. package/src/gjc-runtime/managed-owner-admission.ts +67 -50
  155. package/src/gjc-runtime/session-state-lock.ts +165 -24
  156. package/src/gjc-runtime/ultragoal-succession.ts +31 -3
  157. package/src/internal-urls/docs-index.generated.ts +21 -19
  158. package/src/internal-urls/embedded-protocol.ts +83 -0
  159. package/src/internal-urls/index.ts +1 -0
  160. package/src/internal-urls/parse.ts +21 -1
  161. package/src/internal-urls/router.ts +4 -2
  162. package/src/main.ts +123 -55
  163. package/src/modes/acp/acp-agent.ts +593 -47
  164. package/src/modes/acp/acp-event-mapper.ts +9 -0
  165. package/src/modes/acp/startup-provenance.ts +59 -0
  166. package/src/modes/components/custom-provider-wizard.ts +308 -7
  167. package/src/modes/components/model-selector.ts +31 -15
  168. package/src/modes/components/oauth-selector.ts +9 -0
  169. package/src/modes/components/session-selector.ts +47 -4
  170. package/src/modes/components/status-line/segments.ts +6 -1
  171. package/src/modes/components/thinking-selector.ts +7 -3
  172. package/src/modes/components/user-message-selector.ts +57 -15
  173. package/src/modes/controllers/command-controller.ts +58 -32
  174. package/src/modes/controllers/extension-ui-controller.ts +33 -7
  175. package/src/modes/controllers/input-controller.ts +4 -0
  176. package/src/modes/controllers/selector-controller.ts +177 -18
  177. package/src/modes/interactive-mode.ts +21 -7
  178. package/src/modes/runtime-init.ts +1 -0
  179. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +124 -7
  180. package/src/modes/shared/agent-wire/workflow-gate-types.ts +16 -2
  181. package/src/modes/types.ts +2 -2
  182. package/src/prompts/agent-fragments/browser-aside.md +1 -0
  183. package/src/prompts/system/title-system.md +1 -1
  184. package/src/prompts/tools/bash.md +1 -1
  185. package/src/prompts/tools/job.md +1 -1
  186. package/src/prompts/tools/read.md +2 -0
  187. package/src/runtime/network-prewarm-service.test.ts +36 -1
  188. package/src/runtime/network-prewarm-service.ts +28 -3
  189. package/src/runtime/process-lifecycle.ts +22 -11
  190. package/src/runtime-mcp/config.ts +16 -1
  191. package/src/runtime-mcp/manager.ts +689 -55
  192. package/src/runtime-mcp/pool.test.ts +31 -0
  193. package/src/runtime-mcp/pool.ts +304 -28
  194. package/src/runtime-mcp/redaction.ts +42 -0
  195. package/src/runtime-mcp/startup-policy.ts +7 -0
  196. package/src/runtime-mcp/tool-bridge.ts +71 -0
  197. package/src/runtime-mcp/transports/http.ts +108 -25
  198. package/src/sdk/acp/adapter.ts +90 -9
  199. package/src/sdk/acp/final-text.ts +19 -2
  200. package/src/sdk/broker/broker.ts +378 -52
  201. package/src/sdk/broker/ensure.ts +97 -19
  202. package/src/sdk/broker/identity.ts +9 -1
  203. package/src/sdk/broker/lifecycle-ledger.ts +95 -31
  204. package/src/sdk/broker/lifecycle.ts +690 -141
  205. package/src/sdk/broker/runtime.ts +1 -1
  206. package/src/sdk/broker/session-index.ts +97 -4
  207. package/src/sdk/broker/spawn-authority.ts +35 -7
  208. package/src/sdk/broker/stderr-drainer.ts +59 -0
  209. package/src/sdk/bus/chat-daemon-control.ts +2 -2
  210. package/src/sdk/bus/chat-daemon-runtime.ts +1 -0
  211. package/src/sdk/bus/index.ts +721 -84
  212. package/src/sdk/bus/telegram-daemon-cli.ts +31 -2
  213. package/src/sdk/bus/telegram-daemon-contract.ts +3 -1
  214. package/src/sdk/bus/telegram-daemon.ts +10 -3
  215. package/src/sdk/cli/master-cli.ts +47 -36
  216. package/src/sdk/cli/rows.ts +30 -7
  217. package/src/sdk/cli/session-cli.ts +687 -184
  218. package/src/sdk/client/client.ts +18 -0
  219. package/src/sdk/guides/catalog.ts +2 -2
  220. package/src/sdk/guides/cli.ts +20 -62
  221. package/src/sdk/guides/verify.ts +14 -0
  222. package/src/sdk/host/host.ts +49 -5
  223. package/src/sdk/host/session-runtime.test.ts +636 -9
  224. package/src/sdk/host/session-runtime.ts +499 -118
  225. package/src/sdk/host/types.ts +12 -1
  226. package/src/sdk/host/websocket-transport.lifecycle.test.ts +84 -0
  227. package/src/sdk/host/websocket-transport.ts +40 -6
  228. package/src/sdk/index.ts +11 -0
  229. package/src/sdk/prompt-deadline-flush.ts +334 -0
  230. package/src/sdk/prompt-deadline-manager.ts +136 -4
  231. package/src/sdk/prompt-failure.ts +43 -1
  232. package/src/sdk/prompt-status.ts +8 -0
  233. package/src/sdk/prompt-tool-boundary.ts +121 -0
  234. package/src/sdk/protocol/operation-inventory.generated.json +106 -0
  235. package/src/sdk/router/replay-retention-gap-cache.ts +27 -0
  236. package/src/sdk/router/session-router.ts +31 -4
  237. package/src/sdk/session.ts +194 -16
  238. package/src/sdk/startup-capability.ts +1 -1
  239. package/src/sdk/transport/relay.ts +71 -6
  240. package/src/sdk/transport/serve-cli.ts +494 -49
  241. package/src/sdk/transport/socket.ts +12 -11
  242. package/src/sdk/transport/stdio.ts +7 -3
  243. package/src/session/agent-session.ts +2437 -400
  244. package/src/session/fallback-chain-controller.ts +6 -7
  245. package/src/session/fold-coordinator.ts +24 -5
  246. package/src/session/internal/managed-session-scope.ts +58 -18
  247. package/src/session/internal/managed-session-storage.ts +304 -11
  248. package/src/session/session-manager.ts +382 -44
  249. package/src/session/session-work-lease.ts +34 -0
  250. package/src/session-import/codex.ts +12 -3
  251. package/src/setup/model-onboarding-guidance.ts +1 -1
  252. package/src/setup/provider-onboarding.ts +397 -24
  253. package/src/slash-commands/builtin-registry.ts +258 -14
  254. package/src/task/index.ts +14 -2
  255. package/src/thinking.ts +21 -2
  256. package/src/tools/bash.ts +98 -78
  257. package/src/tools/fetch.ts +119 -20
  258. package/src/tools/job.ts +151 -25
  259. package/src/tools/output-meta.ts +15 -2
  260. package/src/tools/path-utils.ts +27 -3
  261. package/src/tools/read.ts +3 -3
  262. package/src/tools/steer-fold.ts +107 -0
  263. package/src/tools/tool-catalog.generated.ts +29 -2
  264. package/src/tools/tool-errors.ts +4 -0
  265. package/src/utils/git.ts +53 -3
  266. package/src/utils/markit.ts +55 -41
  267. package/src/utils/mupdf-assets.d.ts +4 -0
  268. package/src/utils/mupdf-embedded.ts +4 -0
  269. package/src/utils/mupdf-wasm-embedded.ts +3 -0
  270. package/src/utils/mupdf-wasm.ts +24 -2
  271. package/src/utils/mupdf.ts +129 -0
  272. package/src/utils/session-title-generation.ts +29 -0
  273. package/src/utils/title-generator.ts +46 -2
  274. package/src/web/scrapers/types.ts +24 -3
  275. package/vendor/markit-ai/LICENSE +21 -0
  276. package/vendor/markit-ai/MANIFEST.json +412 -0
  277. package/vendor/markit-ai/dist/commands/config.d.ts +4 -0
  278. package/vendor/markit-ai/dist/commands/config.js +139 -0
  279. package/vendor/markit-ai/dist/commands/convert.d.ts +6 -0
  280. package/vendor/markit-ai/dist/commands/convert.js +113 -0
  281. package/vendor/markit-ai/dist/commands/formats.d.ts +2 -0
  282. package/vendor/markit-ai/dist/commands/formats.js +92 -0
  283. package/vendor/markit-ai/dist/commands/init.d.ts +2 -0
  284. package/vendor/markit-ai/dist/commands/init.js +29 -0
  285. package/vendor/markit-ai/dist/commands/onboard.d.ts +2 -0
  286. package/vendor/markit-ai/dist/commands/onboard.js +61 -0
  287. package/vendor/markit-ai/dist/commands/plugin.d.ts +4 -0
  288. package/vendor/markit-ai/dist/commands/plugin.js +58 -0
  289. package/vendor/markit-ai/dist/config.d.ts +26 -0
  290. package/vendor/markit-ai/dist/config.js +42 -0
  291. package/vendor/markit-ai/dist/converters/audio.d.ts +7 -0
  292. package/vendor/markit-ai/dist/converters/audio.js +104 -0
  293. package/vendor/markit-ai/dist/converters/csv.d.ts +7 -0
  294. package/vendor/markit-ai/dist/converters/csv.js +83 -0
  295. package/vendor/markit-ai/dist/converters/docx.d.ts +6 -0
  296. package/vendor/markit-ai/dist/converters/docx.js +57 -0
  297. package/vendor/markit-ai/dist/converters/epub.d.ts +8 -0
  298. package/vendor/markit-ai/dist/converters/epub.js +128 -0
  299. package/vendor/markit-ai/dist/converters/github.d.ts +18 -0
  300. package/vendor/markit-ai/dist/converters/github.js +148 -0
  301. package/vendor/markit-ai/dist/converters/html.d.ts +6 -0
  302. package/vendor/markit-ai/dist/converters/html.js +30 -0
  303. package/vendor/markit-ai/dist/converters/image.d.ts +6 -0
  304. package/vendor/markit-ai/dist/converters/image.js +124 -0
  305. package/vendor/markit-ai/dist/converters/ipynb.d.ts +6 -0
  306. package/vendor/markit-ai/dist/converters/ipynb.js +75 -0
  307. package/vendor/markit-ai/dist/converters/iwork.d.ts +20 -0
  308. package/vendor/markit-ai/dist/converters/iwork.js +391 -0
  309. package/vendor/markit-ai/dist/converters/json.d.ts +6 -0
  310. package/vendor/markit-ai/dist/converters/json.js +21 -0
  311. package/vendor/markit-ai/dist/converters/pdf/columns.d.ts +35 -0
  312. package/vendor/markit-ai/dist/converters/pdf/columns.js +93 -0
  313. package/vendor/markit-ai/dist/converters/pdf/extract.d.ts +19 -0
  314. package/vendor/markit-ai/dist/converters/pdf/extract.js +514 -0
  315. package/vendor/markit-ai/dist/converters/pdf/grid.d.ts +25 -0
  316. package/vendor/markit-ai/dist/converters/pdf/grid.js +795 -0
  317. package/vendor/markit-ai/dist/converters/pdf/headers.d.ts +24 -0
  318. package/vendor/markit-ai/dist/converters/pdf/headers.js +108 -0
  319. package/vendor/markit-ai/dist/converters/pdf/index.d.ts +19 -0
  320. package/vendor/markit-ai/dist/converters/pdf/index.js +136 -0
  321. package/vendor/markit-ai/dist/converters/pdf/mupdf-loader.js +9 -0
  322. package/vendor/markit-ai/dist/converters/pdf/render.d.ts +24 -0
  323. package/vendor/markit-ai/dist/converters/pdf/render.js +513 -0
  324. package/vendor/markit-ai/dist/converters/pdf/types.d.ts +75 -0
  325. package/vendor/markit-ai/dist/converters/pdf/types.js +1 -0
  326. package/vendor/markit-ai/dist/converters/plain-text.d.ts +6 -0
  327. package/vendor/markit-ai/dist/converters/plain-text.js +87 -0
  328. package/vendor/markit-ai/dist/converters/pptx.d.ts +8 -0
  329. package/vendor/markit-ai/dist/converters/pptx.js +289 -0
  330. package/vendor/markit-ai/dist/converters/rss.d.ts +11 -0
  331. package/vendor/markit-ai/dist/converters/rss.js +138 -0
  332. package/vendor/markit-ai/dist/converters/wikipedia.d.ts +6 -0
  333. package/vendor/markit-ai/dist/converters/wikipedia.js +33 -0
  334. package/vendor/markit-ai/dist/converters/xlsx.d.ts +8 -0
  335. package/vendor/markit-ai/dist/converters/xlsx.js +147 -0
  336. package/vendor/markit-ai/dist/converters/xml.d.ts +6 -0
  337. package/vendor/markit-ai/dist/converters/xml.js +18 -0
  338. package/vendor/markit-ai/dist/converters/yaml.d.ts +6 -0
  339. package/vendor/markit-ai/dist/converters/yaml.js +17 -0
  340. package/vendor/markit-ai/dist/converters/zip.d.ts +8 -0
  341. package/vendor/markit-ai/dist/converters/zip.js +57 -0
  342. package/vendor/markit-ai/dist/index.d.ts +30 -0
  343. package/vendor/markit-ai/dist/index.js +26 -0
  344. package/vendor/markit-ai/dist/main.d.ts +2 -0
  345. package/vendor/markit-ai/dist/main.js +191 -0
  346. package/vendor/markit-ai/dist/markit.d.ts +45 -0
  347. package/vendor/markit-ai/dist/markit.js +267 -0
  348. package/vendor/markit-ai/dist/plugins/api.d.ts +7 -0
  349. package/vendor/markit-ai/dist/plugins/api.js +42 -0
  350. package/vendor/markit-ai/dist/plugins/index.d.ts +4 -0
  351. package/vendor/markit-ai/dist/plugins/index.js +3 -0
  352. package/vendor/markit-ai/dist/plugins/installer.d.ts +25 -0
  353. package/vendor/markit-ai/dist/plugins/installer.js +176 -0
  354. package/vendor/markit-ai/dist/plugins/loader.d.ts +6 -0
  355. package/vendor/markit-ai/dist/plugins/loader.js +61 -0
  356. package/vendor/markit-ai/dist/plugins/types.d.ts +25 -0
  357. package/vendor/markit-ai/dist/plugins/types.js +1 -0
  358. package/vendor/markit-ai/dist/providers/anthropic.d.ts +2 -0
  359. package/vendor/markit-ai/dist/providers/anthropic.js +47 -0
  360. package/vendor/markit-ai/dist/providers/index.d.ts +21 -0
  361. package/vendor/markit-ai/dist/providers/index.js +56 -0
  362. package/vendor/markit-ai/dist/providers/openai.d.ts +2 -0
  363. package/vendor/markit-ai/dist/providers/openai.js +76 -0
  364. package/vendor/markit-ai/dist/providers/types.d.ts +26 -0
  365. package/vendor/markit-ai/dist/providers/types.js +1 -0
  366. package/vendor/markit-ai/dist/types.d.ts +36 -0
  367. package/vendor/markit-ai/dist/types.js +1 -0
  368. package/vendor/markit-ai/dist/utils/exit-codes.d.ts +4 -0
  369. package/vendor/markit-ai/dist/utils/exit-codes.js +4 -0
  370. package/vendor/markit-ai/dist/utils/output.d.ts +22 -0
  371. package/vendor/markit-ai/dist/utils/output.js +31 -0
  372. package/vendor/markit-ai/dist/utils/turndown.d.ts +8 -0
  373. package/vendor/markit-ai/dist/utils/turndown.js +70 -0
  374. package/vendor/markit-ai/package.json +74 -0
  375. package/vendor/markit-ai.patch +49 -0
@@ -131,7 +131,7 @@ export declare class SelectorController {
131
131
  smartRoutingOnly?: boolean;
132
132
  }): void;
133
133
  showPluginSelector(mode?: "install" | "uninstall"): Promise<void>;
134
- showUserMessageSelector(): void;
134
+ showUserMessageSelector(onCommitted?: () => void): void;
135
135
  showTreeSelector(): void;
136
136
  showSessionSelector(): Promise<void>;
137
137
  handleResumeSession(sessionPath: string): Promise<void>;
@@ -257,7 +257,7 @@ export declare class InteractiveMode implements InteractiveModeContext {
257
257
  handleDropCommand(): Promise<boolean>;
258
258
  handleForkCommand(): Promise<void>;
259
259
  handleMoveCommand(targetPath: string): Promise<void>;
260
- handleRenameCommand(title: string): Promise<void>;
260
+ handleRenameCommand(title?: string): Promise<void>;
261
261
  handleMemoryCommand(text: string): Promise<void>;
262
262
  handleSTTToggle(): Promise<void>;
263
263
  showDebugSelector(): void;
@@ -8,6 +8,8 @@ export type PersistedResolutionOrigin = {
8
8
  kind: "telegram_notification";
9
9
  interactionActionId: string;
10
10
  };
11
+ /** Keep accepted diagnostics below the coordinator's cumulative Q12 snapshot cap. */
12
+ export declare const MAX_ACCEPTED_WORKFLOW_GATE_QUERY_RECORDS = 32;
11
13
  export type PersistedAckPolicy = {
12
14
  kind: "none";
13
15
  reason: "non_telegram" | "semantic_noncommit" | "legacy_unproven";
@@ -95,7 +97,7 @@ export interface WorkflowGateEmitter {
95
97
  */
96
98
  export declare class BrokerWorkflowGateEmitter implements WorkflowGateEmitter {
97
99
  #private;
98
- constructor(runId: string, store: GateStore, emitterHooks?: Pick<BrokerHooks, "advance">);
100
+ constructor(runId: string, store: GateStore, emitterHooks?: Pick<BrokerHooks, "advance" | "continuationLost">);
99
101
  supportsRemoteGateAnswers(): boolean;
100
102
  setRuntimeTurnProvider(provider: (() => string | undefined) | null): void;
101
103
  emitGate(input: OpenGateInput): Promise<unknown>;
@@ -193,6 +195,11 @@ export type GateAuditEvent = {
193
195
  } | {
194
196
  event: "gate_response_idempotent_replay";
195
197
  gate_id: string;
198
+ }
199
+ /** An idempotent replay refused because this runtime cannot prove the continuation ran. */
200
+ | {
201
+ event: "gate_response_replay_unproven";
202
+ gate_id: string;
196
203
  } | {
197
204
  event: "gate_response_idempotency_conflict";
198
205
  gate_id: string;
@@ -225,6 +232,8 @@ export interface BrokerHooks {
225
232
  terminalizeAccepted?(record: PersistedGate): WorkflowGateTerminalProof | Promise<WorkflowGateTerminalProof>;
226
233
  /** Runs only after a successful advance has been durably marked advanced. */
227
234
  completeAccepted?(record: PersistedGate): void | Promise<void>;
235
+ /** Notifies the owning runtime when the accepted answer cannot reach its continuation. */
236
+ continuationLost?(record: PersistedGate): void;
228
237
  /** Append-only audit sink. */
229
238
  audit?(event: GateAuditEvent): void;
230
239
  }
@@ -277,6 +286,7 @@ export declare class WorkflowGateBroker {
277
286
  lookupCompletedResolution(response: WorkflowGateResponse): WorkflowGateCompletedResolutionLookup;
278
287
  private runShort;
279
288
  private hasLiveContinuation;
289
+ private recordContinuationLoss;
280
290
  hasRecoverableAcceptedGate(): boolean;
281
291
  prepareTerminalization(gateId: string, proof: WorkflowGateTerminalProof): boolean;
282
292
  clearPreparedTerminalization(gateId: string): void;
@@ -117,13 +117,26 @@ export interface WorkflowGateDiagnostic extends WorkflowGate {
117
117
  id: string;
118
118
  tag: "quarantined";
119
119
  lifecycle: WorkflowGateLifecycle;
120
+ /** Whether the durable broker retained an answer for this gate. */
121
+ answer_recorded: boolean;
122
+ }
123
+ /** Durable acceptance evidence for a gate that is no longer pending. */
124
+ export interface WorkflowGateResolutionDiagnostic extends WorkflowGate {
125
+ id: string;
126
+ tag: "accepted";
127
+ /** True when the accepted record contains the answer body. */
128
+ answer_recorded: true;
129
+ resolved_at: string;
130
+ /** Single post-accept disposition; raw answers and derived answer values stay private. */
131
+ post_accept_disposition: "accepted" | "terminalized" | "advanced" | "continuation_lost" | "unknown";
120
132
  }
121
133
  /** Stable Q12 row preserving the root WorkflowGate shape. */
122
134
  export type WorkflowGateQueryRecord = (WorkflowGate & {
123
135
  id: string;
124
136
  tag: "pending";
125
137
  lifecycle?: undefined;
126
- }) | WorkflowGateDiagnostic;
138
+ answer_recorded: false;
139
+ }) | WorkflowGateDiagnostic | WorkflowGateResolutionDiagnostic;
127
140
  /** Inbound: the agent's answer to a workflow gate. */
128
141
  export interface WorkflowGateResponse {
129
142
  gate_id: string;
@@ -303,7 +303,7 @@ export interface InteractiveModeContext {
303
303
  handleHandoffCommand(customInstructions?: string): Promise<void>;
304
304
  handleContributionPrepCommand(customInstructions?: string): Promise<void>;
305
305
  handleMoveCommand(targetPath: string): Promise<void>;
306
- handleRenameCommand(title: string): Promise<void>;
306
+ handleRenameCommand(title?: string): Promise<void>;
307
307
  handleMemoryCommand(text: string): Promise<void>;
308
308
  handleSTTToggle(): Promise<void>;
309
309
  executeCompaction(customInstructionsOrOptions?: string | CompactOptions, isAuto?: boolean): Promise<CompactionOutcome>;
@@ -367,7 +367,7 @@ export interface InteractiveModeContext {
367
367
  initHooksAndCustomTools(): Promise<void>;
368
368
  emitCustomToolSessionEvent(reason: "start" | "switch" | "branch" | "tree" | "shutdown", previousSessionFile?: string): Promise<void>;
369
369
  planModeController: Pick<import("./controllers/plan-mode-controller").PlanModeController, "enabled" | "paused" | "planFilePath" | "handleCommand" | "handleApproval" | "flushPendingModelSwitch">;
370
- goalModeController: Pick<import("./controllers/goal-mode-controller").GoalModeController, "enabled" | "paused" | "handleCommand">;
370
+ goalModeController: Pick<import("./controllers/goal-mode-controller").GoalModeController, "enabled" | "paused" | "handleCommand" | "cancelContinuation" | "scheduleContinuation">;
371
371
  setHookWidget(key: string, content: ExtensionWidgetContent, options?: ExtensionWidgetOptions): void;
372
372
  setHookStatus(key: string, text: string | undefined): void;
373
373
  showHookSelector(title: string, options: string[], dialogOptions?: ExtensionUIDialogOptions): Promise<string | undefined>;
@@ -80,6 +80,8 @@ type ResourceDisposer = () => void | Promise<void>;
80
80
  export declare function registerResourceOwner(name: string, disposer: ResourceDisposer): () => void;
81
81
  /** Number of registered resource owners. Exposed for leak assertions/tests. */
82
82
  export declare function resourceOwnerCount(): number;
83
+ /** True while a process-level resource-owner sweep is in progress. */
84
+ export declare function isResourceOwnerDisposalActive(): boolean;
83
85
  /**
84
86
  * Run and clear every registered resource disposer. Attempts all disposers even
85
87
  * if some throw, then surfaces the failures as an `AggregateError` so callers
@@ -14,6 +14,7 @@ import type { MCPProtocolObservation } from "./protocol";
14
14
  import type { MCPToolDetails } from "./tool-bridge";
15
15
  import type { MCPToolCache } from "./tool-cache";
16
16
  import type { MCPGetPromptResult, MCPInputRequestHandler, MCPPrompt, MCPRequestOptions, MCPResource, MCPResourceReadResult, MCPResourceTemplate, MCPServerConfig, MCPServerConnection } from "./types";
17
+ export declare function isMCPStartupTimeoutError(error: unknown): boolean;
17
18
  export declare function resolveStartupTimeoutMs(configs: MCPServerConfig[], maxStartupTimeoutMs?: number): number;
18
19
  export declare function resolveExactConfigStartupTimeoutMs(configs: MCPServerConfig[]): number;
19
20
  /**
@@ -56,6 +57,20 @@ export interface MCPLoadResult {
56
57
  /** Extracted Exa API keys from filtered MCP servers */
57
58
  exaApiKeys: string[];
58
59
  }
60
+ export type MCPToolCatalogPublication = "unpublished" | "published" | "fenced";
61
+ /**
62
+ * Atomic view of the manager's fenced tool catalog and its publication state.
63
+ *
64
+ * `unpublished` is reserved for the initial deferred window where no manager
65
+ * catalog has been published and no exact control is fencing it. An empty
66
+ * `published` or `fenced` catalog is authoritative and must not be replaced
67
+ * with an in-flight discovery result.
68
+ */
69
+ export interface MCPToolCatalogSnapshot {
70
+ tools: CustomTool<TSchema, MCPToolDetails>[];
71
+ publication: MCPToolCatalogPublication;
72
+ generation: number;
73
+ }
59
74
  /** Options for discovering and connecting to MCP servers */
60
75
  export interface MCPDiscoverOptions {
61
76
  /** Whether to load project-level config (default: true) */
@@ -100,6 +115,30 @@ export interface MCPManagerOptions {
100
115
  /** Test seam for fencing the acquisition-to-registration replacement race. */
101
116
  afterLeaseAcquiredForTests?: (name: string, lease: MCPPoolLease) => void | Promise<void>;
102
117
  }
118
+ export type ExactMcpServerControlStatus = "suspended" | "already-suspended" | "resumed" | "not-suspended" | "reconnected" | "unavailable" | "unknown-server";
119
+ export interface ExactMcpServerControlResult {
120
+ readonly name: string;
121
+ readonly status: ExactMcpServerControlStatus;
122
+ readonly toolCount: number;
123
+ }
124
+ /**
125
+ * A staged catalog the caller can validate against before it is published.
126
+ * `commit` is the single publication point; `abort` releases anything the
127
+ * preparation opened and leaves the manager on its predecessor.
128
+ */
129
+ export interface PreparedExactMcpCatalog {
130
+ readonly tools: CustomTool<TSchema, MCPToolDetails>[];
131
+ canCommit(): boolean;
132
+ commit(): Promise<void>;
133
+ abort(): Promise<void>;
134
+ }
135
+ export interface PreparedExactMcpServerControl extends PreparedExactMcpCatalog {
136
+ readonly result: ExactMcpServerControlResult;
137
+ /** Validate a resumed replacement before an atomic multi-server publication. */
138
+ precommit?(): void;
139
+ /** Publish after every replacement in the catalog has passed precommit. */
140
+ publish?(): void;
141
+ }
103
142
  /**
104
143
  * MCP Server Manager.
105
144
  *
@@ -164,6 +203,23 @@ export declare class MCPManager {
164
203
  * Get all loaded tools.
165
204
  */
166
205
  getTools(): CustomTool<TSchema, MCPToolDetails>[];
206
+ /**
207
+ * Read the fenced catalog and publication state atomically.
208
+ *
209
+ * An empty catalog is still authoritative after publication or while an
210
+ * exact control is in flight. Deferred startup may fall back to its discovery
211
+ * result only for the explicit `unpublished` state.
212
+ */
213
+ getToolCatalogSnapshot(): MCPToolCatalogSnapshot;
214
+ isExactServerSuppressed(name: string): boolean;
215
+ /**
216
+ * Prepare one exact-config control without publishing manager state. Session
217
+ * registry and prompt validation run against `tools`; commit is the single
218
+ * publication point and abort releases only an unpublished candidate.
219
+ */
220
+ prepareExactServerControl(action: "suspend" | "resume" | "reconnect", name: string): Promise<PreparedExactMcpServerControl>;
221
+ /** Clear all session-local suppression before this owner adopts a new identity. */
222
+ prepareExactServerControlReset(): Promise<PreparedExactMcpCatalog>;
167
223
  /**
168
224
  * Get a specific connection.
169
225
  */
@@ -145,6 +145,13 @@ export interface MCPPoolLease {
145
145
  onEvent(listener: LeaseListener): () => void;
146
146
  release(): Promise<void>;
147
147
  }
148
+ export interface MCPPreparedReplacement {
149
+ readonly lease: MCPPoolLease;
150
+ canCommit(): boolean;
151
+ publish(): void;
152
+ commit(): void;
153
+ abort(): Promise<void>;
154
+ }
148
155
  declare class MCPPoolLeaseImpl implements MCPPoolLease {
149
156
  #private;
150
157
  readonly generation: number;
@@ -187,7 +194,11 @@ export declare class MCPConnectionPool {
187
194
  awaitRestart(key: string): Promise<boolean>;
188
195
  finishRestart(key: string, error?: unknown): void;
189
196
  releaseRestart(key: string): void;
197
+ private retiredCleanupId;
198
+ private getRetiredAcquisitionCleanup;
199
+ private getRetiredAcquisitionCleanupForKey;
190
200
  private retainCancelledAcquireCleanup;
201
+ private retainPreparedCleanup;
191
202
  private notifyPendingAcquireCleanup;
192
203
  /** @internal Whether this pool still owns the notified abandoned-acquire flight. */
193
204
  hasPendingAcquireCleanup(error: MCPPoolAcquireAbortError): boolean;
@@ -202,6 +213,12 @@ export declare class MCPConnectionPool {
202
213
  /** @internal Join and retry one generation of abandoned acquisition cleanup. */
203
214
  closePendingAcquireCleanup(key: string, generation: number): Promise<void>;
204
215
  acquire(name: string, config: MCPServerConfig, options?: MCPPoolAcquireOptions): Promise<MCPPoolLease>;
216
+ /**
217
+ * Prepared MCP replacements fence and retain acquisition cleanup ownership
218
+ * The caller validates its catalog first, then commits the key swap
219
+ * synchronously or aborts and closes only the candidate.
220
+ */
221
+ prepareReplacement(name: string, config: MCPServerConfig, options?: MCPPoolAcquireOptions): Promise<MCPPreparedReplacement>;
205
222
  private waitForPendingEntry;
206
223
  private scheduleZeroClaimCleanup;
207
224
  private cancelPendingEntry;
@@ -1,2 +1,22 @@
1
+ import type { AgentSession } from "../session/agent-session";
1
2
  export declare function redactMCPEndpoint(value: string | undefined): string | undefined;
2
3
  export declare function redactMCPDiagnosticValue(value: unknown): unknown;
4
+ /**
5
+ * Capability granted to a session that the root interactive entry point created
6
+ * with an explicit `--mcp-config` path. Holding it is the only way to read exact
7
+ * MCP status; it carries no manager, transport, or configuration reference.
8
+ */
9
+ export interface ExactMcpControls {
10
+ readonly grantSource: "root-interactive-exact-config";
11
+ /**
12
+ * The exact config this session was started with. Status needs it because a
13
+ * tools-only manager deletes a server from its own bookkeeping when the
14
+ * connection fails, so the manager alone can never report a server that did
15
+ * not come up — the very case an operator runs `/mcp` to see.
16
+ */
17
+ readonly configPath: string;
18
+ }
19
+ export declare function attachExactMcpControls(session: AgentSession, controls: ExactMcpControls): void;
20
+ export declare function getExactMcpControls(session: AgentSession): ExactMcpControls | undefined;
21
+ /** Revoke controls when the AgentSession object adopts a new logical identity. */
22
+ export declare function revokeExactMcpControls(session: AgentSession): void;
@@ -1,4 +1,10 @@
1
1
  import type { MCPServerConfig } from "./types";
2
2
  export type AutoloadStatus = "autoload" | "autoload-off" | "disabled";
3
+ /** Ordinary standalone sessions stop blocking on MCP startup after this wait. */
4
+ export declare const DEFAULT_MCP_STARTUP_WAIT_MS = 250;
5
+ /** Grace added to the largest declared per-server startup window. */
6
+ export declare const MCP_STARTUP_WAIT_GRACE_MS = 500;
7
+ /** Ordinary startup never blocks longer than this batch ceiling. */
8
+ export declare const MAX_MCP_STARTUP_WAIT_MS = 1750;
3
9
  /** Pure startup policy shared by runtime-facing CLI inspection and doctor. */
4
10
  export declare function computeAutoloadStatus(name: string, config: Pick<MCPServerConfig, "enabled" | "autoload">, disabledServers: ReadonlySet<string>): AutoloadStatus;
@@ -22,6 +22,13 @@ export interface MCPToolOptions {
22
22
  * owning manager/runtime. Resolved per call so late registration still applies.
23
23
  */
24
24
  inputHandler?: () => MCPInputRequestHandler | undefined;
25
+ /**
26
+ * Exact MCP session control: false while the owning manager has this server
27
+ * suspended. Checked alongside `#sessionControlInvalidated` so a wrapper that
28
+ * outlives a resume/reconnect still fails locally instead of reaching the
29
+ * transport for a server this session no longer has active.
30
+ */
31
+ isAvailable?: () => boolean;
25
32
  }
26
33
  export declare function isRetriableConnectionError(error: unknown): boolean;
27
34
  /** Details included in MCP tool results for rendering */
@@ -66,6 +73,7 @@ export declare class MCPTool implements CustomTool<TSchema, MCPToolDetails> {
66
73
  /** Server name */
67
74
  readonly mcpServerName: string;
68
75
  private connection;
76
+ invalidateForSessionControl(): void;
69
77
  /** Create MCPTool instances for all tools from an MCP server lease/connection. */
70
78
  static fromTools(target: MCPToolTarget, tools: MCPToolDefinition[], reconnect?: MCPReconnect, options?: MCPToolOptions): MCPTool[];
71
79
  constructor(target: MCPToolTarget, tool: MCPToolDefinition, reconnect?: MCPReconnect | undefined, options?: MCPToolOptions);
@@ -90,6 +98,7 @@ export declare class DeferredMCPTool implements CustomTool<TSchema, MCPToolDetai
90
98
  readonly mcpToolName: string;
91
99
  /** Server name */
92
100
  readonly mcpServerName: string;
101
+ invalidateForSessionControl(): void;
93
102
  /** Create DeferredMCPTool instances for all tools from an MCP server */
94
103
  static fromTools(serverName: string, tools: MCPToolDefinition[], getConnection: () => Promise<MCPServerConnection>, source?: SourceMeta, reconnect?: MCPReconnect, options?: MCPToolOptions): DeferredMCPTool[];
95
104
  constructor(serverName: string, tool: MCPToolDefinition, getConnection: () => Promise<MCPServerConnection>, source?: SourceMeta, reconnect?: MCPReconnect | undefined, options?: MCPToolOptions);
@@ -1,5 +1,7 @@
1
1
  import type { MCPHttpServerConfig, MCPRequestOptions, MCPSseServerConfig, MCPTransport } from "../../runtime-mcp/types";
2
2
  import { type MCPModernClientContext, type MCPProtocolEra } from "../protocol";
3
+ /** Live HTTP/SSE MCP transports awaiting postmortem release. Exposed for leak assertions/tests. */
4
+ export declare function liveHttpTransportCount(): number;
3
5
  /**
4
6
  * HTTP transport for MCP servers.
5
7
  * Uses POST for requests, supports SSE responses.
@@ -38,6 +40,15 @@ export declare class HttpTransport implements MCPTransport {
38
40
  startSSEListener(): Promise<void>;
39
41
  request<T = unknown>(method: string, params?: Record<string, unknown>, options?: MCPRequestOptions): Promise<T>;
40
42
  notify(method: string, params?: Record<string, unknown>): Promise<void>;
43
+ /**
44
+ * Terminate the server-side session on a signal or fatal exit, without the
45
+ * reader drain `close()` does: postmortem runs inside the signal handler,
46
+ * where an aborted SSE body read is never observed by JS, so awaiting the
47
+ * readers there never settles and the DELETE stays unreachable. `onClose` is
48
+ * deliberately not fired - the manager reacts to it by reconnecting, which
49
+ * would open a fresh server session on the way out.
50
+ */
51
+ releaseForPostmortem(signal: AbortSignal): Promise<void>;
41
52
  close(): Promise<void>;
42
53
  }
43
54
  /**
@@ -3,6 +3,33 @@ import type { AbortScope } from "../host/control/operations";
3
3
  import { type SessionAttachment, type SessionRouter } from "../router";
4
4
  import { ACP_SESSION_RECONNECT } from "../session-reconnect";
5
5
  import type { SessionLifecycleMcpServer } from "./mcp";
6
+ /**
7
+ * Registration rounds one provider activation may spend chasing a moving attachment.
8
+ *
9
+ * The activation loop restarts whenever the Router attachment changes identity while it
10
+ * is registering, because the leases it just took belong to a connection that no longer
11
+ * exists. One reconnect costs one restart, so a handful covers any churn that is actually
12
+ * converging; beyond that the attachment is rotating faster than registration completes
13
+ * and another round only re-takes leases that will be invalidated again. Bounding this is
14
+ * what turns "many session hosts contend for one agent dir" from an unbounded spin into a
15
+ * reported failure (issue #5658).
16
+ */
17
+ export declare const PROVIDER_ACTIVATION_MAX_ATTEMPTS = 8;
18
+ /**
19
+ * Wall-clock budget for the same loop.
20
+ *
21
+ * The attempt cap alone bounds rounds, not time: every round is a `#requestSession` round
22
+ * trip per provider, so under lease contention attempts are slow rather than fast-spinning
23
+ * and eight of them can still outlast the caller. The budget is sized to a third of
24
+ * {@link ACP_PROMPT_INACTIVITY_TIMEOUT_MS} so a prompt stalled in provider preflight fails
25
+ * with this error — which names the contended capability — with room to spare before the
26
+ * ACP prompt watchdog reports the same stall as undifferentiated silence.
27
+ *
28
+ * It gates *starting* another round, never interrupting one in flight: a single slow but
29
+ * healthy registration keeps whatever time it needs, and only a retry decided after the
30
+ * deadline is refused.
31
+ */
32
+ export declare const PROVIDER_ACTIVATION_BUDGET_MS: number;
6
33
  type JsonObject = Record<string, unknown>;
7
34
  /** The small agent-side ACP surface used for reverse requests. */
8
35
  export interface AcpReverseConnection {
@@ -16,4 +16,12 @@ export type AcpFinalTextResolution = {
16
16
  };
17
17
  export declare function boundAcpFinalText(value: string): BoundedAcpFinalText;
18
18
  export declare function acpFinalTextFromMessage(message: unknown): BoundedAcpFinalText;
19
+ /**
20
+ * Assistant-content presence is trimmed everywhere in the prompt pipeline: whitespace carries no
21
+ * assistant content. The ACP retry gate, prompt reconciliation
22
+ * (`sdk/bus/prompt-reconciliation.ts`) and terminal publication must agree, otherwise a terminal
23
+ * the retry gate treats as "no output" can still publish a whitespace chunk alongside the retry's
24
+ * real answer (review P2 on #5628).
25
+ */
26
+ export declare function hasAcpFinalTextContent(value: string): boolean;
19
27
  export declare function resolveAcpFinalText(streamed: string, finalText: string): AcpFinalTextResolution;
@@ -4,7 +4,7 @@ import { type SdkHostModelResolver } from "../host/model-pin";
4
4
  import { type DirectoryMigrationPolicy } from "../session-directory";
5
5
  import { type BrokerDiscovery, type BrokerPublicationObservation, type RedactedBrokerDiscovery } from "./discovery";
6
6
  import { type LifecycleDurableEffectsReceipt, LifecycleLedger, type LifecycleStartupFailureReceipt } from "./lifecycle-ledger";
7
- import { SessionIndex } from "./session-index";
7
+ import { type IndexedSession, SessionIndex } from "./session-index";
8
8
  import { type MasterCapabilityVerifier, type SpawnSubstrateFailure, type SpawnSubstrateProvider } from "./spawn-authority";
9
9
  export interface BrokerSettings {
10
10
  agentDir: string;
@@ -149,6 +149,9 @@ export type BrokerResponse = {
149
149
  durableEffects?: LifecycleDurableEffectsReceipt;
150
150
  startupFailure?: LifecycleStartupFailureReceipt;
151
151
  };
152
+ export type InputNormalization = {
153
+ input: Record<string, unknown>;
154
+ } | BrokerResponse;
152
155
  /** Complete five-leg child endpoint pin captured at registration. */
153
156
  export type SpawnHostRegistration = {
154
157
  sessionId: string;
@@ -201,6 +204,13 @@ export interface SpawnPromptLayer {
201
204
  pinned: SpawnHostRegistration;
202
205
  }): Promise<SpawnQ26Reconciliation>;
203
206
  }
207
+ /** Exact admission predicate for the child host row published after launch. */
208
+ export declare function spawnRegistrationMatches(candidate: IndexedSession, expected: {
209
+ childId: string;
210
+ cwd: string;
211
+ stateRoot: string;
212
+ }): boolean;
213
+ export declare function normalizeBrokerInput(operation: string, input: Record<string, unknown>): InputNormalization;
204
214
  /** Test seam for lifecycle serialization identity. */
205
215
  export declare function lifecycleTargetForTest(operation: string, input: Record<string, unknown>): unknown;
206
216
  /** Tombstone prefix used by {@link Broker.reclaimStaleLock} when a dead owner's lock is renamed aside. */
@@ -235,7 +245,8 @@ export interface BrokerLockArtifactReapResult {
235
245
  * of the lock's dev+ino, so a machine accrues one directory per dead owner and
236
246
  * nothing ever removed them (54 on the install in #3963). Reaping is
237
247
  * best-effort and fail-closed: anything live, unreadable, permission-denied, or
238
- * otherwise ambiguous is kept and the reason is logged.
248
+ * otherwise ambiguous is kept. Retained paths are logged at debug level and
249
+ * summarized in one warning per reap pass.
239
250
  */
240
251
  export declare function reapStaleBrokerLockArtifacts(input: {
241
252
  agentDir: string;
@@ -28,6 +28,51 @@ export interface EnsureBrokerSettings {
28
28
  */
29
29
  env?: NodeJS.ProcessEnv;
30
30
  }
31
+ export interface BrokerStartupLockTestHooks {
32
+ onAcquired?: () => void;
33
+ onContended?: () => void;
34
+ }
35
+ /**
36
+ * Test-only phase observation for detached broker startup regressions. The
37
+ * signal is opt-in through the child environment and never affects broker
38
+ * ownership or error handling when the test seam is absent.
39
+ */
40
+ export declare function emitBrokerStartupTestSignal(signal: string): Promise<void>;
41
+ /**
42
+ * The parent discovery budget published as a composition rather than a number.
43
+ * A test that stages a fence contention has to time itself against these legs,
44
+ * and retyping the sum makes it win or lose on scheduler noise while letting a
45
+ * change to any single leg silently re-tune it (#5604). This is the one source
46
+ * of truth for how the budget is built; nothing may restate the arithmetic.
47
+ */
48
+ export declare const BROKER_DISCOVERY_BUDGET: {
49
+ readonly staleRetirementMs: 5000;
50
+ readonly startupLockWaitMs: 9000;
51
+ readonly publicationMs: 15000;
52
+ /** What the startup fence grants its holder: retirement plus one publication attempt. */
53
+ readonly fenceOperationMs: number;
54
+ /**
55
+ * When a child spawned under the parent's spawn lock gives up on the fence,
56
+ * measured from that lock acquisition: the parent retires the stale incumbent
57
+ * first, then the child exhausts its own fence wait. Not a production
58
+ * constant -- an emergent property of the two legs that precede publication.
59
+ */
60
+ readonly childFenceWaitMs: number;
61
+ readonly discoveryMs: number;
62
+ };
63
+ /**
64
+ * Clock the discovery budget is measured on. The default is the real one; a test
65
+ * installs a virtual clock to assert the composition order -- stale retirement,
66
+ * then the child fence, then startup and publication -- in-process instead of
67
+ * racing three wall clocks against each other (#5604). Reaping keeps its own
68
+ * {@link ReapTiming} seam and is deliberately not driven from here.
69
+ */
70
+ export interface EnsureBrokerTiming {
71
+ now(): number;
72
+ sleep(ms: number): Promise<void>;
73
+ }
74
+ /** Test hook: drives the discovery budget on a controllable clock. */
75
+ export declare function setEnsureBrokerTimingForTest(timing: EnsureBrokerTiming | undefined): void;
31
76
  type SpawnLockOptions = Pick<FileLockOptions, "retries" | "retryDelayMs" | "signal">;
32
77
  declare function readBrokerDiscoveryBeforeDeadline(agentDir: string, heartbeatTtlMs: number | undefined, deadline: number): Promise<BrokerDiscovery | null>;
33
78
  /**
@@ -48,7 +93,7 @@ declare function acquireSpawnLock(agentDir: string, options?: SpawnLockOptions):
48
93
  * The parent-held spawn lock prevents ordinary stampedes; this second fence keeps
49
94
  * startup single-flight if that detached child's launcher dies and its lock is reclaimed.
50
95
  */
51
- export declare function withBrokerStartupLock<T>(agentDir: string, operation: (deadline: number) => Promise<T>): Promise<T>;
96
+ export declare function withBrokerStartupLock<T>(agentDir: string, operation: (deadline: number) => Promise<T>, testHooks?: BrokerStartupLockTestHooks): Promise<T>;
52
97
  /**
53
98
  * Tail of the detached broker's stderr folded into a discovery failure.
54
99
  *
@@ -1,4 +1,6 @@
1
1
  export declare function brokerIdentityPath(agentDir: string): string;
2
2
  export declare function getBrokerIdentityKey(agentDir: string): Promise<string>;
3
- export declare function deriveIdempotencyIdentity(agentDir: string, operation: string, callerKey: string, _protocolVersionOrLegacyTargetHash?: string): Promise<string>;
3
+ export declare function deriveIdempotencyIdentity(agentDir: string, operation: string, callerKey: string, targetHash?: string): Promise<string>;
4
+ /** Identity format used by lifecycle rows written before target binding. */
5
+ export declare function deriveLegacyIdentity(agentDir: string, operation: string, callerKey: string): Promise<string>;
4
6
  export declare function deriveLegacyTargetIdentity(agentDir: string, operation: string, callerKey: string, canonicalTargetHash: string): Promise<string>;
@@ -95,6 +95,23 @@ export type BeginResult = {
95
95
  kind: "in_progress";
96
96
  entry: LifecycleLedgerEntry;
97
97
  };
98
+ type BoundedSourceReadRejection = "not-regular-file" | "oversized-by-stat" | "oversized-by-read" | "read-error";
99
+ /**
100
+ * Why a terminal read-back produced no entry. `absent` means nothing terminal is
101
+ * recorded for the request; `rejected` means the source or a row was refused, which
102
+ * is evidence of a damaged ledger rather than of an unpersisted operation. Collapsing
103
+ * the two lets a corrupt source or row read as "not yet written" and unfence the session.
104
+ */
105
+ export type TerminalReadBackRejection = "bounds" | "shape" | "undecodable" | "row-not-attributable" | "partial-row" | BoundedSourceReadRejection;
106
+ export type TerminalReadBack = {
107
+ kind: "terminal";
108
+ entry: LifecycleLedgerEntry;
109
+ } | {
110
+ kind: "absent";
111
+ } | {
112
+ kind: "rejected";
113
+ reason: TerminalReadBackRejection;
114
+ };
98
115
  export interface LifecycleLedgerLimits {
99
116
  maxBytes?: number;
100
117
  maxLineBytes?: number;
@@ -121,14 +138,15 @@ export declare class LifecycleLedger {
121
138
  * uncertainly persists that conclusion, and refusing to read it back would report a
122
139
  * synced row as unpersisted and replace its true reason with a generic one.
123
140
  */
124
- readTerminal(identity: string, requestHash: string): Promise<LifecycleLedgerEntry | undefined>;
125
- findByOperationKey(operationKey: string): LifecycleLedgerEntry | undefined;
141
+ readTerminal(identity: string, requestHash: string): Promise<TerminalReadBack>;
142
+ findByOperationKey(operationKey: string, fingerprint?: string): LifecycleLedgerEntry | undefined;
143
+ findAnyByOperationKey(operationKey: string): LifecycleLedgerEntry | undefined;
126
144
  /**
127
145
  * Legacy target-inclusive rows predate the operation/key index. Their opaque
128
146
  * identities cannot establish that a different target is safe, so callers
129
147
  * must reject rather than create a second admission.
130
148
  */
131
- hasLegacyIdentity(): boolean;
149
+ hasLegacyIdentity(excludedIdentities?: ReadonlySet<string>): boolean;
132
150
  migrateIdentity(from: string, to: string, metadata: {
133
151
  operationKey: string;
134
152
  fingerprint: string;
@@ -137,6 +155,7 @@ export declare class LifecycleLedger {
137
155
  begin(identity: string, requestHash: string, metadata?: {
138
156
  operationKey?: string;
139
157
  fingerprint?: string;
158
+ intendedSessionId?: string;
140
159
  }): Promise<BeginResult>;
141
160
  transition(identity: string, state: LifecycleState, fields?: Omit<Partial<LifecycleLedgerEntry>, "identity" | "requestHash" | "state" | "ts">): Promise<LifecycleLedgerEntry>;
142
161
  assertSupportedStateVersions(): Promise<void>;
@@ -152,3 +171,4 @@ export declare class LifecycleLedger {
152
171
  listUncertainCreatesBySessionId(sessionId: string, effectMarker?: string, remoteCreateKey?: string): LifecycleLedgerEntry[];
153
172
  findPendingCleanupByTarget(sessionId: string, cwd: string, transcriptPath: string): LifecycleLedgerEntry | undefined;
154
173
  }
174
+ export {};
@@ -1,5 +1,6 @@
1
1
  import { type ChildProcess } from "node:child_process";
2
2
  import { type GjcLaunchWorktreePlan } from "../../gjc-runtime/launch-worktree";
3
+ import type { SessionWorkLease } from "../../session/session-work-lease";
3
4
  import type { SessionLifecycleMcpServer } from "../acp/mcp";
4
5
  import { type SdkStartupFailure, type SdkStartupRollbackResult } from "../startup-capability";
5
6
  import type { Broker, BrokerCleanupEvidence, BrokerResponse } from "./broker";
@@ -8,8 +9,11 @@ import { type ProcessIncarnationCommandRunner, type ProcessIncarnationOptions, p
8
9
  import { type SdkInternalSpawnCommand } from "./runtime";
9
10
  import { type IndexedSession } from "./session-index";
10
11
  export { type ProcessIncarnationCommandRunner, type ProcessIncarnationOptions, parseDarwinProcessIncarnation, processIncarnation, };
12
+ /** Remove lifecycle stderr artifacts abandoned by a broker or detached host crash. */
13
+ export declare function reapOrphanedChildStderrLogs(agentDir: string, limit?: number): Promise<number>;
14
+ export declare function lifecycleFailureMessage(message: string, child?: ChildProcess): string;
11
15
  export declare function terminalUncertainStartupMessage(response: BrokerResponse): string;
12
- export declare function waitForChildSpawn(spawned: Pick<ChildProcess, "off" | "on" | "once">, onPostSpawnError?: (error: Error) => void): Promise<void>;
16
+ export declare function waitForChildSpawn(spawned: Pick<ChildProcess, "off" | "on" | "once" | "pid">, onPostSpawnError?: (error: Error) => void): Promise<void>;
13
17
  export interface LifecycleDeadlines {
14
18
  receivedAt: number;
15
19
  requestedReadinessTimeoutMs: number;
@@ -245,8 +249,9 @@ export interface LifecycleExecutionOutcome {
245
249
  /** Returns the response together with every durable lifecycle fact needed for truthful replay. */
246
250
  export declare function executeLifecycle(broker: Broker, operation: string, input: Input, identity: string, cleanup?: CleanupEvidence): Promise<LifecycleExecutionOutcome>;
247
251
  /**
248
- * The live client/socket subscription count of the SDK session endpoint this
249
- * process serves, or `undefined` while this process serves no endpoint.
252
+ * The live SDK demand count of the session endpoint this process serves, or
253
+ * `undefined` while this process serves no endpoint. Observer-only sockets are
254
+ * excluded by {@link SessionHostRuntimeEvidence.observerClients}.
250
255
  *
251
256
  * Only the SDK session runtime owns the real socket table, so it publishes a
252
257
  * reader here instead of every consumer re-deriving attachment from the OS.
@@ -257,8 +262,10 @@ export type SessionHostAttachmentReader = () => number;
257
262
  export interface SessionHostRuntimeEvidence {
258
263
  /** This runtime's own live SDK client/socket subscription count. */
259
264
  attachedClients: SessionHostAttachmentReader;
260
- /** Whether this runtime currently has agent work in flight. */
261
- workInFlight: () => boolean;
265
+ /** Optional subset of attached sockets that only observes the host. */
266
+ observerClients?: SessionHostAttachmentReader;
267
+ /** One authoritative lease held by every admitted or continuing work state. */
268
+ workLease: SessionWorkLease;
262
269
  }
263
270
  /** One runtime's live publication, retractable only by its owner. */
264
271
  export interface SessionHostRuntimePublication {
@@ -275,19 +282,19 @@ export interface SessionHostRuntimePublication {
275
282
  */
276
283
  export declare function publishSessionHostRuntimeEvidence(evidence: SessionHostRuntimeEvidence): SessionHostRuntimePublication;
277
284
  /**
278
- * This process's currently attached SDK client count, summed across every
285
+ * This process's currently demanding SDK client count, summed across every
279
286
  * serving runtime, or `undefined` when no runtime publishes a readable count
280
287
  * (before startup, after teardown, or when every reader itself fails). Never
281
288
  * guesses: absence of a reader is absence of evidence.
282
289
  */
283
290
  export declare function sessionHostAttachedClients(): number | undefined;
284
291
  /**
285
- * Whether any runtime in this process has agent work in flight right now.
292
+ * Whether any runtime in this process still holds its authoritative work lease.
286
293
  *
287
294
  * Positive evidence only: a runtime that publishes nothing, or whose reader
288
295
  * fails, reports no work, so this can never keep an abandoned host alive.
289
296
  */
290
- export declare function sessionHostWorkInFlight(): boolean;
297
+ export declare function sessionHostWorkLeaseActive(): boolean;
291
298
  /**
292
299
  * How often a live broker re-checks its own session registrations against OS
293
300
  * process liveness.
@@ -1,4 +1,4 @@
1
- export type SdkInternalAction = "broker-internal" | "session-host-internal";
1
+ export type SdkInternalAction = "broker-internal" | "session-host-internal" | "stderr-drain-internal";
2
2
  export type SdkInternalSpawnCommand = {
3
3
  kind: "bun-source";
4
4
  file: string;