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.
Files changed (55) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +35 -12
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/PendingInboundStore.d.ts +31 -1
  5. package/dist/core/PendingInboundStore.d.ts.map +1 -1
  6. package/dist/core/PendingInboundStore.js +81 -2
  7. package/dist/core/PendingInboundStore.js.map +1 -1
  8. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  9. package/dist/core/PostUpdateMigrator.js +10 -1
  10. package/dist/core/PostUpdateMigrator.js.map +1 -1
  11. package/dist/core/QueueDrainLoop.d.ts +19 -0
  12. package/dist/core/QueueDrainLoop.d.ts.map +1 -1
  13. package/dist/core/QueueDrainLoop.js +122 -1
  14. package/dist/core/QueueDrainLoop.js.map +1 -1
  15. package/dist/core/SessionManager.d.ts +35 -26
  16. package/dist/core/SessionManager.d.ts.map +1 -1
  17. package/dist/core/SessionManager.js +196 -53
  18. package/dist/core/SessionManager.js.map +1 -1
  19. package/dist/core/StateManager.d.ts +7 -0
  20. package/dist/core/StateManager.d.ts.map +1 -1
  21. package/dist/core/StateManager.js +13 -1
  22. package/dist/core/StateManager.js.map +1 -1
  23. package/dist/data/standards-guard-index.json +1 -1
  24. package/dist/data/standards-guard-index.meta.json +2 -2
  25. package/dist/data/standards-registry.meta.json +1 -1
  26. package/dist/monitoring/ReapLog.d.ts +3 -0
  27. package/dist/monitoring/ReapLog.d.ts.map +1 -1
  28. package/dist/monitoring/ReapLog.js +12 -1
  29. package/dist/monitoring/ReapLog.js.map +1 -1
  30. package/dist/monitoring/SessionReaper.d.ts +4 -37
  31. package/dist/monitoring/SessionReaper.d.ts.map +1 -1
  32. package/dist/monitoring/SessionReaper.js +61 -65
  33. package/dist/monitoring/SessionReaper.js.map +1 -1
  34. package/dist/scaffold/templates.js +1 -1
  35. package/dist/server/AgentServer.d.ts +2 -1
  36. package/dist/server/AgentServer.d.ts.map +1 -1
  37. package/dist/server/AgentServer.js +1 -0
  38. package/dist/server/AgentServer.js.map +1 -1
  39. package/dist/server/routes.d.ts +5 -1
  40. package/dist/server/routes.d.ts.map +1 -1
  41. package/dist/server/routes.js +20 -11
  42. package/dist/server/routes.js.map +1 -1
  43. package/dist/testing/selfActionRegistry.js +1 -1
  44. package/dist/testing/selfActionRegistry.js.map +1 -1
  45. package/package.json +1 -1
  46. package/src/data/builtin-manifest.json +65 -65
  47. package/src/data/standards-guard-index.json +1 -1
  48. package/src/data/standards-guard-index.meta.json +2 -2
  49. package/src/data/standards-registry.meta.json +1 -1
  50. package/src/scaffold/templates.ts +1 -1
  51. package/upgrades/1.3.1119.md +41 -0
  52. package/upgrades/1.3.1120.md +33 -0
  53. package/upgrades/session-reaper-local-age-owner.eli16.md +50 -0
  54. package/upgrades/side-effects/inbound-queue-shadow-custody.md +62 -0
  55. 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,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;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,CA01qBtE;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;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"}
@@ -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 sessionManager.terminateSession(session.id, 'session-recovery', {
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) => sessionManager.terminateSession(id, reason, {
17657
+ terminate: (id, reason, opts) => terminateWithAuthority(id, reason, {
17650
17658
  bypassActiveProcessKeep: opts?.bypassActiveProcessKeep,
17651
17659
  bypassRecentUserMessageForConfirmedMove: opts?.bypassRecentUserMessageForConfirmedMove,
17652
- // F8 carve-out: the topic-moved closeout's lease bypass must reach
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 sessionManager.terminateSession(rec.id, reason, {
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 + !dryRun + the six config-seam invariants.
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 sessionManager.terminateSession(rec.id, `topic ${topicId} moved to ${cmd.nickname} (user-commanded transfer) — closing the leftover local session`, { origin: 'operator', disposition: 'recovery-bounce' }).then((r) => {
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