instar 1.3.889 → 1.3.891

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 (126) hide show
  1. package/dashboard/glance.js +1 -0
  2. package/dashboard/index.html +93 -0
  3. package/dist/commands/server.d.ts.map +1 -1
  4. package/dist/commands/server.js +99 -1
  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 +14 -0
  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 +22 -15
  11. package/dist/core/BackupManager.js.map +1 -1
  12. package/dist/core/InitiativeTracker.d.ts +7 -0
  13. package/dist/core/InitiativeTracker.d.ts.map +1 -1
  14. package/dist/core/InitiativeTracker.js +17 -0
  15. package/dist/core/InitiativeTracker.js.map +1 -1
  16. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  17. package/dist/core/PostUpdateMigrator.js +8 -0
  18. package/dist/core/PostUpdateMigrator.js.map +1 -1
  19. package/dist/core/WriteDomainRegistry.d.ts.map +1 -1
  20. package/dist/core/WriteDomainRegistry.js +12 -0
  21. package/dist/core/WriteDomainRegistry.js.map +1 -1
  22. package/dist/core/canonicalPipelineRegistry.d.ts +73 -0
  23. package/dist/core/canonicalPipelineRegistry.d.ts.map +1 -0
  24. package/dist/core/canonicalPipelineRegistry.js +56 -0
  25. package/dist/core/canonicalPipelineRegistry.js.map +1 -0
  26. package/dist/core/canonicalPipelineRuntimeEvidence.d.ts +13 -0
  27. package/dist/core/canonicalPipelineRuntimeEvidence.d.ts.map +1 -0
  28. package/dist/core/canonicalPipelineRuntimeEvidence.js +15 -0
  29. package/dist/core/canonicalPipelineRuntimeEvidence.js.map +1 -0
  30. package/dist/core/componentCategories.d.ts.map +1 -1
  31. package/dist/core/componentCategories.js +1 -0
  32. package/dist/core/componentCategories.js.map +1 -1
  33. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  34. package/dist/core/devGatedFeatures.js +24 -0
  35. package/dist/core/devGatedFeatures.js.map +1 -1
  36. package/dist/core/types.d.ts +24 -1
  37. package/dist/core/types.d.ts.map +1 -1
  38. package/dist/core/types.js.map +1 -1
  39. package/dist/core/version-skew.d.ts +1 -1
  40. package/dist/core/version-skew.d.ts.map +1 -1
  41. package/dist/data/llmBenchCoverage.d.ts.map +1 -1
  42. package/dist/data/llmBenchCoverage.js +6 -0
  43. package/dist/data/llmBenchCoverage.js.map +1 -1
  44. package/dist/data/provenanceCoverage.d.ts +2 -0
  45. package/dist/data/provenanceCoverage.d.ts.map +1 -1
  46. package/dist/data/provenanceCoverage.js +10 -0
  47. package/dist/data/provenanceCoverage.js.map +1 -1
  48. package/dist/feedback-factory/drain/FeedbackConsumerPromotionStore.d.ts +18 -0
  49. package/dist/feedback-factory/drain/FeedbackConsumerPromotionStore.d.ts.map +1 -0
  50. package/dist/feedback-factory/drain/FeedbackConsumerPromotionStore.js +51 -0
  51. package/dist/feedback-factory/drain/FeedbackConsumerPromotionStore.js.map +1 -0
  52. package/dist/feedback-factory/drain/FeedbackDrainBackupCadence.d.ts +20 -0
  53. package/dist/feedback-factory/drain/FeedbackDrainBackupCadence.d.ts.map +1 -0
  54. package/dist/feedback-factory/drain/FeedbackDrainBackupCadence.js +28 -0
  55. package/dist/feedback-factory/drain/FeedbackDrainBackupCadence.js.map +1 -0
  56. package/dist/feedback-factory/drain/FeedbackDrainPosture.d.ts +14 -0
  57. package/dist/feedback-factory/drain/FeedbackDrainPosture.d.ts.map +1 -0
  58. package/dist/feedback-factory/drain/FeedbackDrainPosture.js +15 -0
  59. package/dist/feedback-factory/drain/FeedbackDrainPosture.js.map +1 -0
  60. package/dist/feedback-factory/drain/FeedbackDrainService.d.ts +121 -0
  61. package/dist/feedback-factory/drain/FeedbackDrainService.d.ts.map +1 -0
  62. package/dist/feedback-factory/drain/FeedbackDrainService.js +370 -0
  63. package/dist/feedback-factory/drain/FeedbackDrainService.js.map +1 -0
  64. package/dist/feedback-factory/drain/FeedbackDrainStore.d.ts +369 -0
  65. package/dist/feedback-factory/drain/FeedbackDrainStore.d.ts.map +1 -0
  66. package/dist/feedback-factory/drain/FeedbackDrainStore.js +1125 -0
  67. package/dist/feedback-factory/drain/FeedbackDrainStore.js.map +1 -0
  68. package/dist/feedback-factory/drain/FeedbackDrainTickProxy.d.ts +67 -0
  69. package/dist/feedback-factory/drain/FeedbackDrainTickProxy.d.ts.map +1 -0
  70. package/dist/feedback-factory/drain/FeedbackDrainTickProxy.js +151 -0
  71. package/dist/feedback-factory/drain/FeedbackDrainTickProxy.js.map +1 -0
  72. package/dist/feedback-factory/drain/FeedbackFactoryGeneratedDefaults.d.ts +32 -0
  73. package/dist/feedback-factory/drain/FeedbackFactoryGeneratedDefaults.d.ts.map +1 -0
  74. package/dist/feedback-factory/drain/FeedbackFactoryGeneratedDefaults.js +47 -0
  75. package/dist/feedback-factory/drain/FeedbackFactoryGeneratedDefaults.js.map +1 -0
  76. package/dist/feedback-factory/drain/FeedbackInitiativeConsumer.d.ts +33 -0
  77. package/dist/feedback-factory/drain/FeedbackInitiativeConsumer.d.ts.map +1 -0
  78. package/dist/feedback-factory/drain/FeedbackInitiativeConsumer.js +71 -0
  79. package/dist/feedback-factory/drain/FeedbackInitiativeConsumer.js.map +1 -0
  80. package/dist/feedback-factory/drain/FeedbackReadinessArbiter.d.ts +36 -0
  81. package/dist/feedback-factory/drain/FeedbackReadinessArbiter.d.ts.map +1 -0
  82. package/dist/feedback-factory/drain/FeedbackReadinessArbiter.js +153 -0
  83. package/dist/feedback-factory/drain/FeedbackReadinessArbiter.js.map +1 -0
  84. package/dist/feedback-factory/drain/index.d.ts +2 -0
  85. package/dist/feedback-factory/drain/index.d.ts.map +1 -0
  86. package/dist/feedback-factory/drain/index.js +2 -0
  87. package/dist/feedback-factory/drain/index.js.map +1 -0
  88. package/dist/feedback-factory/processing/FeedbackProcessingService.d.ts +14 -0
  89. package/dist/feedback-factory/processing/FeedbackProcessingService.d.ts.map +1 -1
  90. package/dist/feedback-factory/processing/FeedbackProcessingService.js +25 -4
  91. package/dist/feedback-factory/processing/FeedbackProcessingService.js.map +1 -1
  92. package/dist/feedback-factory/store/FeedbackSourceGenerations.d.ts +39 -0
  93. package/dist/feedback-factory/store/FeedbackSourceGenerations.d.ts.map +1 -0
  94. package/dist/feedback-factory/store/FeedbackSourceGenerations.js +288 -0
  95. package/dist/feedback-factory/store/FeedbackSourceGenerations.js.map +1 -0
  96. package/dist/feedback-factory/store/JsonlFeedbackStore.d.ts +26 -6
  97. package/dist/feedback-factory/store/JsonlFeedbackStore.d.ts.map +1 -1
  98. package/dist/feedback-factory/store/JsonlFeedbackStore.js +139 -25
  99. package/dist/feedback-factory/store/JsonlFeedbackStore.js.map +1 -1
  100. package/dist/monitoring/AutonomousThroughputFloor.d.ts +118 -0
  101. package/dist/monitoring/AutonomousThroughputFloor.d.ts.map +1 -0
  102. package/dist/monitoring/AutonomousThroughputFloor.js +147 -0
  103. package/dist/monitoring/AutonomousThroughputFloor.js.map +1 -0
  104. package/dist/scaffold/templates.d.ts.map +1 -1
  105. package/dist/scaffold/templates.js +4 -0
  106. package/dist/scaffold/templates.js.map +1 -1
  107. package/dist/server/AgentServer.d.ts +4 -0
  108. package/dist/server/AgentServer.d.ts.map +1 -1
  109. package/dist/server/AgentServer.js +193 -1
  110. package/dist/server/AgentServer.js.map +1 -1
  111. package/dist/server/routes.d.ts +33 -0
  112. package/dist/server/routes.d.ts.map +1 -1
  113. package/dist/server/routes.js +288 -0
  114. package/dist/server/routes.js.map +1 -1
  115. package/package.json +5 -2
  116. package/scripts/lint-canonical-pipeline-completeness.mjs +265 -0
  117. package/src/data/builtin-manifest.json +65 -65
  118. package/src/data/llmBenchCoverage.ts +6 -0
  119. package/src/data/provenanceCoverage.ts +12 -0
  120. package/src/data/state-coherence-registry.json +18 -0
  121. package/src/scaffold/templates/jobs/instar/feedback-factory-process.md +13 -12
  122. package/src/scaffold/templates.ts +4 -0
  123. package/upgrades/1.3.890.md +19 -0
  124. package/upgrades/1.3.891.md +30 -0
  125. package/upgrades/side-effects/autonomous-throughput-floor.md +36 -0
  126. package/upgrades/side-effects/feedback-factory-operating-drain.md +110 -0
