@zhihaohong52/sonata 0.9.1 → 0.10.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 (51) hide show
  1. package/README.md +27 -15
  2. package/dist/build-info.js +54 -0
  3. package/dist/build-info.js.map +1 -0
  4. package/dist/catalog.js +93 -144
  5. package/dist/catalog.js.map +1 -1
  6. package/dist/cli.js +19 -3
  7. package/dist/cli.js.map +1 -1
  8. package/dist/commands/agents.js +30 -6
  9. package/dist/commands/agents.js.map +1 -1
  10. package/dist/commands/doctor.js +42 -16
  11. package/dist/commands/doctor.js.map +1 -1
  12. package/dist/commands/serve.js +116 -44
  13. package/dist/commands/serve.js.map +1 -1
  14. package/dist/commands/sync.js +149 -12
  15. package/dist/commands/sync.js.map +1 -1
  16. package/dist/commands/usage.js +1 -1
  17. package/dist/commands/usage.js.map +1 -1
  18. package/dist/config.js +28 -7
  19. package/dist/config.js.map +1 -1
  20. package/dist/init/guidance.js +34 -5
  21. package/dist/init/guidance.js.map +1 -1
  22. package/dist/init/plan.js +13 -3
  23. package/dist/init/plan.js.map +1 -1
  24. package/dist/init/toml.js +2 -1
  25. package/dist/init/toml.js.map +1 -1
  26. package/dist/ledger.js +89 -25
  27. package/dist/ledger.js.map +1 -1
  28. package/dist/native/router.js +19 -2
  29. package/dist/native/router.js.map +1 -1
  30. package/dist/native/ui-detail.js +174 -0
  31. package/dist/native/ui-detail.js.map +1 -0
  32. package/dist/native/ui-runs.js +258 -0
  33. package/dist/native/ui-runs.js.map +1 -0
  34. package/dist/native/ui-sessions.js +56 -0
  35. package/dist/native/ui-sessions.js.map +1 -0
  36. package/dist/native/ui-usage.js +56 -0
  37. package/dist/native/ui-usage.js.map +1 -0
  38. package/dist/native/ui.js +199 -0
  39. package/dist/native/ui.js.map +1 -0
  40. package/dist/tui-ink/agents-app.js +16 -10
  41. package/dist/tui-ink/agents-app.js.map +1 -1
  42. package/dist/tui-ink/app-state.js +5 -4
  43. package/dist/tui-ink/app-state.js.map +1 -1
  44. package/dist/tui-ink/app.js +41 -13
  45. package/dist/tui-ink/app.js.map +1 -1
  46. package/dist/tui-ink/components/models-step.js +12 -3
  47. package/dist/tui-ink/components/models-step.js.map +1 -1
  48. package/hooks/ensure-serve.mjs +0 -1
  49. package/package.json +5 -3
  50. package/skills/loop/SKILL.md +22 -13
  51. package/ui/index.html +275 -0
package/README.md CHANGED
@@ -17,8 +17,9 @@ Two ways to run it:
17
17
  - **Native** — the foreign model runs *inside Claude Code's own loop*: its
18
18
  tools, its permission modes, no separate TUI. A local routing proxy
19
19
  (`sonata serve`) makes this possible; see the [Native path guide](docs/guide/native-path.md).
20
- This is the default: `sonata init` generates one tier agent per role, each
21
- backed by a ranked list of models the router tries in order.
20
+ This is the default: `sonata init` generates one agent per role and present tier
21
+ (up to 12 agents), each backed by a ranked list of models the router tries in
22
+ order.
22
23
  - **Harness** — the foreign model runs in *its own* CLI (OpenCode, Codex, Pi,
23
24
  Reasonix), launched in a detached tmux session and driven through
24
25
  `sonata dispatch`. No proxy required — this is the fallback lane: when
@@ -192,13 +193,17 @@ Picking a harness-catalogued provider then shows its models to select from:
192
193
  2 of 13 · space toggle · type to filter · enter confirm · esc cancel
