@gajae-code/coding-agent 0.17.2 → 0.17.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (349) hide show
  1. package/CHANGELOG.md +194 -0
  2. package/dist/types/cli/daemon-cli.d.ts +3 -1
  3. package/dist/types/cli/github-release.d.ts +17 -0
  4. package/dist/types/cli/public-command-entry.d.ts +56 -0
  5. package/dist/types/cli/public-command-errors.d.ts +126 -0
  6. package/dist/types/cli/public-command-evidence.d.ts +99 -0
  7. package/dist/types/cli/public-command-help.d.ts +65 -0
  8. package/dist/types/cli/public-command-registry.d.ts +69 -0
  9. package/dist/types/cli/session-picker.d.ts +1 -1
  10. package/dist/types/cli/setup-cli.d.ts +1 -0
  11. package/dist/types/cli/skills-cli.d.ts +5 -0
  12. package/dist/types/cli.d.ts +3 -0
  13. package/dist/types/commands/daemon.d.ts +4 -50
  14. package/dist/types/commands/sdk.d.ts +20 -37
  15. package/dist/types/commands/setup.d.ts +3 -0
  16. package/dist/types/commands/skills.d.ts +9 -0
  17. package/dist/types/config/autorouting-tier-map.d.ts +18 -0
  18. package/dist/types/config/file-lock.d.ts +9 -1
  19. package/dist/types/config/model-profile-activation.d.ts +45 -1
  20. package/dist/types/config/model-registry.d.ts +11 -2
  21. package/dist/types/config/settings-schema.d.ts +11 -0
  22. package/dist/types/coordinator-mcp/question-state.d.ts +6 -1
  23. package/dist/types/daemon/operator-contract.d.ts +5 -1
  24. package/dist/types/eval/js/worker-protocol.d.ts +2 -0
  25. package/dist/types/extensibility/extensions/types.d.ts +12 -0
  26. package/dist/types/extensibility/gjc-plugins/registry.d.ts +4 -0
  27. package/dist/types/extensibility/runtime-skill-discovery.d.ts +18 -0
  28. package/dist/types/extensibility/shared-events.d.ts +3 -1
  29. package/dist/types/gjc-runtime/session-state-lock.d.ts +61 -0
  30. package/dist/types/internal-urls/embedded-protocol.d.ts +9 -0
  31. package/dist/types/internal-urls/index.d.ts +1 -0
  32. package/dist/types/internal-urls/parse.d.ts +9 -1
  33. package/dist/types/main.d.ts +22 -0
  34. package/dist/types/modes/acp/acp-agent.d.ts +55 -1
  35. package/dist/types/modes/acp/startup-provenance.d.ts +16 -0
  36. package/dist/types/modes/components/custom-provider-wizard.d.ts +19 -1
  37. package/dist/types/modes/components/session-selector.d.ts +5 -2
  38. package/dist/types/modes/components/user-message-selector.d.ts +5 -2
  39. package/dist/types/modes/controllers/command-controller.d.ts +1 -1
  40. package/dist/types/modes/controllers/selector-controller.d.ts +1 -1
  41. package/dist/types/modes/interactive-mode.d.ts +1 -1
  42. package/dist/types/modes/shared/agent-wire/workflow-gate-broker.d.ts +11 -1
  43. package/dist/types/modes/shared/agent-wire/workflow-gate-types.d.ts +14 -1
  44. package/dist/types/modes/types.d.ts +2 -2
  45. package/dist/types/runtime/process-lifecycle.d.ts +2 -0
  46. package/dist/types/runtime-mcp/manager.d.ts +56 -0
  47. package/dist/types/runtime-mcp/pool.d.ts +17 -0
  48. package/dist/types/runtime-mcp/redaction.d.ts +20 -0
  49. package/dist/types/runtime-mcp/startup-policy.d.ts +6 -0
  50. package/dist/types/runtime-mcp/tool-bridge.d.ts +9 -0
  51. package/dist/types/runtime-mcp/transports/http.d.ts +11 -0
  52. package/dist/types/sdk/broker/broker.d.ts +13 -2
  53. package/dist/types/sdk/broker/identity.d.ts +3 -1
  54. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +23 -3
  55. package/dist/types/sdk/broker/lifecycle.d.ts +15 -8
  56. package/dist/types/sdk/broker/runtime.d.ts +1 -1
  57. package/dist/types/sdk/broker/session-index.d.ts +22 -3
  58. package/dist/types/sdk/broker/spawn-authority.d.ts +4 -0
  59. package/dist/types/sdk/broker/stderr-drainer.d.ts +13 -0
  60. package/dist/types/sdk/bus/index.d.ts +19 -0
  61. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +3 -1
  62. package/dist/types/sdk/bus/telegram-daemon.d.ts +5 -0
  63. package/dist/types/sdk/cli/master-cli.d.ts +6 -10
  64. package/dist/types/sdk/cli/rows.d.ts +19 -1
  65. package/dist/types/sdk/cli/session-cli.d.ts +22 -5
  66. package/dist/types/sdk/client/client.d.ts +2 -0
  67. package/dist/types/sdk/guides/cli.d.ts +3 -4
  68. package/dist/types/sdk/guides/verify.d.ts +2 -0
  69. package/dist/types/sdk/host/host.d.ts +9 -0
  70. package/dist/types/sdk/host/session-runtime.d.ts +31 -0
  71. package/dist/types/sdk/host/types.d.ts +10 -0
  72. package/dist/types/sdk/index.d.ts +1 -0
  73. package/dist/types/sdk/prompt-deadline-flush.d.ts +83 -0
  74. package/dist/types/sdk/prompt-deadline-manager.d.ts +37 -0
  75. package/dist/types/sdk/prompt-tool-boundary.d.ts +73 -0
  76. package/dist/types/sdk/router/session-router.d.ts +2 -0
  77. package/dist/types/sdk/startup-capability.d.ts +2 -0
  78. package/dist/types/sdk/transport/relay.d.ts +1 -0
  79. package/dist/types/sdk/transport/serve-cli.d.ts +48 -4
  80. package/dist/types/sdk/transport/stdio.d.ts +5 -1
  81. package/dist/types/session/agent-session.d.ts +168 -21
  82. package/dist/types/session/fallback-chain-controller.d.ts +6 -6
  83. package/dist/types/session/fold-coordinator.d.ts +17 -3
  84. package/dist/types/session/internal/managed-session-storage.d.ts +7 -1
  85. package/dist/types/session/session-manager.d.ts +64 -1
  86. package/dist/types/session/session-work-lease.d.ts +14 -0
  87. package/dist/types/setup/model-onboarding-guidance.d.ts +1 -1
  88. package/dist/types/setup/provider-onboarding.d.ts +81 -1
  89. package/dist/types/tools/bash.d.ts +37 -11
  90. package/dist/types/tools/job.d.ts +1 -1
  91. package/dist/types/tools/steer-fold.d.ts +31 -0
  92. package/dist/types/utils/git.d.ts +28 -2
  93. package/dist/types/utils/mupdf-embedded.d.ts +2 -0
  94. package/dist/types/utils/mupdf.d.ts +4 -0
  95. package/dist/types/utils/session-title-generation.d.ts +6 -0
  96. package/dist/types/utils/title-generator.d.ts +11 -2
  97. package/dist/types/web/scrapers/types.d.ts +3 -0
  98. package/package.json +18 -10
  99. package/scripts/build-binary.ts +9 -3
  100. package/scripts/compile-args.ts +0 -9
  101. package/scripts/embed-mupdf.ts +52 -0
  102. package/scripts/generate-sdk-operation-inventory.ts +31 -1
  103. package/scripts/vendor-markit.ts +196 -0
  104. package/src/async/job-manager.ts +22 -1
  105. package/src/cli/daemon-cli.ts +53 -18
  106. package/src/cli/github-release.ts +87 -5
  107. package/src/cli/mcp-cli.ts +38 -4
  108. package/src/cli/public-command-entry.ts +450 -0
  109. package/src/cli/public-command-errors.ts +581 -0
  110. package/src/cli/public-command-evidence.ts +717 -0
  111. package/src/cli/public-command-help.ts +360 -0
  112. package/src/cli/public-command-registry.ts +535 -0
  113. package/src/cli/session-picker.ts +2 -1
  114. package/src/cli/setup-cli.ts +9 -1
  115. package/src/cli/skills-cli.ts +46 -2
  116. package/src/cli.ts +61 -1
  117. package/src/commands/daemon.ts +65 -69
  118. package/src/commands/sdk.ts +175 -117
  119. package/src/commands/setup.ts +2 -0
  120. package/src/commands/skills.ts +11 -0
  121. package/src/config/autorouting-tier-map.ts +14 -0
  122. package/src/config/file-lock.ts +147 -51
  123. package/src/config/model-profile-activation.ts +334 -43
  124. package/src/config/model-registry.ts +183 -25
  125. package/src/config/settings-schema.ts +26 -2
  126. package/src/coordinator-mcp/policy.ts +10 -5
  127. package/src/coordinator-mcp/question-gate-codec.ts +17 -0
  128. package/src/coordinator-mcp/question-state.ts +175 -8
  129. package/src/coordinator-mcp/server.ts +507 -81
  130. package/src/coordinator-mcp/session-reaper.ts +6 -4
  131. package/src/crash/record-loader.ts +6 -2
  132. package/src/daemon/operator-contract.ts +26 -12
  133. package/src/defaults/gjc/skills/ultragoal/SKILL.md +1 -1
  134. package/src/eval/js/context-manager.ts +8 -8
  135. package/src/eval/js/worker-core.ts +9 -4
  136. package/src/eval/js/worker-protocol.ts +2 -0
  137. package/src/extensibility/extensions/runner.ts +52 -4
  138. package/src/extensibility/extensions/types.ts +10 -0
  139. package/src/extensibility/gjc-plugins/registry.ts +196 -37
  140. package/src/extensibility/runtime-skill-discovery.ts +61 -3
  141. package/src/extensibility/shared-events.ts +3 -1
  142. package/src/gjc-runtime/session-state-lock.ts +165 -24
  143. package/src/gjc-runtime/ultragoal-succession.ts +31 -3
  144. package/src/internal-urls/docs-index.generated.ts +20 -19
  145. package/src/internal-urls/embedded-protocol.ts +83 -0
  146. package/src/internal-urls/index.ts +1 -0
  147. package/src/internal-urls/parse.ts +21 -1
  148. package/src/internal-urls/router.ts +4 -2
  149. package/src/main.ts +123 -55
  150. package/src/modes/acp/acp-agent.ts +408 -35
  151. package/src/modes/acp/startup-provenance.ts +59 -0
  152. package/src/modes/components/custom-provider-wizard.ts +308 -7
  153. package/src/modes/components/oauth-selector.ts +9 -0
  154. package/src/modes/components/session-selector.ts +47 -4
  155. package/src/modes/components/user-message-selector.ts +57 -15
  156. package/src/modes/controllers/command-controller.ts +58 -32
  157. package/src/modes/controllers/extension-ui-controller.ts +33 -7
  158. package/src/modes/controllers/input-controller.ts +4 -0
  159. package/src/modes/controllers/selector-controller.ts +161 -15
  160. package/src/modes/interactive-mode.ts +21 -7
  161. package/src/modes/runtime-init.ts +1 -0
  162. package/src/modes/shared/agent-wire/workflow-gate-broker.ts +124 -7
  163. package/src/modes/shared/agent-wire/workflow-gate-types.ts +16 -2
  164. package/src/modes/types.ts +2 -2
  165. package/src/prompts/agent-fragments/browser-aside.md +1 -0
  166. package/src/prompts/system/title-system.md +1 -1
  167. package/src/prompts/tools/bash.md +1 -1
  168. package/src/prompts/tools/job.md +1 -1
  169. package/src/prompts/tools/read.md +2 -0
  170. package/src/runtime/network-prewarm-service.test.ts +36 -1
  171. package/src/runtime/network-prewarm-service.ts +28 -3
  172. package/src/runtime/process-lifecycle.ts +22 -11
  173. package/src/runtime-mcp/config.ts +16 -1
  174. package/src/runtime-mcp/manager.ts +689 -55
  175. package/src/runtime-mcp/pool.test.ts +31 -0
  176. package/src/runtime-mcp/pool.ts +304 -28
  177. package/src/runtime-mcp/redaction.ts +42 -0
  178. package/src/runtime-mcp/startup-policy.ts +7 -0
  179. package/src/runtime-mcp/tool-bridge.ts +71 -0
  180. package/src/runtime-mcp/transports/http.ts +108 -25
  181. package/src/sdk/acp/adapter.ts +27 -8
  182. package/src/sdk/broker/broker.ts +378 -52
  183. package/src/sdk/broker/identity.ts +9 -1
  184. package/src/sdk/broker/lifecycle-ledger.ts +95 -31
  185. package/src/sdk/broker/lifecycle.ts +690 -141
  186. package/src/sdk/broker/runtime.ts +1 -1
  187. package/src/sdk/broker/session-index.ts +97 -4
  188. package/src/sdk/broker/spawn-authority.ts +35 -7
  189. package/src/sdk/broker/stderr-drainer.ts +59 -0
  190. package/src/sdk/bus/chat-daemon-control.ts +2 -2
  191. package/src/sdk/bus/chat-daemon-runtime.ts +1 -0
  192. package/src/sdk/bus/index.ts +690 -80
  193. package/src/sdk/bus/telegram-daemon-cli.ts +31 -2
  194. package/src/sdk/bus/telegram-daemon-contract.ts +3 -1
  195. package/src/sdk/bus/telegram-daemon.ts +10 -3
  196. package/src/sdk/cli/master-cli.ts +47 -36
  197. package/src/sdk/cli/rows.ts +30 -7
  198. package/src/sdk/cli/session-cli.ts +687 -184
  199. package/src/sdk/client/client.ts +18 -0
  200. package/src/sdk/guides/catalog.ts +2 -2
  201. package/src/sdk/guides/cli.ts +20 -62
  202. package/src/sdk/guides/verify.ts +14 -0
  203. package/src/sdk/host/host.ts +49 -5
  204. package/src/sdk/host/session-runtime.test.ts +138 -2
  205. package/src/sdk/host/session-runtime.ts +311 -97
  206. package/src/sdk/host/types.ts +12 -1
  207. package/src/sdk/host/websocket-transport.lifecycle.test.ts +84 -0
  208. package/src/sdk/host/websocket-transport.ts +40 -6
  209. package/src/sdk/index.ts +11 -0
  210. package/src/sdk/prompt-deadline-flush.ts +334 -0
  211. package/src/sdk/prompt-deadline-manager.ts +133 -1
  212. package/src/sdk/prompt-tool-boundary.ts +121 -0
  213. package/src/sdk/protocol/operation-inventory.generated.json +106 -0
  214. package/src/sdk/router/session-router.ts +9 -1
  215. package/src/sdk/session.ts +182 -7
  216. package/src/sdk/startup-capability.ts +1 -1
  217. package/src/sdk/transport/relay.ts +71 -6
  218. package/src/sdk/transport/serve-cli.ts +397 -42
  219. package/src/sdk/transport/socket.ts +12 -11
  220. package/src/sdk/transport/stdio.ts +7 -3
  221. package/src/session/agent-session.ts +2437 -400
  222. package/src/session/fallback-chain-controller.ts +6 -7
  223. package/src/session/fold-coordinator.ts +24 -5
  224. package/src/session/internal/managed-session-scope.ts +58 -18
  225. package/src/session/internal/managed-session-storage.ts +304 -11
  226. package/src/session/session-manager.ts +382 -44
  227. package/src/session/session-work-lease.ts +34 -0
  228. package/src/setup/model-onboarding-guidance.ts +1 -1
  229. package/src/setup/provider-onboarding.ts +397 -24
  230. package/src/slash-commands/builtin-registry.ts +258 -14
  231. package/src/task/index.ts +14 -2
  232. package/src/tools/bash.ts +98 -78
  233. package/src/tools/fetch.ts +119 -20
  234. package/src/tools/job.ts +151 -25
  235. package/src/tools/output-meta.ts +15 -2
  236. package/src/tools/path-utils.ts +27 -3
  237. package/src/tools/read.ts +3 -3
  238. package/src/tools/steer-fold.ts +107 -0
  239. package/src/tools/tool-catalog.generated.ts +29 -2
  240. package/src/tools/tool-errors.ts +4 -0
  241. package/src/utils/git.ts +53 -3
  242. package/src/utils/markit.ts +55 -41
  243. package/src/utils/mupdf-assets.d.ts +4 -0
  244. package/src/utils/mupdf-embedded.ts +4 -0
  245. package/src/utils/mupdf.ts +129 -0
  246. package/src/utils/session-title-generation.ts +29 -0
  247. package/src/utils/title-generator.ts +46 -2
  248. package/src/web/scrapers/types.ts +24 -3
  249. package/vendor/markit-ai/LICENSE +21 -0
  250. package/vendor/markit-ai/MANIFEST.json +412 -0
  251. package/vendor/markit-ai/dist/commands/config.d.ts +4 -0
  252. package/vendor/markit-ai/dist/commands/config.js +139 -0
  253. package/vendor/markit-ai/dist/commands/convert.d.ts +6 -0
  254. package/vendor/markit-ai/dist/commands/convert.js +113 -0
  255. package/vendor/markit-ai/dist/commands/formats.d.ts +2 -0
  256. package/vendor/markit-ai/dist/commands/formats.js +92 -0
  257. package/vendor/markit-ai/dist/commands/init.d.ts +2 -0
  258. package/vendor/markit-ai/dist/commands/init.js +29 -0
  259. package/vendor/markit-ai/dist/commands/onboard.d.ts +2 -0
  260. package/vendor/markit-ai/dist/commands/onboard.js +61 -0
  261. package/vendor/markit-ai/dist/commands/plugin.d.ts +4 -0
  262. package/vendor/markit-ai/dist/commands/plugin.js +58 -0
  263. package/vendor/markit-ai/dist/config.d.ts +26 -0
  264. package/vendor/markit-ai/dist/config.js +42 -0
  265. package/vendor/markit-ai/dist/converters/audio.d.ts +7 -0
  266. package/vendor/markit-ai/dist/converters/audio.js +104 -0
  267. package/vendor/markit-ai/dist/converters/csv.d.ts +7 -0
  268. package/vendor/markit-ai/dist/converters/csv.js +83 -0
  269. package/vendor/markit-ai/dist/converters/docx.d.ts +6 -0
  270. package/vendor/markit-ai/dist/converters/docx.js +57 -0
  271. package/vendor/markit-ai/dist/converters/epub.d.ts +8 -0
  272. package/vendor/markit-ai/dist/converters/epub.js +128 -0
  273. package/vendor/markit-ai/dist/converters/github.d.ts +18 -0
  274. package/vendor/markit-ai/dist/converters/github.js +148 -0
  275. package/vendor/markit-ai/dist/converters/html.d.ts +6 -0
  276. package/vendor/markit-ai/dist/converters/html.js +30 -0
  277. package/vendor/markit-ai/dist/converters/image.d.ts +6 -0
  278. package/vendor/markit-ai/dist/converters/image.js +124 -0
  279. package/vendor/markit-ai/dist/converters/ipynb.d.ts +6 -0
  280. package/vendor/markit-ai/dist/converters/ipynb.js +75 -0
  281. package/vendor/markit-ai/dist/converters/iwork.d.ts +20 -0
  282. package/vendor/markit-ai/dist/converters/iwork.js +391 -0
  283. package/vendor/markit-ai/dist/converters/json.d.ts +6 -0
  284. package/vendor/markit-ai/dist/converters/json.js +21 -0
  285. package/vendor/markit-ai/dist/converters/pdf/columns.d.ts +35 -0
  286. package/vendor/markit-ai/dist/converters/pdf/columns.js +93 -0
  287. package/vendor/markit-ai/dist/converters/pdf/extract.d.ts +19 -0
  288. package/vendor/markit-ai/dist/converters/pdf/extract.js +514 -0
  289. package/vendor/markit-ai/dist/converters/pdf/grid.d.ts +25 -0
  290. package/vendor/markit-ai/dist/converters/pdf/grid.js +795 -0
  291. package/vendor/markit-ai/dist/converters/pdf/headers.d.ts +24 -0
  292. package/vendor/markit-ai/dist/converters/pdf/headers.js +108 -0
  293. package/vendor/markit-ai/dist/converters/pdf/index.d.ts +19 -0
  294. package/vendor/markit-ai/dist/converters/pdf/index.js +136 -0
  295. package/vendor/markit-ai/dist/converters/pdf/mupdf-loader.js +9 -0
  296. package/vendor/markit-ai/dist/converters/pdf/render.d.ts +24 -0
  297. package/vendor/markit-ai/dist/converters/pdf/render.js +513 -0
  298. package/vendor/markit-ai/dist/converters/pdf/types.d.ts +75 -0
  299. package/vendor/markit-ai/dist/converters/pdf/types.js +1 -0
  300. package/vendor/markit-ai/dist/converters/plain-text.d.ts +6 -0
  301. package/vendor/markit-ai/dist/converters/plain-text.js +87 -0
  302. package/vendor/markit-ai/dist/converters/pptx.d.ts +8 -0
  303. package/vendor/markit-ai/dist/converters/pptx.js +289 -0
  304. package/vendor/markit-ai/dist/converters/rss.d.ts +11 -0
  305. package/vendor/markit-ai/dist/converters/rss.js +138 -0
  306. package/vendor/markit-ai/dist/converters/wikipedia.d.ts +6 -0
  307. package/vendor/markit-ai/dist/converters/wikipedia.js +33 -0
  308. package/vendor/markit-ai/dist/converters/xlsx.d.ts +8 -0
  309. package/vendor/markit-ai/dist/converters/xlsx.js +147 -0
  310. package/vendor/markit-ai/dist/converters/xml.d.ts +6 -0
  311. package/vendor/markit-ai/dist/converters/xml.js +18 -0
  312. package/vendor/markit-ai/dist/converters/yaml.d.ts +6 -0
  313. package/vendor/markit-ai/dist/converters/yaml.js +17 -0
  314. package/vendor/markit-ai/dist/converters/zip.d.ts +8 -0
  315. package/vendor/markit-ai/dist/converters/zip.js +57 -0
  316. package/vendor/markit-ai/dist/index.d.ts +30 -0
  317. package/vendor/markit-ai/dist/index.js +26 -0
  318. package/vendor/markit-ai/dist/main.d.ts +2 -0
  319. package/vendor/markit-ai/dist/main.js +191 -0
  320. package/vendor/markit-ai/dist/markit.d.ts +45 -0
  321. package/vendor/markit-ai/dist/markit.js +267 -0
  322. package/vendor/markit-ai/dist/plugins/api.d.ts +7 -0
  323. package/vendor/markit-ai/dist/plugins/api.js +42 -0
  324. package/vendor/markit-ai/dist/plugins/index.d.ts +4 -0
  325. package/vendor/markit-ai/dist/plugins/index.js +3 -0
  326. package/vendor/markit-ai/dist/plugins/installer.d.ts +25 -0
  327. package/vendor/markit-ai/dist/plugins/installer.js +176 -0
  328. package/vendor/markit-ai/dist/plugins/loader.d.ts +6 -0
  329. package/vendor/markit-ai/dist/plugins/loader.js +61 -0
  330. package/vendor/markit-ai/dist/plugins/types.d.ts +25 -0
  331. package/vendor/markit-ai/dist/plugins/types.js +1 -0
  332. package/vendor/markit-ai/dist/providers/anthropic.d.ts +2 -0
  333. package/vendor/markit-ai/dist/providers/anthropic.js +47 -0
  334. package/vendor/markit-ai/dist/providers/index.d.ts +21 -0
  335. package/vendor/markit-ai/dist/providers/index.js +56 -0
  336. package/vendor/markit-ai/dist/providers/openai.d.ts +2 -0
  337. package/vendor/markit-ai/dist/providers/openai.js +76 -0
  338. package/vendor/markit-ai/dist/providers/types.d.ts +26 -0
  339. package/vendor/markit-ai/dist/providers/types.js +1 -0
  340. package/vendor/markit-ai/dist/types.d.ts +36 -0
  341. package/vendor/markit-ai/dist/types.js +1 -0
  342. package/vendor/markit-ai/dist/utils/exit-codes.d.ts +4 -0
  343. package/vendor/markit-ai/dist/utils/exit-codes.js +4 -0
  344. package/vendor/markit-ai/dist/utils/output.d.ts +22 -0
  345. package/vendor/markit-ai/dist/utils/output.js +31 -0
  346. package/vendor/markit-ai/dist/utils/turndown.d.ts +8 -0
  347. package/vendor/markit-ai/dist/utils/turndown.js +70 -0
  348. package/vendor/markit-ai/package.json +74 -0
  349. package/vendor/markit-ai.patch +49 -0
