@gajae-code/coding-agent 0.17.2 → 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 (349) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/dist/types/cli/daemon-cli.d.ts +3 -1
  3. package/dist/types/cli/github-release.d.ts +17 -0
  4. package/dist/types/cli/public-command-entry.d.ts +56 -0
  5. package/dist/types/cli/public-command-errors.d.ts +126 -0
  6. package/dist/types/cli/public-command-evidence.d.ts +99 -0
  7. package/dist/types/cli/public-command-help.d.ts +65 -0
  8. package/dist/types/cli/public-command-registry.d.ts +69 -0
  9. package/dist/types/cli/session-picker.d.ts +1 -1
  10. package/dist/types/cli/setup-cli.d.ts +1 -0
  11. package/dist/types/cli/skills-cli.d.ts +5 -0
  12. package/dist/types/cli.d.ts +3 -0
  13. package/dist/types/commands/daemon.d.ts +4 -50
  14. package/dist/types/commands/sdk.d.ts +20 -37
  15. package/dist/types/commands/setup.d.ts +3 -0
  16. package/dist/types/commands/skills.d.ts +9 -0
  17. package/dist/types/config/autorouting-tier-map.d.ts +18 -0
  18. package/dist/types/config/file-lock.d.ts +9 -1
  19. package/dist/types/config/model-profile-activation.d.ts +45 -1
  20. package/dist/types/config/model-registry.d.ts +11 -2
  21. package/dist/types/config/settings-schema.d.ts +11 -0
  22. package/dist/types/coordinator-mcp/question-state.d.ts +6 -1
  23. package/dist/types/daemon/operator-contract.d.ts +5 -1
  24. package/dist/types/eval/js/worker-protocol.d.ts +2 -0
  25. package/dist/types/extensibility/extensions/types.d.ts +12 -0
  26. package/dist/types/extensibility/gjc-plugins/registry.d.ts +4 -0
  27. package/dist/types/extensibility/runtime-skill-discovery.d.ts +18 -0
  28. package/dist/types/extensibility/shared-events.d.ts +3 -1
  29. package/dist/types/gjc-runtime/session-state-lock.d.ts +61 -0
  30. package/dist/types/internal-urls/embedded-protocol.d.ts +9 -0
  31. package/dist/types/internal-urls/index.d.ts +1 -0
  32. package/dist/types/internal-urls/parse.d.ts +9 -1
  33. package/dist/types/main.d.ts +22 -0
  34. package/dist/types/modes/acp/acp-agent.d.ts +55 -1
  35. package/dist/types/modes/acp/startup-provenance.d.ts +16 -0
  36. package/dist/types/modes/components/custom-provider-wizard.d.ts +19 -1
  37. package/dist/types/modes/components/session-selector.d.ts +5 -2
  38. package/dist/types/modes/components/user-message-selector.d.ts +5 -2
  39. package/dist/types/modes/controllers/command-controller.d.ts +1 -1
  40. package/dist/types/modes/controllers/selector-controller.d.ts +1 -1
  41. package/dist/types/modes/interactive-mode.d.ts +1 -1
  42. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +11 -1
  43. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +14 -1
  44. package/dist/types/modes/types.d.ts +2 -2
  45. package/dist/types/runtime/process-lifecycle.d.ts +2 -0
  46. package/dist/types/runtime-mcp/manager.d.ts +56 -0
  47. package/dist/types/runtime-mcp/pool.d.ts +17 -0
  48. package/dist/types/runtime-mcp/redaction.d.ts +20 -0
  49. package/dist/types/runtime-mcp/startup-policy.d.ts +6 -0
  50. package/dist/types/runtime-mcp/tool-bridge.d.ts +9 -0
  51. package/dist/types/runtime-mcp/transports/http.d.ts +11 -0
  52. package/dist/types/sdk/broker/broker.d.ts +13 -2
  53. package/dist/types/sdk/broker/identity.d.ts +3 -1
  54. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +23 -3
  55. package/dist/types/sdk/broker/lifecycle.d.ts +15 -8
  56. package/dist/types/sdk/broker/runtime.d.ts +1 -1
  57. package/dist/types/sdk/broker/session-index.d.ts +22 -3
  58. package/dist/types/sdk/broker/spawn-authority.d.ts +4 -0
  59. package/dist/types/sdk/broker/stderr-drainer.d.ts +13 -0
  60. package/dist/types/sdk/bus/index.d.ts +19 -0
  61. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +3 -1
  62. package/dist/types/sdk/bus/telegram-daemon.d.ts +5 -0
  63. package/dist/types/sdk/cli/master-cli.d.ts +6 -10
  64. package/dist/types/sdk/cli/rows.d.ts +19 -1
  65. package/dist/types/sdk/cli/session-cli.d.ts +22 -5
  66. package/dist/types/sdk/client/client.d.ts +2 -0
  67. package/dist/types/sdk/guides/cli.d.ts +3 -4
  68. package/dist/types/sdk/guides/verify.d.ts +2 -0
  69. package/dist/types/sdk/host/host.d.ts +9 -0
  70. package/dist/types/sdk/host/session-runtime.d.ts +31 -0
  71. package/dist/types/sdk/host/types.d.ts +10 -0
  72. package/dist/types/sdk/index.d.ts +1 -0
  73. package/dist/types/sdk/prompt-deadline-flush.d.ts +83 -0
  74. package/dist/types/sdk/prompt-deadline-manager.d.ts +37 -0
  75. package/dist/types/sdk/prompt-tool-boundary.d.ts +73 -0
  76. package/dist/types/sdk/router/session-router.d.ts +2 -0
  77. package/dist/types/sdk/startup-capability.d.ts +2 -0
  78. package/dist/types/sdk/transport/relay.d.ts +1 -0
  79. package/dist/types/sdk/transport/serve-cli.d.ts +48 -4
  80. package/dist/types/sdk/transport/stdio.d.ts +5 -1
  81. package/dist/types/session/agent-session.d.ts +168 -21
  82. package/dist/types/session/fallback-chain-controller.d.ts +6 -6
  83. package/dist/types/session/fold-coordinator.d.ts +17 -3
  84. package/dist/types/session/internal/managed-session-storage.d.ts +7 -1
  85. package/dist/types/session/session-manager.d.ts +64 -1
  86. package/dist/types/session/session-work-lease.d.ts +14 -0
  87. package/dist/types/setup/model-onboarding-guidance.d.ts +1 -1
  88. package/dist/types/setup/provider-onboarding.d.ts +81 -1
  89. package/dist/types/tools/bash.d.ts +37 -11
  90. package/dist/types/tools/job.d.ts +1 -1
  91. package/dist/types/tools/steer-fold.d.ts +31 -0
  92. package/dist/types/utils/git.d.ts +28 -2
  93. package/dist/types/utils/mupdf-embedded.d.ts +2 -0
  94. package/dist/types/utils/mupdf.d.ts +4 -0
  95. package/dist/types/utils/session-title-generation.d.ts +6 -0
  96. package/dist/types/utils/title-generator.d.ts +11 -2
  97. package/dist/types/web/scrapers/types.d.ts +3 -0
  98. package/package.json +18 -10
  99. package/scripts/build-binary.ts +9 -3
  100. package/scripts/compile-args.ts +0 -9
  101. package/scripts/embed-mupdf.ts +52 -0
  102. package/scripts/generate-sdk-operation-inventory.ts +31 -1
  103. package/scripts/vendor-markit.ts +196 -0
  104. package/src/async/job-manager.ts +22 -1
  105. package/src/cli/daemon-cli.ts +53 -18
  106. package/src/cli/github-release.ts +87 -5
  107. package/src/cli/mcp-cli.ts +38 -4
  108. package/src/cli/public-command-entry.ts +450 -0
  109. package/src/cli/public-command-errors.ts +581 -0
  110. package/src/cli/public-command-evidence.ts +717 -0
  111. package/src/cli/public-command-help.ts +360 -0
  112. package/src/cli/public-command-registry.ts +535 -0
  113. package/src/cli/session-picker.ts +2 -1
  114. package/src/cli/setup-cli.ts +9 -1
  115. package/src/cli/skills-cli.ts +46 -2
  116. package/src/cli.ts +61 -1
  117. package/src/commands/daemon.ts +65 -69
  118. package/src/commands/sdk.ts +175 -117
  119. package/src/commands/setup.ts +2 -0
  120. package/src/commands/skills.ts +11 -0
  121. package/src/config/autorouting-tier-map.ts +14 -0
  122. package/src/config/file-lock.ts +147 -51
  123. package/src/config/model-profile-activation.ts +334 -43
  124. package/src/config/model-registry.ts +183 -25
  125. package/src/config/settings-schema.ts +26 -2
  126. package/src/coordinator-mcp/policy.ts +10 -5
  127. package/src/coordinator-mcp/question-gate-codec.ts +17 -0
  128. package/src/coordinator-mcp/question-state.ts +175 -8
  129. package/src/coordinator-mcp/server.ts +507 -81
  130. package/src/coordinator-mcp/session-reaper.ts +6 -4
  131. package/src/crash/record-loader.ts +6 -2
  132. package/src/daemon/operator-contract.ts +26 -12
  133. package/src/defaults/gjc/skills/ultragoal/SKILL.md +1 -1
  134. package/src/eval/js/context-manager.ts +8 -8
  135. package/src/eval/js/worker-core.ts +9 -4
  136. package/src/eval/js/worker-protocol.ts +2 -0
  137. package/src/extensibility/extensions/runner.ts +52 -4
  138. package/src/extensibility/extensions/types.ts +10 -0
  139. package/src/extensibility/gjc-plugins/registry.ts +196 -37
  140. package/src/extensibility/runtime-skill-discovery.ts +61 -3
  141. package/src/extensibility/shared-events.ts +3 -1
  142. package/src/gjc-runtime/session-state-lock.ts +165 -24
  143. package/src/gjc-runtime/ultragoal-succession.ts +31 -3
  144. package/src/internal-urls/docs-index.generated.ts +20 -19
  145. package/src/internal-urls/embedded-protocol.ts +83 -0
  146. package/src/internal-urls/index.ts +1 -0
  147. package/src/internal-urls/parse.ts +21 -1
  148. package/src/internal-urls/router.ts +4 -2
  149. package/src/main.ts +123 -55
  150. package/src/modes/acp/acp-agent.ts +408 -35
  151. package/src/modes/acp/startup-provenance.ts +59 -0
  152. package/src/modes/components/custom-provider-wizard.ts +308 -7
  153. package/src/modes/components/oauth-selector.ts +9 -0
  154. package/src/modes/components/session-selector.ts +47 -4
  155. package/src/modes/components/user-message-selector.ts +57 -15
  156. package/src/modes/controllers/command-controller.ts +58 -32
  157. package/src/modes/controllers/extension-ui-controller.ts +33 -7
  158. package/src/modes/controllers/input-controller.ts +4 -0
  159. package/src/modes/controllers/selector-controller.ts +161 -15
  160. package/src/modes/interactive-mode.ts +21 -7
  161. package/src/modes/runtime-init.ts +1 -0
  162. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +124 -7
  163. package/src/modes/shared/agent-wire/workflow-gate-types.ts +16 -2
  164. package/src/modes/types.ts +2 -2
  165. package/src/prompts/agent-fragments/browser-aside.md +1 -0
  166. package/src/prompts/system/title-system.md +1 -1
  167. package/src/prompts/tools/bash.md +1 -1
  168. package/src/prompts/tools/job.md +1 -1
  169. package/src/prompts/tools/read.md +2 -0
  170. package/src/runtime/network-prewarm-service.test.ts +36 -1
  171. package/src/runtime/network-prewarm-service.ts +28 -3
  172. package/src/runtime/process-lifecycle.ts +22 -11
  173. package/src/runtime-mcp/config.ts +16 -1
  174. package/src/runtime-mcp/manager.ts +689 -55
  175. package/src/runtime-mcp/pool.test.ts +31 -0
  176. package/src/runtime-mcp/pool.ts +304 -28
  177. package/src/runtime-mcp/redaction.ts +42 -0
  178. package/src/runtime-mcp/startup-policy.ts +7 -0
  179. package/src/runtime-mcp/tool-bridge.ts +71 -0
  180. package/src/runtime-mcp/transports/http.ts +108 -25
  181. package/src/sdk/acp/adapter.ts +27 -8
  182. package/src/sdk/broker/broker.ts +378 -52
  183. package/src/sdk/broker/identity.ts +9 -1
  184. package/src/sdk/broker/lifecycle-ledger.ts +95 -31
  185. package/src/sdk/broker/lifecycle.ts +690 -141
  186. package/src/sdk/broker/runtime.ts +1 -1
  187. package/src/sdk/broker/session-index.ts +97 -4
  188. package/src/sdk/broker/spawn-authority.ts +35 -7
  189. package/src/sdk/broker/stderr-drainer.ts +59 -0
  190. package/src/sdk/bus/chat-daemon-control.ts +2 -2
  191. package/src/sdk/bus/chat-daemon-runtime.ts +1 -0
  192. package/src/sdk/bus/index.ts +690 -80
  193. package/src/sdk/bus/telegram-daemon-cli.ts +31 -2
  194. package/src/sdk/bus/telegram-daemon-contract.ts +3 -1
  195. package/src/sdk/bus/telegram-daemon.ts +10 -3
  196. package/src/sdk/cli/master-cli.ts +47 -36
  197. package/src/sdk/cli/rows.ts +30 -7
  198. package/src/sdk/cli/session-cli.ts +687 -184
  199. package/src/sdk/client/client.ts +18 -0
  200. package/src/sdk/guides/catalog.ts +2 -2
  201. package/src/sdk/guides/cli.ts +20 -62
  202. package/src/sdk/guides/verify.ts +14 -0
  203. package/src/sdk/host/host.ts +49 -5
  204. package/src/sdk/host/session-runtime.test.ts +138 -2
  205. package/src/sdk/host/session-runtime.ts +311 -97
  206. package/src/sdk/host/types.ts +12 -1
  207. package/src/sdk/host/websocket-transport.lifecycle.test.ts +84 -0
  208. package/src/sdk/host/websocket-transport.ts +40 -6
  209. package/src/sdk/index.ts +11 -0
  210. package/src/sdk/prompt-deadline-flush.ts +334 -0
  211. package/src/sdk/prompt-deadline-manager.ts +133 -1
  212. package/src/sdk/prompt-tool-boundary.ts +121 -0
  213. package/src/sdk/protocol/operation-inventory.generated.json +106 -0
  214. package/src/sdk/router/session-router.ts +9 -1
  215. package/src/sdk/session.ts +182 -7
  216. package/src/sdk/startup-capability.ts +1 -1
  217. package/src/sdk/transport/relay.ts +71 -6
  218. package/src/sdk/transport/serve-cli.ts +397 -42
  219. package/src/sdk/transport/socket.ts +12 -11
  220. package/src/sdk/transport/stdio.ts +7 -3
  221. package/src/session/agent-session.ts +2437 -400
  222. package/src/session/fallback-chain-controller.ts +6 -7
  223. package/src/session/fold-coordinator.ts +24 -5
  224. package/src/session/internal/managed-session-scope.ts +58 -18
  225. package/src/session/internal/managed-session-storage.ts +304 -11
  226. package/src/session/session-manager.ts +382 -44
  227. package/src/session/session-work-lease.ts +34 -0
  228. package/src/setup/model-onboarding-guidance.ts +1 -1
  229. package/src/setup/provider-onboarding.ts +397 -24
  230. package/src/slash-commands/builtin-registry.ts +258 -14
  231. package/src/task/index.ts +14 -2
  232. package/src/tools/bash.ts +98 -78
  233. package/src/tools/fetch.ts +119 -20
  234. package/src/tools/job.ts +151 -25
  235. package/src/tools/output-meta.ts +15 -2
  236. package/src/tools/path-utils.ts +27 -3
  237. package/src/tools/read.ts +3 -3
  238. package/src/tools/steer-fold.ts +107 -0
  239. package/src/tools/tool-catalog.generated.ts +29 -2
  240. package/src/tools/tool-errors.ts +4 -0
  241. package/src/utils/git.ts +53 -3
  242. package/src/utils/markit.ts +55 -41
  243. package/src/utils/mupdf-assets.d.ts +4 -0
  244. package/src/utils/mupdf-embedded.ts +4 -0
  245. package/src/utils/mupdf.ts +129 -0
  246. package/src/utils/session-title-generation.ts +29 -0
  247. package/src/utils/title-generator.ts +46 -2
  248. package/src/web/scrapers/types.ts +24 -3
  249. package/vendor/markit-ai/LICENSE +21 -0
  250. package/vendor/markit-ai/MANIFEST.json +412 -0
  251. package/vendor/markit-ai/dist/commands/config.d.ts +4 -0
  252. package/vendor/markit-ai/dist/commands/config.js +139 -0
  253. package/vendor/markit-ai/dist/commands/convert.d.ts +6 -0
  254. package/vendor/markit-ai/dist/commands/convert.js +113 -0
  255. package/vendor/markit-ai/dist/commands/formats.d.ts +2 -0
  256. package/vendor/markit-ai/dist/commands/formats.js +92 -0
  257. package/vendor/markit-ai/dist/commands/init.d.ts +2 -0
  258. package/vendor/markit-ai/dist/commands/init.js +29 -0
  259. package/vendor/markit-ai/dist/commands/onboard.d.ts +2 -0
  260. package/vendor/markit-ai/dist/commands/onboard.js +61 -0
  261. package/vendor/markit-ai/dist/commands/plugin.d.ts +4 -0
  262. package/vendor/markit-ai/dist/commands/plugin.js +58 -0
  263. package/vendor/markit-ai/dist/config.d.ts +26 -0
  264. package/vendor/markit-ai/dist/config.js +42 -0
  265. package/vendor/markit-ai/dist/converters/audio.d.ts +7 -0
  266. package/vendor/markit-ai/dist/converters/audio.js +104 -0
  267. package/vendor/markit-ai/dist/converters/csv.d.ts +7 -0
  268. package/vendor/markit-ai/dist/converters/csv.js +83 -0
  269. package/vendor/markit-ai/dist/converters/docx.d.ts +6 -0
  270. package/vendor/markit-ai/dist/converters/docx.js +57 -0
  271. package/vendor/markit-ai/dist/converters/epub.d.ts +8 -0
  272. package/vendor/markit-ai/dist/converters/epub.js +128 -0
  273. package/vendor/markit-ai/dist/converters/github.d.ts +18 -0
  274. package/vendor/markit-ai/dist/converters/github.js +148 -0
  275. package/vendor/markit-ai/dist/converters/html.d.ts +6 -0
  276. package/vendor/markit-ai/dist/converters/html.js +30 -0
  277. package/vendor/markit-ai/dist/converters/image.d.ts +6 -0
  278. package/vendor/markit-ai/dist/converters/image.js +124 -0
  279. package/vendor/markit-ai/dist/converters/ipynb.d.ts +6 -0
  280. package/vendor/markit-ai/dist/converters/ipynb.js +75 -0
  281. package/vendor/markit-ai/dist/converters/iwork.d.ts +20 -0
  282. package/vendor/markit-ai/dist/converters/iwork.js +391 -0
  283. package/vendor/markit-ai/dist/converters/json.d.ts +6 -0
  284. package/vendor/markit-ai/dist/converters/json.js +21 -0
  285. package/vendor/markit-ai/dist/converters/pdf/columns.d.ts +35 -0
  286. package/vendor/markit-ai/dist/converters/pdf/columns.js +93 -0
  287. package/vendor/markit-ai/dist/converters/pdf/extract.d.ts +19 -0
  288. package/vendor/markit-ai/dist/converters/pdf/extract.js +514 -0
  289. package/vendor/markit-ai/dist/converters/pdf/grid.d.ts +25 -0
  290. package/vendor/markit-ai/dist/converters/pdf/grid.js +795 -0
  291. package/vendor/markit-ai/dist/converters/pdf/headers.d.ts +24 -0
  292. package/vendor/markit-ai/dist/converters/pdf/headers.js +108 -0
  293. package/vendor/markit-ai/dist/converters/pdf/index.d.ts +19 -0
  294. package/vendor/markit-ai/dist/converters/pdf/index.js +136 -0
  295. package/vendor/markit-ai/dist/converters/pdf/mupdf-loader.js +9 -0
  296. package/vendor/markit-ai/dist/converters/pdf/render.d.ts +24 -0
  297. package/vendor/markit-ai/dist/converters/pdf/render.js +513 -0
  298. package/vendor/markit-ai/dist/converters/pdf/types.d.ts +75 -0
  299. package/vendor/markit-ai/dist/converters/pdf/types.js +1 -0
  300. package/vendor/markit-ai/dist/converters/plain-text.d.ts +6 -0
  301. package/vendor/markit-ai/dist/converters/plain-text.js +87 -0
  302. package/vendor/markit-ai/dist/converters/pptx.d.ts +8 -0
  303. package/vendor/markit-ai/dist/converters/pptx.js +289 -0
  304. package/vendor/markit-ai/dist/converters/rss.d.ts +11 -0
  305. package/vendor/markit-ai/dist/converters/rss.js +138 -0
  306. package/vendor/markit-ai/dist/converters/wikipedia.d.ts +6 -0
  307. package/vendor/markit-ai/dist/converters/wikipedia.js +33 -0
  308. package/vendor/markit-ai/dist/converters/xlsx.d.ts +8 -0
  309. package/vendor/markit-ai/dist/converters/xlsx.js +147 -0
  310. package/vendor/markit-ai/dist/converters/xml.d.ts +6 -0
  311. package/vendor/markit-ai/dist/converters/xml.js +18 -0
  312. package/vendor/markit-ai/dist/converters/yaml.d.ts +6 -0
  313. package/vendor/markit-ai/dist/converters/yaml.js +17 -0
  314. package/vendor/markit-ai/dist/converters/zip.d.ts +8 -0
  315. package/vendor/markit-ai/dist/converters/zip.js +57 -0
  316. package/vendor/markit-ai/dist/index.d.ts +30 -0
  317. package/vendor/markit-ai/dist/index.js +26 -0
  318. package/vendor/markit-ai/dist/main.d.ts +2 -0
  319. package/vendor/markit-ai/dist/main.js +191 -0
  320. package/vendor/markit-ai/dist/markit.d.ts +45 -0
  321. package/vendor/markit-ai/dist/markit.js +267 -0
  322. package/vendor/markit-ai/dist/plugins/api.d.ts +7 -0
  323. package/vendor/markit-ai/dist/plugins/api.js +42 -0
  324. package/vendor/markit-ai/dist/plugins/index.d.ts +4 -0
  325. package/vendor/markit-ai/dist/plugins/index.js +3 -0
  326. package/vendor/markit-ai/dist/plugins/installer.d.ts +25 -0
  327. package/vendor/markit-ai/dist/plugins/installer.js +176 -0
  328. package/vendor/markit-ai/dist/plugins/loader.d.ts +6 -0
  329. package/vendor/markit-ai/dist/plugins/loader.js +61 -0
  330. package/vendor/markit-ai/dist/plugins/types.d.ts +25 -0
  331. package/vendor/markit-ai/dist/plugins/types.js +1 -0
  332. package/vendor/markit-ai/dist/providers/anthropic.d.ts +2 -0
  333. package/vendor/markit-ai/dist/providers/anthropic.js +47 -0
  334. package/vendor/markit-ai/dist/providers/index.d.ts +21 -0
  335. package/vendor/markit-ai/dist/providers/index.js +56 -0
  336. package/vendor/markit-ai/dist/providers/openai.d.ts +2 -0
  337. package/vendor/markit-ai/dist/providers/openai.js +76 -0
  338. package/vendor/markit-ai/dist/providers/types.d.ts +26 -0
  339. package/vendor/markit-ai/dist/providers/types.js +1 -0
  340. package/vendor/markit-ai/dist/types.d.ts +36 -0
  341. package/vendor/markit-ai/dist/types.js +1 -0
  342. package/vendor/markit-ai/dist/utils/exit-codes.d.ts +4 -0
  343. package/vendor/markit-ai/dist/utils/exit-codes.js +4 -0
  344. package/vendor/markit-ai/dist/utils/output.d.ts +22 -0
  345. package/vendor/markit-ai/dist/utils/output.js +31 -0
  346. package/vendor/markit-ai/dist/utils/turndown.d.ts +8 -0
  347. package/vendor/markit-ai/dist/utils/turndown.js +70 -0
  348. package/vendor/markit-ai/package.json +74 -0
  349. package/vendor/markit-ai.patch +49 -0
