@gajae-code/coding-agent 0.13.3 → 0.14.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 (599) hide show
  1. package/CHANGELOG.md +184 -2
  2. package/README.md +2 -0
  3. package/bin/gajaessi.js +4 -0
  4. package/dist/types/async/job-manager.d.ts +55 -2
  5. package/dist/types/async/support.d.ts +14 -0
  6. package/dist/types/capability/mcp.d.ts +6 -0
  7. package/dist/types/capability/types.d.ts +6 -0
  8. package/dist/types/cli/accounts-cli.d.ts +19 -0
  9. package/dist/types/cli/args.d.ts +3 -0
  10. package/dist/types/cli/config-cli.d.ts +6 -0
  11. package/dist/types/cli/crash-cli.d.ts +10 -0
  12. package/dist/types/cli/customize-doctor.d.ts +145 -0
  13. package/dist/types/cli/daemon-cli.d.ts +3 -1
  14. package/dist/types/cli/mcp-cli.d.ts +11 -0
  15. package/dist/types/cli/notify-cli.d.ts +1 -1
  16. package/dist/types/cli/root-flags.d.ts +12 -0
  17. package/dist/types/cli/setup-cli.d.ts +3 -1
  18. package/dist/types/cli/skills-cli.d.ts +2 -1
  19. package/dist/types/cli/update-cli.d.ts +19 -1
  20. package/dist/types/cli.d.ts +6 -0
  21. package/dist/types/commands/accounts.d.ts +40 -0
  22. package/dist/types/commands/crash.d.ts +24 -0
  23. package/dist/types/commands/customize.d.ts +22 -0
  24. package/dist/types/commands/daemon.d.ts +1 -1
  25. package/dist/types/commands/launch.d.ts +6 -0
  26. package/dist/types/commands/setup.d.ts +6 -0
  27. package/dist/types/commands/skills.d.ts +6 -1
  28. package/dist/types/commands/update.d.ts +7 -0
  29. package/dist/types/config/atomic-yaml-patch-worker.d.ts +25 -0
  30. package/dist/types/config/atomic-yaml-patch.d.ts +62 -2
  31. package/dist/types/config/config-schema-version.d.ts +10 -0
  32. package/dist/types/config/file-lock.d.ts +18 -0
  33. package/dist/types/config/model-profile-activation.d.ts +3 -1
  34. package/dist/types/config/model-registry.d.ts +9 -1
  35. package/dist/types/config/models-config-schema.d.ts +2 -0
  36. package/dist/types/config/settings-schema.d.ts +70 -6
  37. package/dist/types/config/settings.d.ts +63 -0
  38. package/dist/types/config/skill-settings-defaults.d.ts +26 -0
  39. package/dist/types/config/task-delegation.d.ts +39 -0
  40. package/dist/types/config/update-channel.d.ts +10 -0
  41. package/dist/types/coordinator-mcp/server.d.ts +5 -1
  42. package/dist/types/crash/index-store.d.ts +87 -0
  43. package/dist/types/crash/nudge.d.ts +50 -0
  44. package/dist/types/crash/record-loader.d.ts +17 -0
  45. package/dist/types/crash/report.d.ts +134 -0
  46. package/dist/types/crash/sanitize.d.ts +25 -0
  47. package/dist/types/cursor.d.ts +13 -2
  48. package/dist/types/customization/import.d.ts +37 -0
  49. package/dist/types/customization/index.d.ts +4 -0
  50. package/dist/types/customization/inventory.d.ts +25 -0
  51. package/dist/types/customization/mutations.d.ts +32 -0
  52. package/dist/types/customization/types.d.ts +115 -0
  53. package/dist/types/daemon/control-types.d.ts +8 -1
  54. package/dist/types/daemon/operator-contract.d.ts +4 -4
  55. package/dist/types/discovery/claude.d.ts +39 -1
  56. package/dist/types/discovery/codex.d.ts +39 -1
  57. package/dist/types/discovery/index.d.ts +2 -0
  58. package/dist/types/discovery/mcp-compat.d.ts +30 -0
  59. package/dist/types/edit/renderer.d.ts +23 -0
  60. package/dist/types/extensibility/extensions/runner.d.ts +3 -0
  61. package/dist/types/extensibility/extensions/types.d.ts +21 -4
  62. package/dist/types/extensibility/gjc-plugins/observability.d.ts +6 -1
  63. package/dist/types/extensibility/gjc-plugins/registry.d.ts +8 -1
  64. package/dist/types/extensibility/hooks/loader.d.ts +19 -5
  65. package/dist/types/extensibility/runtime-skill-discovery.d.ts +22 -1
  66. package/dist/types/extensibility/skill-management.d.ts +107 -0
  67. package/dist/types/gjc-runtime/deep-interview-runtime.d.ts +3 -1
  68. package/dist/types/gjc-runtime/launch-worktree.d.ts +8 -0
  69. package/dist/types/gjc-runtime/linux-proc.d.ts +3 -0
  70. package/dist/types/gjc-runtime/ralplan-runtime.d.ts +10 -6
  71. package/dist/types/gjc-runtime/session-state-lock.d.ts +104 -0
  72. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +120 -2
  73. package/dist/types/gjc-runtime/state-writer.d.ts +10 -1
  74. package/dist/types/gjc-runtime/ultragoal-guard.d.ts +4 -2
  75. package/dist/types/gjc-runtime/ultragoal-runtime.d.ts +8 -6
  76. package/dist/types/gjc-runtime/workflow-settings.d.ts +109 -0
  77. package/dist/types/hooks/events.d.ts +60 -0
  78. package/dist/types/hooks/normalize.d.ts +83 -0
  79. package/dist/types/hooks/skill-state.d.ts +9 -2
  80. package/dist/types/main.d.ts +1 -1
  81. package/dist/types/modes/acp/abort-scope.d.ts +13 -0
  82. package/dist/types/modes/acp/acp-agent.d.ts +7 -4
  83. package/dist/types/modes/components/customization/customization-dashboard.d.ts +44 -0
  84. package/dist/types/modes/components/customization/import-wizard.d.ts +21 -0
  85. package/dist/types/modes/components/customization/index.d.ts +1 -0
  86. package/dist/types/modes/components/gajae-pet-widget.d.ts +8 -30
  87. package/dist/types/modes/components/irc-sidebar.d.ts +1 -0
  88. package/dist/types/modes/components/iterm-pet-transport.d.ts +122 -0
  89. package/dist/types/modes/components/oauth-selector.d.ts +10 -4
  90. package/dist/types/modes/components/pet-capability.d.ts +11 -25
  91. package/dist/types/modes/components/status-line/gh.d.ts +6 -2
  92. package/dist/types/modes/controllers/extension-ui-controller.d.ts +1 -1
  93. package/dist/types/modes/controllers/selector-controller.d.ts +7 -8
  94. package/dist/types/modes/controllers/stt-controller.d.ts +1 -1
  95. package/dist/types/modes/interactive-mode.d.ts +1 -0
  96. package/dist/types/modes/types.d.ts +1 -0
  97. package/dist/types/modes/utils/injected-user-submission.d.ts +10 -0
  98. package/dist/types/runtime-mcp/config.d.ts +9 -0
  99. package/dist/types/runtime-mcp/manager.d.ts +26 -1
  100. package/dist/types/runtime-mcp/oauth-discovery.d.ts +4 -0
  101. package/dist/types/runtime-mcp/oauth-flow.d.ts +24 -1
  102. package/dist/types/runtime-mcp/pool-key.d.ts +2 -0
  103. package/dist/types/runtime-mcp/protocol.d.ts +278 -0
  104. package/dist/types/runtime-mcp/scope-config.d.ts +29 -0
  105. package/dist/types/runtime-mcp/tool-bridge.d.ts +15 -13
  106. package/dist/types/runtime-mcp/transports/http.d.ts +9 -0
  107. package/dist/types/runtime-mcp/types.d.ts +102 -10
  108. package/dist/types/sdk/acp/adapter.d.ts +26 -5
  109. package/dist/types/sdk/broker/broker.d.ts +3 -55
  110. package/dist/types/sdk/broker/lifecycle.d.ts +18 -12
  111. package/dist/types/sdk/broker/session-index.d.ts +14 -5
  112. package/dist/types/sdk/broker/startup-failure.d.ts +16 -1
  113. package/dist/types/sdk/bus/chat-daemon-control.d.ts +51 -1
  114. package/dist/types/sdk/bus/chat-daemon-runtime.d.ts +4 -41
  115. package/dist/types/sdk/bus/config.d.ts +11 -0
  116. package/dist/types/sdk/bus/conversation-store.d.ts +0 -1
  117. package/dist/types/sdk/bus/daemon-paths.d.ts +6 -0
  118. package/dist/types/sdk/bus/discord-conversation.d.ts +2 -0
  119. package/dist/types/sdk/bus/discord-daemon.d.ts +17 -12
  120. package/dist/types/sdk/bus/existing-thread-readiness.d.ts +4 -34
  121. package/dist/types/sdk/bus/inbound-reaction-ordering.d.ts +61 -0
  122. package/dist/types/sdk/bus/index.d.ts +85 -99
  123. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +29 -7
  124. package/dist/types/sdk/bus/managed-daemon.d.ts +2 -32
  125. package/dist/types/sdk/bus/notification-service.d.ts +52 -0
  126. package/dist/types/sdk/bus/operator-runtime.d.ts +1 -1
  127. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +16 -5
  128. package/dist/types/sdk/bus/reconciliation-store.d.ts +113 -5
  129. package/dist/types/sdk/bus/session-control.d.ts +25 -1
  130. package/dist/types/sdk/bus/slack-conversation.d.ts +4 -0
  131. package/dist/types/sdk/bus/slack-daemon.d.ts +9 -17
  132. package/dist/types/sdk/bus/slack-live-provider.d.ts +3 -1
  133. package/dist/types/sdk/bus/slack-provider.d.ts +4 -0
  134. package/dist/types/sdk/bus/slack-thread-binding.d.ts +6 -40
  135. package/dist/types/sdk/bus/telegram-adoption-intent.d.ts +30 -104
  136. package/dist/types/sdk/bus/telegram-daemon-cli.d.ts +10 -0
  137. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +262 -19
  138. package/dist/types/sdk/bus/telegram-daemon-orphan-reap.d.ts +125 -0
  139. package/dist/types/sdk/bus/telegram-daemon-owner-registry.d.ts +22 -0
  140. package/dist/types/sdk/bus/telegram-daemon.d.ts +119 -310
  141. package/dist/types/sdk/bus/telegram-reference.d.ts +1 -47
  142. package/dist/types/sdk/bus/threaded-render.d.ts +1 -0
  143. package/dist/types/sdk/bus/topic-registry.d.ts +33 -17
  144. package/dist/types/sdk/cli/rows.d.ts +2 -11
  145. package/dist/types/sdk/cli/session-cli.d.ts +15 -25
  146. package/dist/types/sdk/client/client.d.ts +97 -1
  147. package/dist/types/sdk/host/control/dispatch.d.ts +0 -7
  148. package/dist/types/sdk/host/control/index.d.ts +1 -1
  149. package/dist/types/sdk/host/control/operations.d.ts +18 -5
  150. package/dist/types/sdk/host/control/runtime-gate.d.ts +19 -0
  151. package/dist/types/sdk/host/host.d.ts +15 -1
  152. package/dist/types/sdk/host/query/handlers.d.ts +5 -0
  153. package/dist/types/sdk/host/reverse-leases.d.ts +1 -1
  154. package/dist/types/sdk/host/session-runtime.d.ts +127 -7
  155. package/dist/types/sdk/host/types.d.ts +1 -1
  156. package/dist/types/sdk/host/websocket-transport.d.ts +1 -1
  157. package/dist/types/sdk/index.d.ts +2 -1
  158. package/dist/types/sdk/lifecycle/broker-client.d.ts +8 -0
  159. package/dist/types/sdk/lifecycle/client.d.ts +59 -0
  160. package/dist/types/sdk/lifecycle/index.d.ts +3 -0
  161. package/dist/types/sdk/lifecycle/service.d.ts +232 -0
  162. package/dist/types/sdk/mcp/server.d.ts +9 -6
  163. package/dist/types/sdk/prompt-deadline-lease.d.ts +43 -0
  164. package/dist/types/sdk/prompt-deadline-manager.d.ts +28 -0
  165. package/dist/types/sdk/prompt-status.d.ts +10 -3
  166. package/dist/types/sdk/protocol/operation-registry.d.ts +5 -0
  167. package/dist/types/sdk/receipt-state.d.ts +17 -0
  168. package/dist/types/sdk/reconciliation-extensions.d.ts +2 -0
  169. package/dist/types/sdk/router/index.d.ts +1 -0
  170. package/dist/types/sdk/router/session-router.d.ts +152 -0
  171. package/dist/types/sdk/session-list.d.ts +22 -0
  172. package/dist/types/sdk/session-reconnect.d.ts +43 -1
  173. package/dist/types/sdk/session.d.ts +34 -1
  174. package/dist/types/sdk/transport/serve-cli.d.ts +1 -4
  175. package/dist/types/session/account-inventory.d.ts +86 -0
  176. package/dist/types/session/agent-session.d.ts +145 -6
  177. package/dist/types/session/agent-storage.d.ts +10 -0
  178. package/dist/types/session/coordinator-tool-label.d.ts +28 -0
  179. package/dist/types/session/internal/managed-session-storage.d.ts +23 -4
  180. package/dist/types/session/messages.d.ts +1 -1
  181. package/dist/types/session/secure-token-file.d.ts +3 -0
  182. package/dist/types/session/session-manager.d.ts +40 -1
  183. package/dist/types/session/startup-auth-config.d.ts +44 -0
  184. package/dist/types/session/terminal-abort.d.ts +378 -0
  185. package/dist/types/session/yield-queue.d.ts +7 -0
  186. package/dist/types/session-import/claude.d.ts +26 -0
  187. package/dist/types/session-import/codex.d.ts +88 -0
  188. package/dist/types/session-import/command.d.ts +35 -0
  189. package/dist/types/session-import/detect.d.ts +22 -0
  190. package/dist/types/session-import/index.d.ts +7 -0
  191. package/dist/types/session-import/provider-codex.d.ts +22 -0
  192. package/dist/types/session-import/provider-service.d.ts +38 -0
  193. package/dist/types/session-import/redact.d.ts +23 -0
  194. package/dist/types/session-import/service.d.ts +47 -0
  195. package/dist/types/session-import/types.d.ts +120 -0
  196. package/dist/types/setup/paseo/check.d.ts +16 -0
  197. package/dist/types/setup/paseo/install-saga.d.ts +115 -0
  198. package/dist/types/setup/paseo/json-publisher.d.ts +76 -0
  199. package/dist/types/setup/paseo/orchestration-preferences.d.ts +24 -0
  200. package/dist/types/setup/paseo/paseo-ownership.d.ts +87 -0
  201. package/dist/types/setup/paseo/paseo-setup.d.ts +29 -0
  202. package/dist/types/setup/paseo/provider-config.d.ts +35 -0
  203. package/dist/types/setup/paseo/remove.d.ts +14 -0
  204. package/dist/types/setup/paseo/result-types.d.ts +59 -0
  205. package/dist/types/setup/paseo/setup-deps.d.ts +73 -0
  206. package/dist/types/setup/paseo/skills-bridge.d.ts +44 -0
  207. package/dist/types/skill-state/active-state.d.ts +5 -1
  208. package/dist/types/slash-commands/acp-builtins.d.ts +5 -1
  209. package/dist/types/slash-commands/builtin-registry.d.ts +2 -0
  210. package/dist/types/slash-commands/helpers/credential-switch.d.ts +12 -0
  211. package/dist/types/slash-commands/helpers/usage-report.d.ts +5 -6
  212. package/dist/types/slash-commands/types.d.ts +7 -1
  213. package/dist/types/task/executor.d.ts +10 -0
  214. package/dist/types/task/index.d.ts +3 -1
  215. package/dist/types/tools/ask-answer-registry.d.ts +6 -3
  216. package/dist/types/tools/bash-sleep-advisory.d.ts +14 -0
  217. package/dist/types/tools/bash.d.ts +2 -6
  218. package/dist/types/tools/browser/attach.d.ts +11 -0
  219. package/dist/types/tools/browser/launch.d.ts +20 -0
  220. package/dist/types/tools/browser/profile-discovery.d.ts +6 -0
  221. package/dist/types/tools/browser/render.d.ts +1 -0
  222. package/dist/types/tools/browser.d.ts +3 -1
  223. package/dist/types/tools/image-gen.d.ts +9 -2
  224. package/dist/types/tools/index.d.ts +8 -0
  225. package/dist/types/tools/monitor.d.ts +1 -1
  226. package/dist/types/tools/skill-discovery.d.ts +8 -1
  227. package/dist/types/tools/subagent.d.ts +2 -0
  228. package/dist/types/tools/ultragoal-ask-guard.d.ts +2 -2
  229. package/dist/types/utils/herdr-pane.d.ts +76 -0
  230. package/package.json +19 -9
  231. package/scripts/build-binary.ts +2 -1
  232. package/scripts/build-sdk-package-smoke.ts +2 -13
  233. package/scripts/capture-sticky-viewport-showcase.ts +0 -1
  234. package/scripts/compile-args.ts +2 -0
  235. package/scripts/generate-sdk-adapter-parity-manifest.ts +31 -16
  236. package/scripts/generate-sdk-operation-inventory.ts +28 -0
  237. package/scripts/generate-telegram-baseline-manifest.ts +1 -0
  238. package/scripts/generate-tool-catalog.ts +6 -4
  239. package/scripts/verify-gjc-sdk-canonicalization.ts +5 -39
  240. package/src/async/job-manager.ts +352 -17
  241. package/src/async/support.ts +25 -0
  242. package/src/autoresearch/dashboard.ts +28 -13
  243. package/src/capability/index.ts +3 -1
  244. package/src/capability/mcp.ts +6 -0
  245. package/src/capability/types.ts +6 -0
  246. package/src/cli/accounts-cli.ts +395 -0
  247. package/src/cli/args.ts +23 -0
  248. package/src/cli/auth-broker-cli.ts +136 -66
  249. package/src/cli/auth-gateway-cli.ts +94 -70
  250. package/src/cli/config-cli.ts +27 -2
  251. package/src/cli/crash-cli.ts +78 -0
  252. package/src/cli/customize-doctor.ts +1605 -0
  253. package/src/cli/daemon-cli.ts +12 -3
  254. package/src/cli/fast-help.ts +1 -0
  255. package/src/cli/mcp-cli.ts +128 -60
  256. package/src/cli/notify-cli.ts +8 -14
  257. package/src/cli/root-flags.ts +8 -0
  258. package/src/cli/setup-cli.ts +145 -0
  259. package/src/cli/skills-cli.ts +38 -2
  260. package/src/cli/update-cli.ts +167 -12
  261. package/src/cli.ts +4 -0
  262. package/src/commands/accounts.ts +71 -0
  263. package/src/commands/crash.ts +35 -0
  264. package/src/commands/customize.ts +84 -0
  265. package/src/commands/daemon.ts +2 -2
  266. package/src/commands/deep-interview.ts +2 -0
  267. package/src/commands/launch.ts +1 -0
  268. package/src/commands/mcp.ts +12 -7
  269. package/src/commands/ralplan.ts +2 -0
  270. package/src/commands/sdk.ts +65 -32
  271. package/src/commands/setup.ts +5 -0
  272. package/src/commands/skills.ts +14 -4
  273. package/src/commands/ultragoal.ts +10 -1
  274. package/src/commands/update.ts +26 -15
  275. package/src/config/atomic-yaml-patch-worker.ts +57 -0
  276. package/src/config/atomic-yaml-patch.ts +769 -29
  277. package/src/config/config-schema-version.ts +10 -0
  278. package/src/config/file-lock.ts +70 -1
  279. package/src/config/mcp-schema.json +52 -14
  280. package/src/config/model-profile-activation.ts +20 -1
  281. package/src/config/model-profiles.ts +29 -19
  282. package/src/config/model-registry.ts +132 -21
  283. package/src/config/models-config-schema.ts +1 -1
  284. package/src/config/settings-schema.ts +76 -6
  285. package/src/config/settings.ts +4038 -199
  286. package/src/config/skill-settings-defaults.ts +41 -3
  287. package/src/config/task-delegation.ts +87 -0
  288. package/src/config/update-channel.ts +23 -0
  289. package/src/coordinator-mcp/server.ts +377 -308
  290. package/src/crash/index-store.ts +723 -0
  291. package/src/crash/nudge.ts +89 -0
  292. package/src/crash/record-loader.ts +149 -0
  293. package/src/crash/report.ts +551 -0
  294. package/src/crash/sanitize.ts +129 -0
  295. package/src/cursor.ts +36 -10
  296. package/src/customization/import.ts +946 -0
  297. package/src/customization/index.ts +4 -0
  298. package/src/customization/inventory.ts +335 -0
  299. package/src/customization/mutations.ts +141 -0
  300. package/src/customization/types.ts +223 -0
  301. package/src/daemon/control-types.ts +8 -1
  302. package/src/daemon/operator-contract.ts +6 -6
  303. package/src/defaults/gjc/skills/deep-interview/SKILL.md +11 -22
  304. package/src/defaults/gjc/skills/ralplan/SKILL.md +36 -23
  305. package/src/defaults/gjc/skills/ultragoal/SKILL.md +16 -0
  306. package/src/discovery/claude-hooks.ts +38 -0
  307. package/src/discovery/claude.ts +142 -209
  308. package/src/discovery/codex-hooks.ts +38 -0
  309. package/src/discovery/codex.ts +132 -198
  310. package/src/discovery/helpers.ts +8 -1
  311. package/src/discovery/index.ts +2 -0
  312. package/src/discovery/mcp-compat.ts +234 -0
  313. package/src/discovery/mcp-json.ts +6 -0
  314. package/src/edit/renderer.ts +40 -0
  315. package/src/edit/streaming.ts +4 -2
  316. package/src/exec/bash-executor.ts +24 -20
  317. package/src/export/html/index.ts +51 -2
  318. package/src/extensibility/extensions/loader.ts +9 -1
  319. package/src/extensibility/extensions/runner.ts +17 -4
  320. package/src/extensibility/extensions/types.ts +31 -6
  321. package/src/extensibility/gjc-plugins/constrained-hooks.ts +33 -0
  322. package/src/extensibility/gjc-plugins/installer.ts +9 -5
  323. package/src/extensibility/gjc-plugins/observability.ts +8 -2
  324. package/src/extensibility/gjc-plugins/registry.ts +13 -2
  325. package/src/extensibility/gjc-plugins/runtime-adapters.ts +3 -1
  326. package/src/extensibility/gjc-plugins/schema.ts +222 -39
  327. package/src/extensibility/hooks/loader.ts +154 -10
  328. package/src/extensibility/runtime-skill-discovery.ts +257 -60
  329. package/src/extensibility/skill-management.ts +368 -0
  330. package/src/extensibility/skills.ts +52 -16
  331. package/src/gjc-runtime/deep-interview-runtime.ts +45 -61
  332. package/src/gjc-runtime/launch-worktree.ts +56 -2
  333. package/src/gjc-runtime/linux-proc.ts +7 -1
  334. package/src/gjc-runtime/ralplan-runtime.ts +100 -164
  335. package/src/gjc-runtime/session-state-lock.ts +992 -0
  336. package/src/gjc-runtime/session-state-sidecar.ts +644 -142
  337. package/src/gjc-runtime/state-writer.ts +39 -14
  338. package/src/gjc-runtime/tmux-owner-isolation.ts +5 -4
  339. package/src/gjc-runtime/ultragoal-guard.ts +11 -4
  340. package/src/gjc-runtime/ultragoal-runtime.ts +44 -41
  341. package/src/gjc-runtime/workflow-settings.ts +596 -0
  342. package/src/goals/tools/goal-tool.ts +6 -1
  343. package/src/hooks/events.ts +291 -0
  344. package/src/hooks/native-skill-hook.ts +4 -0
  345. package/src/hooks/normalize.ts +369 -0
  346. package/src/hooks/skill-state.ts +165 -46
  347. package/src/internal-urls/docs-index.generated.ts +40 -32
  348. package/src/main.ts +32 -5
  349. package/src/migrate/mcp-mapper.ts +25 -2
  350. package/src/modes/acp/abort-scope.ts +29 -0
  351. package/src/modes/acp/acp-agent.ts +423 -98
  352. package/src/modes/components/assistant-message.ts +6 -1
  353. package/src/modes/components/customization/customization-dashboard.ts +443 -0
  354. package/src/modes/components/customization/import-wizard.ts +372 -0
  355. package/src/modes/components/customization/index.ts +1 -0
  356. package/src/modes/components/gajae-pet-widget.ts +539 -213
  357. package/src/modes/components/irc-sidebar.ts +11 -0
  358. package/src/modes/components/iterm-pet-transport.ts +585 -0
  359. package/src/modes/components/oauth-selector.ts +277 -86
  360. package/src/modes/components/pet-capability.ts +39 -40
  361. package/src/modes/components/settings-selector.ts +9 -0
  362. package/src/modes/components/status-line/gh.ts +45 -1
  363. package/src/modes/components/status-line/segments.ts +16 -1
  364. package/src/modes/components/tool-status-header.ts +13 -3
  365. package/src/modes/controllers/command-controller.ts +20 -8
  366. package/src/modes/controllers/extension-ui-controller.ts +56 -257
  367. package/src/modes/controllers/input-controller.ts +10 -0
  368. package/src/modes/controllers/runtime-mcp-command-controller.ts +16 -3
  369. package/src/modes/controllers/selector-controller.ts +177 -72
  370. package/src/modes/controllers/stt-controller.ts +3 -3
  371. package/src/modes/interactive-mode.ts +88 -16
  372. package/src/modes/print-mode.ts +35 -6
  373. package/src/modes/runtime-init.ts +21 -68
  374. package/src/modes/types.ts +1 -0
  375. package/src/modes/utils/injected-user-submission.ts +25 -0
  376. package/src/modes/utils/terminal-bell.ts +15 -1
  377. package/src/prompts/agent-fragments/ralplan-persistence.md +1 -1
  378. package/src/prompts/agent-fragments/restricted-bash.md +1 -1
  379. package/src/prompts/agents/critic.md +1 -1
  380. package/src/prompts/system/rlm-research.md +1 -1
  381. package/src/prompts/system/system-prompt.md +0 -2
  382. package/src/prompts/tools/bash.md +7 -1
  383. package/src/prompts/tools/browser.md +1 -1
  384. package/src/prompts/tools/cron.md +6 -6
  385. package/src/prompts/tools/read.md +0 -2
  386. package/src/prompts/tools/skill-discovery.md +4 -2
  387. package/src/runtime-mcp/client.ts +427 -23
  388. package/src/runtime-mcp/config.ts +37 -5
  389. package/src/runtime-mcp/manager-pool.test.ts +56 -0
  390. package/src/runtime-mcp/manager.ts +52 -2
  391. package/src/runtime-mcp/oauth-discovery.ts +13 -0
  392. package/src/runtime-mcp/oauth-flow.ts +46 -1
  393. package/src/runtime-mcp/pool-key.ts +5 -1
  394. package/src/runtime-mcp/pool.test.ts +9 -0
  395. package/src/runtime-mcp/protocol.test.ts +353 -0
  396. package/src/runtime-mcp/protocol.ts +624 -0
  397. package/src/runtime-mcp/scope-config.ts +78 -0
  398. package/src/runtime-mcp/tool-bridge.ts +44 -10
  399. package/src/runtime-mcp/transports/http.ts +84 -13
  400. package/src/runtime-mcp/types.ts +123 -12
  401. package/src/sdk/acp/adapter.ts +328 -97
  402. package/src/sdk/broker/broker.ts +160 -741
  403. package/src/sdk/broker/ensure.ts +9 -1
  404. package/src/sdk/broker/lifecycle.ts +510 -116
  405. package/src/sdk/broker/operation-receipt-ledger.ts +11 -2
  406. package/src/sdk/broker/process-incarnation.ts +19 -0
  407. package/src/sdk/broker/session-index.ts +516 -117
  408. package/src/sdk/broker/startup-failure.ts +28 -5
  409. package/src/sdk/broker/transport.ts +1 -13
  410. package/src/sdk/bus/chat-daemon-cli.ts +4 -2
  411. package/src/sdk/bus/chat-daemon-control.ts +67 -6
  412. package/src/sdk/bus/chat-daemon-runtime.ts +183 -859
  413. package/src/sdk/bus/config.ts +13 -0
  414. package/src/sdk/bus/conversation-store.ts +59 -171
  415. package/src/sdk/bus/daemon-paths.ts +20 -0
  416. package/src/sdk/bus/discord-conversation.ts +2 -0
  417. package/src/sdk/bus/discord-daemon.ts +524 -126
  418. package/src/sdk/bus/discord-live-provider.ts +206 -79
  419. package/src/sdk/bus/existing-thread-readiness.ts +4 -97
  420. package/src/sdk/bus/inbound-reaction-ordering.ts +122 -0
  421. package/src/sdk/bus/index.ts +2480 -456
  422. package/src/sdk/bus/kind-aware-reconciliation.ts +204 -34
  423. package/src/sdk/bus/lifecycle-commands.ts +2 -2
  424. package/src/sdk/bus/managed-daemon.ts +2 -145
  425. package/src/sdk/bus/notification-service.ts +196 -0
  426. package/src/sdk/bus/operator-runtime.ts +1 -1
  427. package/src/sdk/bus/prompt-reconciliation.ts +24 -15
  428. package/src/sdk/bus/reconciliation-store.ts +553 -24
  429. package/src/sdk/bus/session-control.ts +49 -3
  430. package/src/sdk/bus/slack-conversation.ts +4 -0
  431. package/src/sdk/bus/slack-daemon.ts +733 -134
  432. package/src/sdk/bus/slack-live-provider.ts +65 -15
  433. package/src/sdk/bus/slack-provider.ts +4 -0
  434. package/src/sdk/bus/slack-thread-binding.ts +9 -104
  435. package/src/sdk/bus/telegram-adoption-intent.ts +299 -209
  436. package/src/sdk/bus/telegram-daemon-cli.ts +194 -7
  437. package/src/sdk/bus/telegram-daemon-contract.ts +265 -19
  438. package/src/sdk/bus/telegram-daemon-control.ts +3 -13
  439. package/src/sdk/bus/telegram-daemon-orphan-reap.ts +498 -0
  440. package/src/sdk/bus/telegram-daemon-owner-registry.ts +176 -0
  441. package/src/sdk/bus/telegram-daemon.ts +2552 -2280
  442. package/src/sdk/bus/telegram-reference.ts +1 -226
  443. package/src/sdk/bus/telegram-setup.ts +2 -2
  444. package/src/sdk/bus/threaded-render.ts +1 -0
  445. package/src/sdk/bus/topic-registry.ts +279 -146
  446. package/src/sdk/cli/rows.ts +2 -35
  447. package/src/sdk/cli/session-cli.ts +776 -700
  448. package/src/sdk/client/client.ts +892 -1
  449. package/src/sdk/host/control/dispatch.ts +93 -58
  450. package/src/sdk/host/control/index.ts +1 -1
  451. package/src/sdk/host/control/operations.ts +18 -10
  452. package/src/sdk/host/control/runtime-gate.ts +40 -0
  453. package/src/sdk/host/host.ts +63 -12
  454. package/src/sdk/host/query/handlers.ts +66 -7
  455. package/src/sdk/host/reverse-leases.ts +2 -2
  456. package/src/sdk/host/sdk-surface-parity.test.ts +1 -1
  457. package/src/sdk/host/session-runtime.test.ts +2787 -34
  458. package/src/sdk/host/session-runtime.ts +1489 -101
  459. package/src/sdk/host/surface-policy.ts +12 -8
  460. package/src/sdk/host/types.ts +1 -1
  461. package/src/sdk/host/websocket-transport.lifecycle.test.ts +31 -59
  462. package/src/sdk/host/websocket-transport.ts +85 -50
  463. package/src/sdk/index.ts +2 -1
  464. package/src/sdk/lifecycle/broker-client.ts +53 -0
  465. package/src/sdk/lifecycle/client.ts +234 -0
  466. package/src/sdk/lifecycle/index.ts +3 -0
  467. package/src/sdk/{bus/recent-activity.ts → lifecycle/recent-sessions.ts} +5 -2
  468. package/src/sdk/lifecycle/service.ts +720 -0
  469. package/src/sdk/mcp/server.ts +226 -188
  470. package/src/sdk/prompt-deadline-lease.ts +55 -0
  471. package/src/sdk/prompt-deadline-manager.ts +148 -0
  472. package/src/sdk/prompt-status.ts +11 -3
  473. package/src/sdk/protocol/operation-inventory.generated.json +272 -129
  474. package/src/sdk/protocol/operation-registry.ts +71 -8
  475. package/src/sdk/receipt-state.ts +43 -0
  476. package/src/sdk/reconciliation-extensions.ts +14 -0
  477. package/src/sdk/router/index.ts +1 -0
  478. package/src/sdk/router/session-router.ts +1658 -0
  479. package/src/sdk/session-list.ts +93 -0
  480. package/src/sdk/session-reconnect.ts +45 -1
  481. package/src/sdk/session.ts +716 -120
  482. package/src/sdk/transport/serve-cli.ts +18 -34
  483. package/src/session/account-inventory.ts +603 -0
  484. package/src/session/agent-session.ts +2857 -582
  485. package/src/session/agent-storage.ts +35 -0
  486. package/src/session/blob-store.ts +32 -1
  487. package/src/session/coordinator-tool-label.ts +40 -0
  488. package/src/session/internal/managed-session-scope.ts +4 -0
  489. package/src/session/internal/managed-session-storage.ts +173 -12
  490. package/src/session/messages.ts +1 -1
  491. package/src/session/secure-token-file.ts +80 -0
  492. package/src/session/session-manager.ts +730 -58
  493. package/src/session/session-storage.ts +25 -16
  494. package/src/session/startup-auth-config.ts +297 -0
  495. package/src/session/terminal-abort.ts +1253 -0
  496. package/src/session/yield-queue.ts +57 -15
  497. package/src/session-import/claude.ts +334 -0
  498. package/src/session-import/codex.ts +1033 -0
  499. package/src/session-import/command.ts +77 -0
  500. package/src/session-import/detect.ts +133 -0
  501. package/src/session-import/index.ts +7 -0
  502. package/src/session-import/provider-codex.ts +327 -0
  503. package/src/session-import/provider-service.ts +457 -0
  504. package/src/session-import/redact.ts +128 -0
  505. package/src/session-import/service.ts +1264 -0
  506. package/src/session-import/types.ts +148 -0
  507. package/src/setup/paseo/check.ts +213 -0
  508. package/src/setup/paseo/install-saga.ts +293 -0
  509. package/src/setup/paseo/json-publisher.ts +263 -0
  510. package/src/setup/paseo/orchestration-preferences.ts +86 -0
  511. package/src/setup/paseo/paseo-ownership.ts +224 -0
  512. package/src/setup/paseo/paseo-setup.ts +253 -0
  513. package/src/setup/paseo/provider-config.ts +139 -0
  514. package/src/setup/paseo/remove.ts +183 -0
  515. package/src/setup/paseo/result-types.ts +79 -0
  516. package/src/setup/paseo/setup-deps.ts +175 -0
  517. package/src/setup/paseo/skills-bridge.ts +260 -0
  518. package/src/skill-state/active-state.ts +21 -11
  519. package/src/slash-commands/acp-builtins.ts +9 -1
  520. package/src/slash-commands/builtin-registry.ts +98 -16
  521. package/src/slash-commands/helpers/credential-switch.ts +143 -0
  522. package/src/slash-commands/helpers/mcp.ts +9 -3
  523. package/src/slash-commands/helpers/usage-report.ts +61 -56
  524. package/src/slash-commands/types.ts +7 -2
  525. package/src/task/executor.ts +30 -11
  526. package/src/task/index.ts +66 -7
  527. package/src/task/render.ts +23 -9
  528. package/src/tools/ask-answer-registry.ts +23 -7
  529. package/src/tools/ask.ts +8 -4
  530. package/src/tools/bash-sleep-advisory.ts +115 -0
  531. package/src/tools/bash.ts +98 -18
  532. package/src/tools/browser/attach.ts +71 -3
  533. package/src/tools/browser/launch.ts +86 -13
  534. package/src/tools/browser/profile-discovery.ts +57 -7
  535. package/src/tools/browser/render.ts +8 -1
  536. package/src/tools/browser.ts +130 -21
  537. package/src/tools/computer.enforcement.test.ts +1 -1
  538. package/src/tools/computer.ts +3 -2
  539. package/src/tools/cron.ts +12 -1
  540. package/src/tools/image-gen.ts +27 -16
  541. package/src/tools/index.ts +8 -0
  542. package/src/tools/job.ts +33 -6
  543. package/src/tools/monitor.ts +41 -2
  544. package/src/tools/skill-discovery.ts +21 -29
  545. package/src/tools/subagent.ts +142 -24
  546. package/src/tools/tool-catalog.generated.ts +6 -6
  547. package/src/tools/ultragoal-ask-guard.ts +10 -3
  548. package/src/utils/herdr-pane.ts +345 -0
  549. package/src/utils/title-generator.ts +2 -0
  550. package/src/web/scrapers/index.ts +6 -4
  551. package/dist/types/cli/malloc-env-guard.test.d.ts +0 -1
  552. package/dist/types/defaults/gjc-defaults.test.d.ts +0 -1
  553. package/dist/types/memory-backend/lazy-loading.test.d.ts +0 -1
  554. package/dist/types/runtime/boot-ordering.test.d.ts +0 -1
  555. package/dist/types/runtime/lazy-service.test.d.ts +0 -1
  556. package/dist/types/runtime/network-prewarm-service.test.d.ts +0 -1
  557. package/dist/types/runtime/workspace-tree-service.test.d.ts +0 -1
  558. package/dist/types/runtime-mcp/config.test.d.ts +0 -1
  559. package/dist/types/runtime-mcp/http.test.d.ts +0 -1
  560. package/dist/types/runtime-mcp/manager-pool.test.d.ts +0 -1
  561. package/dist/types/runtime-mcp/pool-key.test.d.ts +0 -1
  562. package/dist/types/runtime-mcp/pool.test.d.ts +0 -1
  563. package/dist/types/sdk/bus/lifecycle-control-runtime.d.ts +0 -117
  564. package/dist/types/sdk/bus/lifecycle-orchestrator.d.ts +0 -141
  565. package/dist/types/sdk/bus/telegram-cli.d.ts +0 -31
  566. package/dist/types/sdk/elevation/allowlist.d.ts +0 -20
  567. package/dist/types/sdk/elevation/audit.d.ts +0 -93
  568. package/dist/types/sdk/elevation/capability.d.ts +0 -3
  569. package/dist/types/sdk/elevation/digest.d.ts +0 -72
  570. package/dist/types/sdk/elevation/dispatch-receipt.d.ts +0 -85
  571. package/dist/types/sdk/elevation/grant-ledger.d.ts +0 -163
  572. package/dist/types/sdk/elevation/owner.d.ts +0 -48
  573. package/dist/types/sdk/host/import-graph.test.d.ts +0 -1
  574. package/dist/types/sdk/host/sdk-surface-parity.test.d.ts +0 -1
  575. package/dist/types/sdk/host/session-runtime.test.d.ts +0 -1
  576. package/dist/types/sdk/host/websocket-transport.lifecycle.test.d.ts +0 -1
  577. package/dist/types/session/auth-broker-config.d.ts +0 -13
  578. package/dist/types/session/heap-eviction-artifacts.test.d.ts +0 -1
  579. package/dist/types/skills/skills.test.d.ts +0 -1
  580. package/dist/types/slash-commands/notify-command.test.d.ts +0 -1
  581. package/dist/types/task/token-log.test.d.ts +0 -1
  582. package/dist/types/tools/computer.enforcement.test.d.ts +0 -1
  583. package/dist/types/tools/descriptors.test.d.ts +0 -1
  584. package/scripts/g005-daemon-smoke.ts +0 -180
  585. package/scripts/g011-daemon-path-smoke.ts +0 -153
  586. package/src/sdk/bus/lifecycle-control-runtime.ts +0 -1733
  587. package/src/sdk/bus/lifecycle-orchestrator.ts +0 -489
  588. package/src/sdk/bus/telegram-cli.ts +0 -212
  589. package/src/sdk/elevation/allowlist.ts +0 -54
  590. package/src/sdk/elevation/audit.ts +0 -208
  591. package/src/sdk/elevation/capability.ts +0 -41
  592. package/src/sdk/elevation/digest.ts +0 -129
  593. package/src/sdk/elevation/dispatch-receipt.ts +0 -184
  594. package/src/sdk/elevation/grant-ledger.ts +0 -1142
  595. package/src/sdk/elevation/owner.ts +0 -109
  596. package/src/session/auth-broker-config.ts +0 -109
  597. /package/dist/types/{ai-core-import-gate.test.d.ts → discovery/claude-hooks.d.ts} +0 -0
  598. /package/dist/types/{cli/fixture-report.test.d.ts → discovery/codex-hooks.d.ts} +0 -0
  599. /package/dist/types/sdk/{bus/recent-activity.d.ts → lifecycle/recent-sessions.d.ts} +0 -0