@@ -10,6 +10,7 @@ import {
10
10
  formatModelProfileDisplayLabel,
11
11
  type ModelProfileDefinition,
12
12
  PROXY_ROUTABLE_PROVIDER_IDS,
13
+ type ResolvedProfileBinding,
13
14
  resolveProfileBindings,
14
15
  } from "./model-profiles";
15
16
 
@@ -21,11 +22,13 @@ import {
21
22
  isAuthenticated,
22
23
  kNoAuth,
23
24
  type ModelRegistry,
25
+ registrySelectorResolvesToModel,
24
26
  } from "./model-registry";
25
27
  import {
26
28
  formatModelSelectorValue,
27
29
  formatModelString,
28
30
  parseModelString,
31
+ resolveConfiguredModelPatterns,
29
32
  resolveModelChainWithAuth,
30
33
  resolveModelRoleValue,
31
34
  splitSelectorThinkingSuffix,
@@ -69,7 +72,8 @@ type ModelProfileActivationSession = Pick<
69
72
  | "resolveModelByLookupAlias"
70
73
  | "authStorage"
71
74
  | "isCredentiallessProvider"
72
- >;
75
+ > &
76
+ Partial<Pick<ModelRegistry, "getAvailableForProfileActivation">>;
73
77
  getConfiguredModelChainState?: (role: string) => ConfiguredModelChainState | undefined;
74
78
  };
