@gajae-code/coding-agent 0.15.5 → 0.16.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 (272) hide show
  1. package/CHANGELOG.md +85 -1
  2. package/dist/types/async/job-manager.d.ts +83 -0
  3. package/dist/types/cli/args.d.ts +2 -0
  4. package/dist/types/cli/auth-gateway-cli.d.ts +17 -0
  5. package/dist/types/cli/model-presets-cli.d.ts +9 -0
  6. package/dist/types/cli/root-flags.d.ts +14 -0
  7. package/dist/types/cli/update-cli.d.ts +15 -0
  8. package/dist/types/cli.d.ts +7 -0
  9. package/dist/types/commands/auth-gateway.d.ts +3 -0
  10. package/dist/types/commands/gc.d.ts +13 -0
  11. package/dist/types/commands/launch.d.ts +10 -0
  12. package/dist/types/commands/model-presets.d.ts +21 -0
  13. package/dist/types/config/autorouting-tier-map.d.ts +120 -0
  14. package/dist/types/config/file-lock.d.ts +54 -2
  15. package/dist/types/config/internal/model-preset-registry-test-state.d.ts +4 -0
  16. package/dist/types/config/internal/model-preset-registry-test-support.d.ts +3 -0
  17. package/dist/types/config/keybindings.d.ts +3 -2
  18. package/dist/types/config/model-preset-registry.d.ts +368 -0
  19. package/dist/types/config/model-profile-activation.d.ts +39 -0
  20. package/dist/types/config/model-profiles.d.ts +5 -3
  21. package/dist/types/config/model-registry.d.ts +17 -5
  22. package/dist/types/config/settings-schema.d.ts +19 -1
  23. package/dist/types/config/settings.d.ts +2 -0
  24. package/dist/types/coordinator-mcp/model-preset.d.ts +7 -5
  25. package/dist/types/coordinator-mcp/projection-scan.d.ts +54 -0
  26. package/dist/types/crash/record-loader.d.ts +15 -0
  27. package/dist/types/extensibility/extensions/types.d.ts +2 -5
  28. package/dist/types/gjc-runtime/empty-delete-gc.d.ts +58 -0
  29. package/dist/types/gjc-runtime/gc-runtime.d.ts +2 -0
  30. package/dist/types/gjc-runtime/launch-worktree-reservation.d.ts +21 -0
  31. package/dist/types/gjc-runtime/managed-owner-supervisor.d.ts +2 -0
  32. package/dist/types/gjc-runtime/session-state-lock.d.ts +35 -6
  33. package/dist/types/gjc-runtime/session-state-sidecar.d.ts +72 -1
  34. package/dist/types/gjc-runtime/tmux-owner-isolation.d.ts +1 -0
  35. package/dist/types/gjc-runtime/tmux-sessions.d.ts +27 -0
  36. package/dist/types/index.d.ts +1 -0
  37. package/dist/types/main.d.ts +3 -1
  38. package/dist/types/master-mode/context.d.ts +21 -0
  39. package/dist/types/master-mode/first-request.d.ts +34 -0
  40. package/dist/types/master-mode/snapshot.d.ts +32 -0
  41. package/dist/types/modes/components/frictionless-onboarding-selector.d.ts +10 -0
  42. package/dist/types/modes/components/jobs-overlay-model.d.ts +4 -2
  43. package/dist/types/modes/components/oauth-selector.d.ts +1 -0
  44. package/dist/types/modes/components/status-line/model-name.d.ts +18 -0
  45. package/dist/types/modes/components/status-line/priority-row.d.ts +34 -0
  46. package/dist/types/modes/components/status-line/segments.d.ts +10 -0
  47. package/dist/types/modes/jobs-observer.d.ts +36 -0
  48. package/dist/types/modes/print-mode.d.ts +17 -0
  49. package/dist/types/modes/ui-language.d.ts +7 -1
  50. package/dist/types/sdk/broker/broker.d.ts +80 -1
  51. package/dist/types/sdk/broker/endpoint-authority.d.ts +24 -0
  52. package/dist/types/sdk/broker/index.d.ts +3 -0
  53. package/dist/types/sdk/broker/lifecycle.d.ts +26 -0
  54. package/dist/types/sdk/broker/master-capability.d.ts +10 -0
  55. package/dist/types/sdk/broker/session-index.d.ts +40 -11
  56. package/dist/types/sdk/broker/session-scope.d.ts +72 -0
  57. package/dist/types/sdk/broker/spawn-authority.d.ts +201 -0
  58. package/dist/types/sdk/broker/spawn-substrate.d.ts +30 -0
  59. package/dist/types/sdk/broker/state-version.d.ts +4 -1
  60. package/dist/types/sdk/broker/worktree-occupancy.d.ts +28 -0
  61. package/dist/types/sdk/bus/chat-daemon-control.d.ts +3 -0
  62. package/dist/types/sdk/bus/index.d.ts +6 -0
  63. package/dist/types/sdk/bus/kind-aware-reconciliation.d.ts +3 -0
  64. package/dist/types/sdk/bus/prompt-reconciliation.d.ts +4 -0
  65. package/dist/types/sdk/bus/telegram-daemon-contract.d.ts +1 -1
  66. package/dist/types/sdk/cli/index.d.ts +1 -0
  67. package/dist/types/sdk/cli/master-cli.d.ts +63 -0
  68. package/dist/types/sdk/cli/rows.d.ts +4 -3
  69. package/dist/types/sdk/cli/session-cli.d.ts +18 -2
  70. package/dist/types/sdk/client/client.d.ts +3 -2
  71. package/dist/types/sdk/client/discovery.d.ts +1 -0
  72. package/dist/types/sdk/host/control/dispatch.d.ts +10 -0
  73. package/dist/types/sdk/host/control/index.d.ts +1 -1
  74. package/dist/types/sdk/host/control/operations.d.ts +2 -0
  75. package/dist/types/sdk/host/control/runtime-gate.d.ts +21 -7
  76. package/dist/types/sdk/host/host.d.ts +10 -0
  77. package/dist/types/sdk/host/model-pin.d.ts +7 -2
  78. package/dist/types/sdk/host/sdk-run-capability.d.ts +1 -0
  79. package/dist/types/sdk/host/session-runtime.d.ts +67 -1
  80. package/dist/types/sdk/lifecycle/broker-client.d.ts +6 -0
  81. package/dist/types/sdk/lifecycle/service.d.ts +15 -3
  82. package/dist/types/sdk/lifecycle-session.d.ts +2 -0
  83. package/dist/types/sdk/prompt-deadline-manager.d.ts +11 -1
  84. package/dist/types/sdk/protocol/adapter-validation.d.ts +2 -0
  85. package/dist/types/sdk/router/session-router.d.ts +11 -0
  86. package/dist/types/sdk/session.d.ts +16 -0
  87. package/dist/types/sdk/startup-capability.d.ts +2 -1
  88. package/dist/types/session/account-inventory.d.ts +1 -0
  89. package/dist/types/session/agent-session.d.ts +24 -7
  90. package/dist/types/session/credential-store-errors.d.ts +1 -0
  91. package/dist/types/session/fold-coordinator.d.ts +201 -0
  92. package/dist/types/session/sdk-run-capability-internal.d.ts +7 -0
  93. package/dist/types/session/sdk-run-capability.d.ts +2 -0
  94. package/dist/types/session/session-manager.d.ts +65 -0
  95. package/dist/types/session/yield-queue.d.ts +5 -4
  96. package/dist/types/setup/frictionless-onboarding.d.ts +1 -0
  97. package/dist/types/telemetry/control.d.ts +11 -0
  98. package/dist/types/telemetry/events.d.ts +20 -0
  99. package/dist/types/telemetry/index.d.ts +3 -0
  100. package/dist/types/telemetry/transport.d.ts +22 -0
  101. package/dist/types/tools/bash-interactive.d.ts +23 -0
  102. package/dist/types/tools/bash.d.ts +4 -0
  103. package/dist/types/tools/gh.d.ts +8 -0
  104. package/dist/types/tools/index.d.ts +10 -5
  105. package/dist/types/web/search/providers/base.d.ts +9 -4
  106. package/dist/types/web/search/providers/xai.d.ts +2 -1
  107. package/dist/types/web/search/types.d.ts +14 -0
  108. package/package.json +10 -7
  109. package/scripts/generate-hotkeys-docs.ts +4 -0
  110. package/scripts/generate-sdk-operation-inventory.ts +9 -3
  111. package/scripts/verify-gjc-sdk-canonicalization.ts +35 -1
  112. package/src/async/job-manager.ts +671 -39
  113. package/src/cli/accounts-cli.ts +9 -5
  114. package/src/cli/args.ts +17 -0
  115. package/src/cli/auth-broker-cli.ts +40 -12
  116. package/src/cli/auth-gateway-cli.ts +273 -97
  117. package/src/cli/config-cli.ts +2 -2
  118. package/src/cli/fast-help.ts +4 -0
  119. package/src/cli/model-presets-cli.ts +100 -0
  120. package/src/cli/root-flags.ts +5 -0
  121. package/src/cli/update-cli.ts +117 -16
  122. package/src/cli.ts +6 -2
  123. package/src/commands/auth-gateway.ts +12 -8
  124. package/src/commands/gc.ts +19 -0
  125. package/src/commands/launch.ts +86 -18
  126. package/src/commands/model-presets.ts +24 -0
  127. package/src/commands/sdk.ts +113 -21
  128. package/src/config/autorouting-tier-map.ts +44 -0
  129. package/src/config/file-lock-gc.ts +9 -4
  130. package/src/config/file-lock.ts +890 -99
  131. package/src/config/internal/model-preset-registry-test-state.ts +28 -0
  132. package/src/config/internal/model-preset-registry-test-support.ts +11 -0
  133. package/src/config/keybindings.ts +6 -2
  134. package/src/config/model-preset-registry.ts +2795 -0
  135. package/src/config/model-profile-activation.ts +115 -28
  136. package/src/config/model-profile-contract.ts +4 -1
  137. package/src/config/model-profiles.ts +56 -14
  138. package/src/config/model-registry.ts +1044 -122
  139. package/src/config/model-resolver.ts +5 -0
  140. package/src/config/settings-schema.ts +19 -1
  141. package/src/config/settings.ts +11 -1
  142. package/src/coordinator-mcp/model-preset.ts +32 -17
  143. package/src/coordinator-mcp/projection-scan.ts +592 -0
  144. package/src/coordinator-mcp/question-state.ts +9 -11
  145. package/src/coordinator-mcp/server.ts +111 -42
  146. package/src/coordinator-mcp/session-reaper.ts +9 -3
  147. package/src/crash/index-store.ts +2 -0
  148. package/src/crash/record-loader.ts +10 -0
  149. package/src/extensibility/extensions/loader.ts +0 -1
  150. package/src/extensibility/extensions/types.ts +2 -3
  151. package/src/extensibility/gjc-plugins/runtime-adapters.ts +1 -0
  152. package/src/gjc-runtime/empty-delete-gc.ts +301 -0
  153. package/src/gjc-runtime/gc-render.ts +29 -0
  154. package/src/gjc-runtime/gc-runtime.ts +174 -11
  155. package/src/gjc-runtime/launch-worktree-reservation.ts +242 -0
  156. package/src/gjc-runtime/managed-owner-supervisor.ts +63 -51
  157. package/src/gjc-runtime/session-state-lock.ts +1321 -147
  158. package/src/gjc-runtime/session-state-sidecar.ts +1004 -25
  159. package/src/gjc-runtime/tmux-owner-isolation-cli.ts +4 -7
  160. package/src/gjc-runtime/tmux-owner-isolation.ts +2 -2
  161. package/src/gjc-runtime/tmux-sessions.ts +252 -13
  162. package/src/hooks/skill-state.ts +6 -0
  163. package/src/index.ts +1 -0
  164. package/src/internal-urls/docs-index.generated.ts +14 -13
  165. package/src/internal-urls/issue-pr-protocol.ts +4 -2
  166. package/src/lsp/config.ts +4 -3
  167. package/src/lsp/path-trust.ts +12 -6
  168. package/src/main.ts +66 -4
  169. package/src/master-mode/context.ts +50 -0
  170. package/src/master-mode/first-request.ts +65 -0
  171. package/src/master-mode/snapshot.ts +205 -0
  172. package/src/modes/acp/acp-agent.ts +616 -161
  173. package/src/modes/components/footer.ts +4 -2
  174. package/src/modes/components/frictionless-onboarding-selector.ts +48 -2
  175. package/src/modes/components/jobs-overlay-model.ts +99 -16
  176. package/src/modes/components/model-selector.ts +158 -18
  177. package/src/modes/components/oauth-selector.ts +6 -1
  178. package/src/modes/components/settings-selector.ts +1 -0
  179. package/src/modes/components/status-line/model-name.ts +53 -0
  180. package/src/modes/components/status-line/priority-row.ts +107 -0
  181. package/src/modes/components/status-line/segments.ts +29 -10
  182. package/src/modes/components/tool-status-header.ts +151 -15
  183. package/src/modes/controllers/extension-ui-controller.ts +1 -1
  184. package/src/modes/controllers/input-controller.ts +51 -6
  185. package/src/modes/controllers/selector-controller.ts +191 -96
  186. package/src/modes/interactive-mode.ts +14 -1
  187. package/src/modes/jobs-observer.ts +149 -16
  188. package/src/modes/print-mode.ts +64 -0
  189. package/src/modes/runtime-init.ts +1 -1
  190. package/src/modes/ui-language.ts +49 -2
  191. package/src/modes/utils/injected-user-submission.ts +15 -1
  192. package/src/prompts/system/master-mode.md +28 -0
  193. package/src/prompts/tools/bash.md +2 -2
  194. package/src/prompts/tools/fold-receipt.md +3 -0
  195. package/src/prompts/tools/job.md +1 -1
  196. package/src/sdk/acp/adapter.ts +17 -2
  197. package/src/sdk/broker/broker.ts +1671 -34
  198. package/src/sdk/broker/endpoint-authority.ts +86 -0
  199. package/src/sdk/broker/ensure.ts +5 -0
  200. package/src/sdk/broker/index.ts +3 -0
  201. package/src/sdk/broker/lifecycle.ts +217 -46
  202. package/src/sdk/broker/master-capability.ts +232 -0
  203. package/src/sdk/broker/session-index.ts +121 -17
  204. package/src/sdk/broker/session-scope.ts +272 -0
  205. package/src/sdk/broker/spawn-authority.ts +1031 -0
  206. package/src/sdk/broker/spawn-substrate.ts +548 -0
  207. package/src/sdk/broker/state-version.ts +26 -14
  208. package/src/sdk/broker/transport.ts +1 -0
  209. package/src/sdk/broker/worktree-occupancy.ts +90 -0
  210. package/src/sdk/bus/chat-daemon-control.ts +5 -2
  211. package/src/sdk/bus/chat-daemon-runtime.ts +46 -5
  212. package/src/sdk/bus/index.ts +51 -4
  213. package/src/sdk/bus/kind-aware-reconciliation.ts +36 -6
  214. package/src/sdk/bus/prompt-reconciliation.ts +28 -4
  215. package/src/sdk/bus/slack-conversation.ts +5 -1
  216. package/src/sdk/bus/telegram-daemon-contract.ts +1 -1
  217. package/src/sdk/cli/index.ts +1 -0
  218. package/src/sdk/cli/master-cli.ts +259 -0
  219. package/src/sdk/cli/rows.ts +11 -8
  220. package/src/sdk/cli/session-cli.ts +276 -6
  221. package/src/sdk/client/client.ts +14 -8
  222. package/src/sdk/client/discovery.ts +3 -1
  223. package/src/sdk/host/control/dispatch.ts +101 -37
  224. package/src/sdk/host/control/index.ts +2 -0
  225. package/src/sdk/host/control/operations.ts +2 -0
  226. package/src/sdk/host/control/runtime-gate.ts +203 -11
  227. package/src/sdk/host/host.ts +27 -2
  228. package/src/sdk/host/model-pin.ts +185 -25
  229. package/src/sdk/host/sdk-run-capability.ts +1 -0
  230. package/src/sdk/host/session-runtime.test.ts +581 -43
  231. package/src/sdk/host/session-runtime.ts +655 -101
  232. package/src/sdk/lifecycle/broker-client.ts +28 -0
  233. package/src/sdk/lifecycle/service.ts +279 -20
  234. package/src/sdk/lifecycle-session.ts +10 -2
  235. package/src/sdk/prompt-deadline-manager.ts +16 -1
  236. package/src/sdk/protocol/adapter-validation.ts +27 -0
  237. package/src/sdk/protocol/operation-inventory.generated.json +53 -2
  238. package/src/sdk/protocol/operation-registry.ts +17 -4
  239. package/src/sdk/router/session-router.ts +294 -154
  240. package/src/sdk/session.ts +440 -167
  241. package/src/sdk/startup-capability.ts +1 -0
  242. package/src/session/account-inventory.ts +27 -11
  243. package/src/session/agent-session.ts +1292 -180
  244. package/src/session/blob-store.ts +15 -5
  245. package/src/session/credential-store-errors.ts +2 -0
  246. package/src/session/fold-coordinator.ts +433 -0
  247. package/src/session/internal/managed-session-storage.ts +153 -78
  248. package/src/session/sdk-run-capability-internal.ts +15 -0
  249. package/src/session/sdk-run-capability.ts +2 -0
  250. package/src/session/session-manager.ts +342 -28
  251. package/src/session/yield-queue.ts +24 -10
  252. package/src/setup/frictionless-onboarding.ts +2 -0
  253. package/src/setup/provider-presets.json +1 -1
  254. package/src/slash-commands/helpers/credential-switch.ts +6 -1
  255. package/src/task/executor.ts +19 -3
  256. package/src/telemetry/control.ts +26 -0
  257. package/src/telemetry/events.ts +1268 -0
  258. package/src/telemetry/index.ts +3 -0
  259. package/src/telemetry/transport.ts +87 -0
  260. package/src/tools/bash-interactive.ts +182 -85
  261. package/src/tools/bash.ts +1028 -109
  262. package/src/tools/gh.ts +104 -48
  263. package/src/tools/github-cache.ts +2 -2
  264. package/src/tools/index.ts +11 -5
  265. package/src/tools/tool-catalog.generated.ts +1 -1
  266. package/src/web/search/provider.ts +120 -11
  267. package/src/web/search/providers/anthropic.ts +89 -17
  268. package/src/web/search/providers/base.ts +9 -4
  269. package/src/web/search/providers/gemini.ts +87 -15
  270. package/src/web/search/providers/openai-compatible.ts +23 -8
  271. package/src/web/search/providers/xai.ts +98 -12
  272. package/src/web/search/types.ts +16 -0