@@ -26,12 +26,14 @@ import {
26
26
  PROVIDER_DESCRIPTORS,
27
27
  readModelCache,
28
28
  registerCustomApi,
29
+ resolveOAuthStorageProvider,
29
30
  type SimpleStreamOptions,
30
31
  type ThinkingConfig,
31
32
  UNK_CONTEXT_WINDOW,
32
33
  UNK_MAX_TOKENS,
33
34
  unregisterCustomApis,
34
35
  } from "@gajae-code/ai/core";
36
+ import { resolveLoopbackOpenAIBaseUrl } from "@gajae-code/ai/utils/discovery/openai-compatible";
35
37
 
36
38
  // Sentinel for local-only OAuth token (LM Studio, vLLM) — declared inline to avoid loading
37
39
  // any provider module at startup. Must match `DEFAULT_LOCAL_TOKEN` in oauth/lm-studio.ts.
@@ -94,6 +96,14 @@ export type { CanonicalModelIndex, CanonicalModelRecord, CanonicalModelVariant,
94
96
  export { isAuthenticated, kNoAuth };
95
97
 
96
98
  const MAX_SESSION_CANONICAL_VARIANTS = 64;
99
+ function firstPositiveDiscoveryNumber(...values: readonly unknown[]): number | undefined {
100
+ for (const value of values) {
101
+ const number =
102
+ typeof value === "number" ? value : typeof value === "string" && value.trim() ? Number(value) : NaN;
103
+ if (Number.isFinite(number) && number > 0) return number;
104
+ }
105
+ return undefined;
106
+ }
97
107
  function redactDiscoveryUrl(value: string | URL): string {
98
108
  try {
99
109
  const url = typeof value === "string" ? new URL(value) : value;
@@ -180,7 +190,9 @@ export function requiresExplicitThinkingChoice(model: Model, role: GjcModelAssig
180
190
  (model.provider === "xai" && (model.id === "grok-4.5" || model.id === "grok-4.6"))
181
191
  )
182
192
  return true;
183
- return role !== null && GJC_MODEL_ASSIGNMENT_TARGETS[role].settingsPath === "task.agentModelOverrides";
193
+ if (role === null) return false;
194
+ if (role === "default") return true;
195
+ return GJC_MODEL_ASSIGNMENT_TARGETS[role].settingsPath === "task.agentModelOverrides";
184
196
  }
185
197
 
186
198
  /** Alias for ModelRoleInfo - used for both built-in and custom roles */
@@ -594,7 +606,8 @@ function getProviderBaseUrlEnvKeys(provider: string): string[] {
594
606
  * never the project `.env`.
595
607
  */
596
608
  function resolveProviderBaseUrlFromEnv(provider: string): string | undefined {
597
- return $pickCredentialEnv(...getProviderBaseUrlEnvKeys(provider));
609
+ const baseUrl = $pickCredentialEnv(...getProviderBaseUrlEnvKeys(provider));
610
+ return provider === "omlx" && baseUrl ? resolveLoopbackOpenAIBaseUrl(baseUrl, "http://127.0.0.1:8080/v1") : baseUrl;
598
611
  }
599
612
 
600
613
  function normalizeLocalOpenAICompatBaseUrl(baseUrl: string): string {
@@ -790,10 +803,8 @@ function extractGoogleOAuthToken(value: string | undefined): string | undefined
790
803
  }
791
804
 
792
805
  function getOAuthCredentialsForProvider(authStorage: AuthStorage, provider: string): OAuthCredential[] {
793
- const providerEntry = authStorage.getAll()[provider];
794
- if (!providerEntry) {
795
- return [];
796
- }
806
+ const providerEntry = authStorage.getAll()[resolveOAuthStorageProvider(provider)];
807
+ if (!providerEntry) return [];
797
808
  const entries = Array.isArray(providerEntry) ? providerEntry : [providerEntry];
798
809
  return entries.filter((entry): entry is OAuthCredential => entry.type === "oauth");
799
810
  }
@@ -1257,7 +1268,15 @@ export class ModelRegistry {
1257
1268
  #configuredDiscoveryProviderIds: ReadonlySet<string> = new Set();
1258
1269
  #descriptorDiscoveryEvidence = new Map<
1259
1270
  string,
1260
- { fresh: boolean; modelIds: ReadonlySet<string>; authGeneration: string; endpoint: string }
1271
+ {
1272
+ fresh: boolean;
1273
+ modelIds: ReadonlySet<string>;
1274
+ profileModelIds?: ReadonlySet<string>;
1275
+ profileFresh?: boolean;
1276
+ profileEndpoint?: string;
1277
+ authGeneration: string;
1278
+ endpoint: string;
1279
+ }
1261
1280
  >();
1262
1281
  #descriptorDiscoveryGenerations = new Map<string, number>();
1263
1282
  #configuredDiscoveryEvidence = new Map<
@@ -1677,7 +1696,9 @@ export class ModelRegistry {
1677
1696
 
1678
1697
  #normalizeDiscoverableModels(providerConfig: DiscoveryProviderConfig, models: Model<Api>[]): Model<Api>[] {
1679
1698
  const liveBaseUrl =
1680
- providerConfig.discovery.type === "openai-models-list" || providerConfig.discovery.type === "lm-studio"
1699
+ providerConfig.discovery.type === "openai-models-list" ||
1700
+ providerConfig.discovery.type === "lm-studio" ||
1701
+ providerConfig.discovery.type === "omlx"
1681
1702
  ? this.#normalizeOpenAIModelsListBaseUrl(
1682
1703
  this.#getProviderBaseUrlForDiscovery(providerConfig.provider) ?? providerConfig.baseUrl,
1683
1704
  )
@@ -1701,7 +1722,9 @@ export class ModelRegistry {
1701
1722
  });
1702
1723
  }
1703
1724
  #sanitizeDiscoverableModelsForCache(providerConfig: DiscoveryProviderConfig, models: Model<Api>[]): Model<Api>[] {
1704
- return providerConfig.discovery.type === "openai-models-list" || providerConfig.discovery.type === "lm-studio"
1725
+ return providerConfig.discovery.type === "openai-models-list" ||
1726
+ providerConfig.discovery.type === "lm-studio" ||
1727
+ providerConfig.discovery.type === "omlx"
1705
1728
  ? this.#stripModelBaseUrlQueries(models)
1706
1729
  : models;
1707
1730
  }
@@ -1754,6 +1777,18 @@ export class ModelRegistry {
1754
1777
  this.#optionalAuthProviders.add("lm-studio");
1755
1778
  this.#keylessProviders.add("lm-studio");
1756
1779
  }
1780
+ if (!configuredProviders.has("omlx") && !disabledProviders.has("omlx")) {
1781
+ this.#discoveryManager.addProvider({
1782
+ provider: "omlx",
1783
+ api: "openai-completions",
1784
+ baseUrl: resolveLoopbackOpenAIBaseUrl(Bun.env.OMLX_BASE_URL, "http://127.0.0.1:8080/v1"),
1785
+ discovery: { type: "omlx" },
1786
+ optional: true,
1787
+ });
1788
+ // Implicit oMLX auth is optional and may be added after startup.
1789
+ this.#optionalAuthProviders.add("omlx");
1790
+ this.#keylessProviders.add("omlx");
1791
+ }
1757
1792
  }
