@gajae-code/coding-agent 0.18.11 → 0.19.0

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 (462) hide show
  1. package/CHANGELOG.md +760 -0
  2. package/dist/types/async/job-manager.d.ts +7 -3
  3. package/dist/types/async/result-formatting.d.ts +2 -0
  4. package/dist/types/autoresearch/git.d.ts +1 -1
  5. package/dist/types/capability/fs.d.ts +2 -2
  6. package/dist/types/capability/rule.d.ts +7 -2
  7. package/dist/types/cli/accounts-cli.d.ts +2 -2
  8. package/dist/types/cli/append-system-prompt.d.ts +6 -0
  9. package/dist/types/cli/args.d.ts +7 -2
  10. package/dist/types/cli/customize-doctor-precedence.d.ts +16 -0
  11. package/dist/types/cli/customize-doctor.d.ts +4 -3
  12. package/dist/types/cli/doctor/install-repairs.d.ts +4 -1
  13. package/dist/types/cli/install-activation.d.ts +10 -4
  14. package/dist/types/cli/public-command-errors.d.ts +2 -0
  15. package/dist/types/cli/root-flags.d.ts +0 -12
  16. package/dist/types/cli/update-cli.d.ts +21 -3
  17. package/dist/types/cli-main.d.ts +0 -6
  18. package/dist/types/cli-ordinary.d.ts +2 -2
  19. package/dist/types/commands/accounts.d.ts +2 -1
  20. package/dist/types/commands/launch.d.ts +0 -6
  21. package/dist/types/commands/migrate.d.ts +1 -1
  22. package/dist/types/commands/sdk.d.ts +13 -0
  23. package/dist/types/commit/changelog/index.d.ts +1 -0
  24. package/dist/types/commit/map-reduce/index.d.ts +4 -4
  25. package/dist/types/config/autorouting-tier-map.d.ts +53 -1
  26. package/dist/types/config/config-hot-reload-trust.d.ts +12 -0
  27. package/dist/types/config/config-hot-reload.d.ts +44 -0
  28. package/dist/types/config/file-lock.d.ts +52 -3
  29. package/dist/types/config/model-discovery-manager.d.ts +2 -0
  30. package/dist/types/config/model-profile-activation.d.ts +79 -9
  31. package/dist/types/config/model-registry.d.ts +72 -8
  32. package/dist/types/config/model-resolver.d.ts +7 -4
  33. package/dist/types/config/models-config-schema.d.ts +10 -0
  34. package/dist/types/config/settings-schema.d.ts +57 -4
  35. package/dist/types/config/settings.d.ts +33 -1
  36. package/dist/types/coordinator-mcp/server.d.ts +4 -0
  37. package/dist/types/customization/import.d.ts +2 -0
  38. package/dist/types/customization/types.d.ts +1 -1
  39. package/dist/types/dap/config.d.ts +8 -4
  40. package/dist/types/dap/session.d.ts +11 -2
  41. package/dist/types/debug/system-info.d.ts +6 -1
  42. package/dist/types/discovery/helpers.d.ts +7 -2
  43. package/dist/types/discovery/mcp-compat.d.ts +3 -1
  44. package/dist/types/edit/index.d.ts +5 -0
  45. package/dist/types/edit/modes/patch.d.ts +14 -0
  46. package/dist/types/edit/modes/replace.d.ts +3 -0
  47. package/dist/types/eval/py/runtime.d.ts +9 -0
  48. package/dist/types/exec/bash-executor.d.ts +12 -0
  49. package/dist/types/export/ttsr.d.ts +19 -0
  50. package/dist/types/extensibility/extensions/types.d.ts +5 -1
  51. package/dist/types/extensibility/slash-commands.d.ts +1 -0
  52. package/dist/types/gjc-runtime/managed-owner-admission.d.ts +3 -0
  53. package/dist/types/gjc-runtime/ralplan-current-final.d.ts +54 -0
  54. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +5 -0
  55. package/dist/types/gjc-runtime/session-state-lock.d.ts +2 -0
  56. package/dist/types/gjc-runtime/state-runtime.d.ts +0 -2
  57. package/dist/types/gjc-runtime/tmux-sessions.d.ts +24 -0
  58. package/dist/types/gjc-runtime/ultragoal-change-set.d.ts +6 -0
  59. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +1 -0
  60. package/dist/types/harness-control-plane/receipt-spool.d.ts +4 -0
  61. package/dist/types/hindsight/content.d.ts +5 -6
  62. package/dist/types/internal-urls/types.d.ts +2 -0
  63. package/dist/types/lsp/clients/swiftlint-client.d.ts +0 -4
  64. package/dist/types/main.d.ts +23 -18
  65. package/dist/types/migrate/action-planner.d.ts +10 -1
  66. package/dist/types/migrate/adapters/codex.d.ts +2 -1
  67. package/dist/types/migrate/adapters/index.d.ts +42 -1
  68. package/dist/types/migrate/executor.d.ts +3 -1
  69. package/dist/types/migrate/hook-module.d.ts +23 -0
  70. package/dist/types/migrate/report.d.ts +2 -1
  71. package/dist/types/migrate/types.d.ts +82 -3
  72. package/dist/types/modes/components/agent-dashboard.d.ts +1 -1
  73. package/dist/types/modes/components/model-selector.d.ts +43 -0
  74. package/dist/types/modes/components/settings-selector.d.ts +6 -0
  75. package/dist/types/modes/controllers/selector-controller.d.ts +2 -0
  76. package/dist/types/modes/prompt-suggestion-controller.d.ts +1 -1
  77. package/dist/types/modes/theme/theme.d.ts +1 -0
  78. package/dist/types/modes/utils/host-status.d.ts +15 -11
  79. package/dist/types/runtime-mcp/content-limits.d.ts +4 -0
  80. package/dist/types/runtime-mcp/manager.d.ts +7 -0
  81. package/dist/types/runtime-mcp/plugin-mcp-name-filter.d.ts +22 -0
  82. package/dist/types/runtime-mcp/project-host-values.d.ts +11 -5
  83. package/dist/types/runtime-mcp/tool-bridge.d.ts +4 -0
  84. package/dist/types/sdk/broker/broker-exit.d.ts +3 -3
  85. package/dist/types/sdk/broker/broker.d.ts +29 -2
  86. package/dist/types/sdk/broker/daemon-entry.d.ts +11 -1
  87. package/dist/types/sdk/broker/doctor-restart.d.ts +1 -1
  88. package/dist/types/sdk/broker/ensure.d.ts +141 -9
  89. package/dist/types/sdk/broker/hop.d.ts +45 -0
  90. package/dist/types/sdk/broker/lifecycle-ledger.d.ts +18 -10
  91. package/dist/types/sdk/broker/lifecycle.d.ts +22 -0
  92. package/dist/types/sdk/broker/lock-host-identity.d.ts +5 -0
  93. package/dist/types/sdk/broker/session-index.d.ts +6 -1
  94. package/dist/types/sdk/broker/transport.d.ts +2 -0
  95. package/dist/types/sdk/bus/chat-command-policy.d.ts +2 -1
  96. package/dist/types/sdk/bus/index.d.ts +44 -0
  97. package/dist/types/sdk/bus/reconciliation-store.d.ts +10 -0
  98. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +9 -1
  99. package/dist/types/sdk/bus/telegram-daemon.d.ts +2 -0
  100. package/dist/types/sdk/bus/threaded-render.d.ts +2 -1
  101. package/dist/types/sdk/cli/session-cli.d.ts +0 -1
  102. package/dist/types/sdk/host/control/operations.d.ts +5 -1
  103. package/dist/types/sdk/host/events.d.ts +4 -0
  104. package/dist/types/sdk/host/host.d.ts +2 -1
  105. package/dist/types/sdk/host/prompt-image-upload.d.ts +43 -0
  106. package/dist/types/sdk/host/session-runtime.d.ts +40 -8
  107. package/dist/types/sdk/host/surface-policy.d.ts +2 -1
  108. package/dist/types/sdk/lifecycle/service.d.ts +12 -0
  109. package/dist/types/sdk/prompt-deadline-flush.d.ts +42 -4
  110. package/dist/types/sdk/prompt-deadline-manager.d.ts +2 -0
  111. package/dist/types/sdk/prompt-status.d.ts +11 -4
  112. package/dist/types/sdk/protocol/adapter-validation.d.ts +10 -4
  113. package/dist/types/sdk/reconciliation-extensions.d.ts +1 -1
  114. package/dist/types/sdk/session-list.d.ts +1 -1
  115. package/dist/types/session/agent-session.d.ts +107 -9
  116. package/dist/types/session/internal/managed-session-scope.d.ts +2 -2
  117. package/dist/types/session/internal/managed-session-storage.d.ts +1 -1
  118. package/dist/types/session/internal/native-publish-outcome.d.ts +1 -1
  119. package/dist/types/session/messages.d.ts +5 -1
  120. package/dist/types/session/session-manager.d.ts +29 -3
  121. package/dist/types/session/startup-auth-config.d.ts +24 -2
  122. package/dist/types/session/streaming-output.d.ts +11 -0
  123. package/dist/types/session/terminal-abort.d.ts +3 -1
  124. package/dist/types/session-import/service.d.ts +1 -1
  125. package/dist/types/skill-state/workflow-mutation-guard.d.ts +20 -4
  126. package/dist/types/slash-commands/helpers/mcp.d.ts +5 -0
  127. package/dist/types/slash-commands/helpers/provider-auth-status.d.ts +8 -0
  128. package/dist/types/ssh/ssh-executor.d.ts +8 -1
  129. package/dist/types/system-prompt.d.ts +3 -2
  130. package/dist/types/task/executor.d.ts +19 -2
  131. package/dist/types/task/role-body.d.ts +11 -0
  132. package/dist/types/tools/ast-edit-write-path.d.ts +10 -0
  133. package/dist/types/tools/atomic-file-write.d.ts +9 -7
  134. package/dist/types/tools/awaiting-input.d.ts +28 -0
  135. package/dist/types/tools/bash-allowed-prefixes.d.ts +17 -0
  136. package/dist/types/tools/bash-skill-urls.d.ts +4 -0
  137. package/dist/types/tools/bash.d.ts +7 -0
  138. package/dist/types/tools/descriptors.d.ts +15 -2
  139. package/dist/types/tools/fetch.d.ts +7 -1
  140. package/dist/types/tools/index.d.ts +2 -0
  141. package/dist/types/tools/irc.d.ts +5 -3
  142. package/dist/types/tools/python.d.ts +1 -1
  143. package/dist/types/tools/report-issue.d.ts +41 -0
  144. package/dist/types/tools/subagent.d.ts +23 -0
  145. package/dist/types/tools/tmux-self-injection-guard.d.ts +2 -0
  146. package/dist/types/tools/ultragoal-ask-guard.d.ts +1 -1
  147. package/dist/types/tools/write.d.ts +2 -0
  148. package/dist/types/utils/file-mentions.d.ts +5 -0
  149. package/dist/types/utils/image-limits.d.ts +7 -0
  150. package/dist/types/utils/image-loading.d.ts +0 -1
  151. package/dist/types/utils/open.d.ts +0 -1
  152. package/dist/types/utils/pasted-image-loading.d.ts +1 -5
  153. package/dist/types/utils/prompt-suggestion.d.ts +2 -2
  154. package/dist/types/utils/shell-snapshot.d.ts +2 -0
  155. package/dist/types/utils/title-generator.d.ts +13 -3
  156. package/dist/types/web/scrapers/types.d.ts +8 -1
  157. package/dist/types/web/search/providers/codex.d.ts +6 -7
  158. package/dist/types/web/search/providers/insane.d.ts +7 -1
  159. package/dist/types/web/search/providers/searxng.d.ts +5 -0
  160. package/package.json +10 -9
  161. package/scripts/acp-conformance-agent.ts +12 -2
  162. package/scripts/build-binary.ts +2 -1
  163. package/scripts/capture-subagent-compact-panel-showcase.ts +105 -0
  164. package/scripts/generate-docs-index.ts +8 -1
  165. package/scripts/generate-sdk-operation-inventory.ts +38 -4
  166. package/src/async/job-manager.ts +356 -56
  167. package/src/async/result-formatting.ts +40 -0
  168. package/src/autoresearch/git.ts +9 -2
  169. package/src/autoresearch/prompts/prompt-setup.md +1 -1
  170. package/src/capability/fs.ts +58 -22
  171. package/src/capability/index.ts +2 -2
  172. package/src/capability/rule.ts +11 -2
  173. package/src/cli/accounts-cli.ts +176 -8
  174. package/src/cli/append-system-prompt.ts +12 -0
  175. package/src/cli/args.ts +11 -7
  176. package/src/cli/auth-broker-cli.ts +21 -11
  177. package/src/cli/customize-doctor-precedence.ts +31 -0
  178. package/src/cli/customize-doctor.ts +49 -39
  179. package/src/cli/doctor/install-repairs.ts +35 -5
  180. package/src/cli/fast-help.ts +1 -3
  181. package/src/cli/install-activation.ts +47 -4
  182. package/src/cli/migrate-cli.ts +19 -6
  183. package/src/cli/public-command-errors.ts +6 -0
  184. package/src/cli/root-flags.ts +2 -4
  185. package/src/cli/stats-cli.ts +9 -5
  186. package/src/cli/update-cli.ts +471 -13
  187. package/src/cli-ordinary.ts +7 -2
  188. package/src/commands/accounts.ts +10 -5
  189. package/src/commands/harness.ts +25 -15
  190. package/src/commands/migrate.ts +3 -3
  191. package/src/commands/sdk.ts +277 -50
  192. package/src/commands/ultragoal.ts +16 -8
  193. package/src/commit/agentic/agent.ts +6 -6
  194. package/src/commit/analysis/conventional.ts +14 -5
  195. package/src/commit/changelog/index.ts +39 -1
  196. package/src/commit/map-reduce/index.ts +7 -7
  197. package/src/commit/message.ts +10 -3
  198. package/src/commit/pipeline.ts +12 -12
  199. package/src/config/autorouting-tier-map.ts +50 -1
  200. package/src/config/config-file.ts +106 -3
  201. package/src/config/config-hot-reload-trust.ts +148 -0
  202. package/src/config/config-hot-reload.ts +742 -0
  203. package/src/config/file-lock.ts +1615 -328
  204. package/src/config/keybindings.ts +154 -7
  205. package/src/config/model-bindings-applier.ts +85 -47
  206. package/src/config/model-discovery-manager.ts +10 -0
  207. package/src/config/model-profile-activation.ts +889 -148
  208. package/src/config/model-registry.ts +1706 -205
  209. package/src/config/model-resolver.ts +52 -22
  210. package/src/config/models-config-schema.ts +6 -0
  211. package/src/config/settings-schema.ts +73 -4
  212. package/src/config/settings.ts +460 -24
  213. package/src/coordinator-mcp/policy.ts +26 -1
  214. package/src/coordinator-mcp/server.ts +37 -2
  215. package/src/crash/sanitize.ts +7 -1
  216. package/src/customization/import.ts +279 -8
  217. package/src/customization/inventory.ts +24 -8
  218. package/src/customization/types.ts +1 -0
  219. package/src/dap/client.ts +3 -2
  220. package/src/dap/config.ts +31 -11
  221. package/src/dap/defaults.json +1 -1
  222. package/src/dap/session.ts +161 -36
  223. package/src/debug/crash-diagnostics.ts +89 -6
  224. package/src/debug/report-bundle.ts +90 -2
  225. package/src/debug/system-info.ts +8 -3
  226. package/src/defaults/gjc/extensions/grok-cli-vendor/src/shared/base-url.ts +21 -7
  227. package/src/discovery/agents-md.ts +1 -1
  228. package/src/discovery/builtin.ts +4 -3
  229. package/src/discovery/helpers.ts +25 -16
  230. package/src/discovery/mcp-compat.ts +120 -17
  231. package/src/edit/apply-patch/index.ts +12 -1
  232. package/src/edit/index.ts +204 -22
  233. package/src/edit/modes/patch.ts +214 -8
  234. package/src/edit/modes/replace.ts +136 -0
  235. package/src/eval/js/context-manager.ts +29 -3
  236. package/src/eval/js/worker-entry.ts +51 -18
  237. package/src/eval/py/executor.ts +14 -4
  238. package/src/eval/py/runner.py +144 -5
  239. package/src/eval/py/runtime.ts +44 -4
  240. package/src/exec/bash-executor.ts +81 -4
  241. package/src/exec/bash-shell-guardian.ts +4 -1
  242. package/src/exec/bash-shell-supervisor.ts +8 -4
  243. package/src/exec/isolated-shell.ts +5 -1
  244. package/src/exec/non-interactive-env.ts +0 -1
  245. package/src/export/html/index.ts +86 -6
  246. package/src/export/ttsr.ts +176 -1
  247. package/src/extensibility/custom-tools/wrapper.ts +3 -1
  248. package/src/extensibility/extensions/loader.ts +10 -1
  249. package/src/extensibility/extensions/ouroboros-ooo-bridge.ts +63 -1
  250. package/src/extensibility/extensions/types.ts +5 -1
  251. package/src/extensibility/hooks/loader.ts +10 -2
  252. package/src/extensibility/plugins/marketplace/fetcher.ts +2 -2
  253. package/src/extensibility/plugins/marketplace/manager.ts +36 -10
  254. package/src/extensibility/slash-commands.ts +5 -0
  255. package/src/gjc-runtime/gc-runtime.ts +37 -7
  256. package/src/gjc-runtime/launch-tmux.ts +30 -15
  257. package/src/gjc-runtime/launch-worktree.test.ts +148 -0
  258. package/src/gjc-runtime/launch-worktree.ts +101 -14
  259. package/src/gjc-runtime/managed-owner-admission.ts +46 -2
  260. package/src/gjc-runtime/ralplan-current-final.ts +294 -0
  261. package/src/gjc-runtime/ralplan-runtime.ts +95 -1
  262. package/src/gjc-runtime/session-resolution.ts +38 -6
  263. package/src/gjc-runtime/session-state-lock.ts +59 -14
  264. package/src/gjc-runtime/state-runtime.ts +23 -19
  265. package/src/gjc-runtime/state-writer.ts +109 -5
  266. package/src/gjc-runtime/tmux-sessions.ts +93 -13
  267. package/src/gjc-runtime/ultragoal-change-set.ts +90 -11
  268. package/src/gjc-runtime/ultragoal-guard.ts +9 -1
  269. package/src/gjc-runtime/ultragoal-runtime.ts +15 -5
  270. package/src/harness-control-plane/finalize.ts +11 -0
  271. package/src/harness-control-plane/receipt-spool.ts +105 -28
  272. package/src/harness-control-plane/storage.ts +124 -6
  273. package/src/hindsight/content.ts +116 -16
  274. package/src/hindsight/mental-models.ts +22 -10
  275. package/src/hindsight/state.ts +7 -4
  276. package/src/hooks/native-skill-hook.ts +17 -12
  277. package/src/internal-urls/artifact-protocol.ts +3 -1
  278. package/src/internal-urls/docs-index.generated.ts +23 -22
  279. package/src/internal-urls/local-protocol.ts +167 -8
  280. package/src/internal-urls/types.ts +2 -0
  281. package/src/lsp/client.ts +2 -1
  282. package/src/lsp/clients/biome-client.ts +2 -0
  283. package/src/lsp/clients/swiftlint-client.ts +2 -0
  284. package/src/lsp/index.ts +29 -0
  285. package/src/lsp/workspace-path.ts +23 -0
  286. package/src/main.ts +330 -92
  287. package/src/memories/index.ts +25 -2
  288. package/src/migrate/action-planner.ts +574 -2
  289. package/src/migrate/adapters/claude-code.ts +162 -5
  290. package/src/migrate/adapters/codex.ts +77 -7
  291. package/src/migrate/adapters/index.ts +258 -5
  292. package/src/migrate/adapters/opencode.ts +10 -1
  293. package/src/migrate/executor.ts +222 -7
  294. package/src/migrate/hook-module.ts +193 -0
  295. package/src/migrate/report.ts +63 -2
  296. package/src/migrate/types.ts +84 -4
  297. package/src/modes/DESIGN.md +51 -0
  298. package/src/modes/acp/acp-agent.ts +10 -1
  299. package/src/modes/acp/permission-mode.ts +18 -1
  300. package/src/modes/components/agent-dashboard.ts +20 -4
  301. package/src/modes/components/assistant-message.ts +55 -1
  302. package/src/modes/components/customization/customization-dashboard.ts +7 -0
  303. package/src/modes/components/customization/import-wizard.ts +29 -3
  304. package/src/modes/components/model-selector.ts +157 -103
  305. package/src/modes/components/settings-selector.ts +103 -37
  306. package/src/modes/components/welcome.ts +3 -1
  307. package/src/modes/controllers/command-controller.ts +300 -9
  308. package/src/modes/controllers/event-controller.ts +1 -1
  309. package/src/modes/controllers/extension-ui-controller.ts +31 -1
  310. package/src/modes/controllers/goal-mode-controller.ts +79 -10
  311. package/src/modes/controllers/input-controller.ts +2 -0
  312. package/src/modes/controllers/plan-mode-controller.ts +66 -11
  313. package/src/modes/controllers/runtime-mcp-command-controller.ts +7 -6
  314. package/src/modes/controllers/selector-controller.ts +76 -7
  315. package/src/modes/interactive-mode.ts +123 -4
  316. package/src/modes/prompt-suggestion-controller.ts +1 -1
  317. package/src/modes/runtime-init.ts +5 -1
  318. package/src/modes/theme/theme.ts +15 -0
  319. package/src/modes/utils/host-status.ts +21 -10
  320. package/src/prompts/agent-fragments/browser-aside.md +2 -2
  321. package/src/prompts/system/irc-incoming.md +3 -1
  322. package/src/prompts/tools/debug.md +1 -1
  323. package/src/prompts/tools/irc.md +1 -1
  324. package/src/prompts/tools/read.md +1 -1
  325. package/src/prompts/tools/report-issue.md +13 -0
  326. package/src/prompts/tools/task.md +1 -1
  327. package/src/runtime-credential-selector.ts +2 -2
  328. package/src/runtime-mcp/content-limits.ts +7 -0
  329. package/src/runtime-mcp/manager-pool.test.ts +5 -4
  330. package/src/runtime-mcp/manager.ts +40 -3
  331. package/src/runtime-mcp/oauth-flow.ts +32 -6
  332. package/src/runtime-mcp/plugin-mcp-name-filter.ts +62 -0
  333. package/src/runtime-mcp/project-host-values.ts +12 -8
  334. package/src/runtime-mcp/render.ts +16 -1
  335. package/src/runtime-mcp/tool-bridge.ts +194 -21
  336. package/src/runtime-mcp/transports/stdio.ts +2 -1
  337. package/src/sdk/broker/broker-exit.ts +10 -5
  338. package/src/sdk/broker/broker.ts +484 -85
  339. package/src/sdk/broker/daemon-entry.ts +338 -116
  340. package/src/sdk/broker/doctor-restart.ts +2 -1
  341. package/src/sdk/broker/ensure.ts +1214 -268
  342. package/src/sdk/broker/hop.ts +286 -0
  343. package/src/sdk/broker/lifecycle-ledger.ts +38 -11
  344. package/src/sdk/broker/lifecycle.ts +102 -6
  345. package/src/sdk/broker/lock-host-identity.ts +29 -0
  346. package/src/sdk/broker/session-index.ts +91 -16
  347. package/src/sdk/broker/transport.ts +17 -1
  348. package/src/sdk/bus/chat-command-policy.ts +16 -3
  349. package/src/sdk/bus/chat-daemon-control.ts +2 -2
  350. package/src/sdk/bus/index.ts +460 -35
  351. package/src/sdk/bus/reconciliation-store.ts +201 -8
  352. package/src/sdk/bus/session-control.ts +2 -0
  353. package/src/sdk/bus/slack-daemon.ts +105 -9
  354. package/src/sdk/bus/telegram-daemon-contract.ts +9 -1
  355. package/src/sdk/bus/telegram-daemon.ts +10 -2
  356. package/src/sdk/bus/threaded-render.ts +20 -1
  357. package/src/sdk/cli/session-cli.ts +23 -6
  358. package/src/sdk/host/control/dispatch.ts +13 -1
  359. package/src/sdk/host/control/operations.ts +10 -1
  360. package/src/sdk/host/events.ts +67 -4
  361. package/src/sdk/host/host.ts +8 -2
  362. package/src/sdk/host/prompt-image-upload.ts +438 -0
  363. package/src/sdk/host/sdk-surface-parity.test.ts +15 -0
  364. package/src/sdk/host/session-runtime.test.ts +1737 -129
  365. package/src/sdk/host/session-runtime.ts +684 -83
  366. package/src/sdk/host/surface-policy.ts +4 -0
  367. package/src/sdk/host/websocket-transport.lifecycle.test.ts +90 -2
  368. package/src/sdk/host/websocket-transport.ts +19 -7
  369. package/src/sdk/lifecycle/service.ts +15 -1
  370. package/src/sdk/prompt-deadline-flush.ts +78 -5
  371. package/src/sdk/prompt-deadline-manager.ts +68 -14
  372. package/src/sdk/prompt-status.ts +6 -4
  373. package/src/sdk/protocol/adapter-validation.ts +81 -12
  374. package/src/sdk/protocol/operation-inventory.generated.json +261 -2
  375. package/src/sdk/protocol/operation-registry.ts +33 -3
  376. package/src/sdk/reconciliation-extensions.ts +1 -0
  377. package/src/sdk/session-list.ts +1 -0
  378. package/src/sdk/session.ts +237 -97
  379. package/src/session/agent-session.ts +2726 -479
  380. package/src/session/history-storage.ts +182 -12
  381. package/src/session/internal/managed-session-scope.ts +173 -57
  382. package/src/session/internal/managed-session-storage.ts +85 -12
  383. package/src/session/internal/native-publish-outcome.ts +5 -1
  384. package/src/session/messages.ts +47 -6
  385. package/src/session/session-manager.ts +326 -19
  386. package/src/session/startup-auth-config.ts +116 -8
  387. package/src/session/streaming-output.ts +262 -4
  388. package/src/session/terminal-abort.ts +14 -2
  389. package/src/session-import/redact.ts +53 -2
  390. package/src/session-import/service.ts +1 -0
  391. package/src/skill-state/workflow-mutation-guard.ts +2145 -206
  392. package/src/slash-commands/builtin-registry.ts +21 -6
  393. package/src/slash-commands/helpers/credential-switch.ts +10 -5
  394. package/src/slash-commands/helpers/mcp.ts +11 -3
  395. package/src/slash-commands/helpers/provider-auth-status.ts +456 -0
  396. package/src/ssh/ssh-executor.ts +9 -2
  397. package/src/stt/recorder.ts +26 -9
  398. package/src/system-prompt.ts +61 -16
  399. package/src/task/executor.ts +115 -20
  400. package/src/task/index.ts +389 -175
  401. package/src/task/role-body.ts +84 -0
  402. package/src/task/token-log-mode.test.ts +162 -0
  403. package/src/task/token-log.ts +91 -2
  404. package/src/tools/archive-reader.ts +650 -37
  405. package/src/tools/ask.ts +1 -0
  406. package/src/tools/ast-edit-write-path.ts +64 -0
  407. package/src/tools/ast-edit.ts +18 -1
  408. package/src/tools/ast-grep.ts +7 -2
  409. package/src/tools/atomic-file-write.ts +46 -15
  410. package/src/tools/auto-generated-guard.ts +15 -3
  411. package/src/tools/awaiting-input.ts +114 -0
  412. package/src/tools/bash-allowed-prefixes.ts +214 -6
  413. package/src/tools/bash-interactive.ts +14 -2
  414. package/src/tools/bash-skill-urls.ts +58 -5
  415. package/src/tools/bash.ts +113 -26
  416. package/src/tools/browser/tab-worker.ts +39 -13
  417. package/src/tools/browser.ts +17 -7
  418. package/src/tools/cron.ts +10 -1
  419. package/src/tools/debug.ts +16 -8
  420. package/src/tools/descriptors.test.ts +44 -0
  421. package/src/tools/descriptors.ts +50 -6
  422. package/src/tools/eval.ts +15 -0
  423. package/src/tools/fetch.ts +93 -4
  424. package/src/tools/gh.ts +27 -12
  425. package/src/tools/image-gen.ts +20 -6
  426. package/src/tools/index.ts +2 -0
  427. package/src/tools/irc.ts +5 -3
  428. package/src/tools/monitor.ts +9 -1
  429. package/src/tools/output-meta.ts +74 -5
  430. package/src/tools/python.ts +1 -1
  431. package/src/tools/read.ts +26 -37
  432. package/src/tools/recipe/runner.ts +23 -12
  433. package/src/tools/render-utils.ts +2 -2
  434. package/src/tools/report-issue.ts +184 -0
  435. package/src/tools/search.ts +3 -2
  436. package/src/tools/ssh.ts +274 -8
  437. package/src/tools/subagent-render.ts +114 -12
  438. package/src/tools/subagent.ts +118 -5
  439. package/src/tools/tmux-self-injection-guard.ts +3301 -122
  440. package/src/tools/todo-write.ts +41 -3
  441. package/src/tools/tool-catalog.generated.ts +32 -4
  442. package/src/tools/ultragoal-ask-guard.ts +13 -1
  443. package/src/tools/write.ts +42 -3
  444. package/src/tui/tree-list.ts +15 -1
  445. package/src/utils/commit-message-generator.ts +12 -4
  446. package/src/utils/external-editor.ts +21 -7
  447. package/src/utils/file-mentions.ts +75 -7
  448. package/src/utils/git.ts +38 -7
  449. package/src/utils/image-limits.ts +8 -0
  450. package/src/utils/image-loading.ts +1 -1
  451. package/src/utils/open.ts +73 -4
  452. package/src/utils/pasted-image-loading.ts +9 -8
  453. package/src/utils/prompt-suggestion.ts +5 -4
  454. package/src/utils/shell-snapshot.ts +9 -1
  455. package/src/utils/title-generator.ts +72 -22
  456. package/src/web/scrapers/index.ts +3 -1
  457. package/src/web/scrapers/types.ts +8 -0
  458. package/src/web/scrapers/youtube.ts +3 -2
  459. package/src/web/search/index.ts +2 -1
  460. package/src/web/search/providers/codex.ts +29 -32
  461. package/src/web/search/providers/insane.ts +91 -28
  462. package/src/web/search/providers/searxng.ts +62 -10