@@ -1580,6 +1580,11 @@ export async function findInitialModel(options: {
1580
1580
  thinkingLevel = resolveThinkingLevelForModel(found, defaultThinkingSelector);
1581
1581
  return { model, thinkingLevel, fallbackMessage: undefined };
1582
1582
  }
1583
+ return {
1584
+ model: undefined,
1585
+ thinkingLevel: undefined,
1586
+ fallbackMessage: `Model ${defaultProvider}/${defaultModelId} not found`,
1587
+ };
1583
1588
  }
1584
1589
 
1585
1590
  // 4. Try first available model with valid API key
@@ -421,6 +421,12 @@ export const SETTINGS_SCHEMA = {
421
421
  description: "Hard maximum runtime for an SDK prompt from acceptance, bounding progress-aware renewals.",
422
422
  validate: (value: number) => Number.isSafeInteger(value) && value >= 60_000 && value <= 86_400_000,
423
423
  },
424
+ "sdk.masterOrphanGraceMs": {
425
+ type: "number",
426
+ default: 120_000,
427
+ description: "Grace period before a master-spawned child orphaned by confirmed master loss is closed.",
428
+ validate: (value: number) => Number.isSafeInteger(value) && value >= 60_000 && value <= 3_600_000,
429
+ },
424
430
 