1758
1793
 
1759
1794
  #loadCustomModels(): CustomModelsResult {
@@ -2445,6 +2480,7 @@ export class ModelRegistry {
2445
2480
  case "llama.cpp":
2446
2481
  return this.#discoverLlamaCppModels(providerConfig, apiKey);
2447
2482
  case "lm-studio":
2483
+ case "omlx":
2448
2484
  case "openai-models-list":
2449
2485
  return this.#discoverOpenAIModelsList(providerConfig, apiKey);
2450
2486
  case "models-dev":
@@ -2606,12 +2642,13 @@ export class ModelRegistry {
2606
2642
  const manager = createModelManager({
2607
2643
  ...options,
2608
2644
  cacheDbPath: this.#cacheDbPath,
2645
+ cacheDynamicModelProvenance: Bun.hash(`${authGeneration}\u0000${endpoint}`).toString(36),
2609
2646
  canPublishCache: isCurrentDiscovery,
2610
2647
  ...(options.fetchDynamicModels
2611
2648
  ? {
2612
2649
  fetchDynamicModels: async () => {
2613
2650
  const models = await options.fetchDynamicModels?.();
2614
- if (models === null) return null;
2651
+ if (models === null || models === undefined) return null;
2615
2652
  const sanitizedModels = this.#stripModelBaseUrlQueries(models ?? []);
2616
2653
  if (canUseCredentialDerivedXiaomiEndpoint) {
2617
2654
  credentialDerivedEndpoint = sanitizedModels[0]?.baseUrl;
@@ -2645,9 +2682,15 @@ export class ModelRegistry {
2645
2682
  ...(baseUrl !== model.baseUrl ? { baseUrl } : {}),
2646
2683
  };
2647
2684
  });
2685
+ const preservesExistingDescriptorEvidence =
2686
+ (result.dynamicModelIds === undefined && !result.fetched && !result.stale) ||
2687
+ (result.stale && result.cacheFresh && result.cacheAuthoritative && evidence?.fresh === true) ||
2688
+ (strategy === "offline" && result.dynamicModelIds === undefined);
2648
2689
  if (
2649
2690
  isCurrentDiscovery() &&
2691
+ !preservesExistingDescriptorEvidence &&
2650
2692
  (result.fetched ||
2693
+ result.dynamicModelIds !== undefined ||
2651
2694
  result.stale ||
2652
2695
  this.#descriptorDiscoveryEvidence.get(options.providerId)?.authGeneration !== authGeneration ||
2653
2696
  this.#descriptorDiscoveryEvidence.get(options.providerId)?.endpoint !== endpoint)
@@ -2655,6 +2698,13 @@ export class ModelRegistry {
2655
2698
  this.#descriptorDiscoveryEvidence.set(options.providerId, {
2656
2699
  fresh: result.fetched,
2657
2700
  modelIds: new Set(models.map(model => model.id)),
2701
+ ...(result.dynamicModelIds === undefined
2702
+ ? {}
2703
+ : {
2704
+ profileModelIds: new Set(result.dynamicModelIds),
2705
+ profileFresh: !result.stale,
2706
+ profileEndpoint: endpoint,
2707
+ }),
2658
2708
  authGeneration,
2659
2709
  endpoint: this.#normalizeDiscoveryEvidenceEndpoint(models[0]?.baseUrl ?? endpoint),
2660
2710
  });
@@ -2974,20 +3024,21 @@ export class ModelRegistry {
2974
3024
  }
2975
3025
  throw new Error(`HTTP ${response.status} from ${redactDiscoveryUrl(modelsUrl)}`);
2976
3026
  }
2977
- const payload = (await response.json()) as {
2978
- data?: Array<{ id: string; name?: string; context_length?: number }>;
2979
- };
2980
- const models = payload.data ?? [];
3027
+ const payload: unknown = await response.json();
3028
+ if (!isRecord(payload) || !Array.isArray(payload.data)) {
3029
+ throw new Error(`Malformed OpenAI models-list response from ${redactDiscoveryUrl(modelsUrl)}`);
3030
+ }
3031
+ const models = payload.data;
2981
3032
  const discovered: Model<Api>[] = [];
2982
3033
  for (const item of models) {
3034
+ if (!isRecord(item) || typeof item.id !== "string" || !item.id.trim()) continue;
2983
3035
  const id = item.id;
2984
- if (!id) continue;
2985
3036
  const referenceModel = resolveCustomModelReference(id);
2986
3037
  const api = this.#resolveDiscoveredModelApi(providerConfig, id);
2987
3038
  discovered.push(
2988
3039
  enrichModelThinking({
2989
3040
  id,
2990
- name: item.name ?? referenceModel?.name ?? id,
3041
+ name: typeof item.name === "string" ? item.name : (referenceModel?.name ?? id),
2991
3042
  api,
2992
3043
  provider: providerConfig.provider,
2993
3044
  baseUrl: requestBaseUrl,
@@ -2996,8 +3047,23 @@ export class ModelRegistry {
2996
3047
  input: referenceModel?.input ?? ["text"],
2997
3048
  output: referenceModel?.output,
2998
3049
  cost: referenceModel?.cost ?? { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
2999
- contextWindow: item.context_length ?? referenceModel?.contextWindow ?? UNK_CONTEXT_WINDOW,
3000
- maxTokens: referenceModel?.maxTokens ?? UNK_MAX_TOKENS,
3050
+ contextWindow:
3051
+ firstPositiveDiscoveryNumber(
3052
+ item.max_model_len,
3053
+ item.context_length,
3054
+ item.context_window,
3055
+ item.max_context_length,
3056
+ referenceModel?.contextWindow,
3057
+ UNK_CONTEXT_WINDOW,
3058
+ ) ?? UNK_CONTEXT_WINDOW,
3059
+ maxTokens:
3060
+ firstPositiveDiscoveryNumber(
3061
+ item.max_completion_tokens,
3062
+ item.max_tokens,
3063
+ item.max_output_tokens,
3064
+ referenceModel?.maxTokens,
3065
+ UNK_MAX_TOKENS,
3066
+ ) ?? UNK_MAX_TOKENS,
3001
3067
  headers: providerConfig.headers,
3002
3068
  compat: {
3003
3069
  ...referenceModel?.compat,
@@ -3707,6 +3773,39 @@ export class ModelRegistry {
3707
3773
  this.#availableModelsEnvFingerprint = envFingerprint;
3708
3774
  return this.#availableModelsCache;
3709
3775
  }
3776
+
3777
+ /**
3778
+ * Get authenticated models, excluding bundled entries that a fresh provider
3779
+ * catalog has positively shown to be unavailable. Bundled entries remain
3780
+ * usable until live catalog evidence exists so offline startup is unchanged.
3781
+ */
3782
+ getAvailableForProfileActivation(): Model<Api>[] {
3783
+ return this.getAvailable().filter(model => {
3784
+ const evidence = this.#descriptorDiscoveryEvidence.get(model.provider);
3785
+ if (!evidence?.profileFresh || evidence.profileModelIds === undefined) return true;
3786
+ if (this.#hasCustomModelOverlay(model.provider, model.id)) return true;
3787
+ const bundledModelIds = new Set(
3788
+ (getBundledModels(model.provider as Parameters<typeof getBundledModels>[0]) as Model<Api>[]).map(
3789
+ candidate => candidate.id,
3790
+ ),
3791
+ );
3792
+ if (!bundledModelIds.has(model.id)) return true;
3793
+ if (
3794
+ evidence.authGeneration !== this.#getProviderEvidenceGeneration(model.provider) ||
3795
+ evidence.profileEndpoint !==
3796
+ this.#normalizeDiscoveryEvidenceEndpoint(this.#getProviderBaseUrlForDiscovery(model.provider) ?? "")
3797
+ )
3798
+ return true;
3799
+ return evidence.profileModelIds.has(model.id);
3800
+ });
3801
+ }
3802
+
3803
+ #hasCustomModelOverlay(provider: string, id: string): boolean {
3804
+ return [...this.#customModelOverlays, ...this.#runtimeModelOverlays].some(
3805
+ overlay => overlay.provider === provider && overlay.id === id,
3806
+ );
3807
+ }
3808
+
3710
3809
  #hasFreshOrStaticModelEvidence(model: Model<Api>): boolean {
3711
3810
  const evidence = this.#providerActivity.get(model.provider);
3712
3811
  if (
@@ -3767,7 +3866,9 @@ export class ModelRegistry {
3767
3866
  this.#normalizeDiscoveryEvidenceEndpoint(
3768
3867
  discoveryType === "ollama"
3769
3868
  ? `${this.#normalizeOllamaBaseUrl(baseUrl)}/v1`
3770
- : discoveryType === "openai-models-list" || discoveryType === "lm-studio"
3869
+ : discoveryType === "openai-models-list" ||
3870
+ discoveryType === "lm-studio" ||
3871
+ discoveryType === "omlx"
3771
3872
  ? this.#normalizeOpenAIModelsListBaseUrl(baseUrl)
3772
3873
  : (baseUrl ?? ""),
3773
3874
  );
@@ -3890,13 +3991,18 @@ export class ModelRegistry {
3890
3991
  async getApiKey(
3891
3992
  model: Model<Api>,
3892
3993
  sessionId?: string,
3893
- options: { credentialSelector?: AuthCredentialSelector; signal?: AbortSignal } = {},
3994
+ options: {
3995
+ credentialSelector?: AuthCredentialSelector;
3996
+ preferredCredentialSelector?: AuthCredentialSelector;
3997
+ signal?: AbortSignal;
3998
+ } = {},
3894
3999
  ): Promise<string | undefined> {
3895
4000
  return this.#getApiKeyOrNoAuth(model.provider, () =>
3896
4001
  this.authStorage.getApiKey(model.provider, sessionId, {
3897
4002
  baseUrl: model.baseUrl,
3898
4003
  modelId: model.id,
3899
4004
  credentialSelector: options.credentialSelector,
4005
+ preferredCredentialSelector: options.preferredCredentialSelector,
3900
4006
  signal: options.signal,
3901
4007
  }),
3902
4008
  );
@@ -3909,12 +4015,17 @@ export class ModelRegistry {
3909
4015
  provider: string,
3910
4016
  sessionId?: string,
3911
4017
  baseUrl?: string,
3912
- options: { credentialSelector?: AuthCredentialSelector; signal?: AbortSignal } = {},
4018
+ options: {
4019
+ credentialSelector?: AuthCredentialSelector;
4020
+ preferredCredentialSelector?: AuthCredentialSelector;
4021
+ signal?: AbortSignal;
4022
+ } = {},
3913
4023
  ): Promise<string | undefined> {
3914
4024
  return this.#getApiKeyOrNoAuth(provider, () =>
3915
4025
  this.authStorage.getApiKey(provider, sessionId, {
3916
4026
  baseUrl,
3917
4027
  credentialSelector: options.credentialSelector,
4028
+ preferredCredentialSelector: options.preferredCredentialSelector,
3918
4029
  signal: options.signal,
3919
4030
  }),
3920
4031
  );
@@ -198,7 +198,7 @@ export const ModelOverrideSchema = z
198
198
  export type ModelOverride = z.infer<typeof ModelOverrideSchema>;
199
199
 
200
200
  export const ProviderDiscoverySchema = z.object({
201
- type: z.enum(["ollama", "llama.cpp", "lm-studio", "openai-models-list", "models-dev"]),
201
+ type: z.enum(["ollama", "llama.cpp", "lm-studio", "omlx", "openai-models-list", "models-dev"]),
202
202
  apiByModelPrefix: z.record(z.string().min(1), z.enum(["openai-completions", "anthropic-messages"])).optional(),
203
203
  modelsDevProvider: z.string().min(1).optional(),
204
204
  });
@@ -181,7 +181,10 @@ interface ArrayDef<T> {
181
181
  ui?: UiBase;
182
182
  }
183
183
 
184
- type RecordValueDef = { type: "model-selector-value" } | { type: "string-enum"; values: readonly string[] };
184
+ type RecordValueDef =
185
+ | { type: "model-selector-value" }
186
+ | { type: "string-enum"; values: readonly string[] }
187
+ | { type: "credential-selector" };
185
188
 
186
189
  interface RecordDef<T> {
187
190
  type: "record";
@@ -270,6 +273,22 @@ export const SETTINGS_SCHEMA = {
270
273
  // per-machine overrides remain trivial.
271
274
  "auth.broker.url": { type: "string", default: undefined },
272
275
  "auth.broker.token": { type: "string", default: undefined },
276
+ "auth.credentialRankingMode": {
277
+ type: "enum",
278
+ values: ["balanced", "earliest-reset"] as const,
279
+ default: "balanced",
280
+ ui: {
281
+ tab: "providers",
282
+ label: "Credential Ranking",
283
+ description: "Choose balanced distribution or earliest-reset-first OAuth account selection.",
284
+ },
285
+ },
286
+ "auth.credentialPins": {
287
+ type: "record",
288
+ default: {} as Record<string, string>,
289
+ valueSchema: { type: "credential-selector" } as const,
290
+ },
291
+ "auth.credentialPinStoreIdentity": { type: "string", default: undefined },
273
292
  "session.directoryMigration": {
274
293
  type: "enum",
275
294
  values: ["copy-retain", "disabled"] as const,
@@ -293,6 +312,12 @@ export const SETTINGS_SCHEMA = {
293
312
  description: "SDK-owned prompt deadline; ACP has no separate timeout.",
294
313
  validate: (value: number) => Number.isSafeInteger(value) && value >= 60_000 && value <= 86_400_000,
295
314
  },
315
+ "sdk.promptMaxRuntimeMs": {
316
+ type: "number",
317
+ default: 21_600_000,
318
+ description: "Hard maximum runtime for an SDK prompt from acceptance, bounding progress-aware renewals.",
319
+ validate: (value: number) => Number.isSafeInteger(value) && value >= 60_000 && value <= 86_400_000,
320
+ },
296
321
 
297
322
  // Notifications (shared daemon with Telegram/Discord/Slack presentation adapters)
298
323
  "notifications.enabled": { type: "boolean", default: false },
@@ -416,7 +441,7 @@ export const SETTINGS_SCHEMA = {
416
441
  tab: "interaction",
417
442
  label: "Terminal Bell",
418
443
  description:
419
- "Emit a BEL character for local terminal notifications. Windows Terminal may keep BEL silent depending on profile/system sound settings; use completion.notifyCommand for a PowerShell Console.Beep workaround.",
444
+ "Emit a BEL character for local terminal notifications. macOS enables this by default unless explicitly disabled. Windows Terminal may keep BEL silent depending on profile/system sound settings; use completion.notifyCommand for a PowerShell Console.Beep workaround.",
420
445
  },
421
446
  },
422
447
  "notifications.bellOnComplete": {
@@ -606,6 +631,11 @@ export const SETTINGS_SCHEMA = {
606
631
  default: 1,
607
632
  validate: (value: number) => Number.isInteger(value) && value >= 1 && value <= 10,
608
633
  },
634
+ "gjc.ultragoal.nudgeBudget": {
635
+ type: "number",
636
+ default: 10,
637
+ validate: (value: number) => Number.isInteger(value) && value >= 0,
638
+ },
609
639
 
610
640
  // ────────────────────────────────────────────────────────────────────────
611
641
  // Appearance
@@ -1571,6 +1601,17 @@ export const SETTINGS_SCHEMA = {
1571
1601
  },
1572
1602
  },
1573
1603
 
1604
+ "crashReport.nudge": {
1605
+ type: "boolean",
1606
+ default: true,
1607
+ ui: {
1608
+ tab: "interaction",
1609
+ label: "Crash Report Nudge",
1610
+ description:
1611
+ "At interactive startup, show one rate-limited line when unreported crash signatures exist. Reads local state only; nothing is ever transmitted without the explicit consent flow in `gjc crash report`.",
1612
+ },
1613
+ },
1614
+
1574
1615
  collapseChangelog: {
1575
1616
  type: "boolean",
1576
1617
  default: false,
@@ -3304,7 +3345,8 @@ export const SETTINGS_SCHEMA = {
3304
3345
  ui: {
3305
3346
  tab: "tasks",
3306
3347
  label: "Prefer Task Delegation",
3307
- description: "Encourage the agent to delegate work to subagents unless changes are trivial",
3348
+ description:
3349
+ "Encourage the agent to delegate work to subagents unless changes are trivial (on by default when executor/planner run on a different provider than the default role)",
3308
3350
  },
3309
3351
  },
3310
3352
 
@@ -3479,9 +3521,29 @@ export const SETTINGS_SCHEMA = {
3479
3521
 
3480
3522
  "skills.enableClaudeProject": { type: "boolean", default: DEFAULT_SKILL_DISCOVERY_SETTINGS.enableClaudeProject },
3481
3523
 
3482
- "skills.enablePiUser": { type: "boolean", default: DEFAULT_SKILL_DISCOVERY_SETTINGS.enablePiUser },
3524
+ "skills.trustProjectSkills": {
3525
+ type: "boolean",
3526
+ ui: {
3527
+ tab: "customization",
3528
+ label: "Trust Project Skills",
3529
+ description:
3530
+ "Load skills from project .gjc/skills, .claude/skills, and .codex/skills. Set to false to ignore project-controlled skills while keeping user skills.",
3531
+ },
3532
+ },
3533
+
3534
+ "skills.trustUserSkills": {
3535
+ type: "boolean",
3536
+ ui: {
3537
+ tab: "customization",
3538
+ label: "Trust User Skills",
3539
+ description:
3540
+ "Load skills from ~/.gjc/agent/skills (and legacy ~/.gjc/skills / <config>/skills). Set to false to ignore user-installed skills while keeping project skills.",
3541
+ },
3542
+ },
3543
+
3544
+ "skills.enablePiUser": { type: "boolean", ui: { tab: "customization", label: "Trust User Skills (legacy)" } },
3483
3545
 
3484
- "skills.enablePiProject": { type: "boolean", default: DEFAULT_SKILL_DISCOVERY_SETTINGS.enablePiProject },
3546
+ "skills.enablePiProject": { type: "boolean", ui: { tab: "customization", label: "Trust Project Skills (legacy)" } },
3485
3547
 
3486
3548
  "skills.customDirectories": { type: "array", default: DEFAULT_SKILL_DISCOVERY_SETTINGS.customDirectories },
3487
3549
 
@@ -3810,7 +3872,7 @@ export function getEnumValues(path: SettingPath): readonly string[] | undefined
3810
3872
  return "values" in def ? (def.values as readonly string[]) : undefined;
3811
3873
  }
3812
3874
 
3813
- export const CONFIG_SCHEMA_VERSION = 1;
3875
+ export { CONFIG_SCHEMA_VERSION } from "./config-schema-version";
3814
3876
 
3815
3877
  export type SettingsSchemaIssue = {
3816
3878
  path: string;
@@ -3866,6 +3928,14 @@ function validRecordValue(valueSchema: RecordValueDef, value: unknown): boolean
3866
3928
  if (valueSchema.type === "model-selector-value") {
3867
3929
  return typeof value === "string" || (Array.isArray(value) && value.every(item => typeof item === "string"));
3868
3930
  }
3931
+ if (valueSchema.type === "credential-selector") {
3932
+ return (
3933
+ typeof value === "string" &&
3934
+ ((value.startsWith("id:") && /^[1-9]\d*$/.test(value.slice(3))) ||
3935
+ /^email:[^@\s]+@[^@\s]+$/.test(value) ||
3936
+ /^account:\S+$/.test(value))
3937
+ );
3938
+ }
3869
3939
  return typeof value === "string" && valueSchema.values.includes(value);
3870
3940
  }
3871
3941