@@ -97,7 +97,7 @@ export async function refreshMissingQualifiedModelProviders(
97
97
  .getRefreshableProviders()
98
98
  .find(candidate => candidate.toLowerCase() === parsedSelector.provider.toLowerCase());
99
99
  if (!provider || refreshedProviders.has(provider)) continue;
100
- const availableModels = modelRegistry.getAvailable();
100
+ const availableModels = modelRegistry.getAvailable(credentialSessionId);
101
101
  const rawModelId = selector.slice(selector.indexOf("/") + 1);
102
102
  if (
103
103
  resolveProviderModelReference(provider, rawModelId, availableModels) ||
@@ -1047,9 +1047,10 @@ export function resolveModelOverride(
1047
1047
  settings?: Settings,
1048
1048
  sessionId?: string,
1049
1049
  aliasIntent?: "preset-equivalent" | "reject",
1050
+ credentialSessionId?: string,
1050
1051
  ): { model?: Model<Api>; thinkingLevel?: ThinkingLevel; explicitThinkingLevel: boolean } {
1051
1052
  if (modelPatterns.length === 0) return { explicitThinkingLevel: false };
1052
- const availableModels = modelRegistry.getAvailable();
1053
+ const availableModels = modelRegistry.getAvailable(credentialSessionId);
1053
1054
  const matchPreferences = { usageOrder: settings?.getStorage()?.getModelUsageOrder() };
1054
1055
  for (const pattern of modelPatterns) {
1055
1056
  const { model, thinkingLevel, explicitThinkingLevel } = resolveModelRoleValue(pattern, availableModels, {
@@ -1081,6 +1082,8 @@ export interface ModelChainResolutionOptions {
1081
1082
  canonicalSessionId?: string | null;
1082
1083
  credentialSessionId?: string;
1083
1084
  isCredentialUnavailable?: (provider: string) => boolean;
1085
+ /** Read-only auth eligibility for staged profile preflight when no access token can be exposed. */
1086
+ isProviderAuthAvailable?: (provider: string) => boolean;
1084
1087
  signal?: AbortSignal;
1085
1088
  }
1086
1089
 
@@ -1139,13 +1142,13 @@ async function resolveModelChainEntries(
1139
1142
  startIndex: number,
1140
1143
  circuitPolicy: { skipOpenCircuits: boolean },
1141
1144
  ): Promise<ModelChainResolution & { firstOpenCircuit?: { index: number; skipCount: number } }> {
1142
- const availableModels = modelRegistry.getAvailable();
1143
- const matchPreferences = { usageOrder: settings?.getStorage()?.getModelUsageOrder() };
1144
- const skips: Array<{ selector: string; reason: string }> = [];
1145
- const authFailedModels = new Set<string>();
1146
1145
  const canonicalSessionId =
1147
1146
  options?.canonicalSessionId === null ? undefined : (options?.canonicalSessionId ?? sessionId);
1148
1147
  const credentialSessionId = options?.credentialSessionId ?? sessionId;
1148
+ const availableModels = modelRegistry.getAvailable(credentialSessionId);
1149
+ const matchPreferences = { usageOrder: settings?.getStorage()?.getModelUsageOrder() };
1150
+ const skips: Array<{ selector: string; reason: string }> = [];
1151
+ const authFailedModels = new Set<string>();
1149
1152
  let firstOpenCircuit: { index: number; skipCount: number } | undefined;
1150
1153
  for (let activeIndex = startIndex; activeIndex < modelPatterns.length; activeIndex += 1) {
1151
1154
  const selector = modelPatterns[activeIndex];
@@ -1198,7 +1201,7 @@ async function resolveModelChainEntries(
1198
1201
  skips.push({ selector, reason: "credential_unavailable" });
1199
1202
  break;
1200
1203
  }
1201
- if (isAuthenticatedOrKeyless(key)) {
1204
+ if (isAuthenticatedOrKeyless(key) || options?.isProviderAuthAvailable?.(candidate.model.provider)) {
1202
1205
  return { ...candidate, activeIndex, skips };
1203
1206
  }
1204
1207
  skips.push({ selector, reason: "unauthenticated" });
@@ -1277,7 +1280,8 @@ export async function resolveModelOverrideWithAuthFallback(
1277
1280
  parentFallbackSelector?: string;
1278
1281
  skips: Array<{ selector: string; reason: string }>;
1279
1282
  }> {
1280
- const availableModels = modelRegistry.getAvailable();
1283
+ const credentialSessionId = options?.credentialSessionId ?? authSessionId;
1284
+ const availableModels = modelRegistry.getAvailable(credentialSessionId);
1281
1285
  const matchPreferences = { usageOrder: settings?.getStorage()?.getModelUsageOrder() };
1282
1286
  let requestedModel: Model<Api> | undefined;
1283
1287
  let requestedResolution: ResolvedModelRoleValue | undefined;
@@ -1292,6 +1296,7 @@ export async function resolveModelOverrideWithAuthFallback(
1292
1296
  settings,
1293
1297
  undefined,
1294
1298
  options?.aliasIntent,
1299
+ credentialSessionId,
1295
1300
  ).model;
1296
1301
  if (parentActiveModel) {
1297
1302
  modelRegistry.seedCanonicalVariant?.(canonicalScope, parentActiveModel);
@@ -1313,7 +1318,7 @@ export async function resolveModelOverrideWithAuthFallback(
1313
1318
  matchPreferences,
1314
1319
  modelRegistry,
1315
1320
  sessionId: canonicalScope,
1316
- credentialSessionId: authSessionId,
1321
+ credentialSessionId,
1317
1322
  aliasIntent: options?.aliasIntent,
1318
1323
  });
1319
1324
  if (!requestedModel && candidate.model) {
@@ -1333,7 +1338,7 @@ export async function resolveModelOverrideWithAuthFallback(
1333
1338
  continue;
1334
1339
  }
1335
1340
  }
1336
- const key = await modelRegistry.getApiKey(candidate.model, authSessionId);
1341
+ const key = await modelRegistry.getApiKey(candidate.model, credentialSessionId);
1337
1342
  if (isAuthenticatedOrKeyless(key)) {
1338
1343
  return { ...candidate, requestedModel: candidate.model, authFallbackUsed: false, activeIndex, skips };
1339
1344
  }
@@ -1343,8 +1348,9 @@ export async function resolveModelOverrideWithAuthFallback(
1343
1348
  ) {
1344
1349
  const equivalentRetry = await resolveModelChainWithAuth([pattern], modelRegistry, settings, authSessionId, {
1345
1350
  managedFallback: options.managedFallback,
1346
- aliasIntent: options.aliasIntent,
1351
+ aliasIntent: options?.aliasIntent,
1347
1352
  canonicalSessionId: canonicalScope,
1353
+ credentialSessionId,
1348
1354
  });
1349
1355
  if (equivalentRetry.model) {
1350
1356
  return {
@@ -1365,10 +1371,17 @@ export async function resolveModelOverrideWithAuthFallback(
1365
1371
  return { explicitThinkingLevel: false, requestedModel, authFallbackUsed: false, activeIndex, skips };
1366
1372
  }
1367
1373
  const fallback = parentActiveModelPattern
1368
- ? resolveModelOverride([parentActiveModelPattern], modelRegistry, settings, authSessionId, options?.aliasIntent)
1374
+ ? resolveModelOverride(
1375
+ [parentActiveModelPattern],
1376
+ modelRegistry,
1377
+ settings,
1378
+ credentialSessionId,
1379
+ options?.aliasIntent,
1380
+ credentialSessionId,
1381
+ )
1369
1382
  : { explicitThinkingLevel: false };
1370
1383
  if (fallback.model) {
1371
- const fallbackKey = await modelRegistry.getApiKey(fallback.model, authSessionId);
1384
+ const fallbackKey = await modelRegistry.getApiKey(fallback.model, credentialSessionId);
1372
1385
  if (isAuthenticatedOrKeyless(fallbackKey)) {
1373
1386
  const isParentSubstitution = requestedModel === undefined || !modelsAreEqual(fallback.model, requestedModel);
1374
1387
  return {
@@ -1450,8 +1463,9 @@ export async function resolveModelScope(
1450
1463
  patterns: string[],
1451
1464
  modelRegistry: Pick<ModelRegistry, "getAvailable" | "getCanonicalVariants">,
1452
1465
  preferences?: ModelMatchPreferences,
1466
+ credentialSessionId?: string,
1453
1467
  ): Promise<ScopedModel[]> {
1454
- const availableModels = modelRegistry.getAvailable();
1468
+ const availableModels = modelRegistry.getAvailable(credentialSessionId);
1455
1469
 
1456
1470
  const scopedModels: ScopedModel[] = [];
1457
1471
  const addScopedModel = (selection: ScopedModel): void => {
@@ -1556,13 +1570,14 @@ export async function resolveAllowedModels(
1556
1570
  modelRegistry: Pick<ModelRegistry, "getAvailable" | "getCanonicalVariants">,
1557
1571
  settings: Settings | undefined,
1558
1572
  preferences?: ModelMatchPreferences,
1573
+ credentialSessionId?: string,
1559
1574
  ): Promise<Model<Api>[]> {
1560
- const available = modelRegistry.getAvailable();
1575
+ const available = modelRegistry.getAvailable(credentialSessionId);
1561
1576
  const patterns = settings?.get("enabledModels");
1562
1577
  if (!patterns || patterns.length === 0) {
1563
1578
  return available;
1564
1579
  }
1565
- const scoped = await resolveModelScope(patterns, modelRegistry, preferences);
1580
+ const scoped = await resolveModelScope(patterns, modelRegistry, preferences, credentialSessionId);
1566
1581
  if (scoped.length === 0) {
1567
1582
  return [];
1568
1583
  }
@@ -1686,6 +1701,7 @@ export async function findInitialModel(options: {
1686
1701
  defaultModelId?: string;
1687
1702
  defaultThinkingSelector?: ThinkingLevel;
1688
1703
  modelRegistry: InitialModelRegistry;
1704
+ credentialSessionId?: string;
1689
1705
  }): Promise<InitialModelResult> {
1690
1706
  const {
1691
1707
  cliProvider,
@@ -1696,6 +1712,7 @@ export async function findInitialModel(options: {
1696
1712
  defaultModelId,
1697
1713
  defaultThinkingSelector,
1698
1714
  modelRegistry,
1715
+ credentialSessionId,
1699
1716
  } = options;
1700
1717
 
1701
1718
  let model: Model<Api> | undefined;
@@ -1703,7 +1720,11 @@ export async function findInitialModel(options: {
1703
1720
 
1704
1721
  // 1. CLI args take priority
1705
1722
  if (cliProvider && cliModel) {
1706
- const found = resolveProviderModelReference(cliProvider, cliModel, modelRegistry.getAvailable());
1723
+ const found = resolveProviderModelReference(
1724
+ cliProvider,
1725
+ cliModel,
1726
+ modelRegistry.getAvailable(credentialSessionId),
1727
+ );
1707
1728
 
1708
1729
  if (!found) {
1709
1730
  console.error(chalk.red(`Model ${cliProvider}/${cliModel} not found`));
@@ -1728,7 +1749,11 @@ export async function findInitialModel(options: {
1728
1749
 
1729
1750
  // 3. Try saved default from settings
1730
1751
  if (defaultProvider && defaultModelId) {
1731
- const found = resolveProviderModelReference(defaultProvider, defaultModelId, modelRegistry.getAvailable());
1752
+ const found = resolveProviderModelReference(
1753
+ defaultProvider,
1754
+ defaultModelId,
1755
+ modelRegistry.getAvailable(credentialSessionId),
1756
+ );
1732
1757
 
1733
1758
  if (found) {
1734
1759
  model = found;
@@ -1743,7 +1768,7 @@ export async function findInitialModel(options: {
1743
1768
  }
1744
1769
 
1745
1770
  // 4. Try first available model with valid API key
1746
- const availableModels = modelRegistry.getAvailable();
1771
+ const availableModels = modelRegistry.getAvailable(credentialSessionId);
1747
1772
 
1748
1773
  if (availableModels.length > 0) {
1749
1774
  // Try to find a default model from known providers
@@ -1772,11 +1797,16 @@ export async function restoreModelFromSession(
1772
1797
  currentModel: Model<Api> | undefined,
1773
1798
  shouldPrintMessages: boolean,
1774
1799
  modelRegistry: RestorableModelRegistry,
1800
+ credentialSessionId?: string,
1775
1801
  ): Promise<{ model: Model<Api> | undefined; fallbackMessage: string | undefined }> {
1776
- const restoredModel = resolveProviderModelReference(savedProvider, savedModelId, modelRegistry.getAvailable());
1802
+ const restoredModel = resolveProviderModelReference(
1803
+ savedProvider,
1804
+ savedModelId,
1805
+ modelRegistry.getAvailable(credentialSessionId),
1806
+ );
1777
1807
 
1778
1808
  // Check if restored model exists and has a valid API key
1779
- const hasApiKey = restoredModel ? !!(await modelRegistry.getApiKey(restoredModel)) : false;
1809
+ const hasApiKey = restoredModel ? !!(await modelRegistry.getApiKey(restoredModel, credentialSessionId)) : false;
1780
1810
 
1781
1811
  if (restoredModel && hasApiKey) {
1782
1812
  if (shouldPrintMessages) {
@@ -1804,7 +1834,7 @@ export async function restoreModelFromSession(
1804
1834
  }
1805
1835
 
1806
1836
  // Try to find any available model
1807
- const availableModels = modelRegistry.getAvailable();
1837
+ const availableModels = modelRegistry.getAvailable(credentialSessionId);
1808
1838
 
1809
1839
  if (availableModels.length > 0) {
1810
1840
  // Try to find a default model from known providers
@@ -26,6 +26,7 @@ export const ModelCompatSchema = z.object({
26
26
  sendSessionHeaders: z.boolean().optional(),
27
27
  supportsResponsesSessionAffinity: z.boolean().optional(),
28
28
  supportsServiceTier: z.boolean().optional(),
29
+ supportsUltrafastTier: z.boolean().optional(),
29
30
  supportsMultipleSystemMessages: z.boolean().optional(),
30
31
  supportsReasoningEffort: z.boolean().optional(),
31
32
  reasoningEffortMap: ReasoningEffortMapSchema.optional(),
@@ -68,6 +69,8 @@ export const GJC_MODEL_ASSIGNMENT_TARGET_IDS = [
68
69
  ] as const;
69
70
  export const EffortSchema = z.enum(GJC_MODEL_EFFORT_IDS);
70
71
  const CacheRetentionSchema = z.enum(["none", "short", "long"]);
72
+ const MAX_STREAM_IDLE_TIMEOUT_MS = 2 ** 31 - 1;
73
+ const StreamIdleTimeoutMsSchema = z.number().int().finite().nonnegative().max(MAX_STREAM_IDLE_TIMEOUT_MS);
71
74
 
72
75
  const ThinkingControlModeSchema = z.enum([
73
76
  "effort",
@@ -166,6 +169,7 @@ const ModelDefinitionSchema = z
166
169
  wireModelId: z.string().min(1).optional(),
167
170
  requestTransform: RequestTransformSchema.optional(),
168
171
  cacheRetention: CacheRetentionSchema.optional(),
172
+ streamIdleTimeoutMs: StreamIdleTimeoutMsSchema.optional(),
169
173
  })
170
174
  .strict();
171
175
 
@@ -193,6 +197,7 @@ export const ModelOverrideSchema = z
193
197
  wireModelId: z.string().min(1).optional(),
194
198
  requestTransform: RequestTransformSchema.optional(),
195
199
  cacheRetention: CacheRetentionSchema.optional(),
200
+ streamIdleTimeoutMs: StreamIdleTimeoutMsSchema.optional(),
196
201
  })
197
202
  .strict();
198
203
 
@@ -257,6 +262,7 @@ const ProviderConfigSchema = z
257
262
  */
258
263
  transport: z.literal("pi-native").optional(),
259
264
  cacheRetention: CacheRetentionSchema.optional(),
265
+ streamIdleTimeoutMs: StreamIdleTimeoutMsSchema.optional(),
260
266
  openaiCompat: LocalOpenAICompatSchema.optional(),
261
267
  })
262
268
  .strict();
@@ -1,5 +1,6 @@
1
1
  import type { Effort } from "@gajae-code/ai/model-thinking";
2
2
  import { PET_MODE_IDS, PET_SKIN_IDS, PET_SKINS } from "@gajae-code/tui/components/gajae-pet";
3
+ import { type CredentialPreferenceEntryValue, parseCredentialPreferenceList } from "../session/startup-auth-config";
3
4
  import { TASK_SIMPLE_MODES } from "../task/simple-mode";
4
5
  import { getThinkingLevelMetadata } from "../thinking-metadata";
5
6
  import { DEFAULT_EDIT_MODE_SETTING, EDIT_MODE_SETTINGS, EDIT_MODES, type EditMode } from "../utils/edit-mode";
@@ -214,7 +215,11 @@ interface ArrayDef<T> {
214
215
  type RecordValueDef =
215
216
  | { type: "model-selector-value" }
216
217
  | { type: "string-enum"; values: readonly string[] }
217
- | { type: "credential-selector" };
218
+ | { type: "credential-selector" }
219
+ | { type: "credential-preference-list" };
220
+
221
+ /** A provider's `auth.credentialPreferences` value: one account or a non-empty ordered list of entries. */
222
+ export type CredentialPreferenceSettingValue = string | CredentialPreferenceEntryValue[];
218
223
 
219
224
  interface ConstrainedRecordValueDef {
220
225
  type: "autorouting-selector-value";
@@ -452,6 +457,13 @@ export const SETTINGS_SCHEMA = {
452
457
  valueSchema: { type: "credential-selector" } as const,
453
458
  },
454
459
  "auth.credentialPinStoreIdentity": { type: "string", default: undefined },
460
+ // Ordered soft per-provider OAuth account preferences with optional per-entry usage caps. Global-only, like pins;
461
+ // read at startup.
462
+ "auth.credentialPreferences": {
463
+ type: "record",
464
+ default: {} as Record<string, CredentialPreferenceSettingValue>,
465
+ valueSchema: { type: "credential-preference-list" } as const,
466
+ },
455
467
  "session.directoryMigration": {
456
468
  type: "enum",
457
469
  values: ["copy-retain", "disabled"] as const,
@@ -493,6 +505,13 @@ export const SETTINGS_SCHEMA = {
493
505
  description: "Grace period before a master-spawned child orphaned by confirmed master loss is closed.",
494
506
  validate: (value: number) => Number.isSafeInteger(value) && value >= 60_000 && value <= 3_600_000,
495
507
  },
508
+ "sdk.brokerAbandonedGraceMs": {
509
+ type: "number",
510
+ default: 120_000,
511
+ description:
512
+ "Grace before a detached broker with no client connection, no live session host, and no open spawn authority exits on its own. A supervised `gjc sdk broker run` service never reaps itself.",
513
+ validate: (value: number) => Number.isSafeInteger(value) && value >= 60_000 && value <= 3_600_000,
514
+ },
496
515
 
497
516
  // Notifications (shared daemon with Telegram/Discord/Slack presentation adapters)
498
517
  "notifications.enabled": { type: "boolean", default: false },
@@ -1470,19 +1489,30 @@ export const SETTINGS_SCHEMA = {
1470
1489
 
1471
1490
  serviceTier: {
1472
1491
  type: "enum",
1473
- values: ["none", "auto", "default", "flex", "scale", "priority", "openai-only", "claude-only"] as const,
1492
+ values: [
1493
+ "none",
1494
+ "auto",
1495
+ "default",
1496
+ "flex",
1497
+ "scale",
1498
+ "priority",
1499
+ "ultrafast",
1500
+ "openai-only",
1501
+ "claude-only",
1502
+ ] as const,
1474
1503
  default: "none",
1475
1504
  ui: {
1476
1505
  tab: "model",
1477
1506
  label: "Service Tier",
1478
1507
  description:
1479
- 'Processing priority hint (none = omit). OpenAI accepts the tier values directly; Anthropic realizes `priority` as `speed: "fast"` on supported Opus models. Scoped values target one family.',
1508
+ 'Processing priority hint (none = omit). OpenAI accepts the tier values directly; ultrafast is a 6x premium tier. Anthropic realizes `priority` as `speed: "fast"` on supported Opus models. Scoped values target one family.',
1480
1509
  options: [
1481
1510
  { value: "none", label: "None", description: "Omit service_tier parameter" },
1482
1511
  { value: "auto", label: "Auto", description: "Use provider default tier selection (OpenAI)" },
1483
1512
  { value: "default", label: "Default", description: "Standard priority processing (OpenAI)" },
1484
1513
  { value: "flex", label: "Flex", description: "Flexible capacity tier when available (OpenAI)" },
1485
1514
  { value: "scale", label: "Scale", description: "Scale Tier credits when available (OpenAI)" },
1515
+ { value: "ultrafast", label: "Ultrafast", description: "Ultrafast processing at a 6x premium (OpenAI)" },
1486
1516
  {
1487
1517
  value: "priority",
1488
1518
  label: "Priority",
@@ -1512,6 +1542,7 @@ export const SETTINGS_SCHEMA = {
1512
1542
  "flex",
1513
1543
  "scale",
1514
1544
  "priority",
1545
+ "ultrafast",
1515
1546
  "openai-only",
1516
1547
  "claude-only",
1517
1548
  ] as const,
@@ -1532,6 +1563,7 @@ export const SETTINGS_SCHEMA = {
1532
1563
  { value: "default", label: "Default", description: "Standard priority processing (OpenAI)" },
1533
1564
  { value: "flex", label: "Flex", description: "Flexible capacity tier when available (OpenAI)" },
1534
1565
  { value: "scale", label: "Scale", description: "Scale Tier credits when available (OpenAI)" },
1566
+ { value: "ultrafast", label: "Ultrafast", description: "Ultrafast processing at a 6x premium (OpenAI)" },
1535
1567
  {
1536
1568
  value: "priority",
1537
1569
  label: "Priority",
@@ -1778,7 +1810,7 @@ export const SETTINGS_SCHEMA = {
1778
1810
  tab: "interaction",
1779
1811
  label: "Prompt Suggestions",
1780
1812
  description:
1781
- "Predict your likely next prompt after each turn (smol-model call) and show it as ghost text; Tab accepts",
1813
+ "Predict your likely next prompt after each turn (one extra default-role model call) and show it as ghost text; Tab accepts",
1782
1814
  },
1783
1815
  },
1784
1816
 
@@ -2821,6 +2853,12 @@ export const SETTINGS_SCHEMA = {
2821
2853
  type: "string",
2822
2854
  default: undefined,
2823
2855
  },
2856
+ // xxHash64 hex pin for settingsPath. Only the user/global value is a pin;
2857
+ // a project file cannot authorize the TOML path it names.
2858
+ "shellMinimizer.settingsHash": {
2859
+ type: "string",
2860
+ default: undefined,
2861
+ },
2824
2862
  "shellMinimizer.only": { type: "array", default: EMPTY_STRING_ARRAY },
2825
2863
  "shellMinimizer.except": { type: "array", default: EMPTY_STRING_ARRAY },
2826
2864
  "shellMinimizer.maxCaptureBytes": {
@@ -3004,6 +3042,17 @@ export const SETTINGS_SCHEMA = {
3004
3042
  },
3005
3043
  },
3006
3044
 
3045
+ "reportIssue.enabled": {
3046
+ type: "boolean",
3047
+ default: false,
3048
+ ui: {
3049
+ tab: "tools",
3050
+ label: "Tool issue reporting",
3051
+ description:
3052
+ "Enable the report_issue tool: the model records tool behavior that contradicts the tool's description into the local ~/.gjc/tool-issues.db. Nothing is sent anywhere.",
3053
+ },
3054
+ },
3055
+
3007
3056
  "debug.enabled": {
3008
3057
  type: "boolean",
3009
3058
  default: true,
@@ -3554,6 +3603,11 @@ export const SETTINGS_SCHEMA = {
3554
3603
  default: [] as string[],
3555
3604
  },
3556
3605
 
3606
+ "mcp.discoveryDeferAutoload": {
3607
+ type: "boolean",
3608
+ default: false,
3609
+ },
3610
+
3557
3611
  "mcp.notifications": {
3558
3612
  type: "boolean",
3559
3613
  default: false,
@@ -3780,6 +3834,17 @@ export const SETTINGS_SCHEMA = {
3780
3834
  },
3781
3835
  },
3782
3836
 
3837
+ "task.compactSubagentPanel": {
3838
+ type: "boolean",
3839
+ default: false,
3840
+ ui: {
3841
+ tab: "tasks",
3842
+ label: "Compact Subagent Panel",
3843
+ description:
3844
+ "Collapse awaited subagents into one summary line (expand tool output to see each one) and refresh only when the summary changes",
3845
+ },
3846
+ },
3847
+
3783
3848
  "task.enableLsp": {
3784
3849
  type: "boolean",
3785
3850
  default: false,
@@ -4358,6 +4423,9 @@ function validRecordValue(valueSchema: RecordValueDef, value: unknown): boolean
4358
4423
  /^account:\S+$/.test(value))
4359
4424
  );
4360
4425
  }
4426
+ if (valueSchema.type === "credential-preference-list") {
4427
+ return parseCredentialPreferenceList(value) !== undefined;
4428
+ }
4361
4429
  return typeof value === "string" && valueSchema.values.includes(value);
4362
4430
  }
4363
4431
 
@@ -4700,6 +4768,7 @@ export interface BashInterceptorRule {
4700
4768
  export interface ShellMinimizerSettings {
4701
4769
  enabled: boolean;
4702
4770
  settingsPath: string | undefined;
4771
+ settingsHash: string | undefined;
4703
4772
  only: string[];
4704
4773
  except: string[];
4705
4774
  maxCaptureBytes: number;