@zhihaohong52/sonata 0.4.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 (183) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +437 -0
  3. package/dist/adapters/claude.js +83 -0
  4. package/dist/adapters/claude.js.map +1 -0
  5. package/dist/adapters/codex.js +382 -0
  6. package/dist/adapters/codex.js.map +1 -0
  7. package/dist/adapters/index.js +21 -0
  8. package/dist/adapters/index.js.map +1 -0
  9. package/dist/adapters/opencode.js +104 -0
  10. package/dist/adapters/opencode.js.map +1 -0
  11. package/dist/adapters/pi.js +152 -0
  12. package/dist/adapters/pi.js.map +1 -0
  13. package/dist/adapters/reasonix.js +358 -0
  14. package/dist/adapters/reasonix.js.map +1 -0
  15. package/dist/adapters/types.js +2 -0
  16. package/dist/adapters/types.js.map +1 -0
  17. package/dist/agent-markers.js +3 -0
  18. package/dist/agent-markers.js.map +1 -0
  19. package/dist/aipricing.js +109 -0
  20. package/dist/aipricing.js.map +1 -0
  21. package/dist/catalog.js +274 -0
  22. package/dist/catalog.js.map +1 -0
  23. package/dist/cli.js +766 -0
  24. package/dist/cli.js.map +1 -0
  25. package/dist/commands/approve.js +23 -0
  26. package/dist/commands/approve.js.map +1 -0
  27. package/dist/commands/auth.js +41 -0
  28. package/dist/commands/auth.js.map +1 -0
  29. package/dist/commands/catalog.js +172 -0
  30. package/dist/commands/catalog.js.map +1 -0
  31. package/dist/commands/code.js +113 -0
  32. package/dist/commands/code.js.map +1 -0
  33. package/dist/commands/dispatch.js +148 -0
  34. package/dist/commands/dispatch.js.map +1 -0
  35. package/dist/commands/doctor.js +545 -0
  36. package/dist/commands/doctor.js.map +1 -0
  37. package/dist/commands/gc.js +25 -0
  38. package/dist/commands/gc.js.map +1 -0
  39. package/dist/commands/init-log.js +83 -0
  40. package/dist/commands/init-log.js.map +1 -0
  41. package/dist/commands/init.js +157 -0
  42. package/dist/commands/init.js.map +1 -0
  43. package/dist/commands/log.js +24 -0
  44. package/dist/commands/log.js.map +1 -0
  45. package/dist/commands/route.js +660 -0
  46. package/dist/commands/route.js.map +1 -0
  47. package/dist/commands/run.js +199 -0
  48. package/dist/commands/run.js.map +1 -0
  49. package/dist/commands/runs.js +37 -0
  50. package/dist/commands/runs.js.map +1 -0
  51. package/dist/commands/serve.js +818 -0
  52. package/dist/commands/serve.js.map +1 -0
  53. package/dist/commands/status.js +14 -0
  54. package/dist/commands/status.js.map +1 -0
  55. package/dist/commands/sync.js +258 -0
  56. package/dist/commands/sync.js.map +1 -0
  57. package/dist/commands/tail.js +229 -0
  58. package/dist/commands/tail.js.map +1 -0
  59. package/dist/commands/usage.js +85 -0
  60. package/dist/commands/usage.js.map +1 -0
  61. package/dist/commands/verify.js +69 -0
  62. package/dist/commands/verify.js.map +1 -0
  63. package/dist/commands/wait.js +38 -0
  64. package/dist/commands/wait.js.map +1 -0
  65. package/dist/config.js +588 -0
  66. package/dist/config.js.map +1 -0
  67. package/dist/detect.js +445 -0
  68. package/dist/detect.js.map +1 -0
  69. package/dist/filelock.js +83 -0
  70. package/dist/filelock.js.map +1 -0
  71. package/dist/init/apply.js +96 -0
  72. package/dist/init/apply.js.map +1 -0
  73. package/dist/init/candidates.js +115 -0
  74. package/dist/init/candidates.js.map +1 -0
  75. package/dist/init/discover.js +216 -0
  76. package/dist/init/discover.js.map +1 -0
  77. package/dist/init/helpers.js +429 -0
  78. package/dist/init/helpers.js.map +1 -0
  79. package/dist/init/interactive-state.js +128 -0
  80. package/dist/init/interactive-state.js.map +1 -0
  81. package/dist/init/plan.js +225 -0
  82. package/dist/init/plan.js.map +1 -0
  83. package/dist/init/scripted-state.js +130 -0
  84. package/dist/init/scripted-state.js.map +1 -0
  85. package/dist/init/toml.js +83 -0
  86. package/dist/init/toml.js.map +1 -0
  87. package/dist/init/validate.js +149 -0
  88. package/dist/init/validate.js.map +1 -0
  89. package/dist/ledger.js +123 -0
  90. package/dist/ledger.js.map +1 -0
  91. package/dist/mcp/protocol.js +64 -0
  92. package/dist/mcp/protocol.js.map +1 -0
  93. package/dist/mcp/server.js +96 -0
  94. package/dist/mcp/server.js.map +1 -0
  95. package/dist/mcp/tools.js +210 -0
  96. package/dist/mcp/tools.js.map +1 -0
  97. package/dist/mode.js +64 -0
  98. package/dist/mode.js.map +1 -0
  99. package/dist/native/claude-shim.js +228 -0
  100. package/dist/native/claude-shim.js.map +1 -0
  101. package/dist/native/codex-auth.js +177 -0
  102. package/dist/native/codex-auth.js.map +1 -0
  103. package/dist/native/copilot-auth.js +105 -0
  104. package/dist/native/copilot-auth.js.map +1 -0
  105. package/dist/native/credentials.js +83 -0
  106. package/dist/native/credentials.js.map +1 -0
  107. package/dist/native/hosts.js +60 -0
  108. package/dist/native/hosts.js.map +1 -0
  109. package/dist/native/litellm.js +103 -0
  110. package/dist/native/litellm.js.map +1 -0
  111. package/dist/native/models.js +96 -0
  112. package/dist/native/models.js.map +1 -0
  113. package/dist/native/oauth-login.js +112 -0
  114. package/dist/native/oauth-login.js.map +1 -0
  115. package/dist/native/router.js +469 -0
  116. package/dist/native/router.js.map +1 -0
  117. package/dist/native/tls.js +73 -0
  118. package/dist/native/tls.js.map +1 -0
  119. package/dist/native/usage.js +119 -0
  120. package/dist/native/usage.js.map +1 -0
  121. package/dist/normalize.js +98 -0
  122. package/dist/normalize.js.map +1 -0
  123. package/dist/pricing.js +86 -0
  124. package/dist/pricing.js.map +1 -0
  125. package/dist/roles.js +49 -0
  126. package/dist/roles.js.map +1 -0
  127. package/dist/sessions.js +62 -0
  128. package/dist/sessions.js.map +1 -0
  129. package/dist/settings.js +131 -0
  130. package/dist/settings.js.map +1 -0
  131. package/dist/store.js +70 -0
  132. package/dist/store.js.map +1 -0
  133. package/dist/tmux.js +89 -0
  134. package/dist/tmux.js.map +1 -0
  135. package/dist/tui-ink/app-state.js +340 -0
  136. package/dist/tui-ink/app-state.js.map +1 -0
  137. package/dist/tui-ink/app.js +156 -0
  138. package/dist/tui-ink/app.js.map +1 -0
  139. package/dist/tui-ink/components/byok-step.js +102 -0
  140. package/dist/tui-ink/components/byok-step.js.map +1 -0
  141. package/dist/tui-ink/components/login-screen.js +80 -0
  142. package/dist/tui-ink/components/login-screen.js.map +1 -0
  143. package/dist/tui-ink/components/models-step.js +92 -0
  144. package/dist/tui-ink/components/models-step.js.map +1 -0
  145. package/dist/tui-ink/components/multi-select-state.js +56 -0
  146. package/dist/tui-ink/components/multi-select-state.js.map +1 -0
  147. package/dist/tui-ink/components/multi-select.js +69 -0
  148. package/dist/tui-ink/components/multi-select.js.map +1 -0
  149. package/dist/tui-ink/components/providers-step.js +285 -0
  150. package/dist/tui-ink/components/providers-step.js.map +1 -0
  151. package/dist/tui-ink/components/ranked-select-state.js +41 -0
  152. package/dist/tui-ink/components/ranked-select-state.js.map +1 -0
  153. package/dist/tui-ink/components/ranked-select.js +61 -0
  154. package/dist/tui-ink/components/ranked-select.js.map +1 -0
  155. package/dist/tui-ink/components/search-select.js +47 -0
  156. package/dist/tui-ink/components/search-select.js.map +1 -0
  157. package/dist/tui-ink/components/text-input-state.js +42 -0
  158. package/dist/tui-ink/components/text-input-state.js.map +1 -0
  159. package/dist/tui-ink/components/text-input.js +48 -0
  160. package/dist/tui-ink/components/text-input.js.map +1 -0
  161. package/dist/tui-ink/run.js +38 -0
  162. package/dist/tui-ink/run.js.map +1 -0
  163. package/dist/tui-ink/test-compile.js +4 -0
  164. package/dist/tui-ink/test-compile.js.map +1 -0
  165. package/dist/tui-ink/types.js +2 -0
  166. package/dist/tui-ink/types.js.map +1 -0
  167. package/dist/tui.js +330 -0
  168. package/dist/tui.js.map +1 -0
  169. package/dist/types.js +2 -0
  170. package/dist/types.js.map +1 -0
  171. package/dist/watchdog.js +85 -0
  172. package/dist/watchdog.js.map +1 -0
  173. package/hooks/capture-mode.mjs +56 -0
  174. package/hooks/ensure-serve.mjs +140 -0
  175. package/hooks/hooks.json +12 -0
  176. package/hooks/route-session.mjs +47 -0
  177. package/hooks/route-subagent.mjs +54 -0
  178. package/package.json +64 -0
  179. package/roles/code.md +13 -0
  180. package/roles/explore.md +9 -0
  181. package/roles/plan.md +10 -0
  182. package/roles/review.md +11 -0
  183. package/skills/loop/SKILL.md +43 -0