75
79
 
@@ -249,7 +253,12 @@ function concretizeMaterializedAssignmentValues(
249
253
  const sessionId = (options.session as { sessionId?: string }).sessionId;
250
254
  const credentialSessionId = options.session.credentialSessionId ?? sessionId;
251
255
  if (!modelRegistry || !sessionId) return assignments;
252
- const availableModels = modelRegistry.getAvailable();
256
+ // Materialized assignments are persisted into `modelRoles` and
257
+ // `task.agentModelOverrides` and later consumed by profile execution, so they
258
+ // must resolve against the descriptor-backed profile-activation catalog, not
259
+ // the broadened general one: otherwise a bare assignment can persist a
260
+ // bundled model that fresh live profile evidence excludes.
261
+ const availableModels = modelRegistry.getAvailableForProfileActivation?.() ?? modelRegistry.getAvailable();
253
262
  const authenticatedModels = availableModels.filter(model => {
254
263
  const isCredentiallessProvider = modelRegistry.isCredentiallessProvider?.bind(modelRegistry);
255
264
  const hasUsableAuth = modelRegistry.authStorage?.hasUsableAuth?.bind(modelRegistry.authStorage);
@@ -639,6 +648,245 @@ export function requiresQualifiedModelProfileRoleResolution(profile: Pick<ModelP
639
648
  return profile.source === "user" || profile.source === "registry";
640
649
  }
641
650
 
651
+ /** Resolve a removed saved-session default through the durable profile without mutating persistent state. */
652
+ export async function resolveMissingSessionModelRecovery(options: {
653
+ modelRegistry: PrepareModelProfileActivationOptions["modelRegistry"];
654
+ settings: Pick<Settings, "get" | "getModelRole">;
655
+ defaultEntries: readonly string[];
656
+ skips: Array<{ selector: string; reason: string }>;
657
+ savedDefault: string | undefined;
658
+ credentialSessionId: string;
659
+ aliasIntent?: "preset-equivalent";
660
+ }): Promise<
661
+ | {
662
+ profileName: string;
663
+ entries: string[];
664
+ model?: Model<Api>;
665
+ thinkingLevel?: ThinkingLevel;
666
+ explicitThinkingLevel: boolean;
667
+ activeIndex: number;
668
+ skips: Array<{ selector: string; reason: string }>;
669
+ }
670
+ | undefined
671
+ > {
672
+ const allSelectorsUnknown =
673
+ options.skips.length === options.defaultEntries.length &&
674
+ options.skips.every(skip => skip.reason === "unknown_model");
675
+ if (!allSelectorsUnknown) return undefined;
676
+ const fullCatalog = options.modelRegistry.getAll();
677
+ const savedSelectorsMissingFromCatalog = resolveConfiguredModelPatterns(
678
+ options.defaultEntries,
679
+ options.settings,
680
+ ).every(selector => {
681
+ if (
682
+ resolveModelRoleValue(selector, fullCatalog, {
683
+ settings: options.settings,
684
+ modelRegistry: options.modelRegistry,
685
+ credentialSessionId: options.credentialSessionId,
686
+ ...(options.aliasIntent ? { aliasIntent: options.aliasIntent } : {}),
687
+ }).model
688
+ )
689
+ return false;
690
+ return !registrySelectorResolvesToModel(selector, fullCatalog);
691
+ });
692
+ const savedConcreteDefault = options.savedDefault ? parseModelString(options.savedDefault) : undefined;
693
+ const savedConcreteDefaultMissingFromCatalog =
694
+ savedConcreteDefault === undefined ||
695
+ !fullCatalog.some(
696
+ model =>
697
+ model.provider.toLowerCase() === savedConcreteDefault.provider.toLowerCase() &&
698
+ model.id.toLowerCase() === savedConcreteDefault.id.toLowerCase(),
699
+ );
700
+ const durableProfile = options.settings.get("modelProfile.default");
701
+ if (!savedSelectorsMissingFromCatalog || !savedConcreteDefaultMissingFromCatalog || !durableProfile)
702
+ return undefined;
703
+ return resolveModelProfileDefaultChain({
704
+ modelRegistry: options.modelRegistry,
705
+ settings: options.settings,
706
+ profileName: durableProfile,
707
+ credentialSessionId: options.credentialSessionId,
708
+ });
709
+ }
710
+
711
+ /** Resolve a durable profile's effective default chain without mutating session or settings state. */
712
+ export async function resolveModelProfileDefaultChain(options: {
713
+ modelRegistry: PrepareModelProfileActivationOptions["modelRegistry"];
714
+ settings: Pick<Settings, "get">;
715
+ profileName: string;
716
+ credentialSessionId: string;
717
+ }): Promise<{
718
+ profileName: string;
719
+ entries: string[];
720
+ model?: Model<Api>;
721
+ thinkingLevel?: ThinkingLevel;
722
+ explicitThinkingLevel: boolean;
723
+ activeIndex: number;
724
+ skips: Array<{ selector: string; reason: string }>;
725
+ }> {
726
+ const profiles = options.modelRegistry.getModelProfiles();
727
+ const profileName = validateModelProfileName(options.profileName, profiles, options.modelRegistry.getError?.());
728
+ const profile = profiles.get(profileName) ?? options.modelRegistry.getModelProfile(profileName)!;
729
+ const profileLabel = formatModelProfileDisplayLabel(profile);
730
+ const requiredProviders = aggregateModelProfileRequiredProviders(profile.requiredProviders, profile);
731
+ const alternativeGroups = profile.alternativeProviderGroups ?? [];
732
+ const alternativeSet = new Set(alternativeGroups.flat());
733
+ const requiredProviderSet = new Set(requiredProviders);
734
+ const authenticatedProviders = new Set<string>();
735
+ const missingProviders: string[] = [];
736
+ const configuredProviderIds = options.modelRegistry.getConfiguredProviderIds?.();
737
+ if (configuredProviderIds !== undefined || options.modelRegistry.isKnownProvider !== undefined) {
738
+ const isProviderKnown = (provider: string): boolean =>
739
+ (options.modelRegistry.isKnownProvider?.(provider) ?? false) ||
740
+ isKnownProvider(provider) ||
741
+ configuredProviderIds?.includes(provider) === true;
742
+ const unknownProviderIds = new Set<string>();
743
+ for (const provider of requiredProviders) {
744
+ if (!alternativeSet.has(provider) && !isProviderKnown(provider)) unknownProviderIds.add(provider);
745
+ }
746
+ for (const group of alternativeGroups) {
747
+ if (group.some(isProviderKnown)) continue;
748
+ for (const provider of group) {
749
+ if (!isProviderKnown(provider)) unknownProviderIds.add(provider);
750
+ }
751
+ }
752
+ const unknownProviders = [...unknownProviderIds].sort();
753
+ if (unknownProviders.length > 0) throw new ModelProfileUnknownProviderError(profileLabel, unknownProviders);
754
+ }
755
+ for (const provider of new Set([
756
+ ...requiredProviders,
757
+ ...alternativeSet,
758
+ ...deriveModelProfileMappedProviders(profile),
759
+ ])) {
760
+ let apiKey: string | undefined;
761
+ try {
762
+ apiKey = await options.modelRegistry.getApiKeyForProvider(provider, options.credentialSessionId);
763
+ } catch (error) {
764
+ if (requiredProviderSet.has(provider) && !alternativeSet.has(provider)) throw error;
765
+ continue;
766
+ }
767
+ if (apiKey === kNoAuth || isAuthenticated(apiKey)) authenticatedProviders.add(provider);
768
+ else if (requiredProviderSet.has(provider)) missingProviders.push(provider);
769
+ }
770
+ const proxyProvider = profile.source !== "user" ? resolveProxyProviderId(options.settings) : undefined;
771
+ const proxyMode = profile.source !== "user" ? resolveProxyMode(options.settings) : "fallback";
772
+ const proxyRoutableProviders =
773
+ profile.source === "user"
774
+ ? new Set<string>()
775
+ : profile.source === "registry"
776
+ ? new Set([
777
+ ...PROXY_ROUTABLE_PROVIDER_IDS,
778
+ ...profile.requiredProviders,
779
+ ...deriveModelProfileMappedProviders(profile),
780
+ ])
781
+ : PROXY_ROUTABLE_PROVIDER_IDS;
782
+ if (proxyMode === "always" && proxyProvider === undefined)
783
+ throw new Error('modelProfile.proxyMode "always" requires modelProfile.proxyProvider');
784
+ const proxyApiKey =
785
+ proxyProvider === undefined
786
+ ? undefined
787
+ : await options.modelRegistry.getApiKeyForProvider(proxyProvider, options.credentialSessionId);
788
+ if (
789
+ proxyProvider !== undefined &&
790
+ !isModelProfileProxyConfigured(proxyProvider, configuredProviderIds, proxyApiKey === kNoAuth)
791
+ ) {
792
+ throw new Error(
793
+ `modelProfile.proxyProvider "${proxyProvider}" is not configured. Configure it with \`gjc setup provider\` before activating a preset.`,
794
+ );
795
+ }
796
+ const proxyAuthenticated = proxyApiKey !== undefined && (proxyApiKey === kNoAuth || isAuthenticated(proxyApiKey));
797
+ if (proxyMode === "always" && !proxyAuthenticated)
798
+ throw new ModelProfileCredentialError(profileLabel, [proxyProvider!]);
799
+ const strictMissing = missingProviders.filter(
800
+ provider => !proxyRoutableProviders.has(provider) && !alternativeSet.has(provider),
801
+ );
802
+ if (strictMissing.length > 0) throw new ModelProfileCredentialError(profileLabel, strictMissing);
803
+ const strictRoutableMissing = missingProviders.filter(
804
+ provider => proxyRoutableProviders.has(provider) && !alternativeSet.has(provider),
805
+ );
806
+ if (strictRoutableMissing.length > 0 && !proxyAuthenticated) {
807
+ throw new ModelProfileCredentialError(
808
+ profileLabel,
809
+ proxyProvider === undefined ? strictRoutableMissing : [proxyProvider],
810
+ );
811
+ }
812
+ for (const group of alternativeGroups) {
813
+ if (group.some(provider => authenticatedProviders.has(provider))) continue;
814
+ const allRoutable = group.every(provider => proxyRoutableProviders.has(provider));
815
+ if (allRoutable && proxyAuthenticated) continue;
816
+ throw new ModelProfileCredentialError(
817
+ profileLabel,
818
+ allRoutable && proxyProvider !== undefined ? [proxyProvider] : [...group],
819
+ );
820
+ }
821
+ const availableModels =
822
+ options.modelRegistry.getAvailableForProfileActivation?.() ??
823
+ options.modelRegistry.getAvailable?.() ??
824
+ options.modelRegistry.getAll();
825
+ let bindings = resolveProfileBindings(profile);
826
+ if (alternativeGroups.length > 0)
827
+ bindings = rewriteBindingsProviders(bindings, authenticatedProviders, alternativeGroups);
828
+ if (proxyProvider !== undefined && proxyAuthenticated && profile.source !== "user") {
829
+ bindings = rewriteBindingsForProxy(
830
+ bindings,
831
+ proxyProvider,
832
+ proxyMode,
833
+ availableModels,
834
+ authenticatedProviders,
835
+ proxyRoutableProviders,
836
+ );
837
+ }
838
+ await preflightModelProfileRoleBindings({
839
+ profile,
840
+ bindings,
841
+ roleCatalogModels: options.modelRegistry.getAll(),
842
+ settings: options.settings as Settings,
843
+ modelRegistry: options.modelRegistry as ModelRegistry,
844
+ sessionId: "",
845
+ credentialSessionId: options.credentialSessionId,
846
+ profileLabel,
847
+ });
848
+ if (!bindings.defaultSelector)
849
+ return { profileName, entries: [], explicitThinkingLevel: false, activeIndex: 0, skips: [] };
850
+ const defaultChain = normalizeModelSelectorValue(
851
+ await resolveAndClampSelectorValue(
852
+ bindings.defaultSelector,
853
+ availableModels,
854
+ {
855
+ settings: options.settings as Settings,
856
+ modelRegistry: options.modelRegistry as ModelRegistry,
857
+ sessionId: "",
858
+ credentialSessionId: options.credentialSessionId,
859
+ aliasIntent: "preset-equivalent",
860
+ },
861
+ profileLabel,
862
+ "default",
863
+ ),
864
+ );
865
+ const resolution = await resolveModelChainWithAuth(
866
+ defaultChain,
867
+ {
868
+ getAvailable: () => availableModels,
869
+ getApiKey: (model, sessionId) =>
870
+ options.modelRegistry.getApiKeyForProvider(model.provider, sessionId, model.baseUrl),
871
+ resolveCanonicalModel: options.modelRegistry.resolveCanonicalModel?.bind(options.modelRegistry),
872
+ getCanonicalVariants: options.modelRegistry.getCanonicalVariants?.bind(options.modelRegistry),
873
+ getCanonicalId: options.modelRegistry.getCanonicalId?.bind(options.modelRegistry),
874
+ resolveModelByLookupAlias: options.modelRegistry.resolveModelByLookupAlias?.bind(options.modelRegistry),
875
+ lookupAliasExists: options.modelRegistry.lookupAliasExists?.bind(options.modelRegistry),
876
+ clearCanonicalVariant: options.modelRegistry.clearCanonicalVariant?.bind(options.modelRegistry),
877
+ } as ModelRegistry,
878
+ options.settings as Settings,
879
+ options.credentialSessionId,
880
+ {
881
+ managedFallback: true,
882
+ aliasIntent: "preset-equivalent",
883
+ canonicalSessionId: null,
884
+ credentialSessionId: options.credentialSessionId,
885
+ },
886
+ );
887
+ return { profileName, entries: defaultChain, ...resolution };
888
+ }
889
+
642
890
  export function rewriteSelectorForProxy(
643
891
  selector: string,
644
892
  proxyProvider: string,
@@ -886,6 +1134,49 @@ async function resolveAndClampSelectorValue(
886
1134
  return clamped.length === 1 && typeof selectorValue === "string" ? clamped[0] : clamped;
887
1135
  }
888
1136
 
1137
+ /** Resolve every non-default binding under the profile activation contract without installing it. */
1138
+ async function preflightModelProfileRoleBindings(options: {
1139
+ profile: ModelProfileDefinition;
1140
+ bindings: ResolvedProfileBinding;
1141
+ roleCatalogModels: Model<Api>[];
1142
+ settings: Settings;
1143
+ modelRegistry: ModelRegistry;
1144
+ sessionId: string;
1145
+ credentialSessionId: string;
1146
+ profileLabel: string;
1147
+ }): Promise<{
1148
+ modelRoles: Record<string, ModelSelectorValue>;
1149
+ agentModelOverrides: Record<string, ModelSelectorValue>;
1150
+ }> {
1151
+ const resolveBindings = async (bindings: Record<string, ModelSelectorValue>) => {
1152
+ const resolved: Record<string, ModelSelectorValue> = {};
1153
+ for (const [role, selectorValue] of Object.entries(bindings) as [
1154
+ GjcModelAssignmentTargetId,
1155
+ ModelSelectorValue,
1156
+ ][]) {
1157
+ resolved[role] = await resolveAndClampSelectorValue(
1158
+ selectorValue,
1159
+ options.roleCatalogModels,
1160
+ {
1161
+ settings: options.settings,
1162
+ modelRegistry: options.modelRegistry,
1163
+ sessionId: options.sessionId,
1164
+ credentialSessionId: options.credentialSessionId,
1165
+ aliasIntent: "preset-equivalent",
1166
+ requireQualifiedResolution: requiresQualifiedModelProfileRoleResolution(options.profile),
1167
+ },
1168
+ options.profileLabel,
1169
+ role,
1170
+ );
1171
+ }
1172
+ return resolved;
1173
+ };
1174
+ return {
1175
+ modelRoles: await resolveBindings(options.bindings.modelRoles),
1176
+ agentModelOverrides: await resolveBindings(options.bindings.agentModelOverrides),
1177
+ };
1178
+ }
1179
+
889
1180
  async function concretizeProfileSelectorValue(
890
1181
  selectorValue: ModelSelectorValue,
891
1182
  prepared: PreparedModelProfileActivation,
@@ -1180,47 +1471,16 @@ export async function prepareModelProfileActivation(
1180
1471
  throw new Error(`Model profile "${profileLabel}" default selectors did not resolve to an authenticated model`);
1181
1472
  }
1182
1473
 
1183
- const modelRoles: Record<string, ModelSelectorValue> = {};
1184
- for (const [role, selectorValue] of Object.entries(bindings.modelRoles) as [
1185
- GjcModelAssignmentTargetId,
1186
- ModelSelectorValue,
1187
- ][]) {
1188
- modelRoles[role] = await resolveAndClampSelectorValue(
1189
- selectorValue,
1190
- roleCatalogModels,
1191
- {
1192
- settings: options.settings as Settings,
1193
- modelRegistry: options.modelRegistry as ModelRegistry,
1194
- sessionId: options.session.sessionId,
1195
- credentialSessionId,
1196
- aliasIntent: "preset-equivalent",
1197
- requireQualifiedResolution: requiresQualifiedModelProfileRoleResolution(profile),
1198
- },
1199
- profileLabel,
1200
- role,
1201
- );
1202
- }
1203
-
1204
- const agentModelOverrides: Record<string, ModelSelectorValue> = {};
1205
- for (const [role, selectorValue] of Object.entries(bindings.agentModelOverrides) as [
1206
- GjcModelAssignmentTargetId,
1207
- ModelSelectorValue,
1208
- ][]) {
1209
- agentModelOverrides[role] = await resolveAndClampSelectorValue(
1210
- selectorValue,
1211
- roleCatalogModels,
1212
- {
1213
- settings: options.settings as Settings,
1214
- modelRegistry: options.modelRegistry as ModelRegistry,
1215
- sessionId: options.session.sessionId,
1216
- credentialSessionId,
1217
- aliasIntent: "preset-equivalent",
1218
- requireQualifiedResolution: requiresQualifiedModelProfileRoleResolution(profile),
1219
- },
1220
- profileLabel,
1221
- role,
1222
- );
1223
- }
1474
+ const { modelRoles, agentModelOverrides } = await preflightModelProfileRoleBindings({
1475
+ profile,
1476
+ bindings,
1477
+ roleCatalogModels,
1478
+ settings: options.settings as Settings,
1479
+ modelRegistry: options.modelRegistry as ModelRegistry,
1480
+ sessionId: options.session.sessionId,
1481
+ credentialSessionId,
1482
+ profileLabel,
1483
+ });
1224
1484
 
1225
1485
  return {
1226
1486
  profileName,
@@ -1722,3 +1982,34 @@ export async function activateModelProfile(
1722
1982
  const prepared = await prepareModelProfileActivation(options);
1723
1983
  await applyPreparedModelProfileActivation(prepared, applyOptions);
1724
1984
  }
1985
+
1986
+ /** Install only a profile's runtime role layer, preserving session model and configured-chain intent. */
1987
+ export async function applyModelProfileRuntimeBindings(options: PrepareModelProfileActivationOptions): Promise<void> {
1988
+ const prepared = await prepareModelProfileActivation(options);
1989
+ try {
1990
+ prepared.settings.override("modelRoles", {
1991
+ ...prepared.baseModelRoles,
1992
+ ...prepared.modelRoles,
1993
+ });
1994
+ prepared.settings.override("task.agentModelOverrides", {
1995
+ ...prepared.baseAgentModelOverrides,
1996
+ ...prepared.agentModelOverrides,
1997
+ });
1998
+ prepared.session.setActiveModelProfile?.(prepared.profileName);
1999
+ prepared.session.noteProfileInstalledOverrides?.(
2000
+ Object.keys(prepared.modelRoles),
2001
+ Object.keys(prepared.agentModelOverrides),
2002
+ prepared.previousModel,
2003
+ );
2004
+ try {
2005
+ await prepared.session.syncEagerDelegation?.();
2006
+ } catch (error) {
2007
+ logger.warn("Failed to sync eager delegation after recovered profile runtime bindings", {
2008
+ profile: prepared.profileName,
2009
+ error: error instanceof Error ? error.message : String(error),
2010
+ });
2011
+ }
2012
+ } finally {
2013
+ restoreCanonicalVariant(prepared.modelRegistry, prepared.session.sessionId, prepared.previousCanonicalVariant);
2014
+ }
2015
+ }