instar 1.3.1118 → 1.3.1120
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 +35 -12
- package/dist/commands/server.js.map +1 -1
- package/dist/core/PendingInboundStore.d.ts +31 -1
- package/dist/core/PendingInboundStore.d.ts.map +1 -1
- package/dist/core/PendingInboundStore.js +81 -2
- package/dist/core/PendingInboundStore.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +10 -1
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/QueueDrainLoop.d.ts +19 -0
- package/dist/core/QueueDrainLoop.d.ts.map +1 -1
- package/dist/core/QueueDrainLoop.js +122 -1
- package/dist/core/QueueDrainLoop.js.map +1 -1
- package/dist/core/SessionManager.d.ts +35 -26
- package/dist/core/SessionManager.d.ts.map +1 -1
- package/dist/core/SessionManager.js +196 -53
- package/dist/core/SessionManager.js.map +1 -1
- package/dist/core/StateManager.d.ts +7 -0
- package/dist/core/StateManager.d.ts.map +1 -1
- package/dist/core/StateManager.js +13 -1
- package/dist/core/StateManager.js.map +1 -1
- package/dist/data/standards-guard-index.json +1 -1
- package/dist/data/standards-guard-index.meta.json +2 -2
- package/dist/data/standards-registry.meta.json +1 -1
- package/dist/monitoring/ReapLog.d.ts +3 -0
- package/dist/monitoring/ReapLog.d.ts.map +1 -1
- package/dist/monitoring/ReapLog.js +12 -1
- package/dist/monitoring/ReapLog.js.map +1 -1
- package/dist/monitoring/SessionReaper.d.ts +4 -37
- package/dist/monitoring/SessionReaper.d.ts.map +1 -1
- package/dist/monitoring/SessionReaper.js +61 -65
- package/dist/monitoring/SessionReaper.js.map +1 -1
- package/dist/scaffold/templates.js +1 -1
- package/dist/server/AgentServer.d.ts +2 -1
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +1 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/routes.d.ts +5 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +20 -11
- package/dist/server/routes.js.map +1 -1
- package/dist/testing/selfActionRegistry.js +1 -1
- package/dist/testing/selfActionRegistry.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +65 -65
- package/src/data/standards-guard-index.json +1 -1
- package/src/data/standards-guard-index.meta.json +2 -2
- package/src/data/standards-registry.meta.json +1 -1
- package/src/scaffold/templates.ts +1 -1
- package/upgrades/1.3.1119.md +41 -0
- package/upgrades/1.3.1120.md +33 -0
- package/upgrades/session-reaper-local-age-owner.eli16.md +50 -0
- package/upgrades/side-effects/inbound-queue-shadow-custody.md +62 -0
- package/upgrades/side-effects/session-reaper-local-age-owner.md +249 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA8EH,OAAO,EAAE,cAAc,
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA8EH,OAAO,EAAE,cAAc,EAAkC,MAAM,2BAA2B,CAAC;AAU3F,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AA0BjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AA+H7D,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;AAuID,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA+rDD;;;;;;;;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,CA+2qBtE;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
|
@@ -5586,7 +5586,15 @@ export async function startServer(options) {
|
|
|
5586
5586
|
loadPerCore: () => _computeDegradedTmuxLoadPerCore(os.loadavg()[0], _degradedTmuxCores),
|
|
5587
5587
|
now: () => Date.now(),
|
|
5588
5588
|
});
|
|
5589
|
+
let boundTerminateAuthority = null;
|
|
5590
|
+
const terminateWithAuthority = (id, reason, opts) => {
|
|
5591
|
+
if (!boundTerminateAuthority) {
|
|
5592
|
+
throw new Error('Session terminate authority was not bound during manager construction');
|
|
5593
|
+
}
|
|
5594
|
+
return boundTerminateAuthority(id, reason, opts);
|
|
5595
|
+
};
|
|
5589
5596
|
const sessionManager = new SessionManager(sessionManagerConfig, state, {
|
|
5597
|
+
bindTerminateAuthority: (authority) => { boundTerminateAuthority = authority; },
|
|
5590
5598
|
tmuxAsyncEnabled: _tmuxAsyncEnabled,
|
|
5591
5599
|
degradedTmuxGuard,
|
|
5592
5600
|
tmuxCallTimeoutMs: config.monitoring?.tmuxResilience?.asyncHotPath?.timeoutMs,
|
|
@@ -9446,6 +9454,7 @@ export async function startServer(options) {
|
|
|
9446
9454
|
reason: e.reason,
|
|
9447
9455
|
disposition: e.disposition,
|
|
9448
9456
|
origin: e.origin,
|
|
9457
|
+
authorityScope: e.authorityScope,
|
|
9449
9458
|
// Untrusted provenance claim from a relayed close (spec §2.3) — a
|
|
9450
9459
|
// signal in the trail, never an authority input.
|
|
9451
9460
|
...(e.via ? { viaClaim: e.via } : {}),
|
|
@@ -9603,7 +9612,6 @@ export async function startServer(options) {
|
|
|
9603
9612
|
// the health endpoint (synchronous tmux has-session calls) and cause the
|
|
9604
9613
|
// lifeline to restart the server in a tight loop.
|
|
9605
9614
|
await sessionManager.purgeDeadSessions();
|
|
9606
|
-
sessionManager.startMonitoring();
|
|
9607
9615
|
// ── Durable Inbound Message Queue: unconditional boot sweep (§5.3) ──
|
|
9608
9616
|
// MUST run BEFORE recoverPendingInjects (boot ordering, spec §3.4): the
|
|
9609
9617
|
// sweep consults injection receipts and vetoes PIS records for
|
|
@@ -10356,7 +10364,7 @@ export async function startServer(options) {
|
|
|
10356
10364
|
killSession: async (name) => {
|
|
10357
10365
|
const session = sessionManager.listRunningSessions().find((s) => s.tmuxSession === name);
|
|
10358
10366
|
if (session) {
|
|
10359
|
-
await
|
|
10367
|
+
await terminateWithAuthority(session.id, 'session-recovery', {
|
|
10360
10368
|
disposition: 'recovery-bounce',
|
|
10361
10369
|
finalStatus: 'killed',
|
|
10362
10370
|
bypassRecoveryFlag: true,
|
|
@@ -17646,13 +17654,10 @@ export async function startServer(options) {
|
|
|
17646
17654
|
cpuCriticalLoadPerCore: rcfg?.cpuCriticalLoadPerCore ?? 1.5,
|
|
17647
17655
|
});
|
|
17648
17656
|
},
|
|
17649
|
-
terminate: (id, reason, opts) =>
|
|
17657
|
+
terminate: (id, reason, opts) => terminateWithAuthority(id, reason, {
|
|
17650
17658
|
bypassActiveProcessKeep: opts?.bypassActiveProcessKeep,
|
|
17651
17659
|
bypassRecentUserMessageForConfirmedMove: opts?.bypassRecentUserMessageForConfirmedMove,
|
|
17652
|
-
|
|
17653
|
-
// the authority — dropping it here would silently restore the
|
|
17654
|
-
// not-lease-holder veto the carve-out exists to lift.
|
|
17655
|
-
bypassLeaseForTopicMovedCloseout: opts?.bypassLeaseForTopicMovedCloseout,
|
|
17660
|
+
localPostTransferCloseout: opts?.localPostTransferCloseout,
|
|
17656
17661
|
workEvidence: opts?.workEvidence,
|
|
17657
17662
|
}),
|
|
17658
17663
|
markReaping: (id) => sessionManager.markReaping(id),
|
|
@@ -20184,8 +20189,7 @@ export async function startServer(options) {
|
|
|
20184
20189
|
const rec = tmux ? state.listSessions().find((s) => s.tmuxSession === tmux) : undefined;
|
|
20185
20190
|
if (!rec)
|
|
20186
20191
|
return { terminated: false, skipped: 'no-local-session' };
|
|
20187
|
-
return
|
|
20188
|
-
origin: 'autonomous',
|
|
20192
|
+
return terminateWithAuthority(rec.id, reason, {
|
|
20189
20193
|
via: 'ws12-drain',
|
|
20190
20194
|
bypassActiveProcessKeep: opts.force,
|
|
20191
20195
|
workEvidence: opts.force ? ['active-build-or-autonomous-run'] : undefined,
|
|
@@ -21764,7 +21768,8 @@ export async function startServer(options) {
|
|
|
21764
21768
|
});
|
|
21765
21769
|
// ── Durable Inbound Message Queue: engine construction (gated) ──
|
|
21766
21770
|
// Gate: pool active (this block) + mesh identity (this block) +
|
|
21767
|
-
// inboundQueue.enabled +
|
|
21771
|
+
// inboundQueue.enabled + the six config-seam invariants. Dry-run
|
|
21772
|
+
// constructs the engine and an isolated shadow custody store.
|
|
21768
21773
|
// A violated invariant keeps the queue OFF for the boot — one loud
|
|
21769
21774
|
// config-error per violated inequality + one attention item, never a
|
|
21770
21775
|
// half-configured queue (spec §Config).
|
|
@@ -21820,6 +21825,18 @@ export async function startServer(options) {
|
|
|
21820
21825
|
const pisMod2 = await import('../core/PendingInjectStore.js');
|
|
21821
21826
|
const queuePis = new pisMod2.PendingInjectStore(path.join(config.stateDir, 'state'));
|
|
21822
21827
|
const store = _sweptInboundStore ?? pisStoreMod.PendingInboundStore.open(config.projectName ?? 'agent', config.stateDir);
|
|
21828
|
+
let shadowStore;
|
|
21829
|
+
if (qcfg.dryRun) {
|
|
21830
|
+
try {
|
|
21831
|
+
shadowStore = pisStoreMod.PendingInboundStore.openShadow(config.projectName ?? 'agent', config.stateDir);
|
|
21832
|
+
}
|
|
21833
|
+
catch (err) {
|
|
21834
|
+
// Keep dry-run fail-open, but its API will say the shadow
|
|
21835
|
+
// exercise is unavailable and each attempted probe counts
|
|
21836
|
+
// an error. A shadow-store failure never affects dispatch.
|
|
21837
|
+
console.error(`[inbound-queue] dry-run shadow store unavailable: ${err instanceof Error ? err.message : String(err)}`);
|
|
21838
|
+
}
|
|
21839
|
+
}
|
|
21823
21840
|
const bootSessionId = `${meshSelfId}:${Date.now()}`;
|
|
21824
21841
|
// §4.2 hold verdict — effective state honesty: always-'failover'
|
|
21825
21842
|
// when the policy is off or the queue is dry-run (unreachable
|
|
@@ -21844,6 +21861,7 @@ export async function startServer(options) {
|
|
|
21844
21861
|
const stoppedTopics = new Set();
|
|
21845
21862
|
_inboundQueue = new qdlMod.QueueDrainLoop({
|
|
21846
21863
|
store,
|
|
21864
|
+
shadowStore,
|
|
21847
21865
|
qcfg,
|
|
21848
21866
|
hcfg,
|
|
21849
21867
|
selfMachineId: meshSelfId,
|
|
@@ -23005,7 +23023,7 @@ export async function startServer(options) {
|
|
|
23005
23023
|
const tmuxName = telegram?.getSessionForTopic(topicId);
|
|
23006
23024
|
const rec = tmuxName ? sessionManager.listRunningSessions().find((s) => s.tmuxSession === tmuxName) : undefined;
|
|
23007
23025
|
if (rec && !sessionManager.getProtectedSessions().includes(rec.tmuxSession)) {
|
|
23008
|
-
void
|
|
23026
|
+
void terminateWithAuthority(rec.id, `topic ${topicId} moved to ${cmd.nickname} (user-commanded transfer) — closing the leftover local session`, { origin: 'operator', disposition: 'recovery-bounce' }).then((r) => {
|
|
23009
23027
|
console.log(pc.dim(` [session-pool] post-transfer closeout: ${rec.tmuxSession} → ${r.terminated ? 'closed' : `skipped (${r.skipped})`}`));
|
|
23010
23028
|
});
|
|
23011
23029
|
}
|
|
@@ -23668,7 +23686,7 @@ export async function startServer(options) {
|
|
|
23668
23686
|
userDirected: true, status: 'open', assignee: null, priority: 'medium',
|
|
23669
23687
|
})),
|
|
23670
23688
|
});
|
|
23671
|
-
const server = new AgentServer({ config, subscriptionEmailBinding: credentialLocationLedger, subscriptionEmailBarrier, subscriptionIdentityOracle: credentialIdentityOracle, sessionManager, llmQueue: sharedLlmQueue, state, scheduler, telegram, relationships, feedback, feedbackAnomalyDetector, dispatches, updateChecker, autoUpdater, autoDispatcher, quotaTracker, quotaManager, publisher, viewer, tunnel, evolution, watchdog, topicMemory, triageNurse, projectMapper, cartographerRoots: cartographerRoots ?? 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) {
|
|
23689
|
+
const server = new AgentServer({ config, terminateSessionAuthority: terminateWithAuthority, subscriptionEmailBinding: credentialLocationLedger, subscriptionEmailBarrier, subscriptionIdentityOracle: credentialIdentityOracle, sessionManager, llmQueue: sharedLlmQueue, state, scheduler, telegram, relationships, feedback, feedbackAnomalyDetector, dispatches, updateChecker, autoUpdater, autoDispatcher, quotaTracker, quotaManager, publisher, viewer, tunnel, evolution, watchdog, topicMemory, triageNurse, projectMapper, cartographerRoots: cartographerRoots ?? 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) {
|
|
23672
23690
|
peers = (_listPoolMachines?.() ?? []).filter((m) => m.machineId !== _meshSelfId && !!m.lastKnownUrl).map((m) => ({ machineId: m.machineId, nickname: m.nickname ?? m.machineId, url: m.lastKnownUrl }));
|
|
23673
23691
|
} if (peers.length === 0)
|
|
23674
23692
|
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, getLastRelayEvent: threadlineGetLastRelayEvent, 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, getSingleMachineFailoverGap: () => _singleMachineFailoverGap, getMissingLoginSession: () => _missingLoginSession, getSessionPoolFailoverRunner: () => _sessionPoolFailoverRunnerDriver?.status() ?? null, sessionPoolPromotionActivation: _sessionPoolPromotionActivation, 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
|
|
@@ -24035,6 +24053,11 @@ export async function startServer(options) {
|
|
|
24035
24053
|
// from binding; logged, and the OS releases the listening socket regardless.
|
|
24036
24054
|
console.error(' Boot health beacon stop failed (continuing to bind real server):', err instanceof Error ? err.message : err);
|
|
24037
24055
|
}
|
|
24056
|
+
// Start session maintenance only after every authority dependency and the
|
|
24057
|
+
// session-pool write posture have been installed. Starting this near initial
|
|
24058
|
+
// construction left a first-tick window with no ReapGuard and, on standby,
|
|
24059
|
+
// no per-session write admission.
|
|
24060
|
+
sessionManager.startMonitoring();
|
|
24038
24061
|
await server.start();
|
|
24039
24062
|
// #1425 regression containment: only begin the cooperative witness-index +
|
|
24040
24063
|
// parity scans AFTER the HTTP server is listening. Until publication the
|