package/dist/config.js ADDED
@@ -0,0 +1,588 @@
1
+ import { readFileSync, existsSync } from 'node:fs';
2
+ import { homedir } from 'node:os';
3
+ import { join } from 'node:path';
4
+ import { parse as parseToml } from 'smol-toml';
5
+ export const KNOWN_HARNESSES = ['opencode', 'codex', 'pi', 'reasonix', 'claude'];
6
+ export const KNOWN_ROLES = ['review', 'code', 'explore', 'plan'];
7
+ /** Harnesses whose `--model` needs a provider segment; codex takes a bare id. */
8
+ const QUALIFIED_ID_HARNESSES = ['opencode', 'pi', 'reasonix'];
9
+ /** Roles that must never write, whatever permission mode the session is in. */
10
+ export const READ_ONLY_ROLES = ['review', 'explore', 'plan'];
11
+ export function isReadOnlyRole(role) {
12
+ return READ_ONLY_ROLES.includes(role);
13
+ }
14
+ export const TIER_NAMES = ['simple', 'complex'];
15
+ /**
16
+ * Whether a role's two tier lists are element-wise identical — the single
17
+ * condition behind both "this role needs one agent file, not two" and "the
18
+ * unsuffixed `sonata-<role>` alias cannot hide a tier choice". Ordered
19
+ * equality, because a tier is a *ranking*: the same models in a different
20
+ * order are a different fallback chain.
21
+ *
22
+ * Extracted because three call sites had each rebuilt it — `cmdSync`, which
23
+ * writes the agent files; `resolveTierAlias`, which routes to them; and
24
+ * `sonata init`'s confirm summary, which counts them. The third had rebuilt it
25
+ * differently and so promised twice the files `sync` went on to write.
26
+ */
27
+ export function tiersCollapse(lists) {
28
+ return lists.simple.length === lists.complex.length &&
29
+ lists.simple.every((key, index) => key === lists.complex[index]);
30
+ }
31
+ export const NATIVE_GATEWAY_AUTHS = ['api-key', 'codex-oauth', 'copilot-oauth'];
32
+ export const NATIVE_GATEWAY_WIRE_FORMATS = ['openai', 'anthropic'];
33
+ export const CREDENTIAL_SOURCES = ['sonata', 'codex', 'opencode'];
34
+ /** Gateway auths whose credential is an OAuth login, not a stored bearer key. */
35
+ export const OAUTH_GATEWAY_AUTHS = ['codex-oauth', 'copilot-oauth'];
36
+ export function isOauthGatewayAuth(auth) {
37
+ return OAUTH_GATEWAY_AUTHS.includes(auth);
38
+ }
39
+ /**
40
+ * The prefix the router reserves for Anthropic.
41
+ *
42
+ * A native model whose key or id starts with it can never be reached, because
43
+ * the router forwards that prefix upstream rather than to LiteLLM. Several
44
+ * gateways legitimately serve Claude models — Copilot, acme, anthropic — so
45
+ * this is a real limitation, not a theoretical one: `init` must not offer such
46
+ * a model, or it writes a config that `parseConfig` then refuses to load.
47
+ */
48
+ export const ANTHROPIC_ROUTED_PREFIX = 'claude-';
49
+ export function isAnthropicRoutedName(name) {
50
+ return name.startsWith(ANTHROPIC_ROUTED_PREFIX);
51
+ }
52
+ /** Where LiteLLM's `chatgpt` provider sends Codex traffic. */
53
+ export const CODEX_OAUTH_BASE_URL = 'https://chatgpt.com/backend-api/codex';
54
+ /** Where LiteLLM's `github_copilot` provider sends Copilot traffic. */
55
+ export const COPILOT_OAUTH_BASE_URL = 'https://api.githubcopilot.com';
56
+ /** The endpoint an OAuth gateway's provider addresses on its own. */
57
+ export function oauthGatewayBaseUrl(auth) {
58
+ return auth === 'copilot-oauth' ? COPILOT_OAUTH_BASE_URL : CODEX_OAUTH_BASE_URL;
59
+ }
60
+ function num(v, fallback) {
61
+ return typeof v === 'number' ? v : fallback;
62
+ }
63
+ const HHMM = /^([01]\d|2[0-3]):([0-5]\d)$/;
64
+ function parseRates(raw, where) {
65
+ const out = {};
66
+ const take = (key, field) => {
67
+ const value = raw[key];
68
+ if (value === undefined)
69
+ return;
70
+ if (typeof value !== 'number' || !Number.isFinite(value) || value < 0) {
71
+ throw new Error(`${where}: ${key} price must be a non-negative number`);
72
+ }
73
+ out[field] = value;
74
+ };
75
+ take('input', 'input');
76
+ take('cached_input', 'cachedInput');
77
+ take('output', 'output');
78
+ return out;
79
+ }
80
+ function parsePrice(raw, where) {
81
+ if (raw === undefined)
82
+ return undefined;
83
+ if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
84
+ throw new Error(`${where}: price must be a table`);
85
+ }
86
+ const table = raw;
87
+ const price = parseRates(table, where);
88
+ const windows = table.windows;
89
+ if (windows !== undefined) {
90
+ if (!Array.isArray(windows))
91
+ throw new Error(`${where}: price.windows must be an array of tables`);
92
+ price.windows = windows.map((entry, i) => {
93
+ const w = (entry ?? {});
94
+ const { from, to } = w;
95
+ if (typeof from !== 'string' || typeof to !== 'string') {
96
+ throw new Error(`${where}: price.windows[${i}] needs both from and to`);
97
+ }
98
+ for (const [name, value] of [['from', from], ['to', to]]) {
99
+ if (!HHMM.test(value))
100
+ throw new Error(`${where}: price.windows[${i}].${name} must be UTC HH:MM`);
101
+ }
102
+ return { from, to, ...parseRates(w, `${where}: price.windows[${i}]`) };
103
+ });
104
+ }
105
+ return price;
106
+ }
107
+ export function parseConfig(text) {
108
+ const raw = parseToml(text);
109
+ const models = {};
110
+ const unifiedModels = {};
111
+ for (const [name, def] of Object.entries(raw.models ?? {})) {
112
+ const d = def;
113
+ // A gateway changes this into a unified model entry, whose `id` names the
114
+ // native model rather than a harness provider/model ref. Branch before the
115
+ // legacy check so a native id is never rejected as an OpenCode-style ref.
116
+ if (typeof d.gateway === 'string') {
117
+ if (typeof d.id !== 'string') {
118
+ throw new Error(`sonata.toml: model "${name}" with gateway "${d.gateway}" needs string "id"`);
119
+ }
120
+ if (isAnthropicRoutedName(name)) {
121
+ throw new Error(`sonata.toml: model "${name}" cannot use the "${ANTHROPIC_ROUTED_PREFIX}" prefix because the router routes it to Anthropic.`);
122
+ }
123
+ if (d.harness !== undefined && (typeof d.harness !== 'string' || !KNOWN_HARNESSES.includes(d.harness))) {
124
+ throw new Error(`sonata.toml: model "${name}" has unknown harness "${String(d.harness)}". ` +
125
+ `Known harnesses: ${KNOWN_HARNESSES.join(', ')}`);
126
+ }
127
+ if (d.harness_id !== undefined && typeof d.harness_id !== 'string') {
128
+ throw new Error(`sonata.toml: model "${name}" has non-string "harness_id"`);
129
+ }
130
+ if (d.context_window !== undefined && typeof d.context_window !== 'number') {
131
+ throw new Error(`sonata.toml: model "${name}" has non-number "context_window"`);
132
+ }
133
+ // Only opencode/pi/reasonix take provider-qualified ids; defaulting
134
+ // codex the same way synthesized `<gateway>/<id>` (e.g. `openai/gpt-5.6-sol`)
135
+ // for a harness that takes a bare id, and that invalid ref reached
136
+ // `sonata dispatch` undetected since the entry otherwise parses fine.
137
+ const harnessId = typeof d.harness === 'string'
138
+ ? (typeof d.harness_id === 'string'
139
+ ? d.harness_id
140
+ : d.harness === 'claude' ? name
141
+ : QUALIFIED_ID_HARNESSES.includes(d.harness) ? `${d.gateway}/${d.id}` : d.id)
142
+ : undefined;
143
+ unifiedModels[name] = {
144
+ gateway: d.gateway,
145
+ id: d.id,
146
+ contextWindow: d.context_window ?? 128000,
147
+ price: parsePrice(d.price, `[models."${name}"]`),
148
+ ...(typeof d.harness === 'string' ? {
149
+ harness: d.harness,
150
+ harnessId,
151
+ } : {}),
152
+ };
153
+ // A unified entry may also be used by the legacy generator. Keep the
154
+ // harness projection populated when both routes are declared; otherwise
155
+ // [generate.roles] would incorrectly report this valid entry as unknown.
156
+ if (typeof d.harness === 'string') {
157
+ models[name] = { harness: d.harness, id: harnessId };
158
+ }
159
+ continue;
160
+ }
161
+ if (typeof d.harness !== 'string' || typeof d.id !== 'string') {
162
+ throw new Error(`sonata.toml: model "${name}" needs string "harness" and "id"`);
163
+ }
164
+ if (!KNOWN_HARNESSES.includes(d.harness)) {
165
+ throw new Error(`sonata.toml: model "${name}" has unknown harness "${d.harness}". ` +
166
+ `Known harnesses: ${KNOWN_HARNESSES.join(', ')}`);
167
+ }
168
+ // Opencode, pi and reasonix address models as provider/model; codex takes a
169
+ // bare id, so this cannot be a global rule. Reasonix's provider segment is
170
+ // the name of a `[providers]` entry in that machine's reasonix.toml, so the
171
+ // same id can mean different things on two machines.
172
+ if (QUALIFIED_ID_HARNESSES.includes(d.harness) && !d.id.includes('/')) {
173
+ throw new Error(`sonata.toml: model "${name}" needs a provider — ${d.harness} takes ` +
174
+ `ids in provider/model form, not "${d.id}". Re-run \`sonata init\` to ` +
175
+ 'choose a provider.');
176
+ }
177
+ models[name] = { harness: d.harness, id: d.id };
178
+ unifiedModels[name] = {
179
+ harness: d.harness,
180
+ harnessId: d.id,
181
+ price: parsePrice(d.price, `[models."${name}"]`),
182
+ };
183
+ }
184
+ let tiers;
185
+ if (raw.tiers !== undefined) {
186
+ tiers = {};
187
+ for (const [role, def] of Object.entries(raw.tiers)) {
188
+ if (!KNOWN_ROLES.includes(role)) {
189
+ throw new Error(`sonata.toml: tiers contains unknown role "${role}". ` +
190
+ `Known roles: ${KNOWN_ROLES.join(', ')}`);
191
+ }
192
+ const d = def;
193
+ const simple = d.simple;
194
+ const complex = d.complex;
195
+ if (!Array.isArray(simple) || simple.length === 0 || !simple.every((key) => typeof key === 'string') ||
196
+ !Array.isArray(complex) || complex.length === 0 || !complex.every((key) => typeof key === 'string')) {
197
+ throw new Error(`sonata.toml: tiers.${role} needs non-empty string lists "simple" and "complex".`);
198
+ }
199
+ for (const [tier, keys] of [['simple', simple], ['complex', complex]]) {
200
+ for (const key of keys) {
201
+ if (isAnthropicRoutedName(key)) {
202
+ throw new Error(`sonata.toml: tiers.${role}.${tier} model "${key}" cannot use the ` +
203
+ `"${ANTHROPIC_ROUTED_PREFIX}" prefix because the router routes it to Anthropic.`);
204
+ }
205
+ if (!unifiedModels[key]) {
206
+ throw new Error(`sonata.toml: tiers.${role}.${tier} references unknown model "${key}". ` +
207
+ `Define [models."${key}"] first.`);
208
+ }
209
+ }
210
+ }
211
+ tiers[role] = { simple, complex };
212
+ }
213
+ // Tier lists own all routing choices. Keeping either legacy generator next
214
+ // to them would generate two incompatible sets of agents from one config.
215
+ if (raw.generate !== undefined || raw.native?.generate !== undefined) {
216
+ throw new Error('sonata.toml: [tiers] replaces [generate.roles] and [generate.native] — run `sonata init` to migrate');
217
+ }
218
+ }
219
+ let avoidGateways;
220
+ if (raw.avoid_gateways !== undefined) {
221
+ const listed = raw.avoid_gateways;
222
+ if (!Array.isArray(listed) || !listed.every((name) => typeof name === 'string')) {
223
+ throw new Error('sonata.toml: avoid_gateways must be a list of gateway names');
224
+ }
225
+ // A name that matches no gateway would silently do nothing, and the whole
226
+ // point of the setting is that its absence is invisible — a typo would
227
+ // read as "the gateway is not being avoided" with no way to tell.
228
+ const known = new Set([
229
+ ...Object.keys(raw.native?.gateways ?? {}),
230
+ ...Object.values(unifiedModels).map((model) => model.gateway).filter((g) => g !== undefined),
231
+ ]);
232
+ for (const name of listed) {
233
+ if (!known.has(name)) {
234
+ throw new Error(`sonata.toml: avoid_gateways names unknown gateway "${name}". ` +
235
+ `Known gateways: ${[...known].sort().join(', ') || '(none)'}`);
236
+ }
237
+ }
238
+ avoidGateways = listed;
239
+ }
240
+ const gen = (raw.generate ?? {});
241
+ // TOML cannot express both `roles = [...]` and `[generate.roles]`, so the
242
+ // old form is distinguishable exactly. Fail loudly rather than approximate:
243
+ // a config read as something nobody intended is worse than one that errors.
244
+ if (Array.isArray(gen.roles) || gen.models !== undefined) {
245
+ throw new Error('sonata.toml: [generate] now maps each role to its own models. Replace\n' +
246
+ ' roles = [...]\n models = [...]\n' +
247
+ 'with, for example:\n' +
248
+ ' [generate.roles]\n code = ["<model-key>"]\n review = ["<model-key>"]\n' +
249
+ 'or re-run `sonata init`.');
250
+ }
251
+ const roles = {};
252
+ for (const [role, list] of Object.entries((gen.roles ?? {}))) {
253
+ if (!KNOWN_ROLES.includes(role)) {
254
+ throw new Error(`sonata.toml: generate.roles contains unknown role "${role}". ` +
255
+ `Known roles: ${KNOWN_ROLES.join(', ')}`);
256
+ }
257
+ if (!Array.isArray(list)) {
258
+ throw new Error(`sonata.toml: generate.roles.${role} must be a list of model keys.`);
259
+ }
260
+ for (const m of list) {
261
+ if (!models[m]) {
262
+ throw new Error(`sonata.toml: generate.roles.${role} references unknown model "${m}". ` +
263
+ `Define [models."${m}"] first.`);
264
+ }
265
+ }
266
+ roles[role] = list;
267
+ }
268
+ let native;
269
+ if (raw.native !== undefined) {
270
+ const rawNative = raw.native;
271
+ const gateways = {};
272
+ for (const [name, def] of Object.entries((rawNative.gateways ?? {}))) {
273
+ const d = def;
274
+ const rawAuth = d.auth ?? 'api-key';
275
+ if (typeof rawAuth !== 'string' || !NATIVE_GATEWAY_AUTHS.includes(rawAuth)) {
276
+ throw new Error(`sonata.toml: native gateway "${name}" has unknown auth "${String(rawAuth)}". ` +
277
+ `Known: ${NATIVE_GATEWAY_AUTHS.join(', ')}`);
278
+ }
279
+ const auth = rawAuth;
280
+ let credentialSource;
281
+ if (d.credential_source !== undefined) {
282
+ const raw = d.credential_source;
283
+ if (typeof raw !== 'string' || !CREDENTIAL_SOURCES.includes(raw)) {
284
+ throw new Error(`sonata.toml: native gateway "${name}" has unknown credential_source "${String(raw)}". ` +
285
+ `Known: ${CREDENTIAL_SOURCES.join(', ')}`);
286
+ }
287
+ credentialSource = raw;
288
+ // codex holds a ChatGPT subscription, never a bearer key. Sending it to
289
+ // a metered endpoint passes auth and then fails for quota, which reads
290
+ // as a missing key — see docs/guide/codex-subscription.md. Die here instead.
291
+ if (credentialSource === 'codex' && auth === 'api-key') {
292
+ throw new Error(`sonata.toml: native gateway "${name}" is auth = "api-key", so it ` +
293
+ 'cannot take its credential from codex — that is a subscription, not a key.');
294
+ }
295
+ // codex's read-through credential is a ChatGPT subscription; GitHub
296
+ // Copilot has no such relationship to it. Accepting this combination
297
+ // would silently fall back to opencode's Copilot login regardless of
298
+ // what the config claims to import from.
299
+ if (credentialSource === 'codex' && auth === 'copilot-oauth') {
300
+ throw new Error(`sonata.toml: native gateway "${name}" is copilot-oauth, so it ` +
301
+ 'cannot take its credential from codex — Copilot logins come only from opencode.');
302
+ }
303
+ }
304
+ let wireFormat;
305
+ if (d.wire_format !== undefined) {
306
+ const rawFormat = d.wire_format;
307
+ if (typeof rawFormat !== 'string' || !NATIVE_GATEWAY_WIRE_FORMATS.includes(rawFormat)) {
308
+ throw new Error(`sonata.toml: native gateway "${name}" has unknown wire_format "${String(rawFormat)}". ` +
309
+ `Known: ${NATIVE_GATEWAY_WIRE_FORMATS.join(', ')}`);
310
+ }
311
+ // OAuth gateway wire formats are fixed by their auth provider.
312
+ if (isOauthGatewayAuth(auth)) {
313
+ throw new Error(`sonata.toml: native gateway "${name}" is ${auth}, so it cannot set wire_format — ` +
314
+ 'that credential\'s wire format is fixed by its auth kind. Remove wire_format.');
315
+ }
316
+ wireFormat = rawFormat;
317
+ }
318
+ const price = parsePrice(d.price, `[native.gateways."${name}"]`);
319
+ let pricingProvider;
320
+ if (d.pricing_provider !== undefined) {
321
+ if (typeof d.pricing_provider !== 'string') {
322
+ throw new Error(`sonata.toml: native gateway "${name}" has non-string "pricing_provider"`);
323
+ }
324
+ pricingProvider = d.pricing_provider;
325
+ }
326
+ // An OAuth gateway is addressed by LiteLLM's own provider, which knows the
327
+ // URL; accepting one here would only let a config claim a base URL that is
328
+ // never used — or worse, name the metered endpoint the credential cannot
329
+ // reach, which authenticates and then fails for quota.
330
+ if (isOauthGatewayAuth(auth)) {
331
+ const implied = oauthGatewayBaseUrl(auth);
332
+ if (d.base_url !== undefined && d.base_url !== implied) {
333
+ throw new Error(`sonata.toml: native gateway "${name}" is ${auth}, so it cannot set base_url ` +
334
+ `to "${String(d.base_url)}" — that credential only reaches ${implied}. ` +
335
+ 'Remove base_url.');
336
+ }
337
+ gateways[name] = { baseUrl: implied, auth, credentialSource, price, pricingProvider };
338
+ continue;
339
+ }
340
+ if (typeof d.base_url !== 'string') {
341
+ throw new Error(`sonata.toml: native gateway "${name}" needs string "base_url"`);
342
+ }
343
+ gateways[name] = { baseUrl: d.base_url, auth, credentialSource, wireFormat, price, pricingProvider };
344
+ }
345
+ const nativeModels = {};
346
+ for (const [name, def] of Object.entries((rawNative.models ?? {}))) {
347
+ const d = def;
348
+ if (typeof d.gateway !== 'string' || typeof d.id !== 'string' || typeof d.context_window !== 'number') {
349
+ throw new Error(`sonata.toml: native model "${name}" needs string "gateway", string "id" and number "context_window"`);
350
+ }
351
+ if (isAnthropicRoutedName(name)) {
352
+ throw new Error(`sonata.toml: native model "${name}" cannot use the "${ANTHROPIC_ROUTED_PREFIX}" prefix because the router routes it to Anthropic.`);
353
+ }
354
+ if (!gateways[d.gateway]) {
355
+ throw new Error(`sonata.toml: native model "${name}" references unknown gateway "${d.gateway}". ` +
356
+ `Define [native.gateways."${d.gateway}"] first.`);
357
+ }
358
+ nativeModels[name] = { gateway: d.gateway, id: d.id, contextWindow: d.context_window };
359
+ }
360
+ const nativeGenerate = {};
361
+ for (const [role, list] of Object.entries((gen.native ?? {}))) {
362
+ if (!KNOWN_ROLES.includes(role)) {
363
+ throw new Error(`sonata.toml: generate.native contains unknown role "${role}". ` +
364
+ `Known roles: ${KNOWN_ROLES.join(', ')}`);
365
+ }
366
+ if (!Array.isArray(list) || !list.every((model) => typeof model === 'string')) {
367
+ throw new Error(`sonata.toml: generate.native.${role} must be a list of native model keys.`);
368
+ }
369
+ for (const model of list) {
370
+ if (!nativeModels[model]) {
371
+ throw new Error(`sonata.toml: generate.native.${role} references unknown native model "${model}". ` +
372
+ `Define [native.models."${model}"] first.`);
373
+ }
374
+ }
375
+ nativeGenerate[role] = list;
376
+ }
377
+ const rawPorts = (rawNative.ports ?? {});
378
+ native = {
379
+ models: nativeModels,
380
+ gateways,
381
+ ports: {
382
+ router: num(rawPorts.router, 4100),
383
+ litellm: num(rawPorts.litellm, 4000),
384
+ },
385
+ generate: nativeGenerate,
386
+ };
387
+ }
388
+ // Unlike [native.models], the unified [models] loop above runs before
389
+ // [native.gateways] is parsed, so it cannot validate a gateway reference
390
+ // there — do it now that `native` is built. Left unchecked, an unknown
391
+ // gateway here reaches litellmModelEntry via the native projection below
392
+ // and crashes on `gateways[gateway].auth` being undefined.
393
+ for (const [name, model] of Object.entries(unifiedModels)) {
394
+ if (model.gateway !== undefined && !native?.gateways[model.gateway]) {
395
+ throw new Error(`sonata.toml: model "${name}" references unknown gateway "${model.gateway}". ` +
396
+ `Define [native.gateways."${model.gateway}"] first.`);
397
+ }
398
+ }
399
+ // Tier configs are the unified format. Keep a native projection so the
400
+ // router and older consumers can use the same gateway/model data while the
401
+ // unified tier-aware consumers migrate.
402
+ if (tiers !== undefined) {
403
+ const projectedModels = { ...(native?.models ?? {}) };
404
+ for (const [key, model] of Object.entries(unifiedModels)) {
405
+ if (model.gateway !== undefined && model.id !== undefined) {
406
+ projectedModels[key] = {
407
+ gateway: model.gateway,
408
+ id: model.id,
409
+ contextWindow: model.contextWindow ?? 128000,
410
+ };
411
+ }
412
+ }
413
+ const projectedGenerate = {};
414
+ for (const [role, lists] of Object.entries(tiers)) {
415
+ projectedGenerate[role] = [...new Set([...lists.simple, ...lists.complex])];
416
+ }
417
+ native = {
418
+ models: projectedModels,
419
+ gateways: native?.gateways ?? {},
420
+ ports: native?.ports ?? { router: 4100, litellm: 4000 },
421
+ generate: projectedGenerate,
422
+ };
423
+ }
424
+ return {
425
+ models,
426
+ unifiedModels,
427
+ tiers,
428
+ avoidGateways,
429
+ generate: { roles },
430
+ native,
431
+ run: {
432
+ tailWindowSeconds: num(raw.run?.tail_window_seconds, 20),
433
+ stallTimeoutSeconds: num(raw.run?.stall_timeout_seconds, 120),
434
+ runTimeoutSeconds: num(raw.run?.run_timeout_seconds, 1800),
435
+ dispatchWindowSeconds: num(raw.run?.dispatch_window_seconds, 1500),
436
+ },
437
+ };
438
+ }
439
+ /**
440
+ * Resolves a `sonata-<role>[-<tier>]` model alias to its ranked routes.
441
+ * The collapsed form (`sonata-explore`) exists for roles whose two tier lists
442
+ * are identical — sync generates a single agent for those, and its alias
443
+ * omits the tier so the picker never shows a fake choice.
444
+ */
445
+ export function resolveTierAlias(config, alias) {
446
+ if (!alias.startsWith('sonata-') || config.tiers === undefined)
447
+ return undefined;
448
+ const rest = alias.slice('sonata-'.length);
449
+ let role = rest;
450
+ let tier = 'complex';
451
+ for (const candidate of TIER_NAMES) {
452
+ if (rest.endsWith(`-${candidate}`)) {
453
+ role = rest.slice(0, -(candidate.length + 1));
454
+ tier = candidate;
455
+ break;
456
+ }
457
+ }
458
+ const lists = config.tiers[role];
459
+ if (lists === undefined)
460
+ return undefined;
461
+ // An unsuffixed alias is valid only when it cannot hide a tier choice. Use
462
+ // ordered equality: both ranking and membership are part of the contract.
463
+ const hasExplicitTier = rest !== role;
464
+ if (!hasExplicitTier && !tiersCollapse(lists))
465
+ return undefined;
466
+ const keys = tier === 'simple' ? lists.simple : lists.complex;
467
+ const routes = keys.map((key) => {
468
+ const model = config.unifiedModels[key];
469
+ return {
470
+ key,
471
+ native: model?.gateway !== undefined && model.id !== undefined
472
+ ? { gateway: model.gateway, id: model.id }
473
+ : undefined,
474
+ harness: model?.harness !== undefined && model.harnessId !== undefined
475
+ ? { harness: model.harness, id: model.harnessId }
476
+ : undefined,
477
+ };
478
+ });
479
+ return { role, tier, routes };
480
+ }
481
+ /** The harness route for one model key, for the dispatch CLI. */
482
+ export function harnessModelFor(config, key) {
483
+ const model = config.unifiedModels[key];
484
+ return model?.harness !== undefined && model.harnessId !== undefined
485
+ ? { harness: model.harness, id: model.harnessId }
486
+ : undefined;
487
+ }
488
+ /** Where a machine-level config lives, relative to the home directory. */
489
+ export const GLOBAL_CONFIG_RELATIVE = join('.config', 'sonata', 'sonata.toml');
490
+ /**
491
+ * The config file that will be used, or null if there is none.
492
+ *
493
+ * A project config wins outright — it is not merged with the machine one.
494
+ * Exactly one file is ever in effect, so it is always possible to say which
495
+ * file produced a run.
496
+ */
497
+ export function configPath(cwd, home) {
498
+ const local = join(cwd, 'sonata.toml');
499
+ if (existsSync(local))
500
+ return local;
501
+ const global = join(home, GLOBAL_CONFIG_RELATIVE);
502
+ if (existsSync(global))
503
+ return global;
504
+ return null;
505
+ }
506
+ /**
507
+ * `home` is optional so that callers which have not yet been threaded through
508
+ * keep working; it is always injected in tests, which must never read the
509
+ * real home directory.
510
+ */
511
+ export function loadConfig(cwd, home = homedir()) {
512
+ const path = configPath(cwd, home);
513
+ if (path === null) {
514
+ throw new Error(`No sonata.toml found. Looked in ${join(cwd, 'sonata.toml')} and ` +
515
+ `${join(home, GLOBAL_CONFIG_RELATIVE)}. Run \`sonata init\` or create one.`);
516
+ }
517
+ return parseConfig(readFileSync(path, 'utf8'));
518
+ }
519
+ /**
520
+ * Every agent the config asks for.
521
+ *
522
+ * The single definition of what should exist. The roles × models product used
523
+ * to be written out in `cmdSync`, again in `init`'s summary, and again as the
524
+ * expected set for `staleAgents` — three copies that could disagree, and stale
525
+ * agents caused three separate failures.
526
+ */
527
+ export function generatedAgents(config) {
528
+ const out = [];
529
+ for (const [role, models] of Object.entries(config.generate.roles)) {
530
+ for (const model of models)
531
+ out.push({ role, model });
532
+ }
533
+ return out;
534
+ }
535
+ /** Every native agent the config asks for. */
536
+ export function generatedNativeAgents(config) {
537
+ const out = [];
538
+ for (const [role, models] of Object.entries(config.native?.generate ?? {})) {
539
+ for (const model of models)
540
+ out.push({ role, model });
541
+ }
542
+ return out;
543
+ }
544
+ /**
545
+ * Every agent filename stem `sonata sync` writes, and therefore the exact set
546
+ * that is not stale.
547
+ *
548
+ * A native model gets two files: `native-<role>-<model>` for a `sonata code`
549
+ * session, and a `<role>-<model>` wrapper for dispatch through the claude
550
+ * harness — unless a harness model already claims that name. `sync` and
551
+ * `doctor` computed this separately and disagreed, so `sync` wrote a file that
552
+ * `doctor` then reported as stale, on every run.
553
+ */
554
+ /**
555
+ * Agent file names for a `[tiers]` config: one per role when that role's
556
+ * `simple` and `complex` lists are element-wise identical, otherwise one per
557
+ * role × tier.
558
+ *
559
+ * Exported because `sonata init`'s confirm summary has to predict this count
560
+ * before `sync` runs. It previously counted roles × models instead, so a
561
+ * config whose tiers collapse was promised twice the files it got — the one
562
+ * screen whose whole job is to say what will be written.
563
+ */
564
+ export function tierAgentNames(tiers) {
565
+ const names = [];
566
+ for (const [role, lists] of Object.entries(tiers)) {
567
+ if (tiersCollapse(lists))
568
+ names.push(role);
569
+ else
570
+ names.push(...TIER_NAMES.map((tier) => `${role}-${tier}`));
571
+ }
572
+ return names;
573
+ }
574
+ export function expectedAgentNames(config) {
575
+ if (config.tiers !== undefined)
576
+ return tierAgentNames(config.tiers);
577
+ const harness = generatedAgents(config);
578
+ const native = generatedNativeAgents(config);
579
+ const harnessNames = harness.map((a) => `${a.role}-${a.model}`);
580
+ return [
581
+ ...harnessNames,
582
+ ...native.map((a) => `native-${a.role}-${a.model}`),
583
+ ...native
584
+ .map((a) => `${a.role}-${a.model}`)
585
+ .filter((name) => !harnessNames.includes(name)),
586
+ ];
587
+ }
588
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}