instar 1.3.777 → 1.3.779

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 (46) hide show
  1. package/dashboard/index.html +134 -0
  2. package/dist/commands/server.d.ts.map +1 -1
  3. package/dist/commands/server.js +10 -1
  4. package/dist/commands/server.js.map +1 -1
  5. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  6. package/dist/config/ConfigDefaults.js +10 -0
  7. package/dist/config/ConfigDefaults.js.map +1 -1
  8. package/dist/core/PostUpdateMigrator.d.ts +11 -0
  9. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  10. package/dist/core/PostUpdateMigrator.js +111 -1
  11. package/dist/core/PostUpdateMigrator.js.map +1 -1
  12. package/dist/core/StopGateDb.d.ts +31 -0
  13. package/dist/core/StopGateDb.d.ts.map +1 -1
  14. package/dist/core/StopGateDb.js +103 -5
  15. package/dist/core/StopGateDb.js.map +1 -1
  16. package/dist/core/UnjustifiedStopGate.d.ts +30 -1
  17. package/dist/core/UnjustifiedStopGate.d.ts.map +1 -1
  18. package/dist/core/UnjustifiedStopGate.js +97 -3
  19. package/dist/core/UnjustifiedStopGate.js.map +1 -1
  20. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  21. package/dist/core/devGatedFeatures.js +6 -0
  22. package/dist/core/devGatedFeatures.js.map +1 -1
  23. package/dist/core/natureRoutingMap.d.ts +110 -0
  24. package/dist/core/natureRoutingMap.d.ts.map +1 -0
  25. package/dist/core/natureRoutingMap.js +120 -0
  26. package/dist/core/natureRoutingMap.js.map +1 -0
  27. package/dist/core/stopGateTranscriptTail.d.ts +48 -0
  28. package/dist/core/stopGateTranscriptTail.d.ts.map +1 -0
  29. package/dist/core/stopGateTranscriptTail.js +118 -0
  30. package/dist/core/stopGateTranscriptTail.js.map +1 -0
  31. package/dist/core/types.d.ts +11 -0
  32. package/dist/core/types.d.ts.map +1 -1
  33. package/dist/core/types.js.map +1 -1
  34. package/dist/server/routes.d.ts.map +1 -1
  35. package/dist/server/routes.js +104 -0
  36. package/dist/server/routes.js.map +1 -1
  37. package/dist/server/stopGate.d.ts +8 -0
  38. package/dist/server/stopGate.d.ts.map +1 -1
  39. package/dist/server/stopGate.js.map +1 -1
  40. package/package.json +1 -1
  41. package/src/data/builtin-manifest.json +63 -63
  42. package/upgrades/1.3.778.md +47 -0
  43. package/upgrades/1.3.779.md +23 -0
  44. package/upgrades/eli16/routing-map-surface.md +41 -0
  45. package/upgrades/side-effects/routing-map-surface.md +117 -0
  46. package/upgrades/side-effects/self-deferral-guard-shadow.eli16.md +48 -0
@@ -2751,6 +2751,7 @@
2751
2751
  <button class="tab" data-tab="tokens" onclick="switchTab('tokens')">Tokens</button>
2752
2752
  <button class="tab" data-tab="resources" onclick="switchTab('resources')">Resource Usage</button>
2753
2753
  <button class="tab" data-tab="llm-activity" onclick="switchTab('llm-activity')">LLM Activity</button>
2754
+ <button class="tab" data-tab="routing-map" onclick="switchTab('routing-map')">Routing Map</button>
2754
2755
  <button class="tab" data-tab="threadline" onclick="switchTab('threadline')">Threadline</button>
2755
2756
  <button class="tab" data-tab="evidence" onclick="switchTab('evidence')">Evidence</button>
2756
2757
  <button class="tab" data-tab="process-health" onclick="switchTab('process-health')">Process Health</button>
@@ -3337,6 +3338,41 @@
3337
3338
  </div>
3338
3339
  </div>
3339
3340
 
