pi-smart-router 0.4.0 → 0.6.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 (84) hide show
  1. package/README.md +174 -1
  2. package/config/operator-config.json.example +64 -0
  3. package/dist/config/defaults.d.ts.map +1 -1
  4. package/dist/config/defaults.js +3 -0
  5. package/dist/config/defaults.js.map +1 -1
  6. package/dist/domain/matching/cluster-matcher.d.ts +23 -0
  7. package/dist/domain/matching/cluster-matcher.d.ts.map +1 -1
  8. package/dist/domain/matching/cluster-matcher.js +93 -12
  9. package/dist/domain/matching/cluster-matcher.js.map +1 -1
  10. package/dist/domain/matching/embedding-provider.d.ts +19 -4
  11. package/dist/domain/matching/embedding-provider.d.ts.map +1 -1
  12. package/dist/domain/matching/embedding-provider.js +46 -13
  13. package/dist/domain/matching/embedding-provider.js.map +1 -1
  14. package/dist/domain/matching/hydra-matcher.d.ts +38 -2
  15. package/dist/domain/matching/hydra-matcher.d.ts.map +1 -1
  16. package/dist/domain/matching/hydra-matcher.js +89 -6
  17. package/dist/domain/matching/hydra-matcher.js.map +1 -1
  18. package/dist/domain/matching/modernbert-heads.d.ts +74 -0
  19. package/dist/domain/matching/modernbert-heads.d.ts.map +1 -0
  20. package/dist/domain/matching/modernbert-heads.js +198 -0
  21. package/dist/domain/matching/modernbert-heads.js.map +1 -0
  22. package/dist/domain/pinning/flip-flop-guard.d.ts +56 -0
  23. package/dist/domain/pinning/flip-flop-guard.d.ts.map +1 -0
  24. package/dist/domain/pinning/flip-flop-guard.js +118 -0
  25. package/dist/domain/pinning/flip-flop-guard.js.map +1 -0
  26. package/dist/domain/pinning/session-pinner.d.ts +40 -4
  27. package/dist/domain/pinning/session-pinner.d.ts.map +1 -1
  28. package/dist/domain/pinning/session-pinner.js +161 -11
  29. package/dist/domain/pinning/session-pinner.js.map +1 -1
  30. package/dist/domain/pipeline/router-pipeline.d.ts +21 -1
  31. package/dist/domain/pipeline/router-pipeline.d.ts.map +1 -1
  32. package/dist/domain/pipeline/router-pipeline.js +117 -5
  33. package/dist/domain/pipeline/router-pipeline.js.map +1 -1
  34. package/dist/domain/pricing/virtual-cost-v2.d.ts +62 -0
  35. package/dist/domain/pricing/virtual-cost-v2.d.ts.map +1 -0
  36. package/dist/domain/pricing/virtual-cost-v2.js +166 -0
  37. package/dist/domain/pricing/virtual-cost-v2.js.map +1 -0
  38. package/dist/domain/routing/expected-cost.d.ts +47 -3
  39. package/dist/domain/routing/expected-cost.d.ts.map +1 -1
  40. package/dist/domain/routing/expected-cost.js +133 -18
  41. package/dist/domain/routing/expected-cost.js.map +1 -1
  42. package/dist/domain/triage/entropy-check.d.ts +77 -0
  43. package/dist/domain/triage/entropy-check.d.ts.map +1 -0
  44. package/dist/domain/triage/entropy-check.js +196 -0
  45. package/dist/domain/triage/entropy-check.js.map +1 -0
  46. package/dist/domain/triage/triage-engine.d.ts +14 -2
  47. package/dist/domain/triage/triage-engine.d.ts.map +1 -1
  48. package/dist/domain/triage/triage-engine.js +33 -5
  49. package/dist/domain/triage/triage-engine.js.map +1 -1
  50. package/dist/domain/types/entities.d.ts +12 -0
  51. package/dist/domain/types/entities.d.ts.map +1 -1
  52. package/dist/domain/types/schemas.d.ts +62 -0
  53. package/dist/domain/types/schemas.d.ts.map +1 -1
  54. package/dist/domain/types/schemas.js +69 -0
  55. package/dist/domain/types/schemas.js.map +1 -1
  56. package/dist/infrastructure/hardware/throughput-meter.d.ts +42 -0
  57. package/dist/infrastructure/hardware/throughput-meter.d.ts.map +1 -0
  58. package/dist/infrastructure/hardware/throughput-meter.js +88 -0
  59. package/dist/infrastructure/hardware/throughput-meter.js.map +1 -0
  60. package/dist/infrastructure/persistence/sqlite-store.d.ts.map +1 -1
  61. package/dist/infrastructure/persistence/sqlite-store.js +2 -1
  62. package/dist/infrastructure/persistence/sqlite-store.js.map +1 -1
  63. package/dist/infrastructure/telemetry/routing-telemetry.d.ts +39 -3
  64. package/dist/infrastructure/telemetry/routing-telemetry.d.ts.map +1 -1
  65. package/dist/infrastructure/telemetry/routing-telemetry.js +117 -4
  66. package/dist/infrastructure/telemetry/routing-telemetry.js.map +1 -1
  67. package/package.json +5 -1
  68. package/src/config/defaults.ts +3 -0
  69. package/src/domain/matching/cluster-matcher.ts +120 -11
  70. package/src/domain/matching/embedding-provider.ts +66 -17
  71. package/src/domain/matching/hydra-matcher.ts +130 -8
  72. package/src/domain/matching/modernbert-heads.ts +323 -0
  73. package/src/domain/pinning/flip-flop-guard.ts +155 -0
  74. package/src/domain/pinning/session-pinner.ts +302 -13
  75. package/src/domain/pipeline/router-pipeline.ts +155 -4
  76. package/src/domain/pricing/virtual-cost-v2.ts +264 -0
  77. package/src/domain/routing/expected-cost.ts +206 -26
  78. package/src/domain/triage/entropy-check.ts +251 -0
  79. package/src/domain/triage/triage-engine.ts +41 -5
  80. package/src/domain/types/entities.ts +13 -0
  81. package/src/domain/types/schemas.ts +87 -0
  82. package/src/infrastructure/hardware/throughput-meter.ts +129 -0
  83. package/src/infrastructure/persistence/sqlite-store.ts +2 -0
  84. package/src/infrastructure/telemetry/routing-telemetry.ts +180 -7
