instar 1.3.780 → 1.3.781

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 (42) hide show
  1. package/dashboard/index.html +161 -0
  2. package/dist/core/PostUpdateMigrator.d.ts +21 -0
  3. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  4. package/dist/core/PostUpdateMigrator.js +59 -0
  5. package/dist/core/PostUpdateMigrator.js.map +1 -1
  6. package/dist/core/routingPriceAuthority.d.ts +0 -0
  7. package/dist/core/routingPriceAuthority.d.ts.map +1 -0
  8. package/dist/core/routingPriceAuthority.js +0 -0
  9. package/dist/core/routingPriceAuthority.js.map +1 -0
  10. package/dist/core/routingSpendView.d.ts +172 -0
  11. package/dist/core/routingSpendView.d.ts.map +1 -0
  12. package/dist/core/routingSpendView.js +215 -0
  13. package/dist/core/routingSpendView.js.map +1 -0
  14. package/dist/core/types.d.ts +25 -0
  15. package/dist/core/types.d.ts.map +1 -1
  16. package/dist/core/types.js.map +1 -1
  17. package/dist/monitoring/FeatureMetricsLedger.d.ts +74 -2
  18. package/dist/monitoring/FeatureMetricsLedger.d.ts.map +1 -1
  19. package/dist/monitoring/FeatureMetricsLedger.js +233 -8
  20. package/dist/monitoring/FeatureMetricsLedger.js.map +1 -1
  21. package/dist/scaffold/templates.d.ts.map +1 -1
  22. package/dist/scaffold/templates.js +2 -1
  23. package/dist/scaffold/templates.js.map +1 -1
  24. package/dist/server/AgentServer.d.ts +1 -0
  25. package/dist/server/AgentServer.d.ts.map +1 -1
  26. package/dist/server/AgentServer.js +35 -2
  27. package/dist/server/AgentServer.js.map +1 -1
  28. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  29. package/dist/server/CapabilityIndex.js +12 -0
  30. package/dist/server/CapabilityIndex.js.map +1 -1
  31. package/dist/server/routes.d.ts +3 -0
  32. package/dist/server/routes.d.ts.map +1 -1
  33. package/dist/server/routes.js +46 -0
  34. package/dist/server/routes.js.map +1 -1
  35. package/package.json +1 -1
  36. package/scripts/routing-price-refresh.mjs +216 -0
  37. package/scripts/routing-prices.manifest.json +64 -0
  38. package/src/data/builtin-manifest.json +64 -64
  39. package/src/scaffold/templates/jobs/instar/routing-price-refresh.md +30 -0
  40. package/src/scaffold/templates.ts +2 -1
  41. package/upgrades/1.3.781.md +25 -0
  42. package/upgrades/side-effects/routing-spend-increment-a.md +84 -0
@@ -84,6 +84,7 @@ import { DeliveryFailureSentinel } from '../monitoring/delivery-failure-sentinel
84
84
  import os from 'node:os';
85
85
  import { TokenLedger } from '../monitoring/TokenLedger.js';
86
86
  import { FeatureMetricsLedger } from '../monitoring/FeatureMetricsLedger.js';
87
+ import { RoutingPriceAuthority } from '../core/routingPriceAuthority.js';
87
88
  import { A2ADeliveryTracker } from '../threadline/A2ADeliveryTracker.js';
88
89
  import { setFeatureMetricsRecorder } from '../core/CircuitBreakingIntelligenceProvider.js';
89
90
  import { TokenLedgerPoller } from '../monitoring/TokenLedgerPoller.js';