3341
+ <!-- Routing Map tab — the read-only nature-axis routing map (FD11 readable canary,
3342
+ docs/specs/nature-axis-routing.md). For every internal job-kind: which door +
3343
+ model it uses and its full ordered fallback tier list, with injection-safe /
3344
+ money-gated / critical-gate flags. Read-only display; data from
3345
+ /intelligence/routing/chains. No controls — the map only DISPLAYS the routing. -->
3346
+ <div id="routingMapPanel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
3347
+ <div style="display:flex;justify-content:space-between;align-items:center;gap:12px;flex-wrap:wrap">
3348
+ <h2 style="margin:0">Routing Map</h2>
3349
+ <button onclick="loadRoutingMap()" style="padding:6px 12px">Refresh</button>
3350
+ </div>
3351
+ <div style="font-size:12px;color:var(--text-dim);line-height:1.4">
3352
+ Where each internal job-kind sends its AI calls. Every background check, gate, and
3353
+ sentinel has a <b>lane</b> (its "nature") and a fallback list of <b>doors</b> — the ways
3354
+ it can reach a model. This shows, per lane, the ordered door + model list it tries, and
3355
+ flags a door that's <b>metered</b> (a paid API, skipped for now), <b>money-gated</b>, or
3356
+ that must never take untrusted input. Read-only: it shows the map, it changes nothing.
3357
+ </div>
3358
+
3359
+ <!-- The four lanes (chains) -->
3360
+ <div id="routingMapChainsCard" style="border:1px solid var(--border);border-radius:8px;padding:16px;display:flex;flex-direction:column;gap:12px">
3361
+ <div style="font-weight:600">Lanes (fallback order)</div>
3362
+ <div id="routingMapChainsBody" style="font-size:13px;overflow-x:auto">
3363
+ <div style="color:var(--text-dim)">Loading...</div>
3364
+ </div>
3365
+ </div>
3366
+
3367
+ <!-- Per job-kind mapping -->
3368
+ <div style="border:1px solid var(--border);border-radius:8px;padding:16px;display:flex;flex-direction:column;gap:8px">
3369
+ <div style="font-weight:600">By job-kind</div>
3370
+ <div id="routingMapComponentsBody" style="font-size:13px;overflow-x:auto">
3371
+ <div style="color:var(--text-dim)">Loading...</div>
3372
+ </div>
3373
+ </div>
3374
+ </div>
3375
+
3340
3376
  <!-- Evidence Tab (WikiClaim Phase 4) — per-entity evidence + reverse "what cites this?" view.
3341
3377
  Spec: docs/specs/OPENCLAW-IMPORT-WIKICLAIM-EVIDENCE-SPEC.md § Phase 4 (line 343). -->
3342
3378
  <!-- process-health tab -->
@@ -5004,6 +5040,12 @@
5004
5040
  display: ['flex'],
5005
5041
  onActivate: () => { if (typeof loadLlmActivity === 'function') loadLlmActivity(); },
5006
5042
  },
5043
+ {
5044
+ id: 'routing-map',
5045
+ panels: ['routingMapPanel'],
5046
+ display: ['flex'],
5047
+ onActivate: () => { if (typeof loadRoutingMap === 'function') loadRoutingMap(); },
5048
+ },
5007
5049
  {
5008
5050
  id: 'threadline',
5009
5051
  panels: ['threadlineTab'],
@@ -5676,6 +5718,98 @@
5676
5718
  }
5677
5719
  }
5678
5720
 