package/README.md CHANGED
@@ -403,6 +403,55 @@ When a **planning** turn would route primary inference to frontier while a warm
403
403
 
404
404
  See [routing-roadmap.md](docs/routing-roadmap.md) §2 P0 and GitHub [#71](https://github.com/beettlle/pi-smart-router/issues/71) for acceptance criteria.
405
405
 
406
+ ### Virtual cost v2 (v0.5.0 subscription economics)
407
+
408
+ **Virtual cost v2** extends SP-096 flat `quota_cost_per_1m` with deterministic subscription-window economics ([#78](https://github.com/beettlle/pi-smart-router/issues/78)). It inflates effective frontier cost late in a rolling quota window and credits warm prefix-cache value on active pins — without MDP or reinforcement-learning quota policy (SeqRoute HBR+CQL is deferred).
409
+
410
+ **Formula (per turn)**
411
+
412
+ `effective_cost_usd = base × λ + quota_arbitrage_premium + exhaustion_risk_premium + kv_cache_savings`
413
+
414
+ | Component | Meaning |
415
+ |-----------|---------|
416
+ | `base` | SP-096 subscription virtual cost (`quota_cost_per_1m`) or sticker `fallback_cost_per_1m` |
417
+ | **λ (quota decay)** | Multiplier rising from 1 at full window toward `lambda_max_multiplier` as budget depletes |
418
+ | **Quota arbitrage premium** | Opportunity-cost uplift for burning subscription quota late in the window |
419
+ | **Exhaustion risk premium** | Extra penalty when remaining window fraction falls below `exhaustion_risk_threshold` |
420
+ | **KV-cache savings** | Negative credit when pin is active and prefix is warm (`prefix_cache_discount` × `prefix_cache_weight`) |
421
+
422
+ **Window position**
423
+
424
+ Rolling-window position is supplied to the router pipeline as `quotaWindowPosition` (library API / telemetry integration). Use `remaining_window_fraction` in `[0, 1]` (1 = full budget). Optionally derive it from elapsed time and consumed quota via `deriveRemainingWindowFraction(elapsed_seconds, consumed_fraction)` in `virtual-cost-v2.ts` (defaults assume a Cursor-style **5h** window).
425
+
426
+ When `quotaWindowPosition` is omitted, λ stays at 1 and quota premiums are zero — behavior matches SP-096 flat virtual cost.
427
+
428
+ **Operator knobs** (`VirtualCostV2Config` — wire through `RouterPipeline` options today; defaults in `DEFAULT_VIRTUAL_COST_V2_CONFIG`):
429
+
430
+ | Knob | Default | Effect |
431
+ |------|---------|--------|
432
+ | `window_duration_seconds` | `18000` (5h) | Rolling window length for time-based remaining fraction |
433
+ | `lambda_decay_exponent` | `2` | Curvature of λ rise as window depletes |
434
+ | `lambda_max_multiplier` | `3` | λ cap at exhaustion |
435
+ | `quota_arbitrage_weight` | `0.5` | Weight on late-window arbitrage premium |
436
+ | `exhaustion_risk_weight` | `1` | Weight on exhaustion risk below threshold |
437
+ | `exhaustion_risk_threshold` | `0.2` | Remaining fraction below which exhaustion premium applies |
438
+ | `prefix_cache_discount` | `0.9` | Assumed prefix-cache discount on warm tokens |
439
+ | `prefix_cache_weight` | `0.2` | Retained future cache value (aligned with SAAR `SMART_ROUTER_PREFIX_CACHE_WEIGHT`) |
440
+
441
+ **Where v2 applies**
442
+
443
+ - **Expected-cost tier selection** — frontier/composer effective cost rises near window exhaustion; economical tiers can win when subscription quota is scarce.
444
+ - **Cache breakeven gate** — marginal switch savings and observability use v2 when `quotaWindowPosition` is set; KV credit on the pinned model reduces marginal savings and can block unnecessary pin breaks.
445
+
446
+ **Dogfood verification**
447
+
448
+ 1. Configure a fleet with subscription `quota_cost_per_1m` on cursor/composer frontier models (see `config/models.yaml.example`).
449
+ 2. Run routing with `quotaWindowPosition: { remaining_window_fraction: 0.05 }` via library `RouterPipeline` options — inspect `tier_selection` / expected-cost rationale for `v2 λ=`, `quota_premium=`, `exhaustion=`, `cache_credit=` strings.
450
+ 3. On a warm pinned session with low `remaining_window_fraction`, trigger a `tool_result` sub-route — when cache credit plus reprime math fails breakeven, expect pin hold (`breakeven_blocked`) in routing logs and `features.breakeven` on explain.
451
+ 4. Compare `remaining_window_fraction: 1` vs `0.02` on the same request — late-window runs should show higher frontier `effective_cost_usd` in `features.tier_selection.tier_costs[].virtual_cost_v2`.
452
+
453
+ See [routing-roadmap.md](docs/routing-roadmap.md) §2 P2 and GitHub [#78](https://github.com/beettlle/pi-smart-router/issues/78).
454
+
406
455
  ### P(success) training export (baseline classifier)
407
456
 
408
457
  When `SMART_ROUTER_DATASET=1`, the router records privacy-safe dataset rows and behavioral outcome labels (model override, compaction pin break, `/smart-router feedback good|bad`). Export labeled training data from pi:
@@ -441,6 +490,39 @@ This writes schema-valid JSON to `.pi-smart-router/exports/telemetry-contrib-<ti
441
490
 
442
491
  See the synthetic reference file at [`data/contrib/example.json`](data/contrib/example.json).
443
492
 
493
+ ### OATS cluster centroid refinement (offline calibration)
494
+
495
+ **OATS** (outcome-aware cluster centroid refinement) shifts semantic cluster centroids during offline calibration toward cheap-tier **success** embeddings and away from loop-escalation **failure** embeddings. Refinement runs in Phase 3 of the calibration train path (`npm run routing:train-calibration`); it adds zero serving latency because refined centroids ship inside `config/routing-calibration.json`.
496
+
497
+ **Regeneration workflow**
498
+
499
+ 1. Opt in to dataset capture (`SMART_ROUTER_DATASET=1`) and export contrib rows (`/smart-router export telemetry-contrib`).
500
+ 2. Aggregate community rows: `npm run routing:calibration-aggregate -- --contrib-dir data/contrib`.
501
+ 3. Train the bundle (includes OATS when enough labeled embeddings exist): `npm run routing:train-calibration -- --input <aggregated.jsonl>`.
502
+ 4. Copy the output to `config/routing-calibration.json` (or your operator config path).
503
+ 5. Verify artifact shapes and benchmark gates: `npm run routing:verify-calibration -- config/routing-calibration.json`.
504
+
505
+ At runtime, `ClusterMatcher` prefers `routing_centroids` from the calibration bundle when `config/routing-calibration.json` is present; otherwise it falls back to `config/routing-centroids.json` (bootstrap via `npm run routing:bootstrap-centroids`).
506
+
507
+ **Hyperparameters** (tunable in `scripts/lib/oats-centroid-refinement.ts` before train):
508
+
509
+ | Parameter | Default | Effect |
510
+ |-----------|---------|--------|
511
+ | `alpha` (α) | 0.15 | Attraction toward cheap-tier success embeddings |
512
+ | `beta` (β) | 0.08 | Repulsion from loop-escalation failures (keep β < α) |
513
+
514
+ **Minimum sample guidance**
515
+
516
+ | Guard | Default | Meaning |
517
+ |-------|---------|---------|
518
+ | Global `routing_centroids` | 10 rows | Labeled contrib rows with embeddings required before any OATS shift |
519
+ | `min_positive_samples` | 3 per cluster | Cheap-tier successes assigned to the cluster |
520
+ | `min_negative_samples` | 2 per cluster | Loop-escalation failures before repulsion term applies |
521
+
522
+ Below these thresholds the train path returns bootstrap centroids unchanged. The verify script reports `oats_refinement` metadata when refinement ran.
523
+
524
+ See [routing-roadmap.md](docs/routing-roadmap.md) §2 P2 OATS and GitHub [#77](https://github.com/beettlle/pi-smart-router/issues/77).
525
+
444
526
  ### Operator tuning (frugality slider)
445
527
 
446
528
  The multi-objective scoring weights control the cost-vs-quality tradeoff:
@@ -456,13 +538,74 @@ Additional operator defaults:
456
538
  | Key | Default | Purpose |
457
539
  |-----|---------|---------|
458
540
  | `loop_escalation.threshold` | 3 | Consecutive identical failures before escalating to frontier |
541
+ | `pin_only_fallback` | `false` | Emergency pin-on-first-turn mode — see [Pin-only emergency fallback](#pin-only-emergency-fallback) |
459
542
  | `local.min_memory_gb_full` | 16 | Minimum RAM for full local inference |
460
543
  | `local.battery_threshold_pct` | 20 | Minimum battery to allow local inference |
461
544
  | `pricing.staleness_days` | 14 | Max age before re-fetching pricing data |
462
545
 
546
+ ### Pin-only emergency fallback
547
+
548
+ **Not the default policy.** Multi-stage routing remains the design target. Enable `pin_only_fallback` only when shadow quality retention regresses or as a manual operator safety valve (GitHub [#83](https://github.com/beettlle/pi-smart-router/issues/83), [routing-roadmap.md](docs/routing-roadmap.md) §1).
549
+
550
+ When `pin_only_fallback` is `true` in `config/operator-config.json`:
551
+
552
+ 1. **First turn** — normal multi-stage routing runs and establishes the session pin.
553
+ 2. **Subsequent turns** — the router reuses the pinned model, skipping `turn_envelope`, triage, HyDRA, and sub-routing (`reason_code: pin_only_fallback`).
554
+
555
+ **Manual trigger:** set `"pin_only_fallback": true` in operator config and restart or reload config. Revert to `false` when shadow metrics recover.
556
+
557
+ **Automated trigger (eval harness):** compare shadow QR from `npm run routing:eval-harness` against a frozen baseline aggregate. When mean quality retention drops more than **5 percentage points** (default threshold), enable pin-only fallback:
558
+
559
+ ```bash
560
+ # Score current fixtures
561
+ npm run routing:eval-harness:smoke > shadow-metrics.json
562
+
563
+ # Compare against a saved baseline (same catalog_id + checkpoint_date)
564
+ node --import tsx -e "
565
+ import { readFileSync } from 'node:fs';
566
+ import { evaluatePinOnlyFallbackFromHarness } from './scripts/eval/quality-retention.ts';
567
+ const shadow = JSON.parse(readFileSync('shadow-metrics.json','utf8')).tracks.capability;
568
+ const baseline = JSON.parse(readFileSync('baseline-metrics.json','utf8')).tracks.capability;
569
+ const result = evaluatePinOnlyFallbackFromHarness(shadow, baseline);
570
+ console.log(JSON.stringify(result, null, 2));
571
+ if (result.pin_only_fallback) process.exit(2);
572
+ "
573
+ ```
574
+
575
+ Exit code `2` signals regression above threshold — operators can wire this into CI or a config reload hook. Override semantics: explicit `pin_only_fallback: true` in config always enables emergency mode; explicit `false` disables the automated recommendation.
576
+
577
+ **Telemetry:** when fallback routes a request, telemetry rows include `pin_only_fallback_active: true` (and `reason_code: pin_only_fallback`). Filter operator audit logs on that field to confirm emergency mode is active.
578
+
463
579
  ### HyDRA model cache
464
580
 
465
- The embedding matcher uses `@huggingface/transformers` with the `Xenova/all-MiniLM-L6-v2` ONNX model (384-dim embeddings). Artifacts are downloaded at runtime and cached under `.pi-smart-router/models/` (configurable via `hydra.artifact_cache_path`). This directory is gitignored.
581
+ The embedding matcher uses `@huggingface/transformers` with ONNX models (384-dim embeddings). Artifacts are downloaded at runtime and cached under `.pi-smart-router/models/` (configurable via `hydra.artifact_cache_path`). This directory is gitignored.
582
+
583
+ | Encoder | Model | Context | Default |
584
+ |---------|-------|---------|---------|
585
+ | `minilm` | `Xenova/all-MiniLM-L6-v2` | 512 tokens | yes |
586
+ | `granite` | `ibm-granite/granite-embedding-97m-multilingual-r2` (ONNX) | long context | trial (#80) |
587
+
588
+ Set the encoder in operator config:
589
+
590
+ ```json
591
+ {
592
+ "hydra": {
593
+ "artifact_cache_path": ".pi-smart-router/models/",
594
+ "encoder": "granite"
595
+ }
596
+ }
597
+ ```
598
+
599
+ MiniLM remains the default fallback when `encoder` is omitted. Both encoders produce 384-dim vectors compatible with the SP-115 learned projection head.
600
+
601
+ **Latency budget:** the HyDRA embedding stage targets ~80–120 ms per turn. Compare MiniLM vs Granite on held-out agent turn samples:
602
+
603
+ ```bash
604
+ npm run benchmark:encoder
605
+ # optional: --fixtures path --cache .pi-smart-router/models/
606
+ ```
607
+
608
+ The script reports p50/p95 latency for each encoder and asserts Granite p50/p95 stay within the 120 ms budget ceiling. Requires `@huggingface/transformers` and a one-time ONNX artifact download.
466
609
 
467
610
  ## Architecture
468
611
 
@@ -599,6 +742,36 @@ Contributors must run `npm run build` before publishing or consuming the library
599
742
  | `npm run routing:verify-calibration` | Verify calibration bundle against benchmark prompts |
600
743
  | `npm run routing:ingest-benchmarks` | Regenerate `config/benchmark-profiles.json` from leaderboard fixtures |
601
744
  | `npm run routing:verify-benchmark-profiles` | CI smoke: assert checked-in profiles match fixture ingest |
745
+ | `npm run routing:eval-replay` | Counterfactual replay on eval trace fixtures |
746
+ | `npm run routing:eval-harness` | Three-track eval harness (capability, cost, continuity) on fixture traces |
747
+ | `npm run routing:eval-harness:smoke` | Harness summary JSON only (CI smoke; no network) |
748
+ | `npm run benchmark:encoder` | Compare MiniLM vs Granite encoder latency on held-out agent turns |
749
+
750
+ ### Offline eval harness (agent-native routing)
751
+
752
+ The eval harness scores routing decisions on **fixture traces** — multi-turn agent sessions with step-level `prefix_hash` identifiers and frozen model catalog metadata. Fixtures live under `tests/eval/fixtures/` (native eval trace JSON) and `tests/eval/fixtures/twinrouterbench/` (TwinRouterBench-compatible static track format adapted at load time).
753
+
754
+ **Frozen catalog rule:** every published QR/CS number must cite `catalog_id` + `checkpoint_date` from the fixture's `frozen_catalog` block (see `docs/routing-roadmap.md` §5).
755
+
756
+ Run locally:
757
+
758
+ ```bash
759
+ # Full metrics JSON (per-fixture + aggregate track summaries)
760
+ npm run routing:eval-harness
761
+
762
+ # CI-style summary only
763
+ npm run routing:eval-harness:smoke
764
+
765
+ # Custom fixture directory (includes TwinRouterBench static track subdirs)
766
+ npm run routing:eval-harness -- --fixtures tests/eval/fixtures
767
+
768
+ # Counterfactual replay only (SP-151)
769
+ npm run routing:eval-replay
770
+ ```
771
+
772
+ **CI smoke:** `.github/workflows/eval-harness-smoke.yml` runs on PRs that touch eval scripts, fixtures, or the workflow. It executes `routing:eval-harness:smoke` and eval unit tests — fast, offline, no provider network calls.
773
+
774
+ **TwinRouterBench static track:** import step-level router-visible prefixes with execution-verified target tiers (`track: "static"`). The adapter in `scripts/eval/twinrouterbench-adapter.ts` converts static track records into native eval fixtures for the three-track harness. See `docs/gemini-research.md` §9 for methodology context.
602
775
 
603
776
  ### Benchmark profile refresh
604
777
 
@@ -0,0 +1,64 @@
1
+ {
2
+ "_documentation": {
3
+ "pin_only_fallback": "EMERGENCY ONLY — default false. When true, the router pins on the first turn and reuses that model for all subsequent turns, skipping turn_envelope, triage, HyDRA, and sub-routing. Use when shadow quality retention regresses (>5% vs baseline) or as a manual operator fallback. See docs/routing-roadmap.md §1 and GitHub #83. Automated trigger wiring is SP-162."
4
+ },
5
+ "frugality": {
6
+ "lambda_cost": 0.5,
7
+ "lambda_latency": 0.1,
8
+ "lambda_verbosity": 0.15
9
+ },
10
+ "loop_escalation": {
11
+ "threshold": 3
12
+ },
13
+ "pricing": {
14
+ "staleness_days": 14
15
+ },
16
+ "local": {
17
+ "min_memory_gb_full": 16,
18
+ "min_memory_gb_classification": 8,
19
+ "battery_threshold_pct": 20
20
+ },
21
+ "hydra": {
22
+ "artifact_cache_path": ".pi-smart-router/models/",
23
+ "encoder": "minilm",
24
+ "hydra_heads": "learned_projection",
25
+ "_hydra_heads_documentation": {
26
+ "learned_projection": "Default — SP-115 384×3 linear projection on MiniLM/Granite embeddings (config/hydra-projection-weights.json). Approximates HyDRA K sigmoid heads; keep until calibration Top-1 error exceeds ~10%.",
27
+ "modernbert_k4": "ModernBERT-base [CLS] with K=4 independent sigmoid heads (config/modernbert-k4-heads.json). Migrating from SP-115: train K=4 head weights offline, set hydra_heads to modernbert_k4, and remove or ignore hydra-projection-weights.json. The fourth debugging dimension is predicted for HyDRA fidelity but excluded from the catalog-decoupled shortfall gate (reasoning, code_gen, tool_use only). See docs/routing-roadmap.md §2 P3 and GitHub #81."
28
+ }
29
+ },
30
+ "low_intensity": {
31
+ "weights": {
32
+ "prompt_shortness": 0.08,
33
+ "token_shortness": 0.08,
34
+ "cyclomatic_low": 0.06,
35
+ "trivial_signal": 0.1,
36
+ "complex_inverse": 0.08,
37
+ "triage_verdict": 0.1,
38
+ "turn_type": 0.08,
39
+ "no_tool_context": 0.06,
40
+ "message_shallow": 0.06,
41
+ "prose_ratio": 0.06,
42
+ "requirement_low": 0.12,
43
+ "cluster_signal": 0.12
44
+ },
45
+ "high_threshold": 0.65,
46
+ "low_threshold": 0.35,
47
+ "p_success_alpha": 0.5
48
+ },
49
+ "saar": {
50
+ "planning_turn_buffer": 2,
51
+ "prefix_cache_weight": 0.2,
52
+ "idle_timeout_seconds": 300,
53
+ "switch_threshold": 0.5
54
+ },
55
+ "planning_delegate": {
56
+ "enabled": true,
57
+ "compressed_context": {
58
+ "max_messages": 12,
59
+ "max_tokens": 16384,
60
+ "exclude_execution_history": true
61
+ }
62
+ },
63
+ "pin_only_fallback": false
64
+ }
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,gCAAgC,EAAE,mBAAmB,EAAE,oCAAoC,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEnK,wFAAwF;AACxF,wBAAgB,4BAA4B,CAC1C,IAAI,GAAE,cAAwC,GAC7C,cAAc,CAMhB;AAED,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,cAAc,CA4BnD,CAAC"}
1
+ {"version":3,"file":"defaults.d.ts","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAKL,KAAK,cAAc,EACpB,MAAM,4BAA4B,CAAC;AAGpC,OAAO,EAAE,gCAAgC,EAAE,mBAAmB,EAAE,oCAAoC,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEnK,wFAAwF;AACxF,wBAAgB,4BAA4B,CAC1C,IAAI,GAAE,cAAwC,GAC7C,cAAc,CAMhB;AAED,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,cAAc,CA+BnD,CAAC"}
@@ -32,6 +32,8 @@ export const DEFAULT_OPERATOR_CONFIG = {
32
32
  },
33
33
  hydra: {
34
34
  artifact_cache_path: '.pi-smart-router/models/',
35
+ encoder: 'minilm',
36
+ hydra_heads: 'learned_projection',
35
37
  },
36
38
  low_intensity: {
37
39
  weights: DEFAULT_LOW_INTENSITY_WEIGHTS,
@@ -41,5 +43,6 @@ export const DEFAULT_OPERATOR_CONFIG = {
41
43
  },
42
44
  saar: DEFAULT_SAAR_CONFIG,
43
45
  planning_delegate: DEFAULT_PLANNING_DELEGATE_CONFIG,
46
+ pin_only_fallback: false,
44
47
  };
45
48
  //# sourceMappingURL=defaults.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,gCAAgC,EAChC,mBAAmB,EACnB,oCAAoC,EACpC,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,OAAO,EAAE,gCAAgC,EAAE,mBAAmB,EAAE,oCAAoC,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEnK,wFAAwF;AACxF,MAAM,UAAU,4BAA4B,CAC1C,OAAuB,uBAAuB;IAE9C,OAAO;QACL,GAAG,IAAI;QACP,IAAI,EAAE,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;QACzC,iBAAiB,EAAE,oCAAoC,CAAC,IAAI,CAAC,iBAAiB,CAAC;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAA6B;IAC/D,SAAS,EAAE;QACT,WAAW,EAAE,GAAG;QAChB,cAAc,EAAE,GAAG;QACnB,gBAAgB,EAAE,IAAI;KACvB;IACD,eAAe,EAAE;QACf,SAAS,EAAE,CAAC;KACb;IACD,OAAO,EAAE;QACP,cAAc,EAAE,EAAE;KACnB;IACD,KAAK,EAAE;QACL,kBAAkB,EAAE,EAAE;QACtB,4BAA4B,EAAE,CAAC;QAC/B,qBAAqB,EAAE,EAAE;KAC1B;IACD,KAAK,EAAE;QACL,mBAAmB,EAAE,0BAA0B;KAChD;IACD,aAAa,EAAE;QACb,OAAO,EAAE,6BAA6B;QACtC,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,GAAG;KACrB;IACD,IAAI,EAAE,mBAAmB;IACzB,iBAAiB,EAAE,gCAAgC;CAC3C,CAAC"}
1
+ {"version":3,"file":"defaults.js","sourceRoot":"","sources":["../../src/config/defaults.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EACL,gCAAgC,EAChC,mBAAmB,EACnB,oCAAoC,EACpC,wBAAwB,GAEzB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAE,6BAA6B,EAAE,MAAM,oCAAoC,CAAC;AAEnF,OAAO,EAAE,gCAAgC,EAAE,mBAAmB,EAAE,oCAAoC,EAAE,wBAAwB,EAAE,MAAM,4BAA4B,CAAC;AAEnK,wFAAwF;AACxF,MAAM,UAAU,4BAA4B,CAC1C,OAAuB,uBAAuB;IAE9C,OAAO;QACL,GAAG,IAAI;QACP,IAAI,EAAE,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC;QACzC,iBAAiB,EAAE,oCAAoC,CAAC,IAAI,CAAC,iBAAiB,CAAC;KAChF,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,MAAM,uBAAuB,GAA6B;IAC/D,SAAS,EAAE;QACT,WAAW,EAAE,GAAG;QAChB,cAAc,EAAE,GAAG;QACnB,gBAAgB,EAAE,IAAI;KACvB;IACD,eAAe,EAAE;QACf,SAAS,EAAE,CAAC;KACb;IACD,OAAO,EAAE;QACP,cAAc,EAAE,EAAE;KACnB;IACD,KAAK,EAAE;QACL,kBAAkB,EAAE,EAAE;QACtB,4BAA4B,EAAE,CAAC;QAC/B,qBAAqB,EAAE,EAAE;KAC1B;IACD,KAAK,EAAE;QACL,mBAAmB,EAAE,0BAA0B;QAC/C,OAAO,EAAE,QAAQ;QACjB,WAAW,EAAE,oBAAoB;KAClC;IACD,aAAa,EAAE;QACb,OAAO,EAAE,6BAA6B;QACtC,cAAc,EAAE,IAAI;QACpB,aAAa,EAAE,IAAI;QACnB,eAAe,EAAE,GAAG;KACrB;IACD,IAAI,EAAE,mBAAmB;IACzB,iBAAiB,EAAE,gCAAgC;IACnD,iBAAiB,EAAE,KAAK;CAChB,CAAC"}
@@ -27,6 +27,22 @@ export declare class RoutingCentroidsError extends Error {
27
27
  constructor(message: string, options?: ErrorOptions);
28
28
  }
29
29
  export declare function computeCentroid(embeddings: readonly Float32Array[]): Float32Array;
30
+ export declare const DEFAULT_ROUTING_CALIBRATION_PATH: string;
31
+ export interface LoadRoutingCentroidsFromBundleOptions {
32
+ readonly filePath?: string;
33
+ }
34
+ /** Extract routing_centroids from a routing-calibration bundle object (SP-147). */
35
+ export declare function parseRoutingCentroidsFromBundle(parsed: unknown): RoutingCentroidsArtifact;
36
+ /**
37
+ * Load cluster centroids from routing-calibration.json (OATS-refined when present).
38
+ * Returns null when the bundle file is missing.
39
+ */
40
+ export declare function loadRoutingCentroidsFromCalibrationBundle(options?: LoadRoutingCentroidsFromBundleOptions): RoutingCentroidsArtifact | null;
41
+ /** Resolve centroids for serve time — calibration bundle preferred, then standalone file. */
42
+ export declare function resolveRoutingCentroidsArtifact(options?: {
43
+ readonly routingCalibrationPath?: string;
44
+ readonly centroidsFilePath?: string;
45
+ }): RoutingCentroidsArtifact | null;
30
46
  export declare function loadRoutingCentroidsArtifact(filePath?: string): RoutingCentroidsArtifact;
31
47
  export declare function validateCentroidClusterIds(catalogClusters: readonly RoutingCluster[], artifact: RoutingCentroidsArtifact): void;
32
48
  export declare function applyPrecomputedCentroids(catalogClusters: readonly RoutingCluster[], artifact: RoutingCentroidsArtifact): readonly LoadedRoutingCluster[];
@@ -35,6 +51,8 @@ export declare function serializeRoutingCentroidsArtifact(artifact: RoutingCentr
35
51
  export interface CreateClusterMatcherOptions {
36
52
  readonly clustersFilePath?: string;
37
53
  readonly centroidsFilePath?: string;
54
+ /** When set, loads OATS-refined centroids from routing-calibration.json (SP-147). */
55
+ readonly routingCalibrationPath?: string;
38
56
  readonly embedder: TextEmbedder;
39
57
  }
40
58
  /**
@@ -53,6 +71,11 @@ export interface ClusterMatchResult {
53
71
  readonly confidence: ClusterMatchConfidence;
54
72
  readonly elapsedMs: number;
55
73
  }
74
+ /** Assign an embedding to the nearest cluster centroid by cosine similarity. */
75
+ export declare function assignClusterByCentroids(artifact: RoutingCentroidsArtifact, embedding: Float32Array): {
76
+ readonly cluster_id: string;
77
+ readonly similarity: number;
78
+ };
56
79
  export declare function cosineSimilarity(a: Float32Array, b: Float32Array): number;
57
80
  export interface ClusterMatcherConfig {
58
81
  readonly catalog: RoutingClusterCatalog;
@@ -1 +1 @@
1
- {"version":3,"file":"cluster-matcher.d.ts","sourceRoot":"","sources":["../../../src/domain/matching/cluster-matcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cluster-matcher.d.ts","sourceRoot":"","sources":["../../../src/domain/matching/cluster-matcher.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AASH,OAAO,EAAiB,KAAK,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAC3E,OAAO,KAAK,EACV,sBAAsB,EACtB,oBAAoB,EACpB,cAAc,EACd,qBAAqB,EACrB,cAAc,EACd,IAAI,EACL,MAAM,mBAAmB,CAAC;AAI3B,eAAO,MAAM,8BAA8B,kCAAkC,CAAC;AAE9E,MAAM,WAAW,qBAAqB;IACpC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,SAAS,MAAM,EAAE,CAAC;IACrC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;CAClC;AAED,MAAM,WAAW,wBAAwB;IACvC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,QAAQ,EAAE,SAAS,qBAAqB,EAAE,CAAC;CACrD;AAED,qBAAa,qBAAsB,SAAQ,KAAK;IAC9C,SAAkB,IAAI,2BAA2B;gBAErC,OAAO,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,YAAY;CAGpD;AAED,wBAAgB,eAAe,CAAC,UAAU,EAAE,SAAS,YAAY,EAAE,GAAG,YAAY,CAwBjF;AAkFD,eAAO,MAAM,gCAAgC,QAAgD,CAAC;AAE9F,MAAM,WAAW,qCAAqC;IACpD,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,mFAAmF;AACnF,wBAAgB,+BAA+B,CAAC,MAAM,EAAE,OAAO,GAAG,wBAAwB,CAWzF;AAED;;;GAGG;AACH,wBAAgB,yCAAyC,CACvD,OAAO,CAAC,EAAE,qCAAqC,GAC9C,wBAAwB,GAAG,IAAI,CA4BjC;AAED,6FAA6F;AAC7F,wBAAgB,+BAA+B,CAAC,OAAO,CAAC,EAAE;IACxD,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;CACrC,GAAG,wBAAwB,GAAG,IAAI,CAuBlC;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,GAAE,MAAgD,GACzD,wBAAwB,CAuB1B;AAED,wBAAgB,0BAA0B,CACxC,eAAe,EAAE,SAAS,cAAc,EAAE,EAC1C,QAAQ,EAAE,wBAAwB,GACjC,IAAI,CAkCN;AAED,wBAAgB,yBAAyB,CACvC,eAAe,EAAE,SAAS,cAAc,EAAE,EAC1C,QAAQ,EAAE,wBAAwB,GACjC,SAAS,oBAAoB,EAAE,CAcjC;AAED,wBAAsB,6BAA6B,CACjD,eAAe,EAAE,SAAS,cAAc,EAAE,EAC1C,QAAQ,EAAE,YAAY,GACrB,OAAO,CAAC,wBAAwB,CAAC,CAsBnC;AAED,wBAAgB,iCAAiC,CAC/C,QAAQ,EAAE,wBAAwB,GACjC,MAAM,CAER;AAED,MAAM,WAAW,2BAA2B;IAC1C,QAAQ,CAAC,gBAAgB,CAAC,EAAE,MAAM,CAAC;IACnC,QAAQ,CAAC,iBAAiB,CAAC,EAAE,MAAM,CAAC;IACpC,qFAAqF;IACrF,QAAQ,CAAC,sBAAsB,CAAC,EAAE,MAAM,CAAC;IACzC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC;AAWD;;;GAGG;AACH,wBAAsB,yBAAyB,CAC7C,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,qBAAqB,CAAC,CAwBhC;AAED,wBAAsB,oBAAoB,CACxC,OAAO,EAAE,2BAA2B,GACnC,OAAO,CAAC,cAAc,CAAC,CAGzB;AAID,MAAM,MAAM,sBAAsB,GAAG,MAAM,GAAG,KAAK,GAAG,MAAM,CAAC;AAE7D,MAAM,WAAW,kBAAkB;IACjC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,QAAQ,EAAE,IAAI,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,+DAA+D;IAC/D,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,sBAAsB,CAAC;IAC5C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B;AASD,gFAAgF;AAChF,wBAAgB,wBAAwB,CACtC,QAAQ,EAAE,wBAAwB,EAClC,SAAS,EAAE,YAAY,GACtB;IAAE,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAa9D;AAED,wBAAgB,gBAAgB,CAAC,CAAC,EAAE,YAAY,EAAE,CAAC,EAAE,YAAY,GAAG,MAAM,CAwBzE;AA6BD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,OAAO,EAAE,qBAAqB,CAAC;IACxC,QAAQ,CAAC,QAAQ,EAAE,YAAY,CAAC;CACjC;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkC;IAC3D,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAe;gBAE5B,MAAM,EAAE,oBAAoB;IAQlC,KAAK,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA4BjE,2EAA2E;IACrE,UAAU,CAAC,OAAO,EAAE,cAAc,GAAG,OAAO,CAAC,SAAS,sBAAsB,EAAE,CAAC;CAyBtF"}
@@ -8,7 +8,7 @@
8
8
  * Centroids load from `config/routing-centroids.json` at startup when present;
9
9
  * otherwise they are computed inline from reference prompts (SP-114).
10
10
  */
11
- import { readFileSync } from 'node:fs';
11
+ import { existsSync, readFileSync } from 'node:fs';
12
12
  import { resolve } from 'node:path';
13
13
  import { loadRoutingClusters, parseRoutingClustersYaml, } from '../../config/routing-clusters-loader.js';
14
14
  import { EMBEDDING_DIM } from './embedding-provider.js';
@@ -96,6 +96,74 @@ function parseRoutingCentroidsArtifact(parsed) {
96
96
  clusters: parsedClusters,
97
97
  };
98
98
  }
99
+ export const DEFAULT_ROUTING_CALIBRATION_PATH = resolve('config', 'routing-calibration.json');
100
+ /** Extract routing_centroids from a routing-calibration bundle object (SP-147). */
101
+ export function parseRoutingCentroidsFromBundle(parsed) {
102
+ if (typeof parsed !== 'object' || parsed === null) {
103
+ throw new RoutingCentroidsError('Routing calibration bundle must be a JSON object');
104
+ }
105
+ const centroids = parsed.routing_centroids;
106
+ if (centroids === undefined) {
107
+ throw new RoutingCentroidsError('Routing calibration bundle missing routing_centroids');
108
+ }
109
+ return parseRoutingCentroidsArtifact(centroids);
110
+ }
111
+ /**
112
+ * Load cluster centroids from routing-calibration.json (OATS-refined when present).
113
+ * Returns null when the bundle file is missing.
114
+ */
115
+ export function loadRoutingCentroidsFromCalibrationBundle(options) {
116
+ const filePath = options?.filePath ?? DEFAULT_ROUTING_CALIBRATION_PATH;
117
+ if (!existsSync(filePath)) {
118
+ return null;
119
+ }
120
+ let raw;
121
+ try {
122
+ raw = readFileSync(filePath, 'utf8');
123
+ }
124
+ catch (err) {
125
+ const message = err instanceof Error ? err.message : String(err);
126
+ throw new RoutingCentroidsError(`Failed to read routing calibration file: ${message}`, {
127
+ cause: err,
128
+ });
129
+ }
130
+ let parsed;
131
+ try {
132
+ parsed = JSON.parse(raw);
133
+ }
134
+ catch (err) {
135
+ const message = err instanceof Error ? err.message : String(err);
136
+ throw new RoutingCentroidsError(`Failed to parse routing calibration JSON: ${message}`, {
137
+ cause: err,
138
+ });
139
+ }
140
+ return parseRoutingCentroidsFromBundle(parsed);
141
+ }
142
+ /** Resolve centroids for serve time — calibration bundle preferred, then standalone file. */
143
+ export function resolveRoutingCentroidsArtifact(options) {
144
+ const calibrationPath = options?.routingCalibrationPath ?? DEFAULT_ROUTING_CALIBRATION_PATH;
145
+ const centroidsPath = options?.centroidsFilePath ?? resolve(DEFAULT_ROUTING_CENTROIDS_PATH);
146
+ try {
147
+ const fromBundle = loadRoutingCentroidsFromCalibrationBundle({ filePath: calibrationPath });
148
+ if (fromBundle !== null) {
149
+ return fromBundle;
150
+ }
151
+ }
152
+ catch (err) {
153
+ console.warn('Routing calibration centroids invalid; falling back to standalone artifact', {
154
+ error: err instanceof Error ? err.message : String(err),
155
+ });
156
+ }
157
+ try {
158
+ return loadRoutingCentroidsArtifact(centroidsPath);
159
+ }
160
+ catch (err) {
161
+ if (isMissingCentroidsFileError(err)) {
162
+ return null;
163
+ }
164
+ throw err;
165
+ }
166
+ }
99
167
  export function loadRoutingCentroidsArtifact(filePath = resolve(DEFAULT_ROUTING_CENTROIDS_PATH)) {
100
168
  let raw;
101
169
  try {
@@ -190,24 +258,37 @@ export async function loadClusterMatcherCatalog(options) {
190
258
  const centroidsFilePath = options.centroidsFilePath ?? resolve(DEFAULT_ROUTING_CENTROIDS_PATH);
191
259
  const raw = readFileSync(clustersFilePath, 'utf8');
192
260
  const catalogClusters = parseRoutingClustersYaml(raw);
193
- try {
194
- const artifact = loadRoutingCentroidsArtifact(centroidsFilePath);
261
+ const artifact = resolveRoutingCentroidsArtifact({
262
+ ...(options.routingCalibrationPath !== undefined
263
+ ? { routingCalibrationPath: options.routingCalibrationPath }
264
+ : {}),
265
+ centroidsFilePath,
266
+ });
267
+ if (artifact !== null) {
195
268
  return { clusters: applyPrecomputedCentroids(catalogClusters, artifact) };
196
269
  }
197
- catch (err) {
198
- if (isMissingCentroidsFileError(err)) {
199
- return loadRoutingClusters({
200
- filePath: clustersFilePath,
201
- embedder: options.embedder,
202
- });
203
- }
204
- throw err;
205
- }
270
+ return loadRoutingClusters({
271
+ filePath: clustersFilePath,
272
+ embedder: options.embedder,
273
+ });
206
274
  }
207
275
  export async function createClusterMatcher(options) {
208
276
  const catalog = await loadClusterMatcherCatalog(options);
209
277
  return new ClusterMatcher({ catalog, embedder: options.embedder });
210
278
  }
279
+ /** Assign an embedding to the nearest cluster centroid by cosine similarity. */
280
+ export function assignClusterByCentroids(artifact, embedding) {
281
+ let bestId = artifact.clusters[0].cluster_id;
282
+ let bestSimilarity = Number.NEGATIVE_INFINITY;
283
+ for (const cluster of artifact.clusters) {
284
+ const similarity = cosineSimilarity(embedding, new Float32Array(cluster.centroid));
285
+ if (similarity > bestSimilarity) {
286
+ bestSimilarity = similarity;
287
+ bestId = cluster.cluster_id;
288
+ }
289
+ }
290
+ return { cluster_id: bestId, similarity: bestSimilarity };
291
+ }
211
292
  export function cosineSimilarity(a, b) {
212
293
  if (a.length !== b.length) {
213
294
  throw new Error(`Embedding shape mismatch: expected ${a.length}, got ${b.length}`);
@@ -1 +1 @@
1
- {"version":3,"file":"cluster-matcher.js","sourceRoot":"","sources":["../../../src/domain/matching/cluster-matcher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cluster-matcher.js","sourceRoot":"","sources":["../../../src/domain/matching/cluster-matcher.ts"],"names":[],"mappings":"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"}
@@ -1,11 +1,19 @@
1
1
  /**
2
- * Shared MiniLM ONNX text embedder — SP-100.
2
+ * Shared ONNX text embedders — SP-100 (MiniLM), SP-156 (Granite trial).
3
3
  *
4
- * Embeds prompt text via Xenova/all-MiniLM-L6-v2 (384-dim) for HyDRA requirement
5
- * projection and semantic cluster matching. One ONNX session per instance; share
6
- * across matchers via a single factory call and coordinated dispose().
4
+ * Embeds prompt text for HyDRA requirement projection and semantic cluster
5
+ * matching. One ONNX session per instance; share across matchers via a single
6
+ * factory call and coordinated dispose().
7
7
  */
8
+ import type { Encoder } from '../types/schemas.js';
8
9
  export declare const EMBEDDING_DIM = 384;
10
+ /** MiniLM ONNX model (384-dim, 512-token context). */
11
+ export declare const MINILM_ONNX_MODEL = "Xenova/all-MiniLM-L6-v2";
12
+ /**
13
+ * Granite 97M ONNX artifact for @huggingface/transformers.
14
+ * Source weights: ibm-granite/granite-embedding-97m-multilingual-r2 (384-dim).
15
+ */
16
+ export declare const GRANITE_ONNX_MODEL = "onnx-community/granite-embedding-97m-multilingual-r2-ONNX";
9
17
  export interface TextEmbedder {
10
18
  embed(text: string): Promise<Float32Array>;
11
19
  dispose(): Promise<void>;
@@ -18,4 +26,11 @@ export interface TextEmbedder {
18
26
  * Install: `npm i @huggingface/transformers`
19
27
  */
20
28
  export declare function createOnnxTextEmbedder(artifactCachePath: string): Promise<TextEmbedder>;
29
+ /**
30
+ * Granite 97M long-context embedder (384-dim ONNX drop-in for SP-115 head).
31
+ * Model: ibm-granite/granite-embedding-97m-multilingual-r2 via ONNX runtime.
32
+ */
33
+ export declare function createGraniteOnnxTextEmbedder(artifactCachePath: string): Promise<TextEmbedder>;
34
+ /** Select ONNX text embedder by operator encoder flag. */
35
+ export declare function createTextEmbedder(encoder: Encoder | undefined, artifactCachePath: string): Promise<TextEmbedder>;
21
36
  //# sourceMappingURL=embedding-provider.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"embedding-provider.d.ts","sourceRoot":"","sources":["../../../src/domain/matching/embedding-provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AAqBD;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,YAAY,CAAC,CAmCvB"}
1
+ {"version":3,"file":"embedding-provider.d.ts","sourceRoot":"","sources":["../../../src/domain/matching/embedding-provider.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAGnD,eAAO,MAAM,aAAa,MAAM,CAAC;AAEjC,sDAAsD;AACtD,eAAO,MAAM,iBAAiB,4BAA4B,CAAC;AAE3D;;;GAGG;AACH,eAAO,MAAM,kBAAkB,8DAC8B,CAAC;AAE9D,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC,CAAC;IAC3C,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CAC1B;AA+DD;;;;;;GAMG;AACH,wBAAsB,sBAAsB,CAC1C,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,YAAY,CAAC,CAEvB;AAED;;;GAGG;AACH,wBAAsB,6BAA6B,CACjD,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,YAAY,CAAC,CAEvB;AAED,0DAA0D;AAC1D,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,OAAO,YAAkB,EAClC,iBAAiB,EAAE,MAAM,GACxB,OAAO,CAAC,YAAY,CAAC,CAWvB"}