193
194
  ```
194
195
 
195
- Then it asks you to rank your selected models into `simple`/`complex` tiers per
196
- role — pre-sorted by a cached Artificial Analysis catalog (`sonata catalog
196
+ Then it asks you to rank your selected models into `simple`, `normal` and
197
+ `complex` tiers per role — pre-sorted by a cached Artificial Analysis catalog
198
+ (`sonata catalog
197
199
  update`, with a free key from [artificialanalysis.ai](https://artificialanalysis.ai))
198
200
  when one exists, or built-in defaults otherwise. `complex` is ordered by raw
199
- capability and `simple` by capability **per task-dollar**, so demanding work
200
- goes to the strongest model you picked and grunt work to the one that returns
201
- the most per dollar rather than merely the cheapest. Set `avoid_gateways` in
201
+ capability. `normal` is ordered by capability **per task-dollar** without a cost
202
+ cap, while `simple` uses that same value order under a cost cap of 12 times the
203
+ best-value model's cost per task. Thus `simple` is a cost-capped prefix of
204
+ `normal`: demanding work goes to the strongest model you picked, ordinary work
205
+ gets the best value, and grunt work stays within the cheaper fallback chain. Set
206
+ `avoid_gateways` in
202
207
  `sonata.toml` to rank a particular gateway's models last without dropping them
203
208
  as fallbacks. It then asks whether the config
204
209
  applies to this project or the whole machine, writes `sonata.toml`, generates
@@ -283,21 +288,28 @@ that suits it:
283
288
 
284
289
  > "Use code-simple to convert these callbacks to async/await."
285
290
 
291
+ > "Use code-normal to add this flag and its tests."
292
+
286
293
  > "Get review-complex to look at the auth refactor."
287
294
 
288
- Judging `simple` vs `complex` is a call you make per task mechanical,
289
- well-specified, single-file work is `simple`; cross-cutting, ambiguous, or
290
- design-sensitive work is `complex`. When unsure, use `-complex`. The
291
- `sonata-loop` skill `sonata init` installs (`skills/loop/SKILL.md`) drives
292
- this across a whole feature: plan, route each task to a tier, gate behind
293
- review, escalate a task to `complex` after two failed reviews at `simple`.
295
+ Choose a tier by the task, not its size: `simple` is specified closely enough
296
+ that the diff can be written without asking a question; `normal` is the default
297
+ when you know what to change but need to fit it into the surrounding code;
298
+ `complex` needs a design decision or the meaning of done is ambiguous. Size is
299
+ not difficulty: a large mechanical change is `simple`, while a three-line
300
+ interface decision is `complex`. When unsure, use `-normal`; a task that fails
301
+ review twice is re-run one tier up. The `sonata-loop` skill `sonata init` installs
302
+ (`skills/loop/SKILL.md`) drives this across a whole feature: plan, route each task
303
+ to a tier, gate behind review, and escalate `simple` to `normal` to `complex`
304
+ after repeated failures.
294
305
 
295
306
  They compose with everything Claude Code already does — parallel fan-out,
296
307
  workflows, and `isolation: "worktree"`.
297
308
 
298
309
  ## How it works
299
310
 
300
- `sonata init` generates one agent per role × difficulty tier — `code-simple`,
311
+ `sonata init` generates one agent per role × present tier — up to 12 agents
312
+ across `simple`, `normal` and `complex` — such as `code-simple`, `code-normal`,
301
313
  `code-complex`, `review-simple`, and so on. Each agent's frontmatter names a
302
314
  router alias (`model: sonata-code-simple`), not a specific model:
303
315
 
@@ -376,7 +388,7 @@ killed and the run is reported `DONE`, `degraded`, with a report beginning
376
388
  | `sonata auth` | Manage native-path gateway keys (`list`, `add <gateway>`, `remove <gateway>`, `login <gateway>`) |
377
389
  | `sonata catalog [update]` | Show the cached Artificial Analysis catalog's age, or refresh it (needs a stored `artificialanalysis` key). `sonata doctor` warns when it goes stale |
378
390
  | `sonata litellm install\|status` | Install or report sonata's own pinned LiteLLM venv. `status` answering `not-required` is healthy — it means no gateway in this config routes through it |
379
- | `sonata serve` | Run the native router and its managed LiteLLM child (`--daemon` detaches) |
391
+ | `sonata serve` | Run the native router and its managed LiteLLM child (`--daemon` detaches); UI: `http://localhost:4100/` |
380
392
  | `sonata restart` | Kill whatever sonata router currently holds the port and start a fresh daemon |
381
393
  | `sonata code` | Launch a Claude Code session routed through the local proxy (passes `claude` args through) |
382
394
  | `sonata route on\|off\|status [--global]` | Route every plain `claude` session in the project (or, with `--global`, every project) through the proxy via settings.local.json/settings.json |
@@ -0,0 +1,54 @@
1
+ import { readFileSync } from 'node:fs';
2
+ import { join } from 'node:path';
3
+ /**
4
+ * The version string a build reports.
5
+ *
6
+ * A published install has no stamp and reports the manifest version unchanged
7
+ * — that number is the truth there, and appending anything to it would make
8
+ * `sonata --version` disagree with npm. A local build reports
9
+ * `<version>+dev.<timestamp>`, because the manifest version of a development
10
+ * install is whatever the last release set and says nothing about the code
11
+ * actually running: two clones at different commits both claim `0.9.1`.
12
+ *
13
+ * **Build metadata, not a prerelease.** The first version of this emitted
14
+ * `<version>-dev-<timestamp>`, which is a valid semver *prerelease* — and a
15
+ * prerelease sorts *below* its release, so a build made from code newer than
16
+ * 0.9.1 announced itself as older than 0.9.1. Anything that compared them
17
+ * would have got the answer backwards, which is the one question the stamp
18
+ * exists to answer. Metadata after `+` is ignored for precedence entirely, so
19
+ * the string says "0.9.1 plus these local changes" and claims nothing about
20
+ * what version is coming next.
21
+ *
22
+ * `.dirty` rides on the end when the worktree was not clean, since that is
23
+ * exactly the build whose commit does not describe it.
24
+ */
25
+ export function stampedVersion(version, info) {
26
+ if (info === undefined)
27
+ return version;
28
+ return `${version}+dev.${info.builtAt}${info.dirty ? '.dirty' : ''}`;
29
+ }
30
+ /**
31
+ * Read the stamp sitting beside the executing file, or `undefined`.
32
+ *
33
+ * Absent is the normal case twice over: a published install never has one, and
34
+ * neither does `npm run dev`, which runs `src/` through tsx and was never
35
+ * built. So an unreadable or malformed stamp degrades to "no stamp" rather
36
+ * than throwing — a version command that fails tells you less than a version
37
+ * command that omits one field.
38
+ */
39
+ export function readBuildInfo(dir) {
40
+ try {
41
+ const parsed = JSON.parse(readFileSync(join(dir, 'build-info.json'), 'utf8'));
42
+ if (typeof parsed.builtAt !== 'string' || parsed.builtAt === '')
43
+ return undefined;
44
+ return {
45
+ builtAt: parsed.builtAt,
46
+ commit: typeof parsed.commit === 'string' && parsed.commit !== '' ? parsed.commit : 'unknown',
47
+ dirty: parsed.dirty === true,
48
+ };
49
+ }
50
+ catch {
51
+ return undefined;
52
+ }
53
+ }
54
+ //# sourceMappingURL=build-info.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"build-info.js","sourceRoot":"","sources":["../src/build-info.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAmBjC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,cAAc,CAAC,OAAe,EAAE,IAAgB;IAC9D,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,OAAO,CAAC;IACvC,OAAO,GAAG,OAAO,QAAQ,IAAI,CAAC,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;AACvE,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,YAAY,CAAC,IAAI,CAAC,GAAG,EAAE,iBAAiB,CAAC,EAAE,MAAM,CAAC,CAAuB,CAAC;QACpG,IAAI,OAAO,MAAM,CAAC,OAAO,KAAK,QAAQ,IAAI,MAAM,CAAC,OAAO,KAAK,EAAE;YAAE,OAAO,SAAS,CAAC;QAClF,OAAO;YACL,OAAO,EAAE,MAAM,CAAC,OAAO;YACvB,MAAM,EAAE,OAAO,MAAM,CAAC,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,KAAK,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS;YAC7F,KAAK,EAAE,MAAM,CAAC,KAAK,KAAK,IAAI;SAC7B,CAAC;IACJ,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,SAAS,CAAC;IACnB,CAAC;AACH,CAAC"}
package/dist/catalog.js CHANGED
@@ -15,14 +15,6 @@ export const AA_ATTRIBUTION = 'Model rankings by Artificial Analysis — https:/
15
15
  /** Coding Index at or above this ⇒ complex-eligible. Chosen so today's
16
16
  * mid-tier coders (deepseek-v4-flash class) sit just above the line. */
17
17
  export const AA_CAPABLE_CODING_INDEX = 40;
18
- /**
19
- * Blended $/1M tokens at or below this ⇒ cheap enough for the simple tier.
20
- *
21
- * Only reaches the simple tier for a model AA has **not** costed per task;
22
- * `SIMPLE_COST_CEILING` decides the ones it has. Kept because a per-1M rate is
23
- * the only price such a model has.
24
- */
25
- export const AA_CHEAP_BLENDED_PRICE_USD = 1.0;
26
18
  /**
27
19
  * A model may cost at most this multiple of the cheapest *selected* model's
28
20
  * per-task cost and still be eligible for a simple tier.
@@ -39,7 +31,7 @@ export const AA_CHEAP_BLENDED_PRICE_USD = 1.0;
39
31
  * at $1.50/1M while costing $0.577/task — less per unit of work than five
40
32
  * models that got in, and a sixth of the way to the $1/1M bar it failed.
41
33
  *
42
- * **Relative**, for the reason `SIMPLE_CAPABILITY_FLOOR` is: an absolute bar
34
+ * **Relative**, because an absolute bar
43
35
  * is wrong in both directions. A user whose whole selection is expensive gets
44
36
  * an empty simple tier and falls back to mirroring complex, which stops the
45
37
  * tier discriminating at all; one whose selection is uniformly cheap gets
@@ -79,39 +71,6 @@ export const AA_CAPABILITY_TIE_MARGIN = 1.0;
79
71
  export function capabilityOf(entry) {
80
72
  return entry.agenticIndex ?? entry.codingIndex ?? entry.intelligenceIndex ?? 0;
81
73
  }
82
- /**
83
- * What one unit of work costs, best available measure first.
84
- *
85
- * `costPerTask` prices the work; the blended per-1M rate only prices tokens
86
- * and is a weaker proxy, kept for models AA has not costed.
87
- */
88
- export function costOfEntry(entry) {
89
- return entry.costPerTask ?? entry.blendedPriceUsd;
90
- }
91
- /**
92
- * A model must reach this fraction of the best score among the *selected*
93
- * models to be eligible for a simple tier.
94
- *
95
- * Relative, not absolute: an absolute floor is wrong in both directions —
96
- * it excludes everything when a user's whole selection is modest, and admits
97
- * junk when their selection is strong. The simple tier optimises
98
- * capability-per-dollar, and without a floor a very cheap, very weak model
99
- * wins on ratio alone.
100
- *
101
- * Set where it is to keep the tier *deep* as well as good. A tier is a ranked
102
- * fallback list, so a floor strict enough to admit one model leaves the router
103
- * nothing to fall through to and sends the first failure straight to 529 and
104
- * the dispatch lane. Measured on a real 17-model config, 0.85 admitted exactly
105
- * one model where 0.75 admits four.
106
- *
107
- * The floor is not only a depth control: it also decides the *leader*, because
108
- * a model it admits can outrank the others on value. On that same config,
109
- * raising it to 0.85 excludes the cheapest model and promotes a stronger,
110
- * dearer one. So it trades capability against both cost and resilience, and
111
- * moving it changes what grunt work actually runs on — not merely what stands
112
- * behind that choice.
113
- */
114
- export const SIMPLE_CAPABILITY_FLOOR = 0.75;
115
74
  /**
116
75
  * The key an AA score is stored and looked up under.
117
76
  *
@@ -374,18 +333,18 @@ function aaEntryFor(normalized, aa, effort) {
374
333
  * anything unlisted is capable-not-cheap, the direction that never silently
375
334
  * hands hard work to a weak model. */
376
335
  const CURATED = {
377
- 'deepseek-v4-flash': { capable: true, cheap: true },
378
- 'deepseek-v4-pro': { capable: true, cheap: false },
379
- 'gpt-5.6-luna': { capable: true, cheap: true },
380
- 'gpt-5.6-terra': { capable: true, cheap: false },
381
- 'gpt-5.6-sol': { capable: true, cheap: false },
382
- 'kimi-k3': { capable: true, cheap: true },
383
- 'kimi-k3-free': { capable: false, cheap: true },
384
- 'glm-5.3': { capable: true, cheap: true },
385
- 'grok-4.6': { capable: true, cheap: false },
386
- 'gemini-3.7-flash': { capable: true, cheap: true },
387
- 'qwen3.8-max': { capable: true, cheap: false },
388
- 'ox-alpha-free': { capable: false, cheap: true },
336
+ 'deepseek-v4-flash': { capable: true },
337
+ 'deepseek-v4-pro': { capable: true },
338
+ 'gpt-5.6-luna': { capable: true },
339
+ 'gpt-5.6-terra': { capable: true },
340
+ 'gpt-5.6-sol': { capable: true },
341
+ 'kimi-k3': { capable: true },
342
+ 'kimi-k3-free': { capable: false },
343
+ 'glm-5.3': { capable: true },
344
+ 'grok-4.6': { capable: true },
345
+ 'gemini-3.7-flash': { capable: true },
346
+ 'qwen3.8-max': { capable: true },
347
+ 'ox-alpha-free': { capable: false },
389
348
  };
390
349
  export function lookupModel(name, aa, providers = [], upstreamFor = identityUpstream) {
391
350
  const { key, effort } = splitCandidate(name);
@@ -394,7 +353,6 @@ export function lookupModel(name, aa, providers = [], upstreamFor = identityUpst
394
353
  if (scored !== undefined) {
395
354
  return {
396
355
  capable: scored.codingIndex >= AA_CAPABLE_CODING_INDEX,
397
- cheap: scored.blendedPriceUsd <= AA_CHEAP_BLENDED_PRICE_USD,
398
356
  source: 'aa',
399
357
  };
400
358
  }
@@ -402,13 +360,28 @@ export function lookupModel(name, aa, providers = [], upstreamFor = identityUpst
402
360
  const curated = normalized.map((spelling) => CURATED[spelling]).find((entry) => entry !== undefined);
403
361
  if (curated !== undefined)
404
362
  return { ...curated, source: 'curated' };
405
- return { capable: true, cheap: false, source: 'default' };
363
+ return { capable: true, source: 'default' };
406
364
  }
407
365
  /** The AA row behind a candidate (`key` or `key@effort`), joined through the match key. */
408
366
  function scoreFor(candidate, aa, providers = [], upstreamFor = identityUpstream) {
409
367
  const { key, effort } = splitCandidate(candidate);
410
368
  return aaEntryFor(normalizedFor(key, providers, upstreamFor), aa, effort);
411
369
  }
370
+ /** Whether AA supplies the per-task cost required for init ranking. */
371
+ export function hasTaskCost(candidate, aa, providers = [], upstreamFor = identityUpstream) {
372
+ // Without a cache there is no exclusion data; preserve the built-in path.
373
+ if (aa === undefined)
374
+ return true;
375
+ // Finite, not merely present: a hand-edited or foreign-written cache can
376
+ // carry `null`, a string or a NaN, and `.toFixed(3)` on the ranking label
377
+ // throws on the first two while the third ranks on a meaningless number.
378
+ const cost = scoreFor(candidate, aa, providers, upstreamFor)?.costPerTask;
379
+ return typeof cost === 'number' && Number.isFinite(cost);
380
+ }
381
+ /** Keep only candidates AA can compare on its dollars-per-task scale. */
382
+ export function taskCostedCandidates(candidates, aa, providers = [], upstreamFor = identityUpstream) {
383
+ return candidates.filter((candidate) => hasTaskCost(candidate, aa, providers, upstreamFor));
384
+ }
412
385
  /**
413
386
  * Each key as the candidates a ranking may choose between: one per scored
414
387
  * level for a model the catalog knows by level, the bare key otherwise. A
@@ -472,10 +445,9 @@ export function candidateLabel(candidate, aa, providers = [], upstreamFor = iden
472
445
  const entry = scoreFor(candidate, aa, providers, upstreamFor);
473
446
  if (entry === undefined)
474
447
  return head;
475
- const cost = entry.costPerTask !== undefined
476
- ? `$${entry.costPerTask.toFixed(3)}/task`
477
- : `$${entry.blendedPriceUsd.toFixed(2)}/1M`;
478
- return `${head.padEnd(32)} ${capabilityOf(entry).toFixed(1).padStart(4)} ${cost}`;
448
+ if (entry.costPerTask === undefined)
449
+ return `${head} (AA publishes no cost-per-task — add by hand to sonata.toml)`;
450
+ return `${head.padEnd(32)} ${capabilityOf(entry).toFixed(1).padStart(4)} $${entry.costPerTask.toFixed(3)}/task`;
479
451
  }
480
452
  /**
481
453
  * Which of `modelKeys` the ranking catalog can actually score.
@@ -500,17 +472,8 @@ export function catalogCoverage(modelKeys, aa, providers = [], upstreamFor = ide
500
472
  function rank(key, aa, providers = [], upstreamFor = identityUpstream) {
501
473
  const scored = scoreFor(key, aa, providers, upstreamFor);
502
474
  return scored !== undefined
503
- ? { index: capabilityOf(scored), price: costOfEntry(scored), perTask: scored.costPerTask !== undefined }
504
- : { index: AA_CAPABLE_CODING_INDEX, price: AA_CHEAP_BLENDED_PRICE_USD, perTask: false };
505
- }
506
- /**
507
- * Compare two prices only when they are in the same unit. `price` is dollars
508
- * per task where AA costed the model and dollars per 1M tokens otherwise —
509
- * two orders of magnitude apart — so across units the comparison is void
510
- * (0), and a costed row sorts ahead of an uncosted one wherever that matters.
511
- */
512
- function samePriceUnit(a, b) {
513
- return a.perTask === b.perTask;
475
+ ? { index: capabilityOf(scored), price: scored.costPerTask ?? 0 }
476
+ : { index: AA_CAPABLE_CODING_INDEX, price: 0 };
514
477
  }
515
478
  /**
516
479
  * Capability per dollar — how a simple tier is ordered.
@@ -524,13 +487,37 @@ function samePriceUnit(a, b) {
524
487
  function valueOf(r) {
525
488
  return r.index / Math.max(r.price, 0.01);
526
489
  }
490
+ /**
491
+ * Rank a role's selected models into the three tiers.
492
+ *
493
+ * Each tier is one sort key over the two quantities AA publishes — a coding
494
+ * index and a cost per task. `complex` takes capability, cost breaking a
495
+ * near-tie; `normal` takes capability per task-dollar; `simple` is `normal`
496
+ * filtered to a cost cap, so it never sorts independently and cannot disagree
497
+ * with `normal` about order.
498
+ *
499
+ * Only candidates AA prices per task are considered (`taskCostedCandidates`),
500
+ * because capability-per-token and capability-per-task are different units and
501
+ * ranking across them is an arithmetic error, not a judgement.
502
+ *
503
+ * Three properties are deliberate and easy to undo by accident:
504
+ * `simple` is a *subsequence* of `normal`, not a prefix — value is not
505
+ * monotonic in cost; the cap is anchored to the best-value model, which
506
+ * therefore always clears it, so `simple` is never empty on any config; and
507
+ * there is no capability floor, because a floor makes the value ranking
508
+ * collapse into the cost ranking and `normal` becomes a copy of `simple`.
509
+ *
510
+ * Avoided gateways are demoted rather than excluded, and never set either bar.
511
+ */
527
512
  export function proposeTiers(modelKeys, aa, providers = [], avoided = new Set(), upstreamFor = identityUpstream) {
528
513
  // Rank over every scored level of every selected model. A model AA scores
529
514
  // at several efforts is several candidates here - luna@high and luna@max
530
515
  // are different capability/cost points, and which one a tier wants is the
531
516
  // whole question. Identity without families, so a catalog-less run (and
532
517
  // every existing caller) sees exactly the keys it passed.
533
- const candidates = expandCandidates(modelKeys, aa, providers, upstreamFor);
518
+ // With a catalog, only AA's per-task scale is valid. Without one, keep the
519
+ // built-in proposal path usable because there is no exclusion data yet.
520
+ const candidates = taskCostedCandidates(expandCandidates(modelKeys, aa, providers, upstreamFor), aa, providers, upstreamFor);
534
521
  const bareKey = (candidate) => splitCandidate(candidate).key;
535
522
  const rankOf = (k) => rank(k, aa, providers, upstreamFor);
536
523
  // An avoided model sorts after every non-avoided one, whatever it scores.
@@ -557,7 +544,7 @@ export function proposeTiers(modelKeys, aa, providers = [], avoided = new Set(),
557
544
  const ra = rankOf(a);
558
545
  const rb = rankOf(b);
559
546
  const gap = Math.abs(rb.index - ra.index) <= AA_CAPABILITY_TIE_MARGIN ? 0 : rb.index - ra.index;
560
- const byPrice = samePriceUnit(ra, rb) ? ra.price - rb.price : 0;
547
+ const byPrice = ra.price - rb.price;
561
548
  return avoidance(a, b) || gap || byPrice || byLevel(a, b);
562
549
  };
563
550
  // Simple work wants the most capability per dollar, capability breaking
@@ -565,86 +552,43 @@ export function proposeTiers(modelKeys, aa, providers = [], avoided = new Set(),
565
552
  // margin is the same noise it is above — a lower level scoring 0.3 higher
566
553
  // is not an edge, and the level decides as it does there.
567
554
  //
568
- // Value is only comparable within one price unit. Every row AA costed per
569
- // task ranks ahead of every row it did not: a per-task cost prices the
570
- // work, the per-1M blend prices tokens, and dividing capability by
571
- // whichever a row happened to carry read `deepseek-v4-flash@none` (18.9 at
572
- // $0.12/1M) as better value than `deepseek-flash@max` (39.5 at
573
- // $0.265/task) — a unit error. Within the uncosted group the per-1M ratio
574
- // is still a value ordering, just a weaker proxy, so a catalog with no
575
- // per-task costs at all ranks exactly as before.
555
+ // Every candidate left here has an AA per-task cost, so capability per
556
+ // dollar is one comparable unit rather than a mix of work and token prices.
576
557
  const byValue = (a, b) => {
577
558
  const ra = rankOf(a);
578
559
  const rb = rankOf(b);
579
- const byUnit = Number(rb.perTask) - Number(ra.perTask);
580
- if (byUnit !== 0)
581
- return avoidance(a, b) || byUnit;
582
560
  if (ra.price === rb.price && Math.abs(rb.index - ra.index) <= AA_CAPABILITY_TIE_MARGIN) {
583
561
  return avoidance(a, b) || byLevel(a, b);
584
562
  }
585
563
  return avoidance(a, b) || valueOf(rb) - valueOf(ra) || rb.index - ra.index || byLevel(a, b);
586
564
  };
587
- const complex = candidates.filter((k) => lookupModel(k, aa, providers, upstreamFor).capable).sort(byCapability);
588
- // The floor is relative to the best model actually selected, so it adapts to
589
- // the user's own set rather than to an absolute score that is wrong whenever
590
- // their selection is uniformly strong or uniformly modest.
591
- // Measured over the models that can actually lead the tier: including an
592
- // avoided model here could raise the bar high enough to exclude everything
593
- // preferred, inverting the setting's intent.
594
- const preferred = candidates.filter((k) => !avoided.has(bareKey(k)));
595
- const leaders = preferred.length > 0 ? preferred : candidates;
596
- const best = Math.max(0, ...leaders.map((k) => rankOf(k).index));
597
- // The cost bar is relative to the cheapest model that can actually *enter*
598
- // the tier — not merely the cheapest one selected. `best` gets away with
599
- // reading every leader because it is a `Math.max`, which a weak model cannot
600
- // drag down; the ceiling is a `Math.min`, which one absolutely can. A very
601
- // cheap, very weak model would set a bar so low that nothing eligible clears
602
- // it, `simple` would come back empty, and the fallback would mirror the
603
- // complex set — the tier silently ceasing to discriminate, which is the whole
604
- // failure the floor exists to prevent. So the same two predicates that decide
605
- // membership below also decide who is allowed to set the bar.
606
- //
607
- // Avoided models are already out (`leaders`), for the same reason the
608
- // capability floor is measured over `preferred`: an avoided model setting the
609
- // bar would move it for models the user asked to demote, which is not what
610
- // avoidance means.
611
- //
612
- // Measured over per-task costs only. `rankOf().price` falls back to a per-1M
613
- // rate when AA has not costed a model, and the two are different units by
614
- // two orders of magnitude — a ratio that mixes them would read an uncosted
615
- // model as ~30x dearer than it is and refuse it on a unit error.
565
+ const capable = (k) => lookupModel(k, aa, providers, upstreamFor).capable;
616
566
  const perTask = (k) => scoreFor(k, aa, providers, upstreamFor)?.costPerTask;
617
- const eligible = (k) => lookupModel(k, aa, providers, upstreamFor).capable
618
- && rankOf(k).index >= best * SIMPLE_CAPABILITY_FLOOR;
619
- const costs = leaders
620
- .filter(eligible)
621
- .map(perTask)
622
- .filter((c) => c !== undefined && c > 0);
623
- const ceiling = costs.length > 0 ? Math.min(...costs) * SIMPLE_COST_CEILING : undefined;
624
- // A model AA has not costed per task has no place on that scale, so it keeps
625
- // the absolute judgement it had before: the curated table's `cheap`, or the
626
- // per-1M bar. That is the pre-existing behaviour for exactly the models this
627
- // change has no better information about.
628
- const isCheap = (k) => {
567
+ const complex = candidates.filter(capable).sort(byCapability);
568
+ const normal = candidates.filter(capable).sort(byValue);
569
+ // Anchor the cap to the best-value model that can actually lead. Avoided
570
+ // models remain fallbacks but must not raise the price paid by preferred ones.
571
+ const anchor = normal.find((k) => !avoided.has(bareKey(k))) ?? normal[0];
572
+ const anchorCost = anchor === undefined ? undefined : perTask(anchor);
573
+ const ceiling = anchorCost === undefined ? undefined : anchorCost * SIMPLE_COST_CEILING;
574
+ // Filtering `normal` rather than sorting again is what stops `simple`
575
+ // disagreeing with it about order: it never does its own sort.
576
+ //
577
+ // The result is a **subsequence, not a prefix**. `normal` is ordered by
578
+ // value, and value is not monotonic in cost — a dearer model with a much
579
+ // better score outranks a cheap weak one — so an over-ceiling candidate can
580
+ // sit ahead of an under-ceiling one and the filter skips past it.
581
+ // Truncating at the first over-ceiling candidate would make it a true
582
+ // prefix and would drop the qualifying cheap models behind it, which is the
583
+ // opposite of what a cheap tier is for.
584
+ const simple = ceiling === undefined ? [] : normal.filter((k) => {
629
585
  const cost = perTask(k);
630
- if (cost === undefined || ceiling === undefined)
631
- return lookupModel(k, aa, providers, upstreamFor).cheap;
632
- return cost <= ceiling;
633
- };
634
- // Same `eligible` the ceiling is measured over, so who sets the bar and who
635
- // is judged against it cannot drift apart.
636
- const simple = candidates.filter((k) => eligible(k) && isCheap(k)).sort(byValue);
637
- // A tier must always resolve to something: with no capable model, everything
638
- // is complex-eligible; with no cheap-capable model, simple mirrors complex.
639
- // The fallback is sorted too — raw input order would break the documented
640
- // "index descending, price ascending" ordering on exactly the path where no
641
- // model cleared the threshold.
586
+ return cost !== undefined && cost <= ceiling;
587
+ });
642
588
  const complexFinal = complex.length > 0 ? complex : [...candidates].sort(byCapability);
643
- // Falls back to the complex set, but re-sorted by value: the reason to
644
- // fall back is that nothing cleared the cheap bar, not that cost stopped
645
- // mattering for grunt work.
646
- const simpleFinal = simple.length > 0 ? simple : [...complexFinal].sort(byValue);
647
- return { simple: simpleFinal, complex: complexFinal };
589
+ const normalFinal = normal.length > 0 ? normal : [...complexFinal].sort(byValue);
590
+ const simpleFinal = simple.length > 0 ? simple : normalFinal;
591
+ return { simple: simpleFinal, normal: normalFinal, complex: complexFinal };
648
592
  }
649
593
  /**
650
594
  * How long a ranking cache stays trustworthy.
@@ -688,8 +632,13 @@ export function loadAaCatalog(home) {
688
632
  Number.isFinite(entry.blendedPriceUsd)) {
689
633
  // An unknown level is a hand-edit or a foreign writer; the score is
690
634
  // still good, so keep the row and drop only the field.
691
- const { effort, ...rest } = entry;
692
- models[name] = effort !== undefined && isEffort(effort) ? { ...rest, effort } : rest;
635
+ const { effort, costPerTask, ...rest } = entry;
636
+ // Same treatment as `effort`: the row's score is still good, so drop
637
+ // only the malformed field and let the model read as uncosted.
638
+ const kept = typeof costPerTask === 'number' && Number.isFinite(costPerTask)
639
+ ? { ...rest, costPerTask }
640
+ : rest;
641
+ models[name] = effort !== undefined && isEffort(effort) ? { ...kept, effort } : kept;
693
642
  }
694
643
  }
695
644
  if (Object.keys(models).length === 0)
@@ -1 +1 @@
1
- {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"catalog.js","sourceRoot":"","sources":["../src/catalog.ts"],"names":[],"mappings":"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"}
package/dist/cli.js CHANGED
@@ -17,10 +17,11 @@ import { initLogDir } from './commands/init-log.js';
17
17
  import { banner, isInteractive, confirm } from './tui.js';
18
18
  import { pruneAgents } from './detect.js';
19
19
  import { homedir } from 'node:os';
20
+ import { readBuildInfo, stampedVersion } from './build-info.js';
20
21
  import { fileURLToPath } from 'node:url';
21
22
  import { existsSync, readFileSync, realpathSync } from 'node:fs';
22
23
  import { cmdAuthAdd, cmdAuthList, cmdAuthLogin, cmdAuthRemove } from './commands/auth.js';
23
- import { cmdServe, cmdRestart, startServeDaemon, isSonataRouter } from './commands/serve.js';
24
+ import { cmdServe, cmdRestart, startServeDaemon, isSonataRouter, sonataRouterReady, sonataRouterHasUi } from './commands/serve.js';
24
25
  import { routerPorts } from './commands/ports.js';
25
26
  import { cmdCode } from './commands/code.js';
26
27
  import { recentRoutes } from './commands/status.js';
@@ -96,6 +97,10 @@ function packageRoot() {
96
97
  */
97
98
  function versionLines() {
98
99
  const root = packageRoot();
100
+ // The stamp sits beside the executing file, not at the package root: that is
101
+ // `dist/` for an installed or linked build and `src/` under `npm run dev`,
102
+ // which is never stamped — so the answer describes the code that ran.
103
+ const info = readBuildInfo(fileURLToPath(new URL('.', import.meta.url)));
99
104
  let version = 'unknown';
100
105
  try {
101
106
  const raw = readFileSync(join(root, 'package.json'), 'utf8');
@@ -109,7 +114,12 @@ function versionLines() {
109
114
  catch {
110
115
  // An unreadable manifest still leaves the path worth printing.
111
116
  }
112
- return [version, root];
117
+ const lines = [stampedVersion(version, info), root];
118
+ // The commit is a second line rather than more suffix: the version is what
119
+ // gets quoted in a bug report, and it stays readable.
120
+ if (info !== undefined)
121
+ lines.push(`built ${info.builtAt} from ${info.commit}${info.dirty ? ' (dirty)' : ''}`);
122
+ return lines;
113
123
  }
114
124
  export async function main(argv) {
115
125
  const [command, ...rest] = argv;
@@ -597,7 +607,13 @@ export async function main(argv) {
597
607
  }
598
608
  if (port !== undefined) {
599
609
  const up = await isSonataRouter(port);
600
- console.log(up ? `router: up on localhost:${port}` : 'router: down');
610
+ const ready = up && await sonataRouterReady(port);
611
+ console.log(!up ? 'router: down' : ready ? `router: up on localhost:${port}` : `router: starting on localhost:${port}`);
612
+ // Only advertised when the running router says it serves the UI: a
613
+ // router from an older build answers `sonata: true` and would have sent
614
+ // the user to a 404.
615
+ if (up && await sonataRouterHasUi(port))
616
+ console.log(`sonata UI: http://localhost:${port}/`);
601
617
  }
602
618
  // The last hour of routes by default, narrowed to the most recent session
603
619
  // — unless --all asks for every session or --session names one specifically.