5721
+ async function loadRoutingMap() {
5722
+ const chainsEl = document.getElementById('routingMapChainsBody');
5723
+ const compsEl = document.getElementById('routingMapComponentsBody');
5724
+ // Render one door+model position as a compact chip line.
5725
+ const flags = (p) => {
5726
+ const f = [];
5727
+ if (p.doorClass === 'metered') f.push('metered' + (p.skippedInIncrementA ? ' · skipped now' : ''));
5728
+ if (p.moneyGated) f.push('money-gated');
5729
+ if (p.injectionSafe === false) f.push('unsafe for untrusted input');
5730
+ if (p.claudeBanned) f.push('no-Claude');
5731
+ return f.length ? ' <span style="color:var(--text-dim)">(' + f.map(escapeHtml).join(' · ') + ')</span>' : '';
5732
+ };
5733
+ const posLine = (p, i) => '<div style="padding:2px 0">' +
5734
+ '<span style="color:var(--text-dim)">' + (i + 1) + '.</span> ' +
5735
+ '<b>' + escapeHtml(p.door) + '</b> → ' + escapeHtml(p.modelId) + flags(p) + '</div>';
5736
+ const th = (t, right) => '<th style="padding:6px 8px;' + (right ? 'text-align:right' : 'text-align:left') + '">' + t + '</th>';
5737
+ const td = (v, right) => '<td style="padding:6px 8px;vertical-align:top;' + (right ? 'text-align:right' : '') + '">' + v + '</td>';
5738
+ try {
5739
+ const data = await apiFetch('/intelligence/routing/chains');
5740
+ const chains = data.chains || [];
5741
+ chainsEl.innerHTML =
5742
+ '<div style="font-size:11px;color:var(--text-dim);margin-bottom:8px">Enforced default framework: <b>' +
5743
+ escapeHtml(String(data.defaultFramework || '—')) + '</b> · injection signal: ' +
5744
+ escapeHtml(String(data.injectionExposureSource || '—')) + '</div>' +
5745
+ '<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:12px">' +
5746
+ chains.map((c) =>
5747
+ '<div style="border:1px solid var(--border);border-radius:6px;padding:10px">' +
5748
+ '<div style="font-weight:600;margin-bottom:4px">' + escapeHtml(c.chain) + '</div>' +
5749
+ (c.positions || []).map(posLine).join('') +
5750
+ '</div>').join('') +
5751
+ '</div>';
5752
+
5753
+ const comps = (data.components || []).slice().sort((a, b) => {
5754
+ // Mapped (has a chain) first, then by component name.
5755
+ if (!!a.chain !== !!b.chain) return a.chain ? -1 : 1;
5756
+ return String(a.component).localeCompare(String(b.component));
5757
+ });
5758
+ if (comps.length === 0) {
5759
+ compsEl.innerHTML = '<div style="color:var(--text-dim)">No components mapped.</div>';
5760
+ return;
5761
+ }
5762
+ const yn = (v) => v === true ? 'yes' : (v === false ? 'no' : '—');
5763
+ compsEl.innerHTML =
5764
+ '<table style="width:100%;border-collapse:collapse;font-size:12px;min-width:760px">' +
5765
+ '<thead><tr style="color:var(--text-dim)">' +
5766
+ th('Job-kind') + th('Category') + th('Lane') + th('Enforced now') +
5767
+ th('Critical gate') + th('Injection exposure') + th('Fallback order') +
5768
+ '</tr></thead><tbody>' +
5769
+ comps.map((c) => {
5770
+ const route = (c.route && c.route.length)
5771
+ ? c.route.map(posLine).join('')
5772
+ : '<span style="color:var(--text-dim)">legacy category routing (no nature lane)</span>';
5773
+ const lane = c.chain
5774
+ ? escapeHtml(c.chain) + ' <span style="color:var(--text-dim)">(' + escapeHtml(String(c.nature)) + ')</span>'
5775
+ : '<span style="color:var(--text-dim)">—</span>';
5776
+ // Prefer the richer FD5b exposure classification; fall back to the untrusted-input flag.
5777
+ let exposure;
5778
+ if (c.injectionExposure) {
5779
+ const ch = c.injectionExposure.channels || {};
5780
+ const chans = ['user', 'model', 'tool'].filter((k) => ch[k]);
5781
+ exposure = c.injectionExposure.exposed
5782
+ ? 'exposed' + (chans.length ? ' <span style="color:var(--text-dim)">(' + chans.join('/') + ')</span>' : '')
5783
+ : 'not exposed' + (c.injectionExposure.reason ? ' <span style="color:var(--text-dim)">(' + escapeHtml(c.injectionExposure.reason) + ')</span>' : '');
5784
+ } else if (c.untrustedInput === true) {
5785
+ exposure = 'exposed';
5786
+ } else if (c.untrustedInput === false) {
5787
+ exposure = 'not exposed' + (c.untrustedInputReason ? ' <span style="color:var(--text-dim)">(' + escapeHtml(c.untrustedInputReason) + ')</span>' : '');
5788
+ } else {
5789
+ exposure = '—';
5790
+ }
5791
+ return '<tr style="border-top:1px solid var(--border)">' +
5792
+ td('<b>' + escapeHtml(c.component) + '</b>') +
5793
+ td(escapeHtml(String(c.category || '—'))) +
5794
+ td(lane) +
5795
+ td(escapeHtml(String(c.enforcedFramework || '—'))) +
5796
+ td(c.criticalGate ? '<b>yes</b>' : 'no') +
5797
+ td(exposure) +
5798
+ td(route) +
5799
+ '</tr>';
5800
+ }).join('') +
5801
+ '</tbody></table>';
5802
+ } catch (err) {
5803
+ const m = err && err.message ? String(err.message) : String(err);
5804
+ if (/503|unavailable|not initialized/i.test(m)) {
5805
+ chainsEl.innerHTML = '<div style="color:var(--text-dim)">The routing map isn\'t available on this agent (no AI provider configured).</div>';
5806
+ } else {
5807
+ chainsEl.innerHTML = '<div style="color:var(--red)">Error: ' + escapeHtml(m) + '</div>';
5808
+ }
5809
+ compsEl.innerHTML = '';
5810
+ }
5811
+ }
5812
+
5679
5813
  async function loadResources() {
5680
5814
  const headlineEl = document.getElementById('resourcesHeadlineBody');
5681
5815
  const sourcesEl = document.getElementById('resourcesSourcesBody');
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAwDH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAU3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AAyBjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA6H7D,OAAO,KAAK,EAAW,oBAAoB,EAAe,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAgFtD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC1C,OAAO,CAUT;AAyID,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAgmDD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,oBAAoB,GAAG,IAAI,GACxC;IACD,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAqBA;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,cAAc,EAC9B,YAAY,CAAC,EAAE,YAAY,EAC3B,WAAW,CAAC,EAAE,WAAW,EACzB,WAAW,CAAC,EAAE,WAAW,EACzB,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAGvE,UAAU,CAAC,EAAE,MAAM,OAAO,8BAA8B,EAAE,WAAW,GAAG,IAAI,EAK5E,qBAAqB,CAAC,EAAE,MAAM,OAAO,gCAAgC,EAAE,kBAAkB,GAAG,IAAI,EAKhG,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,EAQrD,oBAAoB,CAAC,EAAE,MAAM;IAC3B,YAAY,EAAE,OAAO,kBAAkB,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,GACP,IAAI,CAonBN;AA2lBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAirmBtE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD5E"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAwDH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAU3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AAyBjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA6H7D,OAAO,KAAK,EAAW,oBAAoB,EAAe,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAgFtD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC1C,OAAO,CAUT;AAyID,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAgmDD;;;;;;;;GAQG;AACH,wBAAgB,wBAAwB,CACtC,MAAM,EAAE,YAAY,EACpB,YAAY,EAAE,oBAAoB,GAAG,IAAI,GACxC;IACD,YAAY,EAAE,oBAAoB,GAAG,IAAI,CAAC;IAC1C,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,CAqBA;AAED,wBAAgB,mBAAmB,CACjC,QAAQ,EAAE,eAAe,EACzB,cAAc,EAAE,cAAc,EAC9B,YAAY,CAAC,EAAE,YAAY,EAC3B,WAAW,CAAC,EAAE,WAAW,EACzB,WAAW,CAAC,EAAE,WAAW,EACzB,iBAAiB,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,EAGvE,UAAU,CAAC,EAAE,MAAM,OAAO,8BAA8B,EAAE,WAAW,GAAG,IAAI,EAK5E,qBAAqB,CAAC,EAAE,MAAM,OAAO,gCAAgC,EAAE,kBAAkB,GAAG,IAAI,EAKhG,mBAAmB,CAAC,EAAE,MAAM,MAAM,GAAG,IAAI,GAAG,SAAS,EAQrD,oBAAoB,CAAC,EAAE,MAAM;IAC3B,YAAY,EAAE,OAAO,kBAAkB,EAAE,oBAAoB,GAAG,IAAI,CAAC;IACrE,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,OAAO,CAAC;IAChB,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB,SAAS,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS,CAAC;IAC3C,QAAQ,EAAE,MAAM,CAAC;CAClB,GAAG,IAAI,GACP,IAAI,CAonBN;AA2lBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CA6rmBtE;AAED,wBAAsB,UAAU,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAsDzE;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,aAAa,CAAC,OAAO,EAAE;IAAE,GAAG,CAAC,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAuD5E"}
@@ -15108,7 +15108,16 @@ export async function startServer(options) {
15108
15108
  if (sharedIntelligence && stopGateDb) {
15109
15109
  try {
15110
15110
  const { UnjustifiedStopGate } = await import('../core/UnjustifiedStopGate.js');
15111
- unjustifiedStopGate = new UnjustifiedStopGate({ intelligence: sharedIntelligence });
15111
+ const { resolveDevAgentGate } = await import('../core/devAgentGate.js');
15112
+ // Turn-End Self-Deferral Guard (Phase A / shadow) — dev-gated dark:
15113
+ // `monitoring.selfDeferralGuard` OMITS `enabled` so resolveDevAgentGate
15114
+ // decides (LIVE on a dev agent, DARK on the fleet). When on, the
15115
+ // authority OFFERS the U_SELF_DEFERRAL rule + its four shadow fields.
15116
+ const selfDeferralGuardEnabled = resolveDevAgentGate(config.monitoring?.selfDeferralGuard?.enabled, config);
15117
+ unjustifiedStopGate = new UnjustifiedStopGate({
15118
+ intelligence: sharedIntelligence,
15119
+ selfDeferralGuardEnabled,
15120
+ });
15112
15121
  }
15113
15122
  catch (err) {
15114
15123
  DegradationReporter.getInstance().report({