instar 1.3.396 → 1.3.398
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 +41 -2
- package/dist/commands/server.js.map +1 -1
- package/dist/core/MeshRpc.d.ts +3 -0
- package/dist/core/MeshRpc.d.ts.map +1 -1
- package/dist/core/MeshRpc.js +1 -0
- package/dist/core/MeshRpc.js.map +1 -1
- package/dist/core/types.d.ts +10 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/monitoring/SessionReaper.d.ts +4 -0
- package/dist/monitoring/SessionReaper.d.ts.map +1 -1
- package/dist/monitoring/SessionReaper.js +8 -1
- package/dist/monitoring/SessionReaper.js.map +1 -1
- package/dist/server/AgentServer.d.ts +9 -0
- package/dist/server/AgentServer.d.ts.map +1 -1
- package/dist/server/AgentServer.js +6 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/StreamTicketStore.d.ts +54 -0
- package/dist/server/StreamTicketStore.d.ts.map +1 -0
- package/dist/server/StreamTicketStore.js +147 -0
- package/dist/server/StreamTicketStore.js.map +1 -0
- package/dist/server/WebSocketManager.d.ts +19 -0
- package/dist/server/WebSocketManager.d.ts.map +1 -1
- package/dist/server/WebSocketManager.js +72 -2
- package/dist/server/WebSocketManager.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +3 -3
- package/src/data/state-coherence-registry.json +13 -1
- package/upgrades/1.3.397.md +43 -0
- package/upgrades/1.3.398.md +30 -0
- package/upgrades/side-effects/dashboard-stream-phase2a-serving.md +69 -0
- package/upgrades/side-effects/reaper-transcript-projectdir.md +46 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAQ3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AAuBjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAiG7D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AA6JtD,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAaH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAQ3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AAuBjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAiG7D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AA6JtD,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AA04BD,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,GAC/F,IAAI,CAyUN;AA2lBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAm3TtE;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
|
@@ -337,6 +337,10 @@ let _resolvePeerUrls = null;
|
|
|
337
337
|
let _topicPinStore = null;
|
|
338
338
|
/** Cross-machine secret-sync (spec Phase 4): route-facing handle (push lever + read-only status). */
|
|
339
339
|
let _secretSyncHandle = null;
|
|
340
|
+
/** Pool Dashboard Streaming (POOL-DASHBOARD-STREAM-SPEC §2.3): shared single-use
|
|
341
|
+
* ticket store — minted by the `pool-stream-ticket` mesh verb, consumed by the
|
|
342
|
+
* WebSocketManager's /pool-stream upgrade. Constructed in the mesh-setup block. */
|
|
343
|
+
let _streamTicketStore = null;
|
|
340
344
|
/** Recognize + apply a "move/run this on <nickname>" relocation on inbound; returns handled=true when the message WAS a relocation command (so it must not also be dispatched). */
|
|
341
345
|
let _tryNicknameRelocation = null;
|
|
342
346
|
/** Per-topic framework override (claude-code | codex-cli). Populated from
|
|
@@ -9342,6 +9346,10 @@ export async function startServer(options) {
|
|
|
9342
9346
|
listRunningSessions: () => sessionManager.listRunningSessions(),
|
|
9343
9347
|
captureOutput: (s, n) => sessionManager.captureOutput(s, n) ?? '',
|
|
9344
9348
|
frameworkForSession: (s) => sessionManager.frameworkForSession(s),
|
|
9349
|
+
// The agent's session-launch cwd — Claude Code encodes it into the transcript
|
|
9350
|
+
// path so the reaper's fallback probe() can resolve + verify idle. Without this
|
|
9351
|
+
// the probe used '' and every transcript read as unresolved (kept everything).
|
|
9352
|
+
transcriptProjectDir: () => config.projectDir,
|
|
9345
9353
|
pressure: () => {
|
|
9346
9354
|
const total = _os.totalmem();
|
|
9347
9355
|
const freePct = total > 0 ? (_os.freemem() / total) * 100 : 100;
|
|
@@ -9544,7 +9552,11 @@ export async function startServer(options) {
|
|
|
9544
9552
|
snapshot: (session) => {
|
|
9545
9553
|
const framework = session.framework ?? sessionManager.frameworkForSession(session.tmuxSession) ?? 'claude-code';
|
|
9546
9554
|
const sessionId = framework === 'claude-code' ? (session.claudeSessionId ?? '') : '';
|
|
9547
|
-
|
|
9555
|
+
// Real projectDir (the agent's session-launch cwd) so the transcript
|
|
9556
|
+
// resolves; '' would encode to an empty dir that never exists →
|
|
9557
|
+
// always-unresolved (the bug that made the reaper's idle-proof never work).
|
|
9558
|
+
// See SessionReaper.probe().
|
|
9559
|
+
const tp = probeTranscript({ framework, sessionId, projectDir: config.projectDir });
|
|
9548
9560
|
// Tail hash: read the last progressFloorBytes so a heartbeat-byte append
|
|
9549
9561
|
// (same tail) is NOT counted as a meaningful advance.
|
|
9550
9562
|
let tailHash = null;
|
|
@@ -9870,6 +9882,20 @@ export async function startServer(options) {
|
|
|
9870
9882
|
?? (meshIdMgr?.hasIdentity() ? meshIdMgr.loadIdentity().machineId : null);
|
|
9871
9883
|
if (meshIdMgr && meshSelfId) {
|
|
9872
9884
|
const meshClockToleranceMs = config.multiMachine?.sessionPool?.meshRpcClockToleranceMs ?? 30000;
|
|
9885
|
+
// Pool Dashboard Streaming (§2.3): the shared single-use ticket store —
|
|
9886
|
+
// the `pool-stream-ticket` verb mints into it; the WS /pool-stream
|
|
9887
|
+
// upgrade consumes from it. Crypto-random tickets; persisted so a
|
|
9888
|
+
// captured ticket can't replay across a restart.
|
|
9889
|
+
{
|
|
9890
|
+
const stsMod = await import('../server/StreamTicketStore.js');
|
|
9891
|
+
const cryptoMod = await import('node:crypto');
|
|
9892
|
+
_streamTicketStore = new stsMod.StreamTicketStore({
|
|
9893
|
+
filePath: path.join(config.stateDir, 'state', 'stream-tickets.json'),
|
|
9894
|
+
now: () => Date.now(),
|
|
9895
|
+
mintId: () => cryptoMod.randomBytes(32).toString('hex'),
|
|
9896
|
+
logger: (m) => console.log(pc.dim(` ${m}`)),
|
|
9897
|
+
});
|
|
9898
|
+
}
|
|
9873
9899
|
const seenMeshNonces = new Map(); // `${sender}:${nonce}` → ts, age-pruned
|
|
9874
9900
|
const meshPruneMs = Math.max(meshClockToleranceMs * 4, 120_000);
|
|
9875
9901
|
// SessionOwnership registry (§L3) — in-memory store (single-machine correct;
|
|
@@ -10119,6 +10145,19 @@ export async function startServer(options) {
|
|
|
10119
10145
|
: undefined;
|
|
10120
10146
|
return { ...base, journalAdvert, ...(commitmentsAdvert ? { commitmentsAdvert } : {}) };
|
|
10121
10147
|
},
|
|
10148
|
+
// Pool Dashboard Streaming (§2.3): mint a single-use bearer ticket
|
|
10149
|
+
// for the authenticated peer so it may open a /pool-stream WS to
|
|
10150
|
+
// watch `session`. verifyEnvelope already proved the peer's identity;
|
|
10151
|
+
// the ticket is bound to that sender and consumed once on upgrade.
|
|
10152
|
+
'pool-stream-ticket': (cmd, sender) => {
|
|
10153
|
+
const c = cmd;
|
|
10154
|
+
if (!_streamTicketStore)
|
|
10155
|
+
return { ok: false, reason: 'pool-stream disabled' };
|
|
10156
|
+
if (!c.session || typeof c.session !== 'string')
|
|
10157
|
+
return { ok: false, reason: 'session required' };
|
|
10158
|
+
const minted = _streamTicketStore.mint(sender);
|
|
10159
|
+
return { ok: true, ticket: minted.ticket, expiresAtMs: minted.expiresAtMs };
|
|
10160
|
+
},
|
|
10122
10161
|
// COHERENCE-JOURNAL-SPEC §3.4 — always-registered journal-sync verb
|
|
10123
10162
|
// (harmless when no peer sends): serve our OWN stream on `request`
|
|
10124
10163
|
// (first-hop only), durably apply an inbound `batch`. The RBAC gate
|
|
@@ -11113,7 +11152,7 @@ export async function startServer(options) {
|
|
|
11113
11152
|
catch (err) {
|
|
11114
11153
|
console.log(pc.dim(` [session-pool] rollout gate not wired: ${err instanceof Error ? err.message : String(err)}`));
|
|
11115
11154
|
}
|
|
11116
|
-
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, coherenceGate: scopeVerifier, contextHierarchy, canonicalState, operationGate, sentinel, adaptiveTrust, memoryMonitor, orphanReaper, coherenceMonitor, commitmentTracker, subscriptionPool, quotaPoller, semanticMemory, activitySentinel, rateLimitSentinel, releaseReadinessSentinel: releaseReadinessSentinel ?? undefined, messageRouter, summarySentinel, spawnManager, systemReviewer, capabilityMapper, selfKnowledgeTree, coverageAuditor, topicResumeMap: _topicResumeMap ?? undefined, sessionRefresh: _sessionRefresh ?? undefined, autonomyManager, trustElevationTracker, autonomousEvolution, coordinator: coordinator.enabled ? coordinator : undefined, localSigningKeyPem, leaseTransport, 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, whatsappBusinessBackend, messageBridge, hookEventReceiver, worktreeMonitor, subagentTracker, instructionsVerifier, handshakeManager: threadlineHandshake, threadlineRouter, conversationStore, warrantsReplyGate, collaborationSurfacer, threadResumeMap, topicLinkageHandler: topicLinkageHandler ?? undefined, threadlineRelayClient, threadlineReplyWaiters, listenerManager: listenerManager ?? undefined, a2aDeliveryTracker: a2aDeliveryTracker ?? undefined, responseReviewGate, messagingToneGate, outboundDedupGate, telemetryHeartbeat, pasteManager, featureRegistry, discoveryEvaluator, completionEvaluator, unifiedTrust, liveConfig, sharedStateLedger, ledgerSessionRegistry, worktreeManager, oidcEnrolledRepos: parallelDevConfig?.oidcEnrolledRepos, initiativeTracker, projectRoundRunner, projectDriftChecker, machineHeartbeat, machinePoolRegistry, meshRpcDispatcher, workingSetPullCoordinator, commitmentReplicaStore, forwardCommitmentMutate, sessionOwnershipRegistry, topicPinStore: _topicPinStore ?? undefined, secretSync: _secretSyncHandle ?? undefined, meshSelfId: _meshSelfId ?? undefined, resolveRouterUrl: _resolveRouterUrl ?? undefined, resolvePeerUrls: _resolvePeerUrls ?? undefined, sessionPoolE2EResultStore, proxyCoordinator, topicIntentStore, topicIntentArcCheck, usherSignalStore, intelligence: sharedIntelligence ?? undefined, telegramBridgeConfig, telegramBridge: telegramBridge ?? undefined, threadlineObservability, briefDeps, workingMemory, taskFlowRegistry, threadlineFlowBridge, sessionReaper, agentWorktreeReaper, mcpProcessReaper, geminiLoopRunner, sleepController, agentActivityState, reapLog, sleepWakeDetector, unjustifiedStopGate, stopGateDb, stopNotifier });
|
|
11155
|
+
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, coherenceGate: scopeVerifier, contextHierarchy, canonicalState, operationGate, sentinel, adaptiveTrust, memoryMonitor, orphanReaper, coherenceMonitor, commitmentTracker, subscriptionPool, quotaPoller, semanticMemory, activitySentinel, rateLimitSentinel, releaseReadinessSentinel: releaseReadinessSentinel ?? undefined, messageRouter, summarySentinel, spawnManager, systemReviewer, capabilityMapper, selfKnowledgeTree, coverageAuditor, topicResumeMap: _topicResumeMap ?? undefined, sessionRefresh: _sessionRefresh ?? undefined, autonomyManager, trustElevationTracker, autonomousEvolution, coordinator: coordinator.enabled ? coordinator : undefined, localSigningKeyPem, leaseTransport, 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, whatsappBusinessBackend, messageBridge, hookEventReceiver, worktreeMonitor, subagentTracker, instructionsVerifier, handshakeManager: threadlineHandshake, threadlineRouter, conversationStore, warrantsReplyGate, collaborationSurfacer, threadResumeMap, topicLinkageHandler: topicLinkageHandler ?? undefined, threadlineRelayClient, threadlineReplyWaiters, listenerManager: listenerManager ?? undefined, a2aDeliveryTracker: a2aDeliveryTracker ?? undefined, responseReviewGate, messagingToneGate, outboundDedupGate, telemetryHeartbeat, pasteManager, featureRegistry, discoveryEvaluator, completionEvaluator, unifiedTrust, liveConfig, sharedStateLedger, ledgerSessionRegistry, worktreeManager, oidcEnrolledRepos: parallelDevConfig?.oidcEnrolledRepos, initiativeTracker, projectRoundRunner, projectDriftChecker, machineHeartbeat, machinePoolRegistry, meshRpcDispatcher, workingSetPullCoordinator, commitmentReplicaStore, forwardCommitmentMutate, sessionOwnershipRegistry, topicPinStore: _topicPinStore ?? undefined, streamTicketStore: _streamTicketStore ?? undefined, poolStreamAllowRemoteInput: config.dashboard?.poolStream?.allowRemoteInput ?? false, secretSync: _secretSyncHandle ?? undefined, meshSelfId: _meshSelfId ?? undefined, resolveRouterUrl: _resolveRouterUrl ?? undefined, resolvePeerUrls: _resolvePeerUrls ?? undefined, sessionPoolE2EResultStore, proxyCoordinator, topicIntentStore, topicIntentArcCheck, usherSignalStore, intelligence: sharedIntelligence ?? undefined, telegramBridgeConfig, telegramBridge: telegramBridge ?? undefined, threadlineObservability, briefDeps, workingMemory, taskFlowRegistry, threadlineFlowBridge, sessionReaper, agentWorktreeReaper, mcpProcessReaper, geminiLoopRunner, sleepController, agentActivityState, reapLog, sleepWakeDetector, unjustifiedStopGate, stopGateDb, stopNotifier });
|
|
11117
11156
|
// Resolve the late-bound topic-operator getter (increment 2e): routing was
|
|
11118
11157
|
// wired before the server existed; from here on inbound binds use the
|
|
11119
11158
|
// server's own store instance.
|