@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
@@ -1,10 +1,13 @@
1
1
  import { createHash } from "node:crypto";
2
+ import * as nodeFs from "node:fs";
2
3
  import * as fs from "node:fs/promises";
3
4
  import * as os from "node:os";
4
5
  import * as path from "node:path";
5
6
  import { logger } from "@gajae-code/utils";
6
- import { Args, CliParseError, Command, Flags, renderCommandHelp } from "@gajae-code/utils/cli";
7
+ import { Args, CliParseError, Command, Flags } from "@gajae-code/utils/cli";
7
8
  import type { Args as ParsedArgs } from "../cli/args";
9
+ import { isSafeSdkInternalAgentDir, scanPublicCommand } from "../cli/public-command-entry";
10
+ import { PublicCommandFailure } from "../cli/public-command-errors";
8
11
  import { parseModelString } from "../config/model-resolver";
9
12
  import { Settings } from "../config/settings";
10
13
  import { applyStartupModelProfiles, createSessionManager } from "../main";
@@ -13,7 +16,11 @@ import { initTheme } from "../modes/theme/theme";
13
16
  import { ACP_MCP_REQUEST_TIMEOUT_MS, ACP_MCP_STARTUP_HEADROOM_MS } from "../sdk/acp/mcp";
14
17
  import { Broker } from "../sdk/broker/broker";
15
18
  import { readBrokerDiscovery } from "../sdk/broker/discovery";
16
- import { reconcileBrokerGenerationForStartup, withBrokerStartupLock } from "../sdk/broker/ensure";
19
+ import {
20
+ emitBrokerStartupTestSignal,
21
+ reconcileBrokerGenerationForStartup,
22
+ withBrokerStartupLock,
23
+ } from "../sdk/broker/ensure";
17
24
  import { completeBrokerProcess } from "../sdk/broker/internal";