@@ -168,6 +169,7 @@ export class AgentServer {
168
169
  toneGate = null;
169
170
  tokenLedger = null;
170
171
  featureMetricsLedger = null;
172
+ routingPriceAuthority = null;
171
173
  featureMetricsPruneTimer = null;
172
174
  a2aDeliveryTracker = null;
173
175
  tokenLedgerPoller = null;
@@ -595,25 +597,55 @@ export class AgentServer {
595
597
  try {
596
598
  const serverDataDir = path.join(options.config.stateDir, 'server-data');
597
599
  fs.mkdirSync(serverDataDir, { recursive: true });
600
+ // routing-control-room-spend Increment A: the daily spend rollup is maintained
601
+ // only where the read-only spend view is live (dev agents; dark on the fleet).
602
+ // The `door` column + batched prune are always active (additive/safe); this flag
603
+ // bounds fleet blast radius to just the (tiny) daily-aggregate writes.
604
+ const routingSpendCfg = options.config.routingSpend;
605
+ const routingSpendOn = resolveDevAgentGate(routingSpendCfg?.enabled, options.config);
598
606
  this.featureMetricsLedger = new FeatureMetricsLedger({
599
607
  dbPath: path.join(serverDataDir, 'feature-metrics.db'),
608
+ maintainSpendRollup: routingSpendOn,
600
609
  });
601
610
  // Phase 1b: wire the funnel → ledger. One injection point covers every
602
611
  // wrapped provider (current and future). Null-safe; no-op if it failed above.
603
612
  setFeatureMetricsRecorder(this.featureMetricsLedger);
613
+ // The reporting price authority (Layer 1) — reviewed manifest + machine-local
614
+ // observed/overlay/credits. Read-only; constructed only when the view is live.
615
+ if (routingSpendOn) {
616
+ try {
617
+ this.routingPriceAuthority = new RoutingPriceAuthority({
618
+ projectDir: options.config.projectDir,
619
+ stateDir: options.config.stateDir,
620
+ });
621
+ }
622
+ catch (err) {
623
+ console.warn('[instar] routing-price-authority init failed (non-fatal):', err);
624
+ this.routingPriceAuthority = null;
625
+ }
626
+ }
604
627
  // Observable Intelligence × Responsible Resource: the audit trail is kept
605
628
  // long enough to see behaviour/performance trends, then aged out — never
606
629
  // hoarded forever. Default 30d; tune via monitoring.featureMetrics.retentionDays
607
630
  // (0/negative disables pruning). Prune once at boot + every 6h thereafter.
608
631
  const fmCfg = options.config.monitoring?.featureMetrics;
609
632
  const retentionDays = fmCfg?.retentionDays ?? 30;
610
- if (retentionDays > 0) {
633
+ // The daily spend rollup has its OWN (longer) horizon, decoupled from the 30d raw
634
+ // rows (routing-control-room-spend scal-F3) — default 400 days.
635
+ const rollupRetentionDays = routingSpendCfg?.tokenRollupRetentionDays ?? 400;
636
+ if (retentionDays > 0 || routingSpendOn) {
611
637
  const retentionMs = retentionDays * 24 * 60 * 60 * 1000;
612
638
  const prune = () => {
613
639
  try {
614
- this.featureMetricsLedger?.pruneOlderThan(Date.now() - retentionMs);
640
+ if (retentionDays > 0)
641
+ this.featureMetricsLedger?.pruneOlderThan(Date.now() - retentionMs);
615
642
  }
616
643
  catch { /* @silent-fallback-ok: retention prune is best-effort housekeeping — a failed prune just leaves old rows for the next tick */ }
644
+ try {
645
+ if (routingSpendOn && rollupRetentionDays > 0)
646
+ this.featureMetricsLedger?.pruneSpendRollup(rollupRetentionDays);
647
+ }
648
+ catch { /* @silent-fallback-ok: rollup prune is best-effort housekeeping */ }
617
649
  };
618
650
  prune();
619
651
  this.featureMetricsPruneTimer = setInterval(prune, 6 * 60 * 60 * 1000);
@@ -1926,6 +1958,7 @@ export class AgentServer {
1926
1958
  machineHeartbeat: options.machineHeartbeat ?? null,
1927
1959
  tokenLedger: this.tokenLedger,
1928
1960
  featureMetricsLedger: this.featureMetricsLedger,
1961
+ routingPriceAuthority: this.routingPriceAuthority,
1929
1962
  resourceLedger: this.resourceLedger,
1930
1963
  processFootprintMonitor: this.processFootprintMonitor,
1931
1964
  approvalLedger: this.approvalLedger,