instar 1.3.890 → 1.3.892

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 (71) hide show
  1. package/dashboard/index.html +35 -2
  2. package/dashboard/preferences-learning.js +2 -2
  3. package/dist/commands/server.d.ts.map +1 -1
  4. package/dist/commands/server.js +100 -2
  5. package/dist/commands/server.js.map +1 -1
  6. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  7. package/dist/config/ConfigDefaults.js +12 -1
  8. package/dist/config/ConfigDefaults.js.map +1 -1
  9. package/dist/core/BackupManager.d.ts.map +1 -1
  10. package/dist/core/BackupManager.js +1 -5
  11. package/dist/core/BackupManager.js.map +1 -1
  12. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  13. package/dist/core/PostUpdateMigrator.js +33 -7
  14. package/dist/core/PostUpdateMigrator.js.map +1 -1
  15. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  16. package/dist/core/devGatedFeatures.js +8 -2
  17. package/dist/core/devGatedFeatures.js.map +1 -1
  18. package/dist/core/types.d.ts +13 -0
  19. package/dist/core/types.d.ts.map +1 -1
  20. package/dist/core/types.js.map +1 -1
  21. package/dist/monitoring/AutonomousThroughputFloor.d.ts +118 -0
  22. package/dist/monitoring/AutonomousThroughputFloor.d.ts.map +1 -0
  23. package/dist/monitoring/AutonomousThroughputFloor.js +147 -0
  24. package/dist/monitoring/AutonomousThroughputFloor.js.map +1 -0
  25. package/dist/monitoring/ClaimClauseArbiter.d.ts +11 -2
  26. package/dist/monitoring/ClaimClauseArbiter.d.ts.map +1 -1
  27. package/dist/monitoring/ClaimClauseArbiter.js +55 -9
  28. package/dist/monitoring/ClaimClauseArbiter.js.map +1 -1
  29. package/dist/monitoring/ClaimObservation.d.ts +181 -0
  30. package/dist/monitoring/ClaimObservation.d.ts.map +1 -0
  31. package/dist/monitoring/ClaimObservation.js +575 -0
  32. package/dist/monitoring/ClaimObservation.js.map +1 -0
  33. package/dist/monitoring/ClaimObservationAdmissionQueue.d.ts +38 -0
  34. package/dist/monitoring/ClaimObservationAdmissionQueue.d.ts.map +1 -0
  35. package/dist/monitoring/ClaimObservationAdmissionQueue.js +90 -0
  36. package/dist/monitoring/ClaimObservationAdmissionQueue.js.map +1 -0
  37. package/dist/monitoring/CompletionClaimVerifier.d.ts +45 -4
  38. package/dist/monitoring/CompletionClaimVerifier.d.ts.map +1 -1
  39. package/dist/monitoring/CompletionClaimVerifier.js +74 -29
  40. package/dist/monitoring/CompletionClaimVerifier.js.map +1 -1
  41. package/dist/monitoring/LlmQueue.d.ts +31 -0
  42. package/dist/monitoring/LlmQueue.d.ts.map +1 -1
  43. package/dist/monitoring/LlmQueue.js +41 -0
  44. package/dist/monitoring/LlmQueue.js.map +1 -1
  45. package/dist/monitoring/TurnEvidence.d.ts.map +1 -1
  46. package/dist/monitoring/TurnEvidence.js +12 -4
  47. package/dist/monitoring/TurnEvidence.js.map +1 -1
  48. package/dist/scaffold/templates.d.ts.map +1 -1
  49. package/dist/scaffold/templates.js +5 -1
  50. package/dist/scaffold/templates.js.map +1 -1
  51. package/dist/server/AgentServer.d.ts +3 -0
  52. package/dist/server/AgentServer.d.ts.map +1 -1
  53. package/dist/server/AgentServer.js +83 -2
  54. package/dist/server/AgentServer.js.map +1 -1
  55. package/dist/server/CapabilityIndex.js +1 -1
  56. package/dist/server/CapabilityIndex.js.map +1 -1
  57. package/dist/server/fileRoutes.d.ts.map +1 -1
  58. package/dist/server/fileRoutes.js +2 -0
  59. package/dist/server/fileRoutes.js.map +1 -1
  60. package/dist/server/routes.d.ts +2 -0
  61. package/dist/server/routes.d.ts.map +1 -1
  62. package/dist/server/routes.js +93 -21
  63. package/dist/server/routes.js.map +1 -1
  64. package/package.json +1 -1
  65. package/src/data/builtin-manifest.json +65 -65
  66. package/src/data/state-coherence-registry.json +18 -0
  67. package/src/scaffold/templates.ts +5 -1
  68. package/upgrades/1.3.891.md +30 -0
  69. package/upgrades/1.3.892.md +20 -0
  70. package/upgrades/side-effects/autonomous-throughput-floor.md +36 -0
  71. package/upgrades/side-effects/claim-verification-sentinel.md +93 -0