18
25
  import {
19
26
  type LifecycleTranscriptEvidence,
@@ -21,13 +28,14 @@ import {
21
28
  type SessionLifecycleLaunchRequest,
22
29
  type SessionLifecycleTranscriptIdentity,
23
30
  sessionHostAttachedClients,
24
- sessionHostWorkInFlight,
31
+ sessionHostWorkLeaseActive,
25
32
  startBrokerDeadRegistrationSweep,
26
33
  writeSessionLifecycleFailure,
27
34
  writeSessionLifecycleReady,
28
35
  } from "../sdk/broker/lifecycle";
29
36
  import { processIncarnation } from "../sdk/broker/process-incarnation";
30
37
  import { writeBrokerStartupFailureMarker } from "../sdk/broker/startup-failure";
38
+ import { runSdkStderrDrainer } from "../sdk/broker/stderr-drainer";
31
39
  import { renderSdkSearchTable, runSdkSearch, runSdkSessionCli } from "../sdk/cli";
32
40
  import { renderSpawnTable, runSdkSpawn, SdkMasterCliError } from "../sdk/cli/master-cli";
33
41
  import { runSdkGuidesCli } from "../sdk/guides/cli";
@@ -39,7 +47,7 @@ import {
39
47
  type SdkStartupRollbackResult,
40
48
  SdkStartupRollbackTracker,
41
49
  } from "../sdk/startup-capability";
42
- import { runSdkServe } from "../sdk/transport/serve-cli";
50
+ import { runSdkServe, SdkServeError } from "../sdk/transport/serve-cli";
43
51
  import { isSessionDisposalIncompleteError } from "../session/agent-session";
44
52
  import {
45
53
  type CapturedSessionTranscriptSnapshot,
@@ -94,6 +102,43 @@ export async function lifecycleArgs(
94
102
  export const SESSION_HOST_BROKER_ABSENCE_GRACE_MS = 10 * 60_000;
95
103
  const SESSION_HOST_BROKER_POLL_MS = 15_000;
96
104
 
105
+ async function waitForBrokerStartupTestGate(gateFile: string): Promise<void> {
106
+ if (await Bun.file(gateFile).exists()) return;
107
+ const directory = path.dirname(gateFile);
108
+ const filename = path.basename(gateFile);
109
+ await new Promise<void>((resolve, reject) => {
110
+ let settled = false;
111
+ let watcher: nodeFs.FSWatcher | undefined;
112
+ const finish = (error?: unknown): void => {
113
+ if (settled) return;
114
+ settled = true;
115
+ watcher?.close();
116
+ if (error === undefined) resolve();
117
+ else reject(error);
118
+ };
119
+ try {
120
+ watcher = nodeFs.watch(directory, (_eventType, changed) => {
121
+ if (String(changed) !== filename) return;
122
+ void Bun.file(gateFile)
123
+ .exists()
124
+ .then(exists => {
125
+ if (exists) finish();
126
+ })
127
+ .catch(finish);
128
+ });
129
+ } catch (error) {
130
+ finish(error);
131
+ return;
132
+ }
133
+ void Bun.file(gateFile)
134
+ .exists()
135
+ .then(exists => {
136
+ if (exists) finish();
137
+ })
138
+ .catch(finish);
139
+ });
140
+ }
141
+
97
142
  /**
98
143
  * Identity of the broker incarnation an observation describes, or `null` when
99
144
  * it carries no usable identity.
@@ -167,10 +212,10 @@ export async function watchSessionHostBrokerLiveness(deps: {
167
212
  * no client attached before treating itself as abandoned.
168
213
  *
169
214
  * This cannot fire during healthy work. "Attached" is the host's own live
170
- * socket-subscription count, so a client that is merely idle — an editor
171
- * sitting on an open ACP session, a long agent turn with nobody typing — still
172
- * holds a socket and resets the window on every poll. Only a client that is
173
- * actually gone opens it, and 30 minutes is far longer than any client
215
+ * demand count: observer-only sockets (such as an idle chat daemon) do not
216
+ * reset the window, while an in-flight turn is reported separately. Only a
217
+ * client that is actually demanding the host opens it, and 30 minutes is far
218
+ * longer than any client
174
219
  * reconnect budget (ACP's is seconds), so a crashed-and-restarted client
175
220
  * reattaches long before the window closes.
176
221
  */
@@ -196,8 +241,8 @@ const SESSION_HOST_ATTACHMENT_POLL_MS = 30_000;
196
241
  * from every client for a full idle grace, or nobody has come for it at all
197
242
  * for a full first-attach grace.
198
243
  *
199
- * `readAttachedClients` reports the host's own live client/socket subscription
200
- * count; `undefined` means the SDK endpoint publishes no such evidence — before
244
+ * `readAttachedClients` reports the host's own live demanding-client count;
245
+ * `undefined` means the SDK endpoint publishes no such evidence — before
201
246
  * startup, after teardown, or when every reader itself fails. That ambiguity is
202
247
  * never instant detachment: it cannot reap on the poll that first sees it, it
203
248
  * can only open a window. Which window depends on what was already observed. A
@@ -208,28 +253,27 @@ const SESSION_HOST_ATTACHMENT_POLL_MS = 30_000;
208
253
  * an observed count of zero. Every reachable state therefore carries a finite
209
254
  * bound.
210
255
  *
211
- * `readWorkInFlight` reports whether the host is running agent work right now.
212
- * Work is positive proof a client did come for this host: a prompt can only
213
- * arrive over an endpoint a client dialed. Live work therefore restarts both
214
- * windows, which is what keeps a mid-prompt host alive whether its count reads
215
- * zero or stops being readable at all. That still bounds a host whose SDK
216
- * runtime never came up: with no transport it can never receive a prompt, so it
217
- * never reports work and its window keeps running from process start. And any
218
- * real turn ends, after which the window resumes; live work defers a bound, it
219
- * never removes it.
256
+ * `readWorkLease` reports whether the host's authoritative session-work lease
257
+ * is held. A lease is positive proof a client did come for this host: a prompt
258
+ * can only arrive over an endpoint a client dialed. Live work therefore
259
+ * restarts both windows, which is what keeps a mid-prompt host alive whether
260
+ * its count reads zero or stops being readable at all. That still bounds a
261
+ * host whose SDK runtime never came up: with no transport it can never receive
262
+ * a prompt, so it never acquires work and its window keeps running from process
263
+ * start. Releasing the lease resumes the applicable bound.
220
264
  */
221
265
  export async function watchSessionHostClientAttachment(deps: {
222
266
  readAttachedClients: () => number | undefined;
223
- readWorkInFlight?: () => boolean;
267
+ readWorkLease?: () => boolean;
224
268
  now?: () => number;
225
269
  sleep?: (ms: number) => Promise<void>;
226
270
  idleGraceMs?: number;
227
271
  firstAttachGraceMs?: number;
228
272
  pollMs?: number;
229
- }): Promise<void> {
273
+ }): Promise<"detached_idle"> {
230
274
  const now = deps.now ?? Date.now;
231
275
  const sleep = deps.sleep ?? (async ms => await Bun.sleep(ms));
232
- const readWorkInFlight = deps.readWorkInFlight ?? (() => false);
276
+ const readWorkLease = deps.readWorkLease ?? (() => false);
233
277
  const idleGraceMs = deps.idleGraceMs ?? SESSION_HOST_DETACHED_IDLE_GRACE_MS;
234
278
  const firstAttachGraceMs = deps.firstAttachGraceMs ?? SESSION_HOST_FIRST_ATTACH_GRACE_MS;
235
279
  const pollMs = deps.pollMs ?? SESSION_HOST_ATTACHMENT_POLL_MS;
@@ -239,7 +283,7 @@ export async function watchSessionHostClientAttachment(deps: {
239
283
  let unattendedSince = now();
240
284
  for (;;) {
241
285
  const attached = deps.readAttachedClients();
242
- if (readWorkInFlight()) {
286
+ if (readWorkLease()) {
243
287
  unattendedSince = now();
244
288
  detachedSince = null;
245
289
  }
@@ -252,9 +296,9 @@ export async function watchSessionHostClientAttachment(deps: {
252
296
  // registration stops publishing a count instead of reporting zero.
253
297
  // Both accrue against the idle bound rather than running forever.
254
298
  detachedSince ??= now();
255
- if (now() - detachedSince >= idleGraceMs) return;
299
+ if (now() - detachedSince >= idleGraceMs) return "detached_idle";
256
300
  } else if (now() - unattendedSince >= firstAttachGraceMs) {
257
- return;
301
+ return "detached_idle";
258
302
  }
259
303
  await sleep(pollMs);
260
304
  }
@@ -644,10 +688,10 @@ export async function runSessionHost(
644
688
  lifecycleTranscriptPath = session.sessionManager.getSessionFile();
645
689
  });
646
690
  let sessionDisposal: Promise<void> | undefined;
647
- const disposeSession = (): Promise<void> => {
691
+ const disposeSession = (reason?: "detached_idle"): Promise<void> => {
648
692
  sessionDisposal ??= (async () => {
649
693
  try {
650
- await session.dispose();
694
+ await session.dispose(reason === undefined ? {} : { sessionShutdownReason: reason });
651
695
  } catch (error) {
652
696
  if (!isSessionDisposalIncompleteError(error)) throw error;
653
697
  await session.awaitDisposeCompletion();
@@ -693,8 +737,8 @@ export async function runSessionHost(
693
737
  return failureRollback;
694
738
  };
695
739
  const sessionEndpointPath = path.join(request.stateRoot, "sdk", `${request.sessionId}.json`);
696
- const exitAfterSessionDisposal = async (): Promise<void> => {
697
- await disposeSession();
740
+ const exitAfterSessionDisposal = async (reason?: "detached_idle"): Promise<void> => {
741
+ await disposeSession(reason);
698
742
  let failure: SdkStartupFailure | undefined;
699
743
  try {
700
744
  const endpoint = JSON.parse(await fs.readFile(sessionEndpointPath, "utf8")) as {
@@ -724,11 +768,11 @@ export async function runSessionHost(
724
768
  process.exit(process.exitCode ?? 0);
725
769
  };
726
770
  let stopping = false;
727
- const stop = () => {
771
+ const stop = (reason?: "detached_idle") => {
728
772
  if (capability.result?.status === "started") {
729
773
  if (stopping) return;
730
774
  stopping = true;
731
- void exitAfterSessionDisposal();
775
+ void exitAfterSessionDisposal(reason);
732
776
  return;
733
777
  }
734
778
  const failure = capability.normalizeFailure("startup", "failed", "SDK lifecycle host terminated.");
@@ -816,31 +860,53 @@ export async function runSessionHost(
816
860
  await Bun.sleep(5_000);
817
861
  }
818
862
  startMemoryBackendAfterReadiness(startDeferredMemoryBackend);
819
- process.once("SIGTERM", stop);
820
- process.once("SIGINT", stop);
863
+ process.once("SIGTERM", () => stop());
864
+ process.once("SIGINT", () => stop());
821
865
  // Two independent bounds, either of which reaps this detached host through
822
866
  // the same graceful teardown a SIGTERM would take. The first covers a broker
823
867
  // that is gone for good; the second covers the opposite case, a perfectly
824
868
  // healthy broker whose host nobody is attached to any more and for which no
825
869
  // `session.close` will ever arrive.
826
- await Promise.race([
827
- watchSessionHostBrokerLiveness({ agentDir }),
870
+ const reapReason = await Promise.race([
871
+ watchSessionHostBrokerLiveness({ agentDir }).then(() => undefined),
828
872
  watchSessionHostClientAttachment({
829
873
  readAttachedClients: sessionHostAttachedClients,
830
- readWorkInFlight: sessionHostWorkInFlight,
874
+ readWorkLease: sessionHostWorkLeaseActive,
831
875
  }),
832
876
  ]);
833
- stop();
877
+ stop(reapReason);
834
878
  await new Promise<void>(() => {});
835
879
  }
836
880
 
837
- export type SdkInternalArgv = { action: "broker-internal"; agentDir: string } | { action: "session-host-internal" };
881
+ export type SdkInternalArgv =
882
+ | { action: "broker-internal"; agentDir: string }
883
+ | { action: "session-host-internal" }
884
+ | { action: "stderr-drain-internal"; logPath: string; maxBytes: number };
838
885
 
839
886
  /** Parses the exact private argv contracts used by SDK child-process spawns. */
840
887
  export function parseSdkInternalArgv(argv: readonly string[]): SdkInternalArgv {
841
888
  if (argv[0] === "session-host-internal" && argv.length === 1) return { action: "session-host-internal" };
842
- if (argv[0] === "broker-internal" && argv.length === 3 && argv[1] === "--agent-dir" && argv[2])
889
+ if (
890
+ argv[0] === "broker-internal" &&
891
+ argv.length === 3 &&
892
+ argv[1] === "--agent-dir" &&
893
+ typeof argv[2] === "string" &&
894
+ isSafeSdkInternalAgentDir(argv[2])
895
+ )
843
896
  return { action: "broker-internal", agentDir: argv[2] };
897
+ if (
898
+ argv[0] === "stderr-drain-internal" &&
899
+ argv.length === 5 &&
900
+ argv[1] === "--path" &&
901
+ argv[2] &&
902
+ path.isAbsolute(argv[2]) &&
903
+ argv[3] === "--max-bytes"
904
+ ) {
905
+ const maxBytes = parsePositiveTimeout(argv[4], "--max-bytes");
906
+ if (maxBytes !== undefined && maxBytes <= 64 * 1024) {
907
+ return { action: "stderr-drain-internal", logPath: argv[2], maxBytes };
908
+ }
909
+ }
844
910
  throw new CliParseError("Invalid internal SDK invocation.");
845
911
  }
846
912
 
@@ -869,12 +935,12 @@ class SdkServeHelp extends Command {
869
935
 
870
936
  class SdkSessionHelp extends Command {
871
937
  static description =
872
- "Manage SDK sessions: `gjc sdk session list|inspect|send|status|tail|retire`, or the explicit raw hatch `gjc sdk session raw control|query|global`. The session CLI is broker-bound and credential-free.";
938
+ "Manage SDK sessions: `gjc sdk session list|inspect|send|status|tail|close|retire`, or the explicit raw hatch `gjc sdk session raw control|query|global`. The session CLI is broker-bound and credential-free.";
873
939
  static args = {
874
940
  verb: Args.string({
875
941
  description: "Session verb",
876
942
  required: false,
877
- options: ["list", "inspect", "send", "status", "tail", "retire", "raw"],
943
+ options: ["list", "inspect", "send", "status", "tail", "close", "retire", "raw"],
878
944
  }),
879
945
  target: Args.string({
880
946
  description: "Session id (or the raw kind control|query|global for `raw`)",
@@ -901,7 +967,8 @@ class SdkSessionHelp extends Command {
901
967
  }),
902
968
  confirm: Flags.boolean({ description: "Confirm a destructive local CLI control operation" }),
903
969
  cursor: Flags.string({
904
- description: "Raw query continuation cursor, saved checkpoint token, or search continuation cursor",
970
+ description:
971
+ "Raw query continuation/search cursor, or session tail checkpoint claim (tail also requires --after-transcript-id)",
905
972
  }),
906
973
  scope: Flags.string({
907
974
  description:
@@ -918,6 +985,10 @@ class SdkSessionHelp extends Command {
918
985
  strict: Flags.boolean({ description: "tail --strict: fail closed on retention gaps" }),
919
986
  "until-idle": Flags.boolean({ description: "tail --until-idle: exit after an observed terminal turn state" }),
920
987
  "all-events": Flags.boolean({ description: "tail --all-events: include every event-ring kind" }),
988
+ "after-transcript-id": Flags.string({
989
+ description:
990
+ "tail --cursor (required): omit transcript rows up to and including this row id (the caller already has them)",
991
+ }),
921
992
  page: Flags.boolean({ description: "raw global session.list: return exactly one broker page" }),
922
993
  };
923
994
  async run(): Promise<void> {}
@@ -1019,6 +1090,7 @@ class SdkSessionCommand extends Command {
1019
1090
  strict: Boolean(flagRec.strict),
1020
1091
  untilIdle: Boolean(flagRec["until-idle"]),
1021
1092
  allEvents: Boolean(flagRec["all-events"]),
1093
+ afterTranscriptId: flagRec["after-transcript-id"] as string | undefined,
1022
1094
  page: Boolean(flagRec.page),
1023
1095
  limit: flagRec.limit as number | undefined,
1024
1096
  agentDir: flagRec["agent-dir"] as string | undefined,
@@ -1058,77 +1130,127 @@ class SdkGuidesCommand extends Command {
1058
1130
  });
1059
1131
  }
1060
1132
  }
1061
-
1062
1133
  export default class Sdk extends Command {
1063
- static description =
1064
- "gjc sdk serve --stdio | --socket <path> [--session <id>]; gjc sdk search [--scope repo|pwd|global] [--json] [--limit N] [--cursor ...]; gjc sdk spawn --cwd <dir> --prompt <task> (master only); gjc sdk session list|inspect|send|status|tail; gjc sdk guides refresh|list|show|status|trust";
1134
+ static description = "SDK command runtime; public grammar and help are registry-owned.";
1065
1135
  static hidden = false;
1066
1136
  static delegateHelp = true;
1067
- static args = {
1068
- action: Args.string({ required: false, options: ["serve", "search", "spawn", "session", "guides"] }),
1069
- };
1070
- static flags = SdkServeHelp.flags;
1071
1137
  async run(): Promise<void> {
1072
- const action = this.argv[0];
1073
- if (this.argv.includes("--help") || this.argv.includes("-h")) {
1074
- const helpAction =
1075
- action === "serve"
1076
- ? "sdk serve"
1077
- : action === "search"
1078
- ? "sdk search"
1079
- : action === "spawn"
1080
- ? "sdk spawn"
1081
- : action === "session"
1082
- ? "sdk session"
1083
- : action === "guides"
1084
- ? "sdk guides"
1085
- : "sdk";
1086
- const helpCommand =
1087
- action === "serve"
1088
- ? SdkServeHelp
1089
- : action === "search"
1090
- ? SdkSearchCommand
1091
- : action === "spawn"
1092
- ? SdkSpawnCommand
1093
- : action === "session"
1094
- ? SdkSessionCommand
1095
- : action === "guides"
1096
- ? SdkGuidesCommand
1097
- : Sdk;
1098
- renderCommandHelp("gjc", helpAction, helpCommand);
1099
- return;
1100
- }
1101
- if (action === "search") {
1102
- await new SdkSearchCommand(this.argv.slice(1), this.config).run();
1103
- return;
1104
- }
1105
- if (action === "spawn") {
1106
- await new SdkSpawnCommand(this.argv.slice(1), this.config).run();
1107
- return;
1108
- }
1109
- if (action === "session") {
1110
- await new SdkSessionCommand(this.argv.slice(1), this.config).run();
1111
- return;
1112
- }
1113
- if (action === "guides") {
1114
- await new SdkGuidesCommand(this.argv.slice(1), this.config).run();
1115
- return;
1116
- }
1117
- if (action === "serve") {
1118
- await runSdkServe(this.argv.slice(1));
1119
- return;
1138
+ if (
1139
+ this.argv[0] !== "broker-internal" &&
1140
+ this.argv[0] !== "session-host-internal" &&
1141
+ this.argv[0] !== "stderr-drain-internal"
1142
+ ) {
1143
+ const scan = scanPublicCommand("sdk", this.argv);
1144
+ if (scan.kind !== "operation") throw new PublicCommandFailure({ kind: "usage", proof: "pre-effect" });
1145
+ const { args, flags } = scan;
1146
+ const operation = scan.descriptor.command[1];
1147
+ const stringFlag = (name: string): string | undefined => flags[name] as string | undefined;
1148
+ const timeoutMs = flags["timeout-ms"] === undefined ? undefined : Number(flags["timeout-ms"]);
1149
+ if (operation === "spawn") {
1150
+ const spawn = await runSdkSpawn({
1151
+ cwd: stringFlag("cwd"),
1152
+ prompt: stringFlag("prompt"),
1153
+ model: stringFlag("model"),
1154
+ profile: stringFlag("profile"),
1155
+ agentDir: stringFlag("agent-dir"),
1156
+ idempotencyKey: stringFlag("idempotency-key"),
1157
+ });
1158
+ process.stdout.write(`${flags.json ? JSON.stringify(spawn.rendered) : renderSpawnTable(spawn.rendered)}\n`);
1159
+ return;
1160
+ }
1161
+ if (operation === "search") {
1162
+ const search = await runSdkSearch({
1163
+ agentDir: stringFlag("agent-dir"),
1164
+ repo: stringFlag("repo"),
1165
+ scope: stringFlag("scope"),
1166
+ limit: flags.limit as number | undefined,
1167
+ cursor: stringFlag("cursor"),
1168
+ });
1169
+ process.stdout.write(
1170
+ `${flags.json ? JSON.stringify(search.result) : renderSdkSearchTable(search.result)}\n`,
1171
+ );
1172
+ return;
1173
+ }
1174
+ if (operation === "session") {
1175
+ await runSdkSessionCli({
1176
+ action: scan.descriptor.command[2],
1177
+ rawAction: scan.descriptor.command[3],
1178
+ sessionId: args.sessionId as string | undefined,
1179
+ opRef: (args.opRef as string | undefined) ?? stringFlag("op-ref"),
1180
+ operation: stringFlag("op"),
1181
+ query: stringFlag("query"),
1182
+ text: stringFlag("text"),
1183
+ jsonInput: stringFlag("json-input"),
1184
+ jsonInputFile: stringFlag("json-input-file"),
1185
+ jsonInputStdin: Boolean(flags["json-input-stdin"]),
1186
+ confirm: Boolean(flags.confirm),
1187
+ idempotencyKey: stringFlag("idempotency-key"),
1188
+ cursor: stringFlag("cursor"),
1189
+ afterTranscriptId: stringFlag("after-transcript-id"),
1190
+ wait: Boolean(flags.wait),
1191
+ timeoutMs,
1192
+ strict: Boolean(flags.strict),
1193
+ untilIdle: Boolean(flags["until-idle"]),
1194
+ allEvents: Boolean(flags["all-events"]),
1195
+ page: Boolean(flags.page),
1196
+ limit: flags.limit as number | undefined,
1197
+ agentDir: stringFlag("agent-dir"),
1198
+ repo: stringFlag("repo"),
1199
+ scope: stringFlag("scope"),
1200
+ json: flags.json === true,
1201
+ });
1202
+ return;
1203
+ }
1204
+ if (operation === "guides") {
1205
+ await runSdkGuidesCli({
1206
+ action: scan.descriptor.command[2],
1207
+ guideId: args.guideId as string | undefined,
1208
+ url: stringFlag("url"),
1209
+ agentDir: stringFlag("agent-dir"),
1210
+ timeoutMs,
1211
+ });
1212
+ return;
1213
+ }
1214
+ if (operation === "serve") {
1215
+ try {
1216
+ await runSdkServe(scan.operationArgv.slice(1));
1217
+ } catch (error) {
1218
+ if (!(error instanceof SdkServeError)) throw error;
1219
+ // A command invoked outside the public family dispatcher still owns its
1220
+ // stderr envelope. The dispatcher itself keeps the typed failure for the
1221
+ // shared JSON/text boundary so it can render the full contract.
1222
+ if (this.config?.commands instanceof Map && this.config.commands.has("sdk")) throw error;
1223
+ process.stderr.write(
1224
+ `${JSON.stringify({
1225
+ ok: false,
1226
+ error: {
1227
+ code: error.code,
1228
+ message: error.message,
1229
+ ...(error.details === undefined ? {} : { details: error.details }),
1230
+ ...(error.cleanupError === undefined ? {} : { cleanupError: error.cleanupError }),
1231
+ },
1232
+ })}\n`,
1233
+ );
1234
+ process.exitCode = error.exitCode;
1235
+ }
1236
+ return;
1237
+ }
1238
+ throw new PublicCommandFailure({ kind: "usage", proof: "pre-effect" });
1120
1239
  }
1121
- if (action !== "broker-internal" && action !== "session-host-internal")
1122
- throw new CliParseError("Expected action to be serve, search, spawn, session, or guides.");
1240
+
1123
1241
  const internal = parseSdkInternalArgv(this.argv);
1124
1242
  if (internal.action === "session-host-internal") {
1125
1243
  await runSessionHost();
1126
1244
  return;
1127
1245
  }
1246
+ if (internal.action === "stderr-drain-internal") {
1247
+ await runSdkStderrDrainer(internal.logPath, internal.maxBytes);
1248
+ return;
1249
+ }
1128
1250
  const agentDir = path.resolve(internal.agentDir);
1129
1251
  let broker: Broker | undefined;
1130
1252
  try {
1131
- broker = await withBrokerStartupLock(agentDir, async deadline => {
1253
+ const startupOperation = async (deadline: number): Promise<Broker | undefined> => {
1132
1254
  const remainingMs = Math.max(1, deadline - Date.now());
1133
1255
  const testWatchdogMs = Number(process.env.GJC_SDK_TEST_BROKER_STARTUP_WATCHDOG_MS ?? 0);
1134
1256
  const watchdogMs =
@@ -1145,6 +1267,12 @@ export default class Sdk extends Command {
1145
1267
  const stalled = Promise.withResolvers<void>();
1146
1268
  await stalled.promise;
1147
1269
  }
1270
+ const startupGateFile = process.env.GJC_SDK_TEST_BROKER_STARTUP_GATE_FILE;
1271
+ if (startupGateFile) {
1272
+ await emitBrokerStartupTestSignal("startup-gate-waiting");
1273
+ await waitForBrokerStartupTestGate(startupGateFile);
1274
+ await emitBrokerStartupTestSignal("startup-gate-released");
1275
+ }
1148
1276
  const startupDelayMs = Number(process.env.GJC_SDK_TEST_BROKER_STARTUP_DELAY_MS ?? 0);
1149
1277
  if (Number.isSafeInteger(startupDelayMs) && startupDelayMs > 0 && startupDelayMs <= 10_000)
1150
1278
  await Bun.sleep(startupDelayMs);
@@ -1179,6 +1307,10 @@ export default class Sdk extends Command {
1179
1307
  } finally {
1180
1308
  clearTimeout(startupWatchdog);
1181
1309
  }
1310
+ };
1311
+ broker = await withBrokerStartupLock(agentDir, startupOperation, {
1312
+ onAcquired: () => void emitBrokerStartupTestSignal("fence-acquired"),
1313
+ onContended: () => void emitBrokerStartupTestSignal("fence-contended"),
1182
1314
  });
1183
1315
  } catch (error) {
1184
1316
  if (broker) {
@@ -76,6 +76,7 @@ export default class Setup extends Command {
76
76
  }),
77
77
  "api-key-env": Flags.string({ description: "Read provider API key from this environment variable" }),
78
78
  model: Flags.string({ description: "Model id to add (repeat or comma-separate)", multiple: true }),
79
+ discover: Flags.boolean({ description: "Discover models from the provider OpenAI /v1/models endpoint" }),
79
80
  "models-path": Flags.string({ description: "Override models config path" }),
80
81
  remove: Flags.boolean({ description: "Roll back the Paseo registration GJC created" }),
81
82
  mpreset: Flags.string({ description: "Register an additional gjc-<preset> Paseo provider" }),
@@ -97,6 +98,7 @@ export default class Setup extends Command {
97
98
  baseUrl: flags["base-url"],
98
99
  apiKeyEnv: flags["api-key-env"],
99
100
  model: flags.model,
101
+ discover: flags.discover,
100
102
  modelsPath: flags["models-path"],
101
103
  smoke: flags.smoke,
102
104
  install: flags.install,
@@ -28,6 +28,11 @@ export default class Skills extends Command {
28
28
  options: ["all", "project", "user"],
29
29
  default: "all",
30
30
  }),
31
+ limit: Flags.integer({ description: "Max discover results, clamped to 1-50 (default 50)" }),
32
+ offset: Flags.integer({ description: "Zero-based offset into the discover results (default 0)" }),
33
+ query: Flags.string({
34
+ description: "Filter discover results by name, description, source, or use conditions",
35
+ }),
31
36
  };
32
37
 
33
38
  static examples = [
@@ -36,6 +41,9 @@ export default class Skills extends Command {
36
41
  "# Machine-readable embedded skill content\n gjc skills read ralplan --json",
37
42
  "# Show filesystem-discovered skills (project and user) with diagnostics\n gjc skills discover",
38
43
  "# Show only project-scope skills (project .gjc/skills locations)\n gjc skills discover --source project --json",
44
+ "# Narrow a truncated catalog to the skills you care about\n gjc skills discover --query ego-browser",
45
+ "# Show only the first 10 discovered skills\n gjc skills discover --limit 10",
46
+ "# Page past the first 50: discover prints the exact next-page command\n gjc skills discover --offset 50",
39
47
  ];
40
48
 
41
49
  async run(): Promise<void> {
@@ -51,6 +59,9 @@ export default class Skills extends Command {
51
59
  flags: {
52
60
  json: flags.json,
53
61
  source: (flags.source as "all" | "project" | "user" | undefined) ?? "all",
62
+ limit: flags.limit,
63
+ offset: flags.offset,
64
+ query: flags.query,
54
65
  },
55
66
  };
56
67
  await runSkillsCommand(cmd);
@@ -360,6 +360,8 @@ export const TIER_MAP_SKIP_LIST = {
360
360
  "nvidia/thinkingmachines/inkling": { rationale: "post-rebase catalog addition from dev; not yet curated" },
361
361
  "nvidia/upstage/solar-10.7b-instruct": { rationale: "post-rebase catalog addition from dev; not yet curated" },
362
362
  "openai-codex/gpt-6-astra": { rationale: "GPT-6 Astra catalog addition (2026-09-03 release); not yet curated" },
363
+ "openai-codex/gpt-6-luna": { rationale: "GPT-6 Luna catalog addition (2026-09-22 release); not yet curated" },
364
+ "openai-codex/gpt-6-sol": { rationale: "GPT-6 Sol catalog addition (2026-09-22 release); not yet curated" },
363
365
  "openai-codex/gpt-daybreak-blue-latest": { rationale: "post-rebase catalog addition from dev; not yet curated" },
364
366
  "opencode-go/deepseek-v4-flash-vision-exp": {
365
367
  rationale: "post-rebase catalog addition from dev; not yet curated",
@@ -378,11 +380,13 @@ export const TIER_MAP_SKIP_LIST = {
378
380
  },
379
381
  "opencode-go/qwen3.8-flash": { rationale: "post-rebase catalog addition from dev; not yet curated" },
380
382
  "opencode-go/qwen3.8-max": { rationale: "post-rebase catalog addition from dev; not yet curated" },
383
+ "opencode-go/union-alpha": { rationale: "stealth model; capability tier not yet independently reviewed" },
381
384
  "opencode-zen/grok-4.6": { rationale: "post-rebase catalog addition from dev; not yet curated" },
382
385
  "opencode-zen/hy3-free": { rationale: "post-rebase catalog addition from dev; not yet curated" },
383
386
  "opencode-zen/kimi-k3": { rationale: "post-rebase catalog addition from dev; not yet curated" },
384
387
  "opencode-zen/ling-3.0-tiny-free": { rationale: "post-rebase catalog addition from dev; not yet curated" },
385
388
  "opencode-zen/nemotron-3.5-lightning-free": { rationale: "post-rebase catalog addition from dev; not yet curated" },
389
+ "opencode-zen/union-alpha": { rationale: "stealth model; capability tier not yet independently reviewed" },
386
390
  "openrouter/anthropic/claude-fable-5:batch": { rationale: "post-rebase catalog addition from dev; not yet curated" },
387
391
  "openrouter/anthropic/claude-haiku-4.5:batch": {
388
392
  rationale: "post-rebase catalog addition from dev; not yet curated",
@@ -539,6 +543,18 @@ export const TIER_MAP_SKIP_LIST = {
539
543
  "alibaba-token-plan/glm-5.2": { baseline: true, rationale: "pre-feature baseline; not yet curated" },
540
544
  "alibaba-token-plan/qwen3.8-max": { baseline: true, rationale: "post-feature catalog addition; not yet curated" },
541
545
  "alibaba-token-plan/qwen3.8-max-preview": { baseline: true, rationale: "pre-feature baseline; not yet curated" },
546
+ "alibaba-token-plan/deepseek-v4-pro-0813": {
547
+ baseline: true,
548
+ rationale: "post-feature catalog addition; not yet curated",
549
+ },
550
+ "alibaba-token-plan/deepseek-v4.1-flash": {
551
+ baseline: true,
552
+ rationale: "post-feature catalog addition; not yet curated",
553
+ },
554
+ "alibaba-token-plan/glm-5.3": {
555
+ baseline: true,
556
+ rationale: "post-feature catalog addition; not yet curated",
557
+ },
542
558
  "amazon-bedrock/anthropic.claude-3-5-haiku-20241022-v1:0": {
543
559
  baseline: true,
544
560
  rationale: "pre-feature baseline; not yet curated",