@gajae-code/coding-agent 0.17.2 → 0.17.5

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 (390) hide show
  1. package/CHANGELOG.md +267 -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 +1049 -3
  18. package/dist/types/config/file-lock.d.ts +13 -3
  19. package/dist/types/config/model-profile-activation.d.ts +45 -1
  20. package/dist/types/config/model-registry.d.ts +14 -3
  21. package/dist/types/config/model-resolver.d.ts +1 -1
  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/daemon/operator-contract.d.ts +5 -1
  25. package/dist/types/eval/js/worker-protocol.d.ts +2 -0
  26. package/dist/types/exec/bash-executor.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/gjc-plugins/runtime-adapters.d.ts +11 -2
  30. package/dist/types/extensibility/runtime-skill-discovery.d.ts +18 -0
  31. package/dist/types/extensibility/shared-events.d.ts +3 -1
  32. package/dist/types/gjc-runtime/session-state-lock.d.ts +61 -0
  33. package/dist/types/gjc-runtime/state-writer.d.ts +14 -1
  34. package/dist/types/harness-control-plane/control-endpoint.d.ts +4 -1
  35. package/dist/types/harness-control-plane/finalize.d.ts +14 -3
  36. package/dist/types/internal-urls/embedded-protocol.d.ts +9 -0
  37. package/dist/types/internal-urls/index.d.ts +1 -0
  38. package/dist/types/internal-urls/parse.d.ts +9 -1
  39. package/dist/types/main.d.ts +23 -1
  40. package/dist/types/modes/acp/acp-agent.d.ts +55 -1
  41. package/dist/types/modes/acp/startup-provenance.d.ts +16 -0
  42. package/dist/types/modes/components/custom-provider-wizard.d.ts +19 -1
  43. package/dist/types/modes/components/session-selector.d.ts +5 -2
  44. package/dist/types/modes/components/user-message-selector.d.ts +5 -2
  45. package/dist/types/modes/controllers/command-controller.d.ts +1 -1
  46. package/dist/types/modes/controllers/selector-controller.d.ts +1 -1
  47. package/dist/types/modes/interactive-mode.d.ts +1 -1
  48. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +11 -1
  49. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +14 -1
  50. package/dist/types/modes/types.d.ts +2 -2
  51. package/dist/types/runtime/process-lifecycle.d.ts +2 -0
  52. package/dist/types/runtime-mcp/loader.d.ts +2 -0
  53. package/dist/types/runtime-mcp/manager.d.ts +69 -6
  54. package/dist/types/runtime-mcp/pool.d.ts +17 -0
  55. package/dist/types/runtime-mcp/redaction.d.ts +20 -0
  56. package/dist/types/runtime-mcp/startup-policy.d.ts +6 -0
  57. package/dist/types/runtime-mcp/tool-bridge.d.ts +9 -0
  58. package/dist/types/runtime-mcp/transports/http.d.ts +11 -0
  59. package/dist/types/sdk/broker/broker.d.ts +17 -4
  60. package/dist/types/sdk/broker/ensure.d.ts +3 -0
  61. package/dist/types/sdk/broker/identity.d.ts +5 -1
  62. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +23 -3
  63. package/dist/types/sdk/broker/lifecycle.d.ts +15 -8
  64. package/dist/types/sdk/broker/managed-task-dag.d.ts +1335 -0
  65. package/dist/types/sdk/broker/managed-task-verification.d.ts +37 -0
  66. package/dist/types/sdk/broker/runtime.d.ts +1 -1
  67. package/dist/types/sdk/broker/session-index.d.ts +22 -3
  68. package/dist/types/sdk/broker/spawn-authority.d.ts +12 -0
  69. package/dist/types/sdk/broker/startup-failure.d.ts +4 -0
  70. package/dist/types/sdk/broker/stderr-drainer.d.ts +13 -0
  71. package/dist/types/sdk/bus/index.d.ts +19 -0
  72. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +7 -1
  73. package/dist/types/sdk/bus/telegram-daemon.d.ts +5 -0
  74. package/dist/types/sdk/cli/master-cli.d.ts +6 -10
  75. package/dist/types/sdk/cli/rows.d.ts +19 -1
  76. package/dist/types/sdk/cli/session-cli.d.ts +22 -5
  77. package/dist/types/sdk/client/client.d.ts +2 -0
  78. package/dist/types/sdk/guides/cli.d.ts +3 -4
  79. package/dist/types/sdk/guides/verify.d.ts +2 -0
  80. package/dist/types/sdk/host/host.d.ts +9 -0
  81. package/dist/types/sdk/host/session-runtime.d.ts +31 -0
  82. package/dist/types/sdk/host/types.d.ts +10 -0
  83. package/dist/types/sdk/index.d.ts +1 -0
  84. package/dist/types/sdk/prompt-deadline-flush.d.ts +85 -0
  85. package/dist/types/sdk/prompt-deadline-manager.d.ts +37 -0
  86. package/dist/types/sdk/prompt-tool-boundary.d.ts +73 -0
  87. package/dist/types/sdk/router/session-router.d.ts +2 -0
  88. package/dist/types/sdk/session.d.ts +3 -3
  89. package/dist/types/sdk/startup-capability.d.ts +2 -0
  90. package/dist/types/sdk/transport/relay.d.ts +1 -0
  91. package/dist/types/sdk/transport/serve-cli.d.ts +48 -4
  92. package/dist/types/sdk/transport/stdio.d.ts +5 -1
  93. package/dist/types/session/agent-session.d.ts +175 -23
  94. package/dist/types/session/fallback-chain-controller.d.ts +6 -6
  95. package/dist/types/session/fold-coordinator.d.ts +17 -3
  96. package/dist/types/session/internal/managed-session-storage.d.ts +7 -1
  97. package/dist/types/session/session-manager.d.ts +64 -1
  98. package/dist/types/session/session-work-lease.d.ts +14 -0
  99. package/dist/types/setup/model-onboarding-guidance.d.ts +1 -1
  100. package/dist/types/setup/provider-onboarding.d.ts +81 -1
  101. package/dist/types/task/types.d.ts +2 -0
  102. package/dist/types/tools/bash-interactive.d.ts +1 -0
  103. package/dist/types/tools/bash.d.ts +37 -11
  104. package/dist/types/tools/fetch.d.ts +10 -1
  105. package/dist/types/tools/job.d.ts +1 -1
  106. package/dist/types/tools/steer-fold.d.ts +31 -0
  107. package/dist/types/tools/subagent.d.ts +8 -1
  108. package/dist/types/utils/git.d.ts +28 -2
  109. package/dist/types/utils/mupdf-embedded.d.ts +2 -0
  110. package/dist/types/utils/mupdf.d.ts +4 -0
  111. package/dist/types/utils/session-title-generation.d.ts +6 -0
  112. package/dist/types/utils/title-generator.d.ts +11 -2
  113. package/dist/types/web/scrapers/types.d.ts +3 -0
  114. package/package.json +18 -10
  115. package/scripts/build-binary.ts +9 -3
  116. package/scripts/compile-args.ts +0 -9
  117. package/scripts/embed-mupdf.ts +52 -0
  118. package/scripts/generate-sdk-operation-inventory.ts +31 -1
  119. package/scripts/vendor-markit.ts +196 -0
  120. package/src/async/job-manager.ts +22 -1
  121. package/src/cli/daemon-cli.ts +53 -18
  122. package/src/cli/github-release.ts +87 -5
  123. package/src/cli/mcp-cli.ts +38 -4
  124. package/src/cli/public-command-entry.ts +450 -0
  125. package/src/cli/public-command-errors.ts +581 -0
  126. package/src/cli/public-command-evidence.ts +717 -0
  127. package/src/cli/public-command-help.ts +360 -0
  128. package/src/cli/public-command-registry.ts +541 -0
  129. package/src/cli/session-picker.ts +2 -1
  130. package/src/cli/setup-cli.ts +10 -1
  131. package/src/cli/skills-cli.ts +46 -2
  132. package/src/cli/stats-cli.ts +11 -1
  133. package/src/cli.ts +61 -1
  134. package/src/commands/daemon.ts +65 -69
  135. package/src/commands/sdk.ts +175 -117
  136. package/src/commands/setup.ts +2 -0
  137. package/src/commands/skills.ts +11 -0
  138. package/src/config/autorouting-tier-map.ts +543 -3
  139. package/src/config/file-lock.ts +206 -65
  140. package/src/config/model-discovery-manager.ts +4 -4
  141. package/src/config/model-profile-activation.ts +417 -66
  142. package/src/config/model-registry.ts +254 -36
  143. package/src/config/model-resolver.ts +6 -1
  144. package/src/config/settings-schema.ts +26 -2
  145. package/src/coordinator-mcp/policy.ts +10 -5
  146. package/src/coordinator-mcp/question-gate-codec.ts +17 -0
  147. package/src/coordinator-mcp/question-state.ts +179 -9
  148. package/src/coordinator-mcp/server.ts +521 -87
  149. package/src/coordinator-mcp/session-reaper.ts +6 -4
  150. package/src/crash/record-loader.ts +6 -2
  151. package/src/daemon/operator-contract.ts +26 -12
  152. package/src/defaults/gjc/skills/ultragoal/SKILL.md +1 -1
  153. package/src/eval/js/context-manager.ts +8 -8
  154. package/src/eval/js/worker-core.ts +9 -4
  155. package/src/eval/js/worker-protocol.ts +2 -0
  156. package/src/exec/bash-executor.ts +3 -0
  157. package/src/extensibility/extensions/runner.ts +52 -4
  158. package/src/extensibility/extensions/types.ts +10 -0
  159. package/src/extensibility/gjc-plugins/registry.ts +196 -37
  160. package/src/extensibility/gjc-plugins/runtime-adapters.ts +46 -8
  161. package/src/extensibility/runtime-skill-discovery.ts +61 -3
  162. package/src/extensibility/shared-events.ts +3 -1
  163. package/src/gjc-runtime/session-state-lock.ts +165 -24
  164. package/src/gjc-runtime/state-writer.ts +317 -6
  165. package/src/gjc-runtime/ultragoal-succession.ts +31 -3
  166. package/src/harness-control-plane/control-endpoint.ts +24 -6
  167. package/src/harness-control-plane/finalize.ts +312 -25
  168. package/src/harness-control-plane/owner.ts +323 -89
  169. package/src/internal-urls/docs-index.generated.ts +23 -20
  170. package/src/internal-urls/embedded-protocol.ts +83 -0
  171. package/src/internal-urls/index.ts +1 -0
  172. package/src/internal-urls/parse.ts +21 -1
  173. package/src/internal-urls/router.ts +4 -2
  174. package/src/main.ts +192 -74
  175. package/src/modes/acp/acp-agent.ts +973 -56
  176. package/src/modes/acp/startup-provenance.ts +59 -0
  177. package/src/modes/components/custom-provider-wizard.ts +308 -7
  178. package/src/modes/components/gjc-bundle-settings.ts +21 -1
  179. package/src/modes/components/oauth-selector.ts +9 -0
  180. package/src/modes/components/session-selector.ts +47 -4
  181. package/src/modes/components/tool-status-header.ts +72 -6
  182. package/src/modes/components/user-message-selector.ts +57 -15
  183. package/src/modes/controllers/command-controller.ts +58 -32
  184. package/src/modes/controllers/extension-ui-controller.ts +33 -7
  185. package/src/modes/controllers/input-controller.ts +4 -0
  186. package/src/modes/controllers/runtime-mcp-command-controller.ts +1 -1
  187. package/src/modes/controllers/selector-controller.ts +161 -15
  188. package/src/modes/interactive-mode.ts +21 -7
  189. package/src/modes/runtime-init.ts +1 -0
  190. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +124 -7
  191. package/src/modes/shared/agent-wire/workflow-gate-types.ts +16 -2
  192. package/src/modes/types.ts +2 -2
  193. package/src/prompts/agent-fragments/browser-aside.md +1 -0
  194. package/src/prompts/system/title-system.md +1 -1
  195. package/src/prompts/tools/bash.md +1 -1
  196. package/src/prompts/tools/job.md +1 -1
  197. package/src/prompts/tools/read.md +2 -0
  198. package/src/runtime/network-prewarm-service.test.ts +36 -1
  199. package/src/runtime/network-prewarm-service.ts +28 -3
  200. package/src/runtime/process-lifecycle.ts +22 -11
  201. package/src/runtime-mcp/config.ts +16 -1
  202. package/src/runtime-mcp/loader.ts +6 -3
  203. package/src/runtime-mcp/manager.ts +845 -109
  204. package/src/runtime-mcp/pool.test.ts +31 -0
  205. package/src/runtime-mcp/pool.ts +304 -28
  206. package/src/runtime-mcp/redaction.ts +42 -0
  207. package/src/runtime-mcp/startup-policy.ts +7 -0
  208. package/src/runtime-mcp/tool-bridge.ts +71 -0
  209. package/src/runtime-mcp/transports/http.ts +108 -25
  210. package/src/sdk/acp/adapter.ts +27 -8
  211. package/src/sdk/broker/broker.ts +1431 -198
  212. package/src/sdk/broker/ensure.ts +21 -3
  213. package/src/sdk/broker/identity.ts +22 -1
  214. package/src/sdk/broker/lifecycle-ledger.ts +95 -31
  215. package/src/sdk/broker/lifecycle.ts +690 -141
  216. package/src/sdk/broker/managed-task-dag.ts +1927 -0
  217. package/src/sdk/broker/managed-task-verification.ts +642 -0
  218. package/src/sdk/broker/runtime.ts +1 -1
  219. package/src/sdk/broker/session-index.ts +97 -4
  220. package/src/sdk/broker/spawn-authority.ts +175 -14
  221. package/src/sdk/broker/startup-failure.ts +80 -1
  222. package/src/sdk/broker/stderr-drainer.ts +59 -0
  223. package/src/sdk/broker/transport.ts +1 -0
  224. package/src/sdk/bus/chat-daemon-control.ts +2 -2
  225. package/src/sdk/bus/chat-daemon-runtime.ts +1 -0
  226. package/src/sdk/bus/index.ts +707 -81
  227. package/src/sdk/bus/telegram-daemon-cli.ts +31 -2
  228. package/src/sdk/bus/telegram-daemon-contract.ts +7 -1
  229. package/src/sdk/bus/telegram-daemon.ts +10 -3
  230. package/src/sdk/cli/master-cli.ts +47 -36
  231. package/src/sdk/cli/rows.ts +30 -7
  232. package/src/sdk/cli/session-cli.ts +705 -184
  233. package/src/sdk/client/client.ts +18 -0
  234. package/src/sdk/guides/catalog.ts +2 -2
  235. package/src/sdk/guides/cli.ts +20 -62
  236. package/src/sdk/guides/verify.ts +14 -0
  237. package/src/sdk/host/host.ts +49 -5
  238. package/src/sdk/host/session-runtime.test.ts +184 -2
  239. package/src/sdk/host/session-runtime.ts +322 -101
  240. package/src/sdk/host/types.ts +12 -1
  241. package/src/sdk/host/websocket-transport.lifecycle.test.ts +84 -0
  242. package/src/sdk/host/websocket-transport.ts +40 -6
  243. package/src/sdk/index.ts +11 -0
  244. package/src/sdk/lifecycle/service.ts +2 -0
  245. package/src/sdk/prompt-deadline-flush.ts +356 -0
  246. package/src/sdk/prompt-deadline-manager.ts +133 -1
  247. package/src/sdk/prompt-tool-boundary.ts +121 -0
  248. package/src/sdk/protocol/operation-inventory.generated.json +106 -0
  249. package/src/sdk/router/session-router.ts +9 -1
  250. package/src/sdk/session.ts +763 -116
  251. package/src/sdk/startup-capability.ts +1 -1
  252. package/src/sdk/transport/relay.ts +71 -6
  253. package/src/sdk/transport/serve-cli.ts +397 -42
  254. package/src/sdk/transport/socket.ts +12 -11
  255. package/src/sdk/transport/stdio.ts +7 -3
  256. package/src/session/agent-session.ts +2472 -407
  257. package/src/session/fallback-chain-controller.ts +6 -7
  258. package/src/session/fold-coordinator.ts +24 -5
  259. package/src/session/internal/managed-session-scope.ts +68 -18
  260. package/src/session/internal/managed-session-storage.ts +334 -12
  261. package/src/session/session-manager.ts +382 -44
  262. package/src/session/session-work-lease.ts +34 -0
  263. package/src/setup/model-onboarding-guidance.ts +1 -1
  264. package/src/setup/provider-onboarding.ts +397 -24
  265. package/src/setup/provider-presets.json +2 -1
  266. package/src/slash-commands/builtin-registry.ts +259 -15
  267. package/src/task/executor.ts +46 -17
  268. package/src/task/index.ts +14 -2
  269. package/src/task/types.ts +2 -0
  270. package/src/tools/bash-interactive.ts +2 -0
  271. package/src/tools/bash.ts +118 -78
  272. package/src/tools/fetch.ts +140 -25
  273. package/src/tools/job.ts +151 -25
  274. package/src/tools/output-meta.ts +15 -2
  275. package/src/tools/path-utils.ts +27 -3
  276. package/src/tools/read.ts +3 -3
  277. package/src/tools/steer-fold.ts +107 -0
  278. package/src/tools/subagent-render.ts +24 -1
  279. package/src/tools/subagent.ts +27 -1
  280. package/src/tools/tool-catalog.generated.ts +29 -2
  281. package/src/tools/tool-errors.ts +4 -0
  282. package/src/utils/git.ts +53 -3
  283. package/src/utils/markit.ts +55 -41
  284. package/src/utils/mupdf-assets.d.ts +4 -0
  285. package/src/utils/mupdf-embedded.ts +4 -0
  286. package/src/utils/mupdf.ts +136 -0
  287. package/src/utils/session-title-generation.ts +29 -0
  288. package/src/utils/title-generator.ts +46 -2
  289. package/src/web/scrapers/types.ts +24 -3
  290. package/vendor/markit-ai/LICENSE +21 -0
  291. package/vendor/markit-ai/MANIFEST.json +412 -0
  292. package/vendor/markit-ai/dist/commands/config.d.ts +4 -0
  293. package/vendor/markit-ai/dist/commands/config.js +139 -0
  294. package/vendor/markit-ai/dist/commands/convert.d.ts +6 -0
  295. package/vendor/markit-ai/dist/commands/convert.js +113 -0
  296. package/vendor/markit-ai/dist/commands/formats.d.ts +2 -0
  297. package/vendor/markit-ai/dist/commands/formats.js +92 -0
  298. package/vendor/markit-ai/dist/commands/init.d.ts +2 -0
  299. package/vendor/markit-ai/dist/commands/init.js +29 -0
  300. package/vendor/markit-ai/dist/commands/onboard.d.ts +2 -0
  301. package/vendor/markit-ai/dist/commands/onboard.js +61 -0
  302. package/vendor/markit-ai/dist/commands/plugin.d.ts +4 -0
  303. package/vendor/markit-ai/dist/commands/plugin.js +58 -0
  304. package/vendor/markit-ai/dist/config.d.ts +26 -0
  305. package/vendor/markit-ai/dist/config.js +42 -0
  306. package/vendor/markit-ai/dist/converters/audio.d.ts +7 -0
  307. package/vendor/markit-ai/dist/converters/audio.js +104 -0
  308. package/vendor/markit-ai/dist/converters/csv.d.ts +7 -0
  309. package/vendor/markit-ai/dist/converters/csv.js +83 -0
  310. package/vendor/markit-ai/dist/converters/docx.d.ts +6 -0
  311. package/vendor/markit-ai/dist/converters/docx.js +57 -0
  312. package/vendor/markit-ai/dist/converters/epub.d.ts +8 -0
  313. package/vendor/markit-ai/dist/converters/epub.js +128 -0
  314. package/vendor/markit-ai/dist/converters/github.d.ts +18 -0
  315. package/vendor/markit-ai/dist/converters/github.js +148 -0
  316. package/vendor/markit-ai/dist/converters/html.d.ts +6 -0
  317. package/vendor/markit-ai/dist/converters/html.js +30 -0
  318. package/vendor/markit-ai/dist/converters/image.d.ts +6 -0
  319. package/vendor/markit-ai/dist/converters/image.js +124 -0
  320. package/vendor/markit-ai/dist/converters/ipynb.d.ts +6 -0
  321. package/vendor/markit-ai/dist/converters/ipynb.js +75 -0
  322. package/vendor/markit-ai/dist/converters/iwork.d.ts +20 -0
  323. package/vendor/markit-ai/dist/converters/iwork.js +391 -0
  324. package/vendor/markit-ai/dist/converters/json.d.ts +6 -0
  325. package/vendor/markit-ai/dist/converters/json.js +21 -0
  326. package/vendor/markit-ai/dist/converters/pdf/columns.d.ts +35 -0
  327. package/vendor/markit-ai/dist/converters/pdf/columns.js +93 -0
  328. package/vendor/markit-ai/dist/converters/pdf/extract.d.ts +19 -0
  329. package/vendor/markit-ai/dist/converters/pdf/extract.js +514 -0
  330. package/vendor/markit-ai/dist/converters/pdf/grid.d.ts +25 -0
  331. package/vendor/markit-ai/dist/converters/pdf/grid.js +795 -0
  332. package/vendor/markit-ai/dist/converters/pdf/headers.d.ts +24 -0
  333. package/vendor/markit-ai/dist/converters/pdf/headers.js +108 -0
  334. package/vendor/markit-ai/dist/converters/pdf/index.d.ts +19 -0
  335. package/vendor/markit-ai/dist/converters/pdf/index.js +136 -0
  336. package/vendor/markit-ai/dist/converters/pdf/mupdf-loader.js +9 -0
  337. package/vendor/markit-ai/dist/converters/pdf/render.d.ts +24 -0
  338. package/vendor/markit-ai/dist/converters/pdf/render.js +513 -0
  339. package/vendor/markit-ai/dist/converters/pdf/types.d.ts +75 -0
  340. package/vendor/markit-ai/dist/converters/pdf/types.js +1 -0
  341. package/vendor/markit-ai/dist/converters/plain-text.d.ts +6 -0
  342. package/vendor/markit-ai/dist/converters/plain-text.js +87 -0
  343. package/vendor/markit-ai/dist/converters/pptx.d.ts +8 -0
  344. package/vendor/markit-ai/dist/converters/pptx.js +289 -0
  345. package/vendor/markit-ai/dist/converters/rss.d.ts +11 -0
  346. package/vendor/markit-ai/dist/converters/rss.js +138 -0
  347. package/vendor/markit-ai/dist/converters/wikipedia.d.ts +6 -0
  348. package/vendor/markit-ai/dist/converters/wikipedia.js +33 -0
  349. package/vendor/markit-ai/dist/converters/xlsx.d.ts +8 -0
  350. package/vendor/markit-ai/dist/converters/xlsx.js +147 -0
  351. package/vendor/markit-ai/dist/converters/xml.d.ts +6 -0
  352. package/vendor/markit-ai/dist/converters/xml.js +18 -0
  353. package/vendor/markit-ai/dist/converters/yaml.d.ts +6 -0
  354. package/vendor/markit-ai/dist/converters/yaml.js +17 -0
  355. package/vendor/markit-ai/dist/converters/zip.d.ts +8 -0
  356. package/vendor/markit-ai/dist/converters/zip.js +57 -0
  357. package/vendor/markit-ai/dist/index.d.ts +30 -0
  358. package/vendor/markit-ai/dist/index.js +26 -0
  359. package/vendor/markit-ai/dist/main.d.ts +2 -0
  360. package/vendor/markit-ai/dist/main.js +191 -0
  361. package/vendor/markit-ai/dist/markit.d.ts +45 -0
  362. package/vendor/markit-ai/dist/markit.js +267 -0
  363. package/vendor/markit-ai/dist/plugins/api.d.ts +7 -0
  364. package/vendor/markit-ai/dist/plugins/api.js +42 -0
  365. package/vendor/markit-ai/dist/plugins/index.d.ts +4 -0
  366. package/vendor/markit-ai/dist/plugins/index.js +3 -0
  367. package/vendor/markit-ai/dist/plugins/installer.d.ts +25 -0
  368. package/vendor/markit-ai/dist/plugins/installer.js +176 -0
  369. package/vendor/markit-ai/dist/plugins/loader.d.ts +6 -0
  370. package/vendor/markit-ai/dist/plugins/loader.js +61 -0
  371. package/vendor/markit-ai/dist/plugins/types.d.ts +25 -0
  372. package/vendor/markit-ai/dist/plugins/types.js +1 -0
  373. package/vendor/markit-ai/dist/providers/anthropic.d.ts +2 -0
  374. package/vendor/markit-ai/dist/providers/anthropic.js +47 -0
  375. package/vendor/markit-ai/dist/providers/index.d.ts +21 -0
  376. package/vendor/markit-ai/dist/providers/index.js +56 -0
  377. package/vendor/markit-ai/dist/providers/openai.d.ts +2 -0
  378. package/vendor/markit-ai/dist/providers/openai.js +76 -0
  379. package/vendor/markit-ai/dist/providers/types.d.ts +26 -0
  380. package/vendor/markit-ai/dist/providers/types.js +1 -0
  381. package/vendor/markit-ai/dist/types.d.ts +36 -0
  382. package/vendor/markit-ai/dist/types.js +1 -0
  383. package/vendor/markit-ai/dist/utils/exit-codes.d.ts +4 -0
  384. package/vendor/markit-ai/dist/utils/exit-codes.js +4 -0
  385. package/vendor/markit-ai/dist/utils/output.d.ts +22 -0
  386. package/vendor/markit-ai/dist/utils/output.js +31 -0
  387. package/vendor/markit-ai/dist/utils/turndown.d.ts +8 -0
  388. package/vendor/markit-ai/dist/utils/turndown.js +70 -0
  389. package/vendor/markit-ai/package.json +74 -0
  390. package/vendor/markit-ai.patch +49 -0
