instar 1.3.819 → 1.3.821
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/dist/commands/server.d.ts.map +1 -1
- package/dist/commands/server.js +498 -3
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +69 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/core/BackupManager.d.ts +10 -0
- package/dist/core/BackupManager.d.ts.map +1 -1
- package/dist/core/BackupManager.js +16 -0
- package/dist/core/BackupManager.js.map +1 -1
- package/dist/core/BoundedJsonlAudit.d.ts +37 -0
- package/dist/core/BoundedJsonlAudit.d.ts.map +1 -0
- package/dist/core/BoundedJsonlAudit.js +87 -0
- package/dist/core/BoundedJsonlAudit.js.map +1 -0
- package/dist/core/JudgmentProvenanceLog.d.ts +144 -0
- package/dist/core/JudgmentProvenanceLog.d.ts.map +1 -0
- package/dist/core/JudgmentProvenanceLog.js +301 -0
- package/dist/core/JudgmentProvenanceLog.js.map +1 -0
- package/dist/core/MachineIdentity.d.ts.map +1 -1
- package/dist/core/MachineIdentity.js +2 -0
- package/dist/core/MachineIdentity.js.map +1 -1
- package/dist/core/OwnerDarkLadder.d.ts +108 -0
- package/dist/core/OwnerDarkLadder.d.ts.map +1 -0
- package/dist/core/OwnerDarkLadder.js +229 -0
- package/dist/core/OwnerDarkLadder.js.map +1 -0
- package/dist/core/PostUpdateMigrator.d.ts +10 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +106 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/SpawnAdmission.d.ts +218 -0
- package/dist/core/SpawnAdmission.d.ts.map +1 -0
- package/dist/core/SpawnAdmission.js +440 -0
- package/dist/core/SpawnAdmission.js.map +1 -0
- 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/machineCoherenceManifest.d.ts.map +1 -1
- package/dist/core/machineCoherenceManifest.js +30 -0
- package/dist/core/machineCoherenceManifest.js.map +1 -1
- package/dist/core/types.d.ts +87 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/monitoring/DuplicateSessionReconciler.d.ts +225 -0
- package/dist/monitoring/DuplicateSessionReconciler.d.ts.map +1 -0
- package/dist/monitoring/DuplicateSessionReconciler.js +544 -0
- package/dist/monitoring/DuplicateSessionReconciler.js.map +1 -0
- package/dist/monitoring/FailureAnalyzer.d.ts.map +1 -1
- package/dist/monitoring/FailureAnalyzer.js +40 -1
- package/dist/monitoring/FailureAnalyzer.js.map +1 -1
- package/dist/monitoring/FailureLedger.d.ts +9 -0
- package/dist/monitoring/FailureLedger.d.ts.map +1 -1
- package/dist/monitoring/FailureLedger.js +21 -4
- package/dist/monitoring/FailureLedger.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +2 -1
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/AgentServer.d.ts +5 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +4 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/CapabilityIndex.d.ts.map +1 -1
- package/dist/server/CapabilityIndex.js +9 -0
- package/dist/server/CapabilityIndex.js.map +1 -1
- package/dist/server/fileRoutes.d.ts +16 -0
- package/dist/server/fileRoutes.d.ts.map +1 -1
- package/dist/server/fileRoutes.js +46 -0
- package/dist/server/fileRoutes.js.map +1 -1
- package/dist/server/routes.d.ts +7 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +99 -0
- package/dist/server/routes.js.map +1 -1
- package/dist/testing/selfActionRegistry.d.ts.map +1 -1
- package/dist/testing/selfActionRegistry.js +89 -0
- package/dist/testing/selfActionRegistry.js.map +1 -1
- package/package.json +1 -1
- package/scripts/lib/self-action-detect.mjs +2 -0
- package/skills/instar-dev/templates/side-effects-artifact.md +8 -0
- package/skills/spec-converge/SKILL.md +1 -0
- package/skills/spec-converge/scripts/write-convergence-tag.mjs +71 -0
- package/src/data/builtin-manifest.json +65 -65
- package/src/scaffold/templates.ts +2 -1
- package/upgrades/1.3.820.md +25 -0
- package/upgrades/1.3.821.md +22 -0
- package/upgrades/side-effects/ownership-gated-spawn-increment-1.md +166 -0
- package/upgrades/side-effects/two-node-harness-increment2-entry-gate.md +64 -0
package/dist/server/routes.js
CHANGED
|
@@ -13484,6 +13484,105 @@ document.getElementById('mcpForm').addEventListener('submit', async function (e)
|
|
|
13484
13484
|
}
|
|
13485
13485
|
res.json(ctx.staleOwnerEngine.status());
|
|
13486
13486
|
});
|
|
13487
|
+
// GET /pool/duplicate-reconciler — ownership-gated-spawn §3.8: the ONE status
|
|
13488
|
+
// surface for all three watchers (duplicate reconciler, owner-dark ladder,
|
|
13489
|
+
// SpawnAdmission error arm) — substrate readiness, per-tick counters, breaker
|
|
13490
|
+
// states, open episodes, and each watcher's ≤300s observability line (the
|
|
13491
|
+
// audit rows in logs/duplicate-reconciler.jsonl + logs/owner-dark-ladder.jsonl
|
|
13492
|
+
// surfaced as status, NEVER a push send). 503 when the layer is absent
|
|
13493
|
+
// (single-machine / pool dark).
|
|
13494
|
+
router.get('/pool/duplicate-reconciler', (_req, res) => {
|
|
13495
|
+
if (!ctx.duplicateReconciler && !ctx.spawnAdmission) {
|
|
13496
|
+
res.status(503).json({ error: 'ownership-gated spawn layer not constructed (single-machine / pool dark)' });
|
|
13497
|
+
return;
|
|
13498
|
+
}
|
|
13499
|
+
res.json({
|
|
13500
|
+
reconciler: ctx.duplicateReconciler?.status() ?? null,
|
|
13501
|
+
ownerDarkLadder: ctx.ownerDarkLadder?.status() ?? null,
|
|
13502
|
+
spawnAdmission: ctx.spawnAdmission?.status() ?? null,
|
|
13503
|
+
auditLocations: ['logs/duplicate-reconciler.jsonl', 'logs/owner-dark-ladder.jsonl'],
|
|
13504
|
+
});
|
|
13505
|
+
});
|
|
13506
|
+
// GET /pool/ownership-view?key=<sessionKey> — THIS machine's OWN ownership
|
|
13507
|
+
// registry read (deliberately proxy-free, unlike /pool/placement): the
|
|
13508
|
+
// reconciler's peer-echo confirmation (§3.2.3) asks each non-owner machine
|
|
13509
|
+
// whether ITS view now names the converged owner. Bearer-authed like every
|
|
13510
|
+
// route; returns record fields only, never payloads.
|
|
13511
|
+
router.get('/pool/ownership-view', (req, res) => {
|
|
13512
|
+
const key = typeof req.query.key === 'string' ? req.query.key.trim() : '';
|
|
13513
|
+
if (!key) {
|
|
13514
|
+
res.status(400).json({ error: 'key (query param) is required' });
|
|
13515
|
+
return;
|
|
13516
|
+
}
|
|
13517
|
+
if (!ctx.sessionOwnershipRegistry) {
|
|
13518
|
+
res.status(503).json({ error: 'session pool not available (dark / single-machine install)' });
|
|
13519
|
+
return;
|
|
13520
|
+
}
|
|
13521
|
+
try {
|
|
13522
|
+
const rec = ctx.sessionOwnershipRegistry.read(key);
|
|
13523
|
+
res.json({
|
|
13524
|
+
key,
|
|
13525
|
+
owner: rec ? ctx.sessionOwnershipRegistry.ownerOf(key) : null,
|
|
13526
|
+
epoch: rec?.ownershipEpoch ?? 0,
|
|
13527
|
+
status: rec?.status ?? null,
|
|
13528
|
+
});
|
|
13529
|
+
}
|
|
13530
|
+
catch (err) {
|
|
13531
|
+
res.status(500).json({ error: `ownership read failed: ${err instanceof Error ? err.message : String(err)}` });
|
|
13532
|
+
}
|
|
13533
|
+
});
|
|
13534
|
+
// GET /judgment-provenance — ownership-gated-spawn §3.5: REDACTED judgment
|
|
13535
|
+
// provenance rows only (the machine-local full context NEVER crosses this
|
|
13536
|
+
// surface — redaction is an invariant, enforced at write + by field omission
|
|
13537
|
+
// on read). ?limit= (default 100, max 1000), ?sinceHours=. ?scope=pool merges
|
|
13538
|
+
// peers' redacted rows as type/length-clamped untrusted data.
|
|
13539
|
+
router.get('/judgment-provenance', async (req, res) => {
|
|
13540
|
+
if (!ctx.judgmentProvenance) {
|
|
13541
|
+
res.status(503).json({ error: 'judgment-provenance log not constructed (single-machine / pool dark)' });
|
|
13542
|
+
return;
|
|
13543
|
+
}
|
|
13544
|
+
try {
|
|
13545
|
+
const limit = Math.min(Math.max(parseInt(String(req.query.limit ?? '100'), 10) || 100, 1), 1000);
|
|
13546
|
+
const sinceHours = parseFloat(String(req.query.sinceHours ?? '')) || 0;
|
|
13547
|
+
const sinceMs = sinceHours > 0 ? Date.now() - sinceHours * 3_600_000 : undefined;
|
|
13548
|
+
const rows = await ctx.judgmentProvenance.readRedacted({ limit, sinceMs });
|
|
13549
|
+
if (req.query.scope !== 'pool') {
|
|
13550
|
+
res.json({ rows, status: ctx.judgmentProvenance.status() });
|
|
13551
|
+
return;
|
|
13552
|
+
}
|
|
13553
|
+
// Pool scope: merge peers' REDACTED rows (each peer redacts on its own
|
|
13554
|
+
// serving machine) as clamped untrusted data — bounded per row + total.
|
|
13555
|
+
const peers = ctx.resolvePeerUrls?.() ?? [];
|
|
13556
|
+
const failed = [];
|
|
13557
|
+
const remote = [];
|
|
13558
|
+
await Promise.all(peers.map(async (p) => {
|
|
13559
|
+
try {
|
|
13560
|
+
const r = await fetch(`${p.url}/judgment-provenance?limit=${limit}${sinceHours ? `&sinceHours=${sinceHours}` : ''}`, {
|
|
13561
|
+
headers: { Authorization: `Bearer ${ctx.config.authToken}` },
|
|
13562
|
+
signal: AbortSignal.timeout(5000),
|
|
13563
|
+
});
|
|
13564
|
+
if (!r.ok) {
|
|
13565
|
+
failed.push({ machineId: p.machineId, error: `HTTP ${r.status}` });
|
|
13566
|
+
return;
|
|
13567
|
+
}
|
|
13568
|
+
const j = (await r.json());
|
|
13569
|
+
for (const row of (j.rows ?? []).slice(0, limit)) {
|
|
13570
|
+
const serialized = JSON.stringify(row);
|
|
13571
|
+
if (serialized.length > 8_192)
|
|
13572
|
+
continue; // clamp: oversized peer rows dropped
|
|
13573
|
+
remote.push({ ...row, machineId: p.machineId, remote: true });
|
|
13574
|
+
}
|
|
13575
|
+
}
|
|
13576
|
+
catch (err) {
|
|
13577
|
+
failed.push({ machineId: p.machineId, error: err instanceof Error ? err.name : 'unreachable' });
|
|
13578
|
+
}
|
|
13579
|
+
}));
|
|
13580
|
+
res.json({ rows: [...rows, ...remote].slice(0, limit * (peers.length + 1)), pool: { peersQueried: peers.length, failed }, status: ctx.judgmentProvenance.status() });
|
|
13581
|
+
}
|
|
13582
|
+
catch (err) {
|
|
13583
|
+
res.status(500).json({ error: `provenance read failed: ${err instanceof Error ? err.message : String(err)}` });
|
|
13584
|
+
}
|
|
13585
|
+
});
|
|
13487
13586
|
// GET /pool/lease-handback — U4.4 (docs/specs/u4-4-lease-handback.md §4): the
|
|
13488
13587
|
// hand-back reconciler's status (state machine position, hysteresis window,
|
|
13489
13588
|
// latch visibility — "hand-back suppressed until <t> — operator flip", last
|