425
431
  // Notifications (shared daemon with Telegram/Discord/Slack presentation adapters)
426
432
  "notifications.enabled": { type: "boolean", default: false },
@@ -745,7 +751,7 @@ export const SETTINGS_SCHEMA = {
745
751
  // ────────────────────────────────────────────────────────────────────────
746
752
  "ui.language": {
747
753
  type: "enum",
748
- values: ["en", "ko", "ja"] as const,
754
+ values: ["en", "ko", "zh", "ja"] as const,
749
755
  default: "en",
750
756
  ui: {
751
757
  tab: "appearance",
@@ -754,6 +760,7 @@ export const SETTINGS_SCHEMA = {
754
760
  options: [
755
761
  { value: "en", label: "English" },
756
762
  { value: "ko", label: "Korean (한국어)" },
763
+ { value: "zh", label: "Chinese (简体中文)" },
757
764
  { value: "ja", label: "Japanese (日本語)" },
758
765
  ],
759
766
  },
@@ -1720,6 +1727,17 @@ export const SETTINGS_SCHEMA = {
1720
1727
  },
1721
1728
  },
1722
1729
 
1730
+ "telemetry.enabled": {
1731
+ type: "boolean",
1732
+ default: false,
1733
+ ui: {
1734
+ tab: "interaction",
1735
+ label: "Anonymous Usage Telemetry",
1736
+ description:
1737
+ "Send minimal allowlisted update and adoption events. Disabled by default; no prompts, paths, environment, identity, or arbitrary errors are collected.",
1738
+ },
1739
+ },
1740
+
1723
1741
  "starReminder.enabled": {
1724
1742
  type: "boolean",
1725
1743
  default: true,
@@ -329,7 +329,12 @@ function getByPath(obj: RawSettings, segments: string[]): unknown {
329
329
 
330
330
  const PATH_SCOPED_ARRAY_SETTINGS = new Set<SettingPath>(["enabledModels", "disabledProviders"]);
331
331
  /** Operator-owned settings which must never be workspace-controlled or runtime-overridden. */
332
- const GLOBAL_ONLY_SETTINGS = new Set<SettingPath>(["crashReport.upstream", "crashReport.upstreamDsn", "ui.language"]);
332
+ const GLOBAL_ONLY_SETTINGS = new Set<SettingPath>([
333
+ "crashReport.upstream",
334
+ "crashReport.upstreamDsn",
335
+ "ui.language",
336
+ "telemetry.enabled",
337
+ ]);
333
338
  const LEGACY_THEME_NAME_REPLACEMENTS = {
334
339
  dark: "red-claw",
335
340
  light: "blue-crab",
@@ -743,6 +748,11 @@ export class Settings implements NotificationSettingsReader {
743
748
  return !this.#persist || !this.#hasRecoveredConfigSyntax;
744
749
  }
745
750
 
751
+ /** Whether this instance can publish a mutation to a durable config file. */
752
+ canPersistDurableConfig(): boolean {
753
+ return this.#persist && !this.#hasRecoveredConfigSyntax;
754
+ }
755
+
746
756
  /**
747
757
  * Set a setting value (sync).
748
758
  * Updates global settings and reserves its background persistence slot before
@@ -1,16 +1,20 @@
1
1
  import * as path from "node:path";
2
2
  import { getAgentDir } from "@gajae-code/utils";
3
- import { YAML } from "bun";
3
+ import { ConfigFile } from "../config/config-file";
4
+ import {
5
+ type AcceptedModelPresetRegistry,
6
+ loadAcceptedModelPresetRegistryAsync,
7
+ } from "../config/model-preset-registry";
4
8
  import { UnknownModelProfileError, validateModelProfileName } from "../config/model-profile-contract";
5
9
  import { mergeModelProfiles } from "../config/model-profiles";
6
- import { ModelsConfigSchema } from "../config/models-config-schema";
10
+ import { type ModelsConfig, ModelsConfigSchema } from "../config/models-config-schema";
7
11
 
8
12
  export interface CoordinatorModelProfile {
9
13
  name: string;
10
14
  }
11
15
 
12
16
  /**
13
- * Loads the merged built-in + custom model-profile names from `models.yml`
17
+ * Loads the merged embedded + accepted registry + custom model-profile names
14
18
  * without loading the session-host model registry. The child still owns
15
19
  * profile activation; this validates the selection before session creation.
16
20
  */
@@ -20,10 +24,11 @@ export type CoordinatorModelProfileLoader = () =>
20
24
 
21
25
  const MAX_ECHOED_MPRESET_LENGTH = 128;
22
26
  /**
23
- * Thrown by the default loader when `models.yml` exists but is invalid or
24
- * unreadable. This lets the resolver fail closed with a distinct, stable reason
25
- * instead of silently collapsing a broken registry to the built-ins-only set
26
- * (which would misreport a caller's valid custom profile as unknown).
27
+ * Thrown by the default loader when `models.yml` or the accepted preset
28
+ * registry is invalid or unreadable. This lets the resolver fail closed with a
29
+ * distinct, stable reason instead of silently collapsing a broken registry to
30
+ * the built-ins-only set (which would misreport a caller's valid custom
31
+ * profile as unknown).
27
32
  */
28
33
  export class CoordinatorModelProfileRegistryError extends Error {
29
34
  constructor(cause?: unknown) {
@@ -34,23 +39,33 @@ export class CoordinatorModelProfileRegistryError extends Error {
34
39
  }
35
40
 
36
41
  function coordinatorModelProfiles(
37
- profiles?: Parameters<typeof mergeModelProfiles>[0],
42
+ profiles?: ModelsConfig["profiles"],
43
+ registryProfiles?: AcceptedModelPresetRegistry["profiles"],
38
44
  ): Map<string, CoordinatorModelProfile> {
39
- return new Map([...mergeModelProfiles(profiles).keys()].map(name => [name, { name }]));
45
+ return new Map([...mergeModelProfiles(profiles, registryProfiles).keys()].map(name => [name, { name }]));
40
46
  }
41
47
 
42
- export const loadCoordinatorModelProfiles: CoordinatorModelProfileLoader = async () => {
43
- const modelsFile = Bun.file(path.join(getAgentDir(), "models.yml"));
44
- if (!(await modelsFile.exists())) return coordinatorModelProfiles();
48
+ export function createCoordinatorModelProfileLoader(agentDir: string): CoordinatorModelProfileLoader {
49
+ return async () => loadCoordinatorModelProfilesFromAgentDir(agentDir);
50
+ }
51
+
52
+ async function loadCoordinatorModelProfilesFromAgentDir(
53
+ agentDir: string,
54
+ ): Promise<Map<string, CoordinatorModelProfile>> {
55
+ const accepted = await loadAcceptedModelPresetRegistryAsync(agentDir);
56
+ if (accepted.error) throw new CoordinatorModelProfileRegistryError(accepted.error);
45
57
  try {
46
- const parsed = YAML.parse(await modelsFile.text());
47
- const config = ModelsConfigSchema.safeParse(parsed);
48
- if (!config.success) throw config.error;
49
- return coordinatorModelProfiles(config.data.profiles);
58
+ const modelsConfig = new ConfigFile("models", ModelsConfigSchema, path.join(agentDir, "models.yml"));
59
+ const loaded = modelsConfig.tryLoad();
60
+ if (loaded.status === "error") throw loaded.error;
61
+ return coordinatorModelProfiles(loaded.value?.profiles, accepted.profiles);
50
62
  } catch (error) {
51
63
  throw new CoordinatorModelProfileRegistryError(error);
52
64
  }
53
- };
65
+ }
66
+
67
+ export const loadCoordinatorModelProfiles: CoordinatorModelProfileLoader = async () =>
68
+ loadCoordinatorModelProfilesFromAgentDir(getAgentDir());
54
69
 
55
70
  export type CoordinatorMpresetResolution =
56
71
  | { ok: true; mpreset: string | null }