@@ -4,8 +4,10 @@ import * as fs from "node:fs/promises";
4
4
  import * as os from "node:os";
5
5
  import * as path from "node:path";
6
6
  import { logger } from "@gajae-code/utils";
7
- import { Args, CliParseError, Command, Flags, renderCommandHelp } from "@gajae-code/utils/cli";
7
+ import { Args, CliParseError, Command, Flags } from "@gajae-code/utils/cli";
8
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";
9
11
  import { parseModelString } from "../config/model-resolver";
10
12
  import { Settings } from "../config/settings";
11
13
  import { applyStartupModelProfiles, createSessionManager } from "../main";
@@ -26,13 +28,14 @@ import {
26
28
  type SessionLifecycleLaunchRequest,
27
29
  type SessionLifecycleTranscriptIdentity,
28
30
  sessionHostAttachedClients,
29
- sessionHostWorkInFlight,
31
+ sessionHostWorkLeaseActive,
30
32
  startBrokerDeadRegistrationSweep,
31
33
  writeSessionLifecycleFailure,
32
34
  writeSessionLifecycleReady,
33
35
  } from "../sdk/broker/lifecycle";
34
36
  import { processIncarnation } from "../sdk/broker/process-incarnation";
35
37
  import { writeBrokerStartupFailureMarker } from "../sdk/broker/startup-failure";