@@ -46,6 +46,7 @@ export const GLANCE_ADOPTED_TABS = [
46
46
  'machines', 'systems', 'spend', 'routing-map', // Phase 3 (the jargon belt); 'systems' is the Health tab
47
47
  // Phase 4 — the sweep: every remaining data-summary view on the floor.
48
48
  'pr-pipeline', 'tokens', 'llm-activity', 'secrets', 'resources', 'initiatives',
49
+ 'feedback-drain', // operated summary reviewed against the F10/F11 floor
49
50
  ];
50
51
 
51
52
  export const GLANCE_GRANDFATHERED = [
@@ -2942,6 +2942,7 @@
2942
2942
  <button class="tab" data-tab="threadline" onclick="switchTab('threadline')">Threadline</button>
2943
2943
  <button class="tab" data-tab="integrated-being" onclick="switchTab('integrated-being')">Integrated-Being</button>
2944
2944
  <button class="tab" data-tab="process-health" onclick="switchTab('process-health')">Process Health</button>
2945
+ <button class="tab" data-tab="feedback-drain" onclick="switchTab('feedback-drain')">Feedback Drain</button>
2945
2946
  <button class="tab" data-tab="preferences-learning" onclick="switchTab('preferences-learning')">Preferences</button>
2946
2947
  </div>
2947
2948
  <div class="tab-group" role="group" aria-label="Content & Access">
@@ -3575,6 +3576,18 @@
3575
3576
  </details>
3576
3577
  </div>
3577
3578
 
3579
+ <div id="feedbackDrainPanel" class="ph-root" style="display:none;flex-direction:column;padding:28px;gap:20px;overflow-y:auto">
3580
+ <div style="display:flex;justify-content:space-between;align-items:baseline">
3581
+ <h2 class="ph-title">Feedback Drain</h2>
3582
+ <div id="fdStamp" class="ph-stamp" aria-live="polite"></div>
3583
+ </div>
3584
+ <p class="ph-intro">The operated path from accepted feedback through agent readiness and durable Initiative handoff.</p>
3585
+ <div id="fdPosture" class="ph-headline-wrap" aria-live="polite"></div>
3586
+ <section class="ph-section"><h3 class="ph-h">Backlog</h3><div id="fdBacklog" class="ph-detail-body"></div></section>
3587
+ <section class="ph-section"><h3 class="ph-h">Progress</h3><div id="fdProgress" class="ph-detail-body"></div></section>
3588
+ <section class="ph-section"><h3 class="ph-h">Source integrity</h3><div id="fdSource" class="ph-detail-body"></div></section>
3589
+ </div>
3590
+
3578
3591
  <!-- subscriptions tab (Subscription & Auth Standard P2.2 — live quota + pending logins) -->
3579
3592
  <style>
3580
3593
  .sub-account { border:1px solid var(--border,#2a2a2a); border-radius:10px; padding:14px 16px; margin-bottom:12px; }
@@ -3766,6 +3779,11 @@
3766
3779
  headline + tiles + drill-down here. Rebuilt from the old insider "guards" line.
3767
3780
  Nickname editing (issue #1429) lives one drill down, commits on Enter/blur. -->
3768
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>
3769
3787
  </div>
3770
3788
 
3771
3789
  <div id="evidenceTab" class="tab-panel" style="display:none;flex-direction:column;padding:20px;gap:16px;overflow-y:auto">
@@ -5280,6 +5298,13 @@
5280
5298
  onActivate: () => { if (typeof startProcessHealth === 'function') startProcessHealth(); },
5281
5299
  onDeactivate: () => { if (typeof stopProcessHealth === 'function') stopProcessHealth(); },
5282
5300
  },
5301
+ {
5302
+ id: 'feedback-drain',
5303
+ panels: ['feedbackDrainPanel'],
5304
+ display: ['flex'],
5305
+ onActivate: () => { if (typeof startFeedbackDrain === 'function') startFeedbackDrain(); },
5306
+ onDeactivate: () => { if (typeof stopFeedbackDrain === 'function') stopFeedbackDrain(); },
5307
+ },
5283
5308
  {
5284
5309
  id: 'subscriptions',
5285
5310
  panels: ['subscriptionsPanel'],
@@ -5516,6 +5541,7 @@
5516
5541
  return;
5517
5542
  }
5518
5543
  if (stamp) stamp.textContent = new Date().toLocaleTimeString();
5544
+ await loadThroughputFloor();
5519
5545
 
5520
5546
  if (!pool.enabled) {
5521
5547
  glanceRoot.textContent = '';
@@ -5538,6 +5564,33 @@
5538
5564
  glance.renderGlance(document, glanceRoot, spec);
5539
5565
  }
5540
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
+
5541
5594
  // ── Tokens Tab ──────────────────────────────────────────────────
5542
5595
  function fmtTokens(n) {
5543
5596
  if (n == null) return '0';
@@ -8839,17 +8892,57 @@
8839
8892
  if (__plController) __plController.stop();
8840
8893
  }
8841
8894
 
8895
+ // Feedback Factory operated-drain read surface. Closed status DTO only;
8896
+ // dynamic values are assigned with textContent and never interpreted as HTML.
8897
+ let __fdTimer = null;
8898
+ const fdText = (id, value) => { const node = document.getElementById(id); if (node) node.textContent = String(value ?? '—'); };
8899
+ async function loadFeedbackDrain() {
8900
+ try {
8901
+ const response = await fetch('/feedback-factory/drain/status', { headers: { 'Authorization': `Bearer ${token}` } });
8902
+ const data = await response.json();
8903
+ const posture = data.posture || { state: 'unavailable', reason: 'initialization-failure' };
8904
+ fdText('fdPosture', `${posture.state}: ${posture.reason}`);
8905
+ if (!response.ok) {
8906
+ fdText('fdBacklog', 'The drain is not accepting work in this posture.');
8907
+ fdText('fdProgress', 'No operated run is active.');
8908
+ fdText('fdSource', 'Source integrity is unavailable until initialization succeeds.');
8909
+ } else {
8910
+ const drain = data.drain || {}; const readiness = drain.readiness || {}; const work = drain.work || {};
8911
+ fdText('fdBacklog', `collecting ${readiness.collecting || 0}; ready ${readiness.ready || 0}; queued ${work.queued || 0}; retryable ${work.retryable || 0}; held ${(readiness.held || 0) + (work.held || 0)}; dead-lettered ${work['dead-lettered'] || 0}`);
8912
+ const run = data.lastRun;
8913
+ fdText('fdProgress', run ? `last run ${run.state}; completed ${work.completed || 0}; oldest queued ${drain.oldestQueuedAgeMs == null ? 'none' : Math.round(drain.oldestQueuedAgeMs / 1000) + 's'}` : 'No drain run has been admitted yet.');
8914
+ fdText('fdSource', `byte lag ${drain.sourceProjectionLagBytes || 0}; generation lag ${drain.sourceGenerationLag || 0}; checksum conflicts ${drain.sourceChecksumConflicts || 0}`);
8915
+ }
8916
+ fdText('fdStamp', `updated ${new Date().toLocaleTimeString()}`);
8917
+ } catch {
8918
+ fdText('fdPosture', 'unavailable: status request failed');
8919
+ fdText('fdStamp', '');
8920
+ }
8921
+ }
8922
+ function startFeedbackDrain() {
8923
+ stopFeedbackDrain();
8924
+ void loadFeedbackDrain();
8925
+ __fdTimer = setInterval(() => { void loadFeedbackDrain(); }, 15000);
8926
+ }
8927
+ function stopFeedbackDrain() {
8928
+ if (__fdTimer) clearInterval(__fdTimer);
8929
+ __fdTimer = null;
8930
+ }
8931
+
8842
8932
  // Handle tab visibility — close SSE when tab is backgrounded
8843
8933
  document.addEventListener('visibilitychange', () => {
8844
8934
  if (document.hidden) {
8845
8935
  disconnectJobsSSE();
8846
8936
  if (currentTab === 'process-health') stopProcessHealth();
8937
+ if (currentTab === 'feedback-drain') stopFeedbackDrain();
8847
8938
  if (currentTab === 'preferences-learning') stopPreferencesLearning();
8848
8939
  } else if (currentTab === 'jobs') {
8849
8940
  connectJobsSSE();
8850
8941
  loadJobs(); // Resync on return
8851
8942
  } else if (currentTab === 'process-health') {
8852
8943
  startProcessHealth(); // resume on return: one immediate refresh + re-arm
8944
+ } else if (currentTab === 'feedback-drain') {
8945
+ startFeedbackDrain();
8853
8946
  } else if (currentTab === 'preferences-learning') {
8854
8947
  startPreferencesLearning(); // resume on return
8855
8948
  }
@@ -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,6 +22593,103 @@ 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
  }
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
+ }
22595
22693
  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
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)