@@ -3762,8 +3762,8 @@
3762
3762
  <div id="plClassReviews"></div>
3763
3763
  </section>
3764
3764
  <section class="ph-section">
3765
- <h3 class="ph-h">Verify-before-done observations</h3>
3766
- <p class="ph-h-sub">Advisory evidence checks from recent completion claims. This never blocks a response.</p>
3765
+ <h3 class="ph-h">Claim Verification observations</h3>
3766
+ <p class="ph-h-sub">Server-admitted only, privacy-scrubbed factual claim checks. This dark observer never blocks or changes a response.</p>
3767
3767
  <div id="plCompletionAudit"></div>
3768
3768
  </section>
3769
3769
  </div>
@@ -3779,6 +3779,11 @@
3779
3779
  headline + tiles + drill-down here. Rebuilt from the old insider "guards" line.
3780
3780
  Nickname editing (issue #1429) lives one drill down, commits on Enter/blur. -->
3781
3781
  <div id="machinesGlance" class="glance-root"></div>
3782
+ <section aria-labelledby="throughputFloorTitle" style="border:1px solid var(--border);border-radius:10px;padding:16px">
3783
+ <h3 id="throughputFloorTitle" style="margin:0 0 8px">Autonomous throughput observations</h3>
3784
+ <p style="margin:0 0 10px;color:var(--text-dim)">Pull-only evidence of project PR movement and manager communication. This view never notifies or changes a run.</p>
3785
+ <div id="throughputFloorStatus" class="glance-empty" aria-live="polite">Loading observations…</div>
3786
+ </section>
3782
3787
  </div>
3783
3788
 
3784
3789
  <div id="evidenceTab" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
@@ -5536,6 +5541,7 @@
5536
5541
  return;
5537
5542
  }
5538
5543
  if (stamp) stamp.textContent = new Date().toLocaleTimeString();
5544
+ await loadThroughputFloor();
5539
5545
 
5540
5546
  if (!pool.enabled) {
5541
5547
  glanceRoot.textContent = '';
@@ -5558,6 +5564,33 @@
5558
5564
  glance.renderGlance(document, glanceRoot, spec);
5559
5565
  }
5560
5566
 
5567
+ async function loadThroughputFloor() {
5568
+ const root = document.getElementById('throughputFloorStatus');
5569
+ if (!root) return;
5570
+ root.textContent = '';
5571
+ let status;
5572
+ try { status = await apiFetch('/autonomous/throughput-floor'); }
5573
+ catch {
5574
+ root.textContent = 'Observation is not enabled on this agent.';
5575
+ return;
5576
+ }
5577
+ const rows = Array.isArray(status.runs) ? status.runs : [];
5578
+ if (rows.length === 0) { root.textContent = 'No eligible autonomous runs are currently observed.'; return; }
5579
+ const list = document.createElement('div');
5580
+ list.style.display = 'grid';
5581
+ list.style.gap = '8px';
5582
+ for (const row of rows) {
5583
+ const item = document.createElement('div');
5584
+ item.style.padding = '8px 10px';
5585
+ item.style.border = '1px solid var(--border)';
5586
+ item.style.borderRadius = '8px';
5587
+ const minutes = Math.floor(Math.min(Number(row.outputFlatForMs || 0), Number(row.managerSilentForMs || 0)) / 60000);
5588
+ item.textContent = 'Topic ' + String(row.topicId) + ': ' + String(row.decision || 'unknown') + (row.decision === 'flatline-observed' ? ' — both signals unchanged for at least ' + minutes + 'm' : '');
5589
+ list.appendChild(item);
5590
+ }
5591
+ root.appendChild(list);
5592
+ }
5593
+
5561
5594
  // ── Tokens Tab ──────────────────────────────────────────────────