38
+ import { runSdkStderrDrainer } from "../sdk/broker/stderr-drainer";
36
39
  import { renderSdkSearchTable, runSdkSearch, runSdkSessionCli } from "../sdk/cli";
37
40
  import { renderSpawnTable, runSdkSpawn, SdkMasterCliError } from "../sdk/cli/master-cli";
38
41
  import { runSdkGuidesCli } from "../sdk/guides/cli";
@@ -209,10 +212,10 @@ export async function watchSessionHostBrokerLiveness(deps: {
209
212
  * no client attached before treating itself as abandoned.
210
213
  *
211
214
  * This cannot fire during healthy work. "Attached" is the host's own live
212
- * socket-subscription count, so a client that is merely idle — an editor
213
- * sitting on an open ACP session, a long agent turn with nobody typing — still
214
- * holds a socket and resets the window on every poll. Only a client that is
215
- * 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
216
219
  * reconnect budget (ACP's is seconds), so a crashed-and-restarted client
217
220
  * reattaches long before the window closes.
218
221
  */
@@ -238,8 +241,8 @@ const SESSION_HOST_ATTACHMENT_POLL_MS = 30_000;
238
241
  * from every client for a full idle grace, or nobody has come for it at all
239
242
  * for a full first-attach grace.
240
243
  *
241
- * `readAttachedClients` reports the host's own live client/socket subscription
242
- * 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
243
246
  * startup, after teardown, or when every reader itself fails. That ambiguity is
244
247
  * never instant detachment: it cannot reap on the poll that first sees it, it
245
248
  * can only open a window. Which window depends on what was already observed. A
@@ -250,28 +253,27 @@ const SESSION_HOST_ATTACHMENT_POLL_MS = 30_000;
250
253
  * an observed count of zero. Every reachable state therefore carries a finite
251
254
  * bound.
252
255
  *
253
- * `readWorkInFlight` reports whether the host is running agent work right now.
254
- * Work is positive proof a client did come for this host: a prompt can only
255
- * arrive over an endpoint a client dialed. Live work therefore restarts both
256
- * windows, which is what keeps a mid-prompt host alive whether its count reads
257
- * zero or stops being readable at all. That still bounds a host whose SDK
258
- * runtime never came up: with no transport it can never receive a prompt, so it
259
- * never reports work and its window keeps running from process start. And any
260
- * real turn ends, after which the window resumes; live work defers a bound, it
261
- * 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.
262
264
  */
263
265
  export async function watchSessionHostClientAttachment(deps: {
264
266
  readAttachedClients: () => number | undefined;
265
- readWorkInFlight?: () => boolean;
267
+ readWorkLease?: () => boolean;
266
268
  now?: () => number;
267
269
  sleep?: (ms: number) => Promise<void>;
268
270
  idleGraceMs?: number;
269
271
  firstAttachGraceMs?: number;
270
272
  pollMs?: number;
271
- }): Promise<void> {
273
+ }): Promise<"detached_idle"> {
272
274
  const now = deps.now ?? Date.now;
273
275
  const sleep = deps.sleep ?? (async ms => await Bun.sleep(ms));
274
- const readWorkInFlight = deps.readWorkInFlight ?? (() => false);
276
+ const readWorkLease = deps.readWorkLease ?? (() => false);
275
277
  const idleGraceMs = deps.idleGraceMs ?? SESSION_HOST_DETACHED_IDLE_GRACE_MS;
276
278
  const firstAttachGraceMs = deps.firstAttachGraceMs ?? SESSION_HOST_FIRST_ATTACH_GRACE_MS;
277
279
  const pollMs = deps.pollMs ?? SESSION_HOST_ATTACHMENT_POLL_MS;
@@ -281,7 +283,7 @@ export async function watchSessionHostClientAttachment(deps: {
281
283
  let unattendedSince = now();
282
284
  for (;;) {
283
285
  const attached = deps.readAttachedClients();
284
- if (readWorkInFlight()) {
286
+ if (readWorkLease()) {
285
287
  unattendedSince = now();
286
288
  detachedSince = null;
287
289
  }
@@ -294,9 +296,9 @@ export async function watchSessionHostClientAttachment(deps: {
294
296
  // registration stops publishing a count instead of reporting zero.
295
297
  // Both accrue against the idle bound rather than running forever.
296
298
  detachedSince ??= now();
297
- if (now() - detachedSince >= idleGraceMs) return;
299
+ if (now() - detachedSince >= idleGraceMs) return "detached_idle";
298
300
  } else if (now() - unattendedSince >= firstAttachGraceMs) {
299
- return;
301
+ return "detached_idle";
300
302
  }
301
303
  await sleep(pollMs);
302
304
  }
@@ -686,10 +688,10 @@ export async function runSessionHost(
686
688
  lifecycleTranscriptPath = session.sessionManager.getSessionFile();
687
689
  });
688
690
  let sessionDisposal: Promise<void> | undefined;
689
- const disposeSession = (): Promise<void> => {
691
+ const disposeSession = (reason?: "detached_idle"): Promise<void> => {
690
692
  sessionDisposal ??= (async () => {
691
693
  try {
692
- await session.dispose();
694
+ await session.dispose(reason === undefined ? {} : { sessionShutdownReason: reason });
693
695
  } catch (error) {
694
696
  if (!isSessionDisposalIncompleteError(error)) throw error;
695
697
  await session.awaitDisposeCompletion();
@@ -735,8 +737,8 @@ export async function runSessionHost(
735
737
  return failureRollback;
736
738
  };
737
739
  const sessionEndpointPath = path.join(request.stateRoot, "sdk", `${request.sessionId}.json`);
738
- const exitAfterSessionDisposal = async (): Promise<void> => {
739
- await disposeSession();
740
+ const exitAfterSessionDisposal = async (reason?: "detached_idle"): Promise<void> => {
741
+ await disposeSession(reason);
740
742
  let failure: SdkStartupFailure | undefined;
741
743
  try {
742
744
  const endpoint = JSON.parse(await fs.readFile(sessionEndpointPath, "utf8")) as {
@@ -766,11 +768,11 @@ export async function runSessionHost(
766
768
  process.exit(process.exitCode ?? 0);
767
769
  };
768
770
  let stopping = false;
769
- const stop = () => {
771
+ const stop = (reason?: "detached_idle") => {
770
772
  if (capability.result?.status === "started") {
771
773
  if (stopping) return;
772
774
  stopping = true;
773
- void exitAfterSessionDisposal();
775
+ void exitAfterSessionDisposal(reason);
774
776
  return;
775
777
  }
776
778
  const failure = capability.normalizeFailure("startup", "failed", "SDK lifecycle host terminated.");
@@ -858,31 +860,53 @@ export async function runSessionHost(
858
860
  await Bun.sleep(5_000);
859
861
  }
860
862
  startMemoryBackendAfterReadiness(startDeferredMemoryBackend);
861
- process.once("SIGTERM", stop);
862
- process.once("SIGINT", stop);
863
+ process.once("SIGTERM", () => stop());
864
+ process.once("SIGINT", () => stop());
863
865
  // Two independent bounds, either of which reaps this detached host through
864
866
  // the same graceful teardown a SIGTERM would take. The first covers a broker
865
867
  // that is gone for good; the second covers the opposite case, a perfectly
866
868
  // healthy broker whose host nobody is attached to any more and for which no
867
869
  // `session.close` will ever arrive.
868
- await Promise.race([
869
- watchSessionHostBrokerLiveness({ agentDir }),
870
+ const reapReason = await Promise.race([
871
+ watchSessionHostBrokerLiveness({ agentDir }).then(() => undefined),
870
872
  watchSessionHostClientAttachment({
871
873
  readAttachedClients: sessionHostAttachedClients,
872
- readWorkInFlight: sessionHostWorkInFlight,
874
+ readWorkLease: sessionHostWorkLeaseActive,
873
875
  }),
874
876
  ]);
875
- stop();
877
+ stop(reapReason);
876
878
  await new Promise<void>(() => {});
877
879
  }
878
880
 
879
- 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 };
880
885
 
881
886
  /** Parses the exact private argv contracts used by SDK child-process spawns. */
882
887
  export function parseSdkInternalArgv(argv: readonly string[]): SdkInternalArgv {
883
888
  if (argv[0] === "session-host-internal" && argv.length === 1) return { action: "session-host-internal" };
884
- 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
+ )
885
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
+ }
886
910
  throw new CliParseError("Invalid internal SDK invocation.");
887
911
  }
888
912
 
@@ -911,12 +935,12 @@ class SdkServeHelp extends Command {
911
935
 
912
936
  class SdkSessionHelp extends Command {
913
937
  static description =
914
- "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.";
915
939
  static args = {
916
940
  verb: Args.string({
917
941
  description: "Session verb",
918
942
  required: false,
919
- options: ["list", "inspect", "send", "status", "tail", "retire", "raw"],
943
+ options: ["list", "inspect", "send", "status", "tail", "close", "retire", "raw"],
920
944
  }),
921
945
  target: Args.string({
922
946
  description: "Session id (or the raw kind control|query|global for `raw`)",
@@ -943,7 +967,8 @@ class SdkSessionHelp extends Command {
943
967
  }),
944
968
  confirm: Flags.boolean({ description: "Confirm a destructive local CLI control operation" }),
945
969
  cursor: Flags.string({
946
- 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)",
947
972
  }),
948
973
  scope: Flags.string({
949
974
  description:
@@ -960,6 +985,10 @@ class SdkSessionHelp extends Command {
960
985
  strict: Flags.boolean({ description: "tail --strict: fail closed on retention gaps" }),
961
986
  "until-idle": Flags.boolean({ description: "tail --until-idle: exit after an observed terminal turn state" }),
962
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
+ }),
963
992
  page: Flags.boolean({ description: "raw global session.list: return exactly one broker page" }),
964
993
  };
965
994
  async run(): Promise<void> {}
@@ -1061,6 +1090,7 @@ class SdkSessionCommand extends Command {
1061
1090
  strict: Boolean(flagRec.strict),
1062
1091
  untilIdle: Boolean(flagRec["until-idle"]),
1063
1092
  allEvents: Boolean(flagRec["all-events"]),
1093
+ afterTranscriptId: flagRec["after-transcript-id"] as string | undefined,
1064
1094
  page: Boolean(flagRec.page),
1065
1095
  limit: flagRec.limit as number | undefined,
1066
1096
  agentDir: flagRec["agent-dir"] as string | undefined,
@@ -1100,95 +1130,123 @@ class SdkGuidesCommand extends Command {
1100
1130
  });
1101
1131
  }
1102
1132
  }
1103
-
1104
1133
  export default class Sdk extends Command {
1105
- static description =
1106
- "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.";
1107
1135
  static hidden = false;
1108
1136
  static delegateHelp = true;
1109
- static args = {
1110
- action: Args.string({ required: false, options: ["serve", "search", "spawn", "session", "guides"] }),
1111
- };
1112
- static flags = SdkServeHelp.flags;
1113
1137
  async run(): Promise<void> {
1114
- const action = this.argv[0];
1115
- if (this.argv.includes("--help") || this.argv.includes("-h")) {
1116
- const helpAction =
1117
- action === "serve"
1118
- ? "sdk serve"
1119
- : action === "search"
1120
- ? "sdk search"
1121
- : action === "spawn"
1122
- ? "sdk spawn"
1123
- : action === "session"
1124
- ? "sdk session"
1125
- : action === "guides"
1126
- ? "sdk guides"
1127
- : "sdk";
1128
- const helpCommand =
1129
- action === "serve"
1130
- ? SdkServeHelp
1131
- : action === "search"
1132
- ? SdkSearchCommand
1133
- : action === "spawn"
1134
- ? SdkSpawnCommand
1135
- : action === "session"
1136
- ? SdkSessionCommand
1137
- : action === "guides"
1138
- ? SdkGuidesCommand
1139
- : Sdk;
1140
- renderCommandHelp("gjc", helpAction, helpCommand);
1141
- return;
1142
- }
1143
- if (action === "search") {
1144
- await new SdkSearchCommand(this.argv.slice(1), this.config).run();
1145
- return;
1146
- }
1147
- if (action === "spawn") {
1148
- await new SdkSpawnCommand(this.argv.slice(1), this.config).run();
1149
- return;
1150
- }
1151
- if (action === "session") {
1152
- await new SdkSessionCommand(this.argv.slice(1), this.config).run();
1153
- return;
1154
- }
1155
- if (action === "guides") {
1156
- await new SdkGuidesCommand(this.argv.slice(1), this.config).run();
1157
- return;
1158
- }
1159
- if (action === "serve") {
1160
- try {
1161
- await runSdkServe(this.argv.slice(1));
1162
- } catch (error) {
1163
- if (!(error instanceof SdkServeError)) throw error;
1164
- // stdout is the frame channel in --stdio mode, so the envelope goes to
1165
- // stderr; returning instead of rethrowing is what keeps a session-selection
1166
- // failure from reaching the embedder as an uncaught exception.
1167
- process.stderr.write(
1168
- `${JSON.stringify({
1169
- ok: false,
1170
- error: {
1171
- code: error.code,
1172
- message: error.message,
1173
- ...(error.details === undefined ? {} : { details: error.details }),
1174
- // A broker teardown that failed alongside the primary failure is
1175
- // recorded on the error; dropping it here would hide from the
1176
- // embedder that the session may not have been released cleanly.
1177
- ...(error.cleanupError === undefined ? {} : { cleanupError: error.cleanupError }),
1178
- },
1179
- })}\n`,
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`,
1180
1171
  );
1181
- process.exitCode = error.exitCode;
1172
+ return;
1182
1173
  }
1183
- return;
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" });
1184
1239
  }
1185
- if (action !== "broker-internal" && action !== "session-host-internal")
1186
- throw new CliParseError("Expected action to be serve, search, spawn, session, or guides.");
1240
+
1187
1241
  const internal = parseSdkInternalArgv(this.argv);
1188
1242
  if (internal.action === "session-host-internal") {
1189
1243
  await runSessionHost();
1190
1244
  return;
1191
1245
  }
1246
+ if (internal.action === "stderr-drain-internal") {
1247
+ await runSdkStderrDrainer(internal.logPath, internal.maxBytes);
1248
+ return;
1249
+ }
1192
1250
  const agentDir = path.resolve(internal.agentDir);
1193
1251
  let broker: Broker | undefined;
1194
1252
  try {
@@ -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);