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.
- package/dashboard/glance.js +1 -0
- package/dashboard/index.html +93 -0
- package/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +99 -1
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +14 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/core/BackupManager.d.ts.map +1 -1
- package/dist/core/BackupManager.js +22 -15
- package/dist/core/BackupManager.js.map +1 -1
- package/dist/core/InitiativeTracker.d.ts +7 -0
- package/dist/core/InitiativeTracker.d.ts.map +1 -1
- package/dist/core/InitiativeTracker.js +17 -0
- package/dist/core/InitiativeTracker.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +8 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/WriteDomainRegistry.d.ts.map +1 -1
- package/dist/core/WriteDomainRegistry.js +12 -0
- package/dist/core/WriteDomainRegistry.js.map +1 -1
- package/dist/core/canonicalPipelineRegistry.d.ts +73 -0
- package/dist/core/canonicalPipelineRegistry.d.ts.map +1 -0
- package/dist/core/canonicalPipelineRegistry.js +56 -0
- package/dist/core/canonicalPipelineRegistry.js.map +1 -0
- package/dist/core/canonicalPipelineRuntimeEvidence.d.ts +13 -0
- package/dist/core/canonicalPipelineRuntimeEvidence.d.ts.map +1 -0
- package/dist/core/canonicalPipelineRuntimeEvidence.js +15 -0
- package/dist/core/canonicalPipelineRuntimeEvidence.js.map +1 -0
- package/dist/core/componentCategories.d.ts.map +1 -1
- package/dist/core/componentCategories.js +1 -0
- package/dist/core/componentCategories.js.map +1 -1
- package/dist/core/devGatedFeatures.d.ts.map +1 -1
- package/dist/core/devGatedFeatures.js +24 -0
- package/dist/core/devGatedFeatures.js.map +1 -1
- package/dist/core/types.d.ts +24 -1
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/version-skew.d.ts +1 -1
- package/dist/core/version-skew.d.ts.map +1 -1
- package/dist/data/llmBenchCoverage.d.ts.map +1 -1
- package/dist/data/llmBenchCoverage.js +6 -0
- package/dist/data/llmBenchCoverage.js.map +1 -1
- package/dist/data/provenanceCoverage.d.ts +2 -0
- package/dist/data/provenanceCoverage.d.ts.map +1 -1
- package/dist/data/provenanceCoverage.js +10 -0
- package/dist/data/provenanceCoverage.js.map +1 -1
- package/dist/feedback-factory/drain/FeedbackConsumerPromotionStore.d.ts +18 -0
- package/dist/feedback-factory/drain/FeedbackConsumerPromotionStore.d.ts.map +1 -0
- package/dist/feedback-factory/drain/FeedbackConsumerPromotionStore.js +51 -0
- package/dist/feedback-factory/drain/FeedbackConsumerPromotionStore.js.map +1 -0
- package/dist/feedback-factory/drain/FeedbackDrainBackupCadence.d.ts +20 -0
- package/dist/feedback-factory/drain/FeedbackDrainBackupCadence.d.ts.map +1 -0
- package/dist/feedback-factory/drain/FeedbackDrainBackupCadence.js +28 -0
- package/dist/feedback-factory/drain/FeedbackDrainBackupCadence.js.map +1 -0
- package/dist/feedback-factory/drain/FeedbackDrainPosture.d.ts +14 -0
- package/dist/feedback-factory/drain/FeedbackDrainPosture.d.ts.map +1 -0
- package/dist/feedback-factory/drain/FeedbackDrainPosture.js +15 -0
- package/dist/feedback-factory/drain/FeedbackDrainPosture.js.map +1 -0
- package/dist/feedback-factory/drain/FeedbackDrainService.d.ts +121 -0
- package/dist/feedback-factory/drain/FeedbackDrainService.d.ts.map +1 -0
- package/dist/feedback-factory/drain/FeedbackDrainService.js +370 -0
- package/dist/feedback-factory/drain/FeedbackDrainService.js.map +1 -0
- package/dist/feedback-factory/drain/FeedbackDrainStore.d.ts +369 -0
- package/dist/feedback-factory/drain/FeedbackDrainStore.d.ts.map +1 -0
- package/dist/feedback-factory/drain/FeedbackDrainStore.js +1125 -0
- package/dist/feedback-factory/drain/FeedbackDrainStore.js.map +1 -0
- package/dist/feedback-factory/drain/FeedbackDrainTickProxy.d.ts +67 -0
- package/dist/feedback-factory/drain/FeedbackDrainTickProxy.d.ts.map +1 -0
- package/dist/feedback-factory/drain/FeedbackDrainTickProxy.js +151 -0
- package/dist/feedback-factory/drain/FeedbackDrainTickProxy.js.map +1 -0
- package/dist/feedback-factory/drain/FeedbackFactoryGeneratedDefaults.d.ts +32 -0
- package/dist/feedback-factory/drain/FeedbackFactoryGeneratedDefaults.d.ts.map +1 -0
- package/dist/feedback-factory/drain/FeedbackFactoryGeneratedDefaults.js +47 -0
- package/dist/feedback-factory/drain/FeedbackFactoryGeneratedDefaults.js.map +1 -0
- package/dist/feedback-factory/drain/FeedbackInitiativeConsumer.d.ts +33 -0
- package/dist/feedback-factory/drain/FeedbackInitiativeConsumer.d.ts.map +1 -0
- package/dist/feedback-factory/drain/FeedbackInitiativeConsumer.js +71 -0
- package/dist/feedback-factory/drain/FeedbackInitiativeConsumer.js.map +1 -0
- package/dist/feedback-factory/drain/FeedbackReadinessArbiter.d.ts +36 -0
- package/dist/feedback-factory/drain/FeedbackReadinessArbiter.d.ts.map +1 -0
- package/dist/feedback-factory/drain/FeedbackReadinessArbiter.js +153 -0
- package/dist/feedback-factory/drain/FeedbackReadinessArbiter.js.map +1 -0
- package/dist/feedback-factory/drain/index.d.ts +2 -0
- package/dist/feedback-factory/drain/index.d.ts.map +1 -0
- package/dist/feedback-factory/drain/index.js +2 -0
- package/dist/feedback-factory/drain/index.js.map +1 -0
- package/dist/feedback-factory/processing/FeedbackProcessingService.d.ts +14 -0
- package/dist/feedback-factory/processing/FeedbackProcessingService.d.ts.map +1 -1
- package/dist/feedback-factory/processing/FeedbackProcessingService.js +25 -4
- package/dist/feedback-factory/processing/FeedbackProcessingService.js.map +1 -1
- package/dist/feedback-factory/store/FeedbackSourceGenerations.d.ts +39 -0
- package/dist/feedback-factory/store/FeedbackSourceGenerations.d.ts.map +1 -0
- package/dist/feedback-factory/store/FeedbackSourceGenerations.js +288 -0
- package/dist/feedback-factory/store/FeedbackSourceGenerations.js.map +1 -0
- package/dist/feedback-factory/store/JsonlFeedbackStore.d.ts +26 -6
- package/dist/feedback-factory/store/JsonlFeedbackStore.d.ts.map +1 -1
- package/dist/feedback-factory/store/JsonlFeedbackStore.js +139 -25
- package/dist/feedback-factory/store/JsonlFeedbackStore.js.map +1 -1
- package/dist/monitoring/AutonomousThroughputFloor.d.ts +118 -0
- package/dist/monitoring/AutonomousThroughputFloor.d.ts.map +1 -0
- package/dist/monitoring/AutonomousThroughputFloor.js +147 -0
- package/dist/monitoring/AutonomousThroughputFloor.js.map +1 -0
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +4 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/AgentServer.d.ts +4 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +193 -1
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/routes.d.ts +33 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +288 -0
- package/dist/server/routes.js.map +1 -1
- package/package.json +5 -2
- package/scripts/lint-canonical-pipeline-completeness.mjs +265 -0
- package/src/data/builtin-manifest.json +65 -65
- package/src/data/llmBenchCoverage.ts +6 -0
- package/src/data/provenanceCoverage.ts +12 -0
- package/src/data/state-coherence-registry.json +18 -0
- package/src/scaffold/templates/jobs/instar/feedback-factory-process.md +13 -12
- package/src/scaffold/templates.ts +4 -0
- package/upgrades/1.3.890.md +19 -0
- package/upgrades/1.3.891.md +30 -0
- package/upgrades/side-effects/autonomous-throughput-floor.md +36 -0
- package/upgrades/side-effects/feedback-factory-operating-drain.md +110 -0
package/dashboard/glance.js
CHANGED
|
@@ -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 = [
|
package/dashboard/index.html
CHANGED
|
@@ -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,
|
|
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"}
|
package/dist/commands/server.js
CHANGED
|
@@ -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)
|