5562
5595
  function fmtTokens(n) {
5563
5596
  if (n == null) return '0';
@@ -255,9 +255,9 @@ export function renderClassReviews(doc, target, body) {
255
255
  export function renderCompletionAudit(doc, target, body) {
256
256
  if (!target) return;
257
257
  target.replaceChildren();
258
- if (body && body.disabled) { target.appendChild(el(doc, 'p', 'ph-empty', 'Verify-before-done is still dark on this agent.')); return; }
258
+ if (body && body.disabled) { target.appendChild(el(doc, 'p', 'ph-empty', 'Claim Verification is still dark on this agent.')); return; }
259
259
  const records = body && Array.isArray(body.records) ? body.records.slice(-20).reverse() : [];
260
- if (!records.length) { target.appendChild(el(doc, 'p', 'ph-empty', 'No completion observations yet.')); return; }
260
+ if (!records.length) { target.appendChild(el(doc, 'p', 'ph-empty', 'No server-admitted claim observations yet.')); return; }
261
261
  for (const record of records) {
262
262
  const item = doc.createElement('details');
263
263
  item.setAttribute('class', 'ph-item');
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA2EH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAU3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AA0BjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA8H7D,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;AA8pDD;;;;;;;;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,CAwtBN;AAgmBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAgxoBtE;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;AA2EH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAU3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AA0BjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA8H7D,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;AA8pDD;;;;;;;;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,CAwtBN;AAgmBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAw1oBtE;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"}
@@ -60,7 +60,7 @@ import { TopicProfileOrchestrator, resolvedToApplied, } from '../core/TopicProfi
60
60
  import { CodexResumeMap } from '../core/CodexResumeMap.js';
61
61
  import { paneIdleWithEmptyInput } from '../core/ModelSwapService.js';
62
62
  import { escalatedModelIds, normalizeTierEscalationConfig } from '../core/ModelTierEscalation.js';
63
- import { activeAutonomousJobs, autonomousRunRemainingForTopic, listAutonomousJobs, stopAutonomousTopic } from '../core/AutonomousSessions.js';
63
+ import { activeAutonomousJobs, autonomousRunRemainingForTopic, listAutonomousJobs, readAutonomousRunMarkers, stopAutonomousTopic } from '../core/AutonomousSessions.js';
64
64
  import { AGE_LIMIT_ACTIVE_RUN_REASON, COMMITMENT_ACTIVE_RUN_REASON } from '../core/WorkEvidence.js';
65
65
  import { gapBEligibleForTopic, recentUserMessageFromHistory, recentUserMessageAtFromHistory, resolveGapBInjectionGate, decideGapBInjection } from '../core/gapBCommitmentEvidence.js';
66
66
  import { TopicProfileTransferCarrier, createTopicProfilePullHandler } from '../core/TopicProfileTransferCarrier.js';
@@ -8477,6 +8477,7 @@ export async function startServer(options) {
8477
8477
  router: () => threadlineRouterForResume,
8478
8478
  });
8479
8479
  let autonomousLivenessReconciler = null;
8480
+ let autonomousThroughputFloor = null;
8480
8481
  let enforcedTerminationWatchdog = null;
8481
8482
  let prHandLease = null;
8482
8483
  // GAP-B Part A surface (spec: autonomous-registration-guarantee.md) — the
@@ -22592,7 +22593,104 @@ export async function startServer(options) {
22592
22593
  else {
22593
22594
  console.log(pc.dim(' Write-admission: dark (multiMachine.writeAdmission resolves off on this agent)'));
22594
22595
  }
22595
- const server = new AgentServer({ config, sessionManager, state, scheduler, telegram, relationships, feedback, feedbackAnomalyDetector, dispatches, updateChecker, autoUpdater, autoDispatcher, quotaTracker, quotaManager, publisher, viewer, tunnel, evolution, watchdog, topicMemory, triageNurse, projectMapper, cartographer: cartographer ?? undefined, coherenceGate: scopeVerifier, contextHierarchy, canonicalState, operationGate, sentinel, adaptiveTrust, memoryMonitor, orphanReaper, coherenceMonitor, commitmentTracker, subscriptionPool, accountFollowMePeerViews: async () => { const nickById = new Map((_listPoolMachines?.() ?? []).map((m) => [m.machineId, m.nickname ?? m.machineId])); let peers = (_resolvePeerUrls?.() ?? []).map((p) => ({ machineId: p.machineId, nickname: nickById.get(p.machineId) ?? p.machineId, url: p.url })); if (peers.length === 0) {
22596
+ // PULL/AUDIT-ONLY: deliberately no notification, governor, A2A, or remediation seam.
22597
+ try {
22598
+ const tfCfg = config.monitoring?.throughputFloor ?? {};
22599
+ if (resolveDevAgentGate(tfCfg.enabled, config)) {
22600
+ const { AutonomousThroughputFloor, hasMeaningfulDeliverableDelta } = await import('../monitoring/AutonomousThroughputFloor.js');
22601
+ const statePath = (id) => path.join(config.stateDir, 'autonomous', `${createHash('sha256').update(id).digest('hex').slice(0, 20)}.throughput-floor.local.json`);
22602
+ const loadTf = (id) => {
22603
+ try {
22604
+ const file = statePath(id);
22605
+ const stat = fs.lstatSync(file);
22606
+ if (stat.isSymbolicLink() || !stat.isFile() || stat.size > 128 * 1024)
22607
+ return { corrupt: true };
22608
+ const parsed = JSON.parse(fs.readFileSync(file, 'utf8'));
22609
+ return validTfState(parsed) ? parsed : { corrupt: true };
22610
+ }
22611
+ catch (error) {
22612
+ return error.code === 'ENOENT' ? null : { corrupt: true };
22613
+ }
22614
+ };
22615
+ const validTfState = (row) => row?.version === 1 && typeof row.signalRunId === 'string' && row.signalRunId.length <= 512
22616
+ && Number.isFinite(row.lastDeliverableDeltaAt) && Number.isFinite(row.lastManagerOutboundAt)
22617
+ && Number.isSafeInteger(row.consecutiveSweepFailures) && row.consecutiveSweepFailures >= 0 && row.consecutiveSweepFailures <= 1_000
22618
+ && Number.isFinite(row.nextSweepAt)
22619
+ && (!row.lastSnapshot || (Array.isArray(row.lastSnapshot.merged) && row.lastSnapshot.merged.length <= 64 && Array.isArray(row.lastSnapshot.open) && row.lastSnapshot.open.length <= 64 && typeof row.lastSnapshot.digest === 'string' && row.lastSnapshot.digest.length <= 128));
22620
+ const saveTf = (id, value) => { const file = statePath(id); fs.mkdirSync(path.dirname(file), { recursive: true, mode: 0o700 }); if (fs.existsSync(file) && fs.lstatSync(file).isSymbolicLink())
22621
+ throw new Error('throughput-floor-state-symlink-refused'); const tmp = `${file}.${process.pid}.tmp`; fs.writeFileSync(tmp, `${JSON.stringify(value)}\n`, { mode: 0o600 }); const fd = fs.openSync(tmp, 'r'); try {
22622
+ fs.fsyncSync(fd);
22623
+ }
22624
+ finally {
22625
+ fs.closeSync(fd);
22626
+ } fs.renameSync(tmp, file); };
22627
+ const snapshot = async (previous) => {
22628
+ const started = Date.now();
22629
+ const run = async (file, args) => {
22630
+ const remaining = 10_000 - (Date.now() - started);
22631
+ if (remaining <= 0)
22632
+ throw new Error('throughput-sweep-timed-out');
22633
+ const result = await execFileAsync(file, args, { encoding: 'utf8', timeout: remaining, maxBuffer: 512 * 1024 });
22634
+ return String(result.stdout).trim();
22635
+ };
22636
+ const origin = await run('git', ['-C', config.projectDir, 'remote', 'get-url', 'origin']);
22637
+ const match = origin.match(/github\.com[/:]([^/]+)\/([^/.]+)(?:\.git)?$/i);
22638
+ if (!match)
22639
+ throw new Error('invalid-scope');
22640
+ const repo = `${match[1]}/${match[2]}`;
22641
+ const [openJson, mergedJson] = await Promise.all([
22642
+ run('gh', ['pr', 'list', '--repo', repo, '--state', 'open', '--limit', '32', '--json', 'number,headRefOid']),
22643
+ run('gh', ['pr', 'list', '--repo', repo, '--state', 'merged', '--limit', '32', '--json', 'number,mergeCommit']),
22644
+ ]);
22645
+ const openRows = JSON.parse(openJson);
22646
+ const mergedRows = JSON.parse(mergedJson);
22647
+ const merged = mergedRows.filter(r => r.mergeCommit?.oid).map(r => ({ number: r.number, mergeCommitSha: r.mergeCommit.oid })).sort((a, b) => a.number - b.number);
22648
+ const prior = new Map((previous?.open ?? []).map(row => [row.number, row]));
22649
+ const open = [];
22650
+ for (let offset = 0; offset < openRows.length; offset += 4) {
22651
+ const batch = openRows.slice(offset, offset + 4);
22652
+ open.push(...await Promise.all(batch.map(async (r) => {
22653
+ const old = prior.get(r.number);
22654
+ const requests = [run('gh', ['api', `repos/${repo}/git/commits/${r.headRefOid}`, '--jq', '.tree.sha'])];
22655
+ if (old && old.headSha !== r.headRefOid)
22656
+ requests.push(run('gh', ['api', `repos/${repo}/compare/${old.headSha}...${r.headRefOid}`, '--jq', '.status']));
22657
+ const [treeSha, compare] = await Promise.all(requests);
22658
+ return { number: r.number, headSha: r.headRefOid, treeSha, descendsPrevious: compare === 'ahead' || compare === 'identical' };
22659
+ })));
22660
+ }
22661
+ open.sort((a, b) => a.number - b.number);
22662
+ return { merged, open, digest: createHash('sha256').update(JSON.stringify({ merged, open })).digest('hex') };
22663
+ };
22664
+ autonomousThroughputFloor = new AutonomousThroughputFloor({
22665
+ listRuns: () => activeAutonomousJobs(config.stateDir).flatMap(job => { const topicId = Number(job.topic); const startedAt = Date.parse(job.startedAt ?? ''); if (!Number.isSafeInteger(topicId) || topicId <= 0 || !Number.isFinite(startedAt))
22666
+ return []; const markers = readAutonomousRunMarkers(config.stateDir, topicId); return [{ signalRunId: `topic:${topicId}:${job.startedAt}`, topicId, startedAt, telegramBacked: Boolean(telegram), registeredMachineCount: _listPoolMachines?.().length || 1, midMove: !markers || Boolean(markers.movedTo || markers.moveSuspended) }]; }),
22667
+ sweep: async (_run, previous) => { try {
22668
+ const next = await snapshot(previous);
22669
+ return { status: 'ok', snapshot: next, meaningfulDelta: previous ? hasMeaningfulDeliverableDelta(previous, next) : false };
22670
+ }
22671
+ catch (error) {
22672
+ const msg = error instanceof Error ? error.message : '';
22673
+ return { status: 'unknown', failure: /invalid-scope/.test(msg) ? 'invalid-scope' : /timed out|ETIMEDOUT/.test(msg) ? 'timeout' : 'github-read' };
22674
+ } },
22675
+ observeOutbound: (run, cursor) => { const rows = telegram?.getTopicHistory(run.topicId, 100) ?? []; const newest = [...rows].reverse().find(row => !row.fromUser); const covered = rows.length < 100 || rows.some(row => Date.parse(row.timestamp) <= run.startedAt || row.timestamp === cursor); return { coverage: covered ? 'proven' : 'unknown', newestOutboundAt: newest ? Date.parse(newest.timestamp) : undefined, cursor: rows.at(-1)?.timestamp }; },
22676
+ loadState: loadTf,
22677
+ saveState: saveTf,
22678
+ audit: (row) => { try {
22679
+ const p = path.join(config.stateDir, 'logs', 'autonomous-throughput-floor.jsonl');
22680
+ fs.mkdirSync(path.dirname(p), { recursive: true }); /* state-registry: audit-autonomous-throughput-floor */
22681
+ fs.appendFileSync(p, `${JSON.stringify(row)}\n`);
22682
+ }
22683
+ catch { /* @silent-fallback-ok: in-memory ring remains */ } },
22684
+ }, { ...tfCfg, enabled: true });
22685
+ autonomousThroughputFloor.start();
22686
+ globalThis.__instarAutonomousThroughputFloor = autonomousThroughputFloor;
22687
+ guardRegistry.register('monitoring.throughputFloor.enabled', () => autonomousThroughputFloor.guardStatus());
22688
+ }
22689
+ }
22690
+ catch (err) { /* @silent-fallback-ok: fleet-dark optional observer; failure is logged and adds no authority */
22691
+ console.warn('[AutonomousThroughputFloor] init failed:', err.message);
22692
+ }
22693
+ const server = new AgentServer({ config, sessionManager, llmQueue: sharedLlmQueue, state, scheduler, telegram, relationships, feedback, feedbackAnomalyDetector, dispatches, updateChecker, autoUpdater, autoDispatcher, quotaTracker, quotaManager, publisher, viewer, tunnel, evolution, watchdog, topicMemory, triageNurse, projectMapper, cartographer: cartographer ?? undefined, coherenceGate: scopeVerifier, contextHierarchy, canonicalState, operationGate, sentinel, adaptiveTrust, memoryMonitor, orphanReaper, coherenceMonitor, commitmentTracker, subscriptionPool, accountFollowMePeerViews: async () => { const nickById = new Map((_listPoolMachines?.() ?? []).map((m) => [m.machineId, m.nickname ?? m.machineId])); let peers = (_resolvePeerUrls?.() ?? []).map((p) => ({ machineId: p.machineId, nickname: nickById.get(p.machineId) ?? p.machineId, url: p.url })); if (peers.length === 0) {
22596
22694
  peers = (_listPoolMachines?.() ?? []).filter((m) => m.machineId !== _meshSelfId && !!m.lastKnownUrl).map((m) => ({ machineId: m.machineId, nickname: m.nickname ?? m.machineId, url: m.lastKnownUrl }));
22597
22695
  } if (peers.length === 0)
22598
22696
  return []; const { fetchPeerSubscriptionViews } = await import('../core/fetchPeerSubscriptionViews.js'); return fetchPeerSubscriptionViews({ peers: () => peers, fetchImpl: fetch, authToken: config.authToken ?? '' }); }, quotaPoller, quotaAwareScheduler: _quotaAwareScheduler ?? undefined, proactiveSwapMonitor: _proactiveSwapMonitor ?? undefined, inUseAccountResolver, enrollmentWizard, accountFollowMeRevocation, credentialRepointing, semanticMemory, activitySentinel, rateLimitSentinel, releaseReadinessSentinel: releaseReadinessSentinel ?? undefined, greenPrAutoMerger: greenPrAutoMerger ?? undefined, guardLatchStore: guardLatchStore ?? undefined, messageRouter, summarySentinel, spawnManager, systemReviewer, capabilityMapper, selfKnowledgeTree, coverageAuditor, topicResumeMap: _topicResumeMap ?? undefined, topicProfile: _topicProfileCtx ?? undefined, sessionRefresh: _sessionRefresh ?? undefined, autonomyManager, trustElevationTracker, autonomousEvolution, coordinator: coordinator.enabled ? coordinator : undefined, meshBindActive: coordinator.managers.identityManager.hasIdentity() && config.multiMachine?.meshTransport?.enabled !== false, localSigningKeyPem, leaseTransport, peerEndpointRecorder, getSelfMeshEndpoints, onLeasePullRequest: () => leaseCoordinatorRef?.currentLease() ?? null, liveTailReceiver, handoffWireTransport, onHandoffBegin, onHandoffInitiate: handoffInitiate, handoffInProgress: handoffSentinelInProgress, messageLedger, currentInboundByTopic, replyMarkerTransport, onReplyMarker: messageLedger ? (marker) => { const m = marker; messageLedger.applyRemoteReplyMarker(m.dedupeKey, { platform: m.platform, replyIdempotencyKey: m.replyIdempotencyKey, epoch: m.epoch, topic: m.topic ?? null }); } : undefined, whatsapp: whatsappAdapter, slack: slackAdapter, imessage: imessageAdapter, conversationRegistry, conversationBindAuth, conversationFollowThrough, whatsappBusinessBackend, messageBridge, hookEventReceiver, worktreeMonitor, subagentTracker, instructionsVerifier, handshakeManager: threadlineHandshake, threadlineRouter, conversationStore, threadLog, threadMessageRecorder, warrantsReplyGate, collaborationSurfacer, threadResumeMap, topicLinkageHandler: topicLinkageHandler ?? undefined, threadlineRelayClient, threadlineReplyWaiters, listenerManager: listenerManager ?? undefined, a2aDeliveryTracker: a2aDeliveryTracker ?? undefined, responseReviewGate, reviewCanaryBattery, messagingToneGate, outboundDedupGate, telemetryHeartbeat, pasteManager, featureRegistry, discoveryEvaluator, completionEvaluator, unifiedTrust, liveConfig, sharedStateLedger, ledgerSessionRegistry, worktreeManager, oidcEnrolledRepos: parallelDevConfig?.oidcEnrolledRepos, initiativeTracker, projectRoundRunner, projectDriftChecker, machineHeartbeat, machinePoolRegistry, ropeHealthMonitor, writeAdmission: writeAdmission ?? undefined, getInboundQueue: () => _inboundQueue, getMachineCoherence: () => _machineCoherenceSentinel, meshRpcDispatcher, deliverA2aToMachine: _deliverA2aToMachine ?? undefined, workingSetPullCoordinator, workingSetArtifactManager, orchestratorPoller, commitmentReplicaStore, preferenceReplicaStore, replicatedRecordEmitter, conflictStore, rollbackUnmerge, droppedOriginRegistry, preferencesUnionReader, forwardCommitmentMutate, sessionOwnershipRegistry, sendDrain: _sendDrain ?? undefined, topicPinStore: _topicPinStore ?? undefined, topicPinSkewQuarantine: _topicPinSkewQuarantine ?? undefined, topicPinFoldView: _topicPinFoldView ?? undefined, ownershipReconciler: _ownershipReconciler ?? undefined, staleOwnerEngine: _staleOwnerEngine ?? undefined, duplicateReconciler: _duplicateReconciler ?? undefined, ownerDarkLadder: _ownerDarkLadder ?? undefined, spawnAdmission: _spawnAdmission ?? undefined, judgmentProvenance: _judgmentProvenance ?? undefined, leaseHandback: _leaseHandbackCtx ?? undefined, streamTicketStore: _streamTicketStore ?? undefined, poolStreamAllowRemoteInput: config.dashboard?.poolStream?.allowRemoteInput ?? false, poolStreamConnector: _poolStreamConnector ?? undefined, secretSync: _secretSyncHandle ?? undefined, meshSelfId: _meshSelfId ?? undefined, resolveRouterUrl: _resolveRouterUrl ?? undefined, resolvePeerUrls: _resolvePeerUrls ?? undefined, guardRegistry, listPoolMachines: _listPoolMachines ?? undefined, deliverMandateToMachine: _deliverMandateToMachine ?? undefined, poolLink: _poolLink ?? undefined, poolPollCache: _poolPollCache ?? undefined, sessionPoolE2EResultStore, proxyCoordinator, topicIntentStore, topicIntentArcCheck, usherSignalStore, intelligence: sharedIntelligence ?? undefined, telegramBridgeConfig, telegramBridge: telegramBridge ?? undefined, threadlineObservability, briefDeps, workingMemory, taskFlowRegistry, threadlineFlowBridge, sessionReaper, agentWorktreeReaper, externalHogSentinel, orphanedWorkSentinel, mcpProcessReaper, geminiLoopRunner, sleepController, agentActivityState, reapLog, resumeQueue, resumeDrainer, autonomousLivenessReconciler, enforcedTerminationStatus: () => enforcedTerminationWatchdog?.guardStatus() ?? null, prHandLease: prHandLease ?? undefined, operatorStopRecorder: recordOperatorStop, sleepWakeDetector, unjustifiedStopGate, stopGateDb, stopNotifier, liveTestGate, liveTestGateMode, liveTestRunnerCtx }); // Resolve the late-bound topic-operator getter (increment 2e): routing was