@@ -6,7 +6,7 @@ import { currentExecutablePath } from "@gajae-code/natives";
6
6
 
7
7
  import internalSourceMarker from "./internal-source-marker-2178.txt" with { type: "file" };
8
8
 
9
- export type SdkInternalAction = "broker-internal" | "session-host-internal";
9
+ export type SdkInternalAction = "broker-internal" | "session-host-internal" | "stderr-drain-internal";
10
10
 
11
11
  export type SdkInternalSpawnCommand =
12
12
  | {
@@ -5,6 +5,7 @@ import { logger, resolveEquivalentPath } from "@gajae-code/utils";
5
5
  import { nativeProcessBindings } from "@gajae-code/utils/native-process";
6
6
  import { withFileLock } from "../../config/file-lock";
7
7
  import { repo } from "../../utils/git";
8
+ import { endpointIncarnation } from "./endpoint-authority";
8
9
  import { processIncarnation } from "./process-incarnation";
9
10
  import {
10
11
  assertSupportedSessionIndexEventVersion,
@@ -26,7 +27,7 @@ export type SessionIndexEventType =
26
27
  | "record_reconciled";
27
28
 
28
29
  export type SessionActivityState = "active" | "idle";
29
- /** Coalesced broker-owned heartbeat checkpoint (C2): state plus the observation time. */
30
+ /** Host-reported or broker-coalesced heartbeat: state plus the observation time. */
30
31
  export interface SessionActivity {
31
32
  state: SessionActivityState;
32
33
  at: number;
@@ -34,6 +35,8 @@ export interface SessionActivity {
34
35
  /** Events persisted without an OS process incarnation (v1/v2 era) are legacy provenance. */
35
36
  export type SessionIdentityProvenance = "composite" | "legacy";
36
37
  export type SessionTombstoneRule = "retain" | "expire";
38
+ /** Durable provenance for a retired host registration. */
39
+ export type HostUnregisteredReason = "process_exited" | "detached_idle";
37
40
  /**
38
41
  * Injected retention policy (C3). The broker schedules compaction independently of
39
42
  * rotation; settings apply at the next scheduled compaction. `clock` drives both
@@ -141,6 +144,7 @@ export interface SessionIndexEvent {
141
144
  /** Immutable endpoint file identity captured by the broker at registration. */
142
145
  endpointFileId?: string;
143
146
  lifecycleRequestId?: string;
147
+ hostUnregisteredReason?: HostUnregisteredReason;
144
148
  terminalUncertain?: boolean;
145
149
  /**
146
150
  * Distinguishes the terminal-uncertain claim written by a forced stop of a
@@ -170,6 +174,7 @@ export interface IndexedSession {
170
174
  live: boolean;
171
175
  indexSeq: number;
172
176
  lifecycleRequestId?: string;
177
+ hostUnregisteredReason?: HostUnregisteredReason;
173
178
  terminalUncertain?: boolean;
174
179
  /** True only for a terminal-uncertain claim written by a forced stale-worktree release. */
175
180
  forcedStaleRelease?: boolean;
@@ -345,6 +350,8 @@ function sameIndexChangeStamp(a: SessionIndexChangeStamp, b: SessionIndexChangeS
345
350
  const ROTATE_BYTES = 4 * 1024 * 1024;
346
351
  /** Coalesced heartbeat checkpoint rate cap (C2): at most one per session per minute. */
347
352
  export const SESSION_HEARTBEAT_INTERVAL_MS = 60_000;
353
+ /** A stale-host retirement requires silence well beyond the broker freshness window. */
354
+ export const DEAD_HOST_HEARTBEAT_SILENCE_MS = 10 * SESSION_HEARTBEAT_INTERVAL_MS;
348
355
  export const DEFAULT_SESSION_RETENTION_MAX_AGE_MS = 30 * 24 * 60 * 60 * 1000;
349
356
  export const DEFAULT_SESSION_RETENTION_MAX_ROWS = 25_000;
350
357
 
@@ -571,6 +578,10 @@ function projectIdentity(
571
578
  const { latest, heartbeat } = state;
572
579
  const terminal = isTerminalEvent(latest);
573
580
  const terminalUncertain = latest.type === "lifecycle_terminal" || latest.terminalUncertain === true;
581
+ const hostUnregisteredReason =
582
+ latest.hostUnregisteredReason === "process_exited" || latest.hostUnregisteredReason === "detached_idle"
583
+ ? latest.hostUnregisteredReason
584
+ : undefined;
574
585
  const pidAlive = alive(latest.pid);
575
586
  // Liveness evidence is host-written: a checkpointed heartbeat, or the
576
587
  // `host_registered` event the host appended itself. Counting registration
@@ -606,6 +617,7 @@ function projectIdentity(
606
617
  endpointMtimeMs: latest.endpointMtimeMs,
607
618
  endpointFileId: latest.endpointFileId,
608
619
  lifecycleRequestId: latest.lifecycleRequestId,
620
+ ...(hostUnregisteredReason === undefined ? {} : { hostUnregisteredReason }),
609
621
  terminalUncertain,
610
622
  ...(latest.forcedStaleRelease === true ? { forcedStaleRelease: true } : {}),
611
623
  indexSeq: latest.indexSeq,
@@ -1687,6 +1699,82 @@ export class SessionIndex {
1687
1699
  });
1688
1700
  });
1689
1701
  }
1702
+
1703
+ /**
1704
+ * Atomically fence an exact, long-silent dead-host authority before a caller
1705
+ * removes state outside the broker index. The comparison and terminal event
1706
+ * append share the machine-global index lock, so a heartbeat, successor
1707
+ * registration, or unresolved-authority update that wins the lock prevents
1708
+ * destructive coordinator cleanup.
1709
+ */
1710
+ async retireStaleIfCurrent(expected: {
1711
+ sessionId: string;
1712
+ workspace: string;
1713
+ endpointGeneration: number;
1714
+ endpointIncarnation: string;
1715
+ }): Promise<"retired" | "already_retired" | "not_found" | "stale"> {
1716
+ const indexPath = path.resolve(logFor(this.#agentDir));
1717
+ // Process-incarnation observations are gathered before the lock. The locked
1718
+ // projection then uses this fixed batch, avoiding an unbounded OS probe while
1719
+ // holding the machine-global index lock.
1720
+ const probed = new Map<string, string | undefined>();
1721
+ for (const row of reduceEvents(this.#events, this.#policy.clock(), this.#agentDir).identities) {
1722
+ const recordedIncarnation = row.hostIncarnation ?? row.processIncarnation;
1723
+ if (recordedIncarnation === undefined || !alive(row.pid)) continue;
1724
+ probed.set(`${row.sessionId}\u0000${row.endpointGeneration}\u0000${row.pid}`, processIncarnation(row.pid));
1725
+ }
1726
+ return await SessionIndex.#enqueue(indexPath, async () => {
1727
+ try {
1728
+ await fs.stat(dirFor(this.#agentDir));
1729
+ } catch (error) {
1730
+ if ((error as NodeJS.ErrnoException).code === "ENOENT") return "not_found";
1731
+ throw error;
1732
+ }
1733
+ return await withSessionIndexLock("stale session retirement", this.#agentDir, async () => {
1734
+ await this.#replayUnderLock();
1735
+ if (this.#corruptSuffix) throw new Error("Cannot retire a session from a corrupt session index");
1736
+ const current = this.listSessions(probed).sessions.find(
1737
+ session => session.sessionId === expected.sessionId,
1738
+ );
1739
+ if (!current) return "not_found";
1740
+ if (
1741
+ resolveEquivalentPath(current.locator.cwd) !== resolveEquivalentPath(expected.workspace) ||
1742
+ current.endpointGeneration !== expected.endpointGeneration ||
1743
+ endpointIncarnation(current, expected.sessionId) !== expected.endpointIncarnation
1744
+ )
1745
+ return "stale";
1746
+ if (current.ambiguous || current.terminalUncertain) return "stale";
1747
+ if (current.terminal) return "already_retired";
1748
+ if (
1749
+ current.live !== false ||
1750
+ current.lastHeartbeatAt === undefined ||
1751
+ this.#policy.clock() - current.lastHeartbeatAt < DEAD_HOST_HEARTBEAT_SILENCE_MS
1752
+ )
1753
+ return "stale";
1754
+ const unsigned: Omit<SessionIndexEvent, "checksum"> = {
1755
+ version: SESSION_INDEX_EVENT_VERSION,
1756
+ indexSeq: this.indexSeq + 1,
1757
+ ts: Date.now(),
1758
+ type: "session_closed",
1759
+ sessionId: current.sessionId,
1760
+ locator: current.locator,
1761
+ endpointGeneration: current.endpointGeneration,
1762
+ pid: current.pid,
1763
+ ...(current.processIncarnation === undefined ? {} : { processIncarnation: current.processIncarnation }),
1764
+ ...(current.hostIncarnation === undefined ? {} : { hostIncarnation: current.hostIncarnation }),
1765
+ ...(current.endpointMtimeMs === undefined ? {} : { endpointMtimeMs: current.endpointMtimeMs }),
1766
+ ...(current.endpointFileId === undefined ? {} : { endpointFileId: current.endpointFileId }),
1767
+ ...(current.lifecycleRequestId === undefined ? {} : { lifecycleRequestId: current.lifecycleRequestId }),
1768
+ };
1769
+ const event: SessionIndexEvent = { ...unsigned, checksum: sessionIndexChecksum(unsigned) };
1770
+ await appendSync(logFor(this.#agentDir), JSON.stringify(event));
1771
+ await this.#refreshUnderLock();
1772
+ if ((await fs.stat(logFor(this.#agentDir))).size >= ROTATE_BYTES) await this.#rotate();
1773
+ return "retired";
1774
+ });
1775
+ });
1776
+ }
1777
+
1690
1778
  async unregisterIfCurrent(
1691
1779
  expected: Pick<
1692
1780
  SessionIndexEvent,
@@ -1701,6 +1789,7 @@ export class SessionIndex {
1701
1789
  | "processIncarnation"
1702
1790
  | "hostIncarnation"
1703
1791
  >,
1792
+ reason?: HostUnregisteredReason,
1704
1793
  ): Promise<boolean> {
1705
1794
  const indexPath = path.resolve(logFor(this.#agentDir));
1706
1795
  return await SessionIndex.#enqueue(indexPath, async () => {
@@ -1781,6 +1870,7 @@ export class SessionIndex {
1781
1870
  ...(expected.lifecycleRequestId === undefined
1782
1871
  ? {}
1783
1872
  : { lifecycleRequestId: expected.lifecycleRequestId }),
1873
+ ...(reason === undefined ? {} : { hostUnregisteredReason: reason }),
1784
1874
  };
1785
1875
  const event: SessionIndexEvent = { ...unsigned, checksum: sessionIndexChecksum(unsigned) };
1786
1876
  await appendSync(logFor(this.#agentDir), JSON.stringify(event));
@@ -1866,10 +1956,10 @@ export class SessionIndex {
1866
1956
  this.#changeStamp = await readIndexChangeStamp(this.#agentDir);
1867
1957
  }
1868
1958
 
1869
- listSessions(): SessionList {
1959
+ listSessions(probedIncarnations?: ReadonlyMap<string, string | undefined>): SessionList {
1870
1960
  return {
1871
1961
  indexSeq: this.indexSeq,
1872
- sessions: reduceEvents(this.#events, this.#policy.clock(), this.#agentDir).sessions,
1962
+ sessions: reduceEvents(this.#events, this.#policy.clock(), this.#agentDir, probedIncarnations).sessions,
1873
1963
  warnings: this.#warnings,
1874
1964
  };
1875
1965
  }
@@ -2323,7 +2413,10 @@ export class SessionIndex {
2323
2413
  ...(row.processIncarnation === undefined ? {} : { processIncarnation: row.processIncarnation }),
2324
2414
  ...(row.hostIncarnation === undefined ? {} : { hostIncarnation: row.hostIncarnation }),
2325
2415
  ...(row.masterRole === undefined ? {} : { masterRole: row.masterRole }),
2326
- activity: { state: "active", at: now },
2416
+ // Preserve the host's last observed activity state while this
2417
+ // broker-owned heartbeat only renews liveness. A live idle host
2418
+ // must not be rewritten as active merely because its pid is alive.
2419
+ activity: row.activity ?? { state: "active", at: now },
2327
2420
  ts: now,
2328
2421
  };
2329
2422
  events.push({ ...unsigned, checksum: sessionIndexChecksum(unsigned) });
@@ -23,6 +23,8 @@ export type SpawnClaimV2 = {
23
23
  failure?: SpawnSubstrateFailure;
24
24
  preSendLease?: { epoch: string; status: "owned" | "consumed" };
25
25
  childId?: string;
26
+ /** Launch proof retained while registration is still unbound so a later retry can re-prove or close it. */
27
+ substrateProof?: SpawnSubstrateProof;
26
28
  seed?: SeedDeliveryV2;
27
29
  authorityRef?: string;
28
30
  createdAt: number;
@@ -139,6 +141,8 @@ export type SpawnClaimTransition = {
139
141
  leaseEpoch?: string;
140
142
  /** The fresh child ID is committed before substrate launch. */
141
143
  childId?: string;
144
+ /** Launch proof may be appended to the pre-registration state for later reconciliation. */
145
+ substrateProof?: SpawnSubstrateProof;
142
146
  /** Required for seed and terminal state transitions that carry Q26 facts. */
143
147
  seed?: SeedDeliveryV2;
144
148
  failure?: SpawnSubstrateFailure;
@@ -225,6 +229,7 @@ const CLAIM_KEYS = new Set([
225
229
  "failure",
226
230
  "preSendLease",
227
231
  "childId",
232
+ "substrateProof",
228
233
  "seed",
229
234
  "authorityRef",
230
235
  "createdAt",
@@ -272,13 +277,13 @@ const FORBIDDEN_FIELD =
272
277
  /(?:task|prompt|capability|idempotency|fingerprint|requesthash|digest|credential|token|secret|password|stderr)/i;
273
278
  const TRANSITION_EDGES: Readonly<Record<SpawnClaimV2["state"], readonly SpawnClaimV2["state"][]>> = {
274
279
  prepared: ["substrate_starting", "pre_send_rejected", "uncertain", "closed"],
275
- substrate_starting: ["authority_active", "pre_send_rejected", "uncertain", "closed"],
280
+ substrate_starting: ["substrate_starting", "authority_active", "pre_send_rejected", "uncertain", "closed"],
276
281
  authority_active: ["seed_prepared", "pre_send_rejected", "uncertain", "closed"],
277
282
  seed_prepared: ["dispatching", "pre_send_rejected", "uncertain", "closed"],
278
283
  dispatching: ["accepted", "pre_send_rejected", "uncertain", "closed"],
279
284
  accepted: ["uncertain", "closed"],
280
285
  pre_send_rejected: ["uncertain", "closed"],
281
- uncertain: ["closed"],
286
+ uncertain: ["pre_send_rejected", "closed"],
282
287
  closed: [],
283
288
  };
284
289
 
@@ -476,6 +481,7 @@ export function isSpawnClaimV2(value: unknown): value is SpawnClaimV2 {
476
481
  ((lease as { status?: unknown }).status === "owned" ||
477
482
  (lease as { status?: unknown }).status === "consumed"))) &&
478
483
  (claim.childId === undefined || isOpaque(claim.childId)) &&
484
+ (claim.substrateProof === undefined || isSpawnSubstrateProof(claim.substrateProof)) &&
479
485
  (claim.seed === undefined || isSeed(claim.seed)) &&
480
486
  (claim.authorityRef === undefined || isOpaque(claim.authorityRef)) &&
481
487
  (claim.failure === undefined || isSpawnSubstrateFailure(claim.failure)) &&
@@ -698,10 +704,19 @@ export class SpawnAuthorityStore {
698
704
  !isOpaque(transition.childId) ||
699
705
  transition.seed !== undefined ||
700
706
  transition.authority !== undefined ||
701
- transition.failure !== undefined
707
+ transition.failure !== undefined ||
708
+ (transition.substrateProof !== undefined && !isSpawnSubstrateProof(transition.substrateProof)) ||
709
+ (current.state === "prepared" && transition.substrateProof !== undefined) ||
710
+ (current.state === "substrate_starting" && transition.substrateProof === undefined) ||
711
+ (current.state === "substrate_starting" && transition.childId !== current.childId)
702
712
  )
703
713
  throw new SpawnAuthorityTransitionError("invalid_transition");
704
- next = { ...current, state: "substrate_starting", childId: transition.childId };
714
+ next = {
715
+ ...current,
716
+ state: "substrate_starting",
717
+ childId: transition.childId,
718
+ ...(transition.substrateProof === undefined ? {} : { substrateProof: transition.substrateProof }),
719
+ };
705
720
  break;
706
721
  }
707
722
  case "authority_active": {
@@ -804,7 +819,11 @@ export class SpawnAuthorityStore {
804
819
  break;
805
820
  }
806
821
  case "uncertain": {
807
- if (transition.childId !== undefined || transition.authority !== undefined)
822
+ if (
823
+ transition.childId !== undefined ||
824
+ transition.authority !== undefined ||
825
+ (transition.failure !== undefined && !isSpawnSubstrateFailure(transition.failure))
826
+ )
808
827
  throw new SpawnAuthorityTransitionError("invalid_transition");
809
828
  if (current.seed) {
810
829
  if (
@@ -813,10 +832,19 @@ export class SpawnAuthorityStore {
813
832
  !sameSeedIdentity(current.seed, transition.seed)
814
833
  )
815
834
  throw new SpawnAuthorityTransitionError("invalid_transition");
816
- next = { ...current, state: "uncertain", seed: transition.seed };
835
+ next = {
836
+ ...current,
837
+ state: "uncertain",
838
+ seed: transition.seed,
839
+ ...(transition.failure === undefined ? {} : { failure: transition.failure }),
840
+ };
817
841
  } else {
818
842
  if (transition.seed !== undefined) throw new SpawnAuthorityTransitionError("invalid_transition");
819
- next = { ...current, state: "uncertain" };
843
+ next = {
844
+ ...current,
845
+ state: "uncertain",
846
+ ...(transition.failure === undefined ? {} : { failure: transition.failure }),
847
+ };
820
848
  }
821
849
  break;
822
850
  }
@@ -0,0 +1,59 @@
1
+ import * as fs from "node:fs/promises";
2
+ import * as path from "node:path";
3
+
4
+ const MAX_DRAIN_BYTES = 64 * 1024;
5
+
6
+ function parseMaxBytes(value: string): number {
7
+ if (!/^[0-9]+$/u.test(value)) throw new Error("Invalid lifecycle stderr drainer byte limit.");
8
+ const maxBytes = Number(value);
9
+ if (!Number.isSafeInteger(maxBytes) || maxBytes <= 0 || maxBytes > MAX_DRAIN_BYTES)
10
+ throw new Error("Invalid lifecycle stderr drainer byte limit.");
11
+ return maxBytes;
12
+ }
13
+
14
+ /** Parse and run the private source/compiled CLI drainer route. */
15
+ export async function runSdkStderrDrainerFromArgv(argv: readonly string[]): Promise<void> {
16
+ if (argv.length !== 4 || argv[0] !== "--path" || argv[1] === undefined || argv[2] !== "--max-bytes")
17
+ throw new Error("Invalid lifecycle stderr drainer invocation.");
18
+ if (!path.isAbsolute(argv[1])) throw new Error("Invalid lifecycle stderr drainer path.");
19
+ await runSdkStderrDrainer(argv[1], parseMaxBytes(argv[3] ?? ""));
20
+ }
21
+
22
+ /**
23
+ * Drain a detached lifecycle host's stderr without letting a noisy child grow
24
+ * its diagnostic artifact. The drainer owns the read side of the pipe, so the
25
+ * host remains attached to a process that outlives the broker itself.
26
+ *
27
+ * The artifact is written through one descriptor opened up front: once the
28
+ * broker has finished reading the startup diagnostic it unlinks the path, and
29
+ * the remaining output lands on an unlinked inode that disappears with this
30
+ * process instead of accumulating under the agent directory.
31
+ */
32
+ export async function runSdkStderrDrainer(logPath: string, maxBytes: number): Promise<void> {
33
+ let handle: fs.FileHandle | undefined;
34
+ try {
35
+ handle = await fs.open(logPath, "w", 0o600);
36
+ } catch {
37
+ // Diagnostics are best effort; keep draining so the host never blocks.
38
+ }
39
+ let tail = Buffer.alloc(0);
40
+ try {
41
+ for await (const chunk of process.stdin) {
42
+ const bytes = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk as Uint8Array);
43
+ if (bytes.length >= maxBytes) tail = Buffer.from(bytes.subarray(bytes.length - maxBytes));
44
+ else {
45
+ const combined = Buffer.concat([tail, bytes]);
46
+ tail = combined.length > maxBytes ? Buffer.from(combined.subarray(combined.length - maxBytes)) : combined;
47
+ }
48
+ if (!handle) continue;
49
+ try {
50
+ await handle.truncate(0);
51
+ await handle.write(tail, 0, tail.length, 0);
52
+ } catch {
53
+ // Diagnostics are best effort; continue draining so the host never blocks.
54
+ }
55
+ }
56
+ } finally {
57
+ await handle?.close().catch(() => undefined);
58
+ }
59
+ }
@@ -141,8 +141,8 @@ export type ChatDaemonAction = "stop" | "reload";
141
141
  * crashes, recovery, and attachment retirement cannot replay ambiguous work.
142
142
  */
143
143
  export const CHAT_DAEMON_GENERATIONS: Readonly<Record<ChatDaemonKind, number>> = {
144
- discord: 76,
145
- slack: 83,
144
+ discord: 79,
145
+ slack: 86,
146
146
  };
147
147
 
148
148
  export function chatDaemonGeneration(kind: ChatDaemonKind): number {
@@ -317,6 +317,7 @@ export class ChatDaemonRuntime {
317
317
  ) {
318
318
  this.#router = new SessionRouter({
319
319
  agentDir: input.agentDir,
320
+ observer: true,
320
321
  correlateFrame,
321
322
  deps: {
322
323
  ...deps.routerDeps,