instar 1.3.1329 → 1.3.1331
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 +103 -2
- package/dist/commands/server.js.map +1 -1
- package/dist/core/AgentIdentityHandover.d.ts.map +1 -1
- package/dist/core/AgentIdentityHandover.js +6 -7
- package/dist/core/AgentIdentityHandover.js.map +1 -1
- package/dist/core/MeshRpc.d.ts +17 -0
- package/dist/core/MeshRpc.d.ts.map +1 -1
- package/dist/core/MeshRpc.js +7 -0
- package/dist/core/MeshRpc.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +15 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/devGatedFeatures.d.ts.map +1 -1
- package/dist/core/devGatedFeatures.js +6 -0
- package/dist/core/devGatedFeatures.js.map +1 -1
- package/dist/core/types.d.ts +9 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.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/identity/IdentityKeyFile.d.ts +86 -0
- package/dist/identity/IdentityKeyFile.d.ts.map +1 -0
- package/dist/identity/IdentityKeyFile.js +264 -0
- package/dist/identity/IdentityKeyFile.js.map +1 -0
- package/dist/identity/IdentityManager.d.ts.map +1 -1
- package/dist/identity/IdentityManager.js +17 -9
- package/dist/identity/IdentityManager.js.map +1 -1
- package/dist/identity/Migration.d.ts.map +1 -1
- package/dist/identity/Migration.js +16 -10
- package/dist/identity/Migration.js.map +1 -1
- 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 +1 -0
- package/dist/server/AgentServer.js.map +1 -1
- package/dist/server/routes.d.ts +15 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +456 -333
- package/dist/server/routes.js.map +1 -1
- package/dist/threadline/HandshakeManager.d.ts +11 -2
- package/dist/threadline/HandshakeManager.d.ts.map +1 -1
- package/dist/threadline/HandshakeManager.js +18 -36
- package/dist/threadline/HandshakeManager.js.map +1 -1
- package/dist/threadline/ThreadlineBootstrap.d.ts +9 -0
- package/dist/threadline/ThreadlineBootstrap.d.ts.map +1 -1
- package/dist/threadline/ThreadlineBootstrap.js +36 -3
- package/dist/threadline/ThreadlineBootstrap.js.map +1 -1
- package/dist/threadline/ThreadlineEndpoints.d.ts.map +1 -1
- package/dist/threadline/ThreadlineEndpoints.js +12 -6
- package/dist/threadline/ThreadlineEndpoints.js.map +1 -1
- package/dist/threadline/ThreadlineMCPServer.d.ts +4 -0
- package/dist/threadline/ThreadlineMCPServer.d.ts.map +1 -1
- package/dist/threadline/ThreadlineMCPServer.js +25 -0
- package/dist/threadline/ThreadlineMCPServer.js.map +1 -1
- package/dist/threadline/ThreadlineRouter.d.ts.map +1 -1
- package/dist/threadline/ThreadlineRouter.js +1 -0
- package/dist/threadline/ThreadlineRouter.js.map +1 -1
- package/dist/threadline/TopicLinkageHandler.d.ts +58 -0
- package/dist/threadline/TopicLinkageHandler.d.ts.map +1 -1
- package/dist/threadline/TopicLinkageHandler.js +193 -5
- package/dist/threadline/TopicLinkageHandler.js.map +1 -1
- package/dist/threadline/client/IdentityManager.d.ts +35 -0
- package/dist/threadline/client/IdentityManager.d.ts.map +1 -1
- package/dist/threadline/client/IdentityManager.js +107 -41
- package/dist/threadline/client/IdentityManager.js.map +1 -1
- package/dist/threadline/mcp-http-client.d.ts.map +1 -1
- package/dist/threadline/mcp-http-client.js +5 -0
- package/dist/threadline/mcp-http-client.js.map +1 -1
- package/dist/threadline/relayBootStatus.d.ts +19 -0
- package/dist/threadline/relayBootStatus.d.ts.map +1 -0
- package/dist/threadline/relayBootStatus.js +26 -0
- package/dist/threadline/relayBootStatus.js.map +1 -0
- package/dist/threadline/relayForward.d.ts +252 -0
- package/dist/threadline/relayForward.d.ts.map +1 -0
- package/dist/threadline/relayForward.js +415 -0
- package/dist/threadline/relayForward.js.map +1 -0
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +64 -64
- 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 +4 -0
- package/upgrades/1.3.1330.md +35 -0
- package/upgrades/1.3.1331.md +34 -0
- package/upgrades/a2a-cross-machine-route.eli16.md +17 -0
- package/upgrades/side-effects/a2a-cross-machine-route.md +132 -0
- package/upgrades/side-effects/threadline-identity-single-writer.md +131 -0
- package/upgrades/threadline-identity-single-writer.eli16.md +26 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAuGA,OAAO,EAAE,cAAc,EAAwD,MAAM,2BAA2B,CAAC;AAUjH,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AA4BjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAqI7D,OAAO,KAAK,EAAW,oBAAoB,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,kBAAkB,CAAC;AACjG,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAmFtD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC1C,OAAO,CAUT;AA0ID,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAoDD,+EAA+E;AAC/E,wBAAgB,qCAAqC,CACnD,SAAS,EAAE,IAAI,CAAC,OAAO,2BAA2B,EAAE,cAAc,EAAE,QAAQ,CAAC,GAAG,IAAI,EACpF,OAAO,EAAE,MAAM,GACd,IAAI,CAEN;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"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"}
|
package/dist/commands/server.js
CHANGED
|
@@ -974,6 +974,13 @@ let _standDownRegistryRef = () => null;
|
|
|
974
974
|
const _handbackSeenTokens = new Set();
|
|
975
975
|
let _handbackCanary = null;
|
|
976
976
|
let _handbackSendOffer = null;
|
|
977
|
+
// A2A cross-machine route (docs/specs/a2a-cross-machine-route.md). ONE shared
|
|
978
|
+
// context for the relay-send route and the two mesh handlers. The boot secret
|
|
979
|
+
// lives ONLY here, in memory — never env, config or logs. `forward` and
|
|
980
|
+
// `_a2aAskTopicOwner` are assigned where the MeshRpcClient exists; until then a
|
|
981
|
+
// standby answers today's 503 and a topic-bound reply takes today's path.
|
|
982
|
+
let _a2aRelayForwardCtx = null;
|
|
983
|
+
let _a2aAskTopicOwner = null;
|
|
977
984
|
let _deliverA2aToMachine = null;
|
|
978
985
|
// Subscription & Auth Standard P1.3 — quota-aware account-swap scheduler. Null
|
|
979
986
|
// until wired (requires SessionRefresh + the subscription pool).
|
|
@@ -16745,6 +16752,17 @@ export async function startServer(options) {
|
|
|
16745
16752
|
// router immediately.
|
|
16746
16753
|
const { SalienceGate } = await import('../threadline/SalienceGate.js');
|
|
16747
16754
|
const { TopicLinkageHandler } = await import('../threadline/TopicLinkageHandler.js');
|
|
16755
|
+
// A2A cross-machine route: the shared forward context. The secret is minted
|
|
16756
|
+
// here, once per boot, and held in memory only.
|
|
16757
|
+
const a2aRelayForwardMod = await import('../threadline/relayForward.js');
|
|
16758
|
+
const a2aRelayForwardCtx = {
|
|
16759
|
+
secret: a2aRelayForwardMod.createForwardSecret(),
|
|
16760
|
+
relaySuppressedByStandby: false,
|
|
16761
|
+
forward: null,
|
|
16762
|
+
counters: a2aRelayForwardMod.createRelayForwardCounters(),
|
|
16763
|
+
};
|
|
16764
|
+
_a2aRelayForwardCtx = a2aRelayForwardCtx;
|
|
16765
|
+
const a2aRelayForwardEnabled = () => a2aRelayForwardMod.resolveRelayForwardEnabled(liveConfig.get('threadline.relayForward.enabled', undefined), config);
|
|
16748
16766
|
const salienceGate = new SalienceGate(); // fallback-only for v1; spec §5.4
|
|
16749
16767
|
let topicLinkageHandler = null;
|
|
16750
16768
|
if (commitmentTracker) {
|
|
@@ -16782,6 +16800,24 @@ export async function startServer(options) {
|
|
|
16782
16800
|
getSessionForTopic: telegram
|
|
16783
16801
|
? (topicId) => telegram.getSessionForTopic(topicId)
|
|
16784
16802
|
: undefined,
|
|
16803
|
+
// A2A cross-machine route §5: a topic-bound reply is typed into the
|
|
16804
|
+
// topic's live session on whichever machine has it. Late-bound: the
|
|
16805
|
+
// mesh client exists only after the multi-machine wiring below.
|
|
16806
|
+
deliverToTopicOwner: (machineId, payload, timeoutMs) => _a2aAskTopicOwner
|
|
16807
|
+
? _a2aAskTopicOwner(machineId, payload, timeoutMs)
|
|
16808
|
+
: Promise.resolve({ injected: false, definitive: false, reason: 'mesh-not-wired' }),
|
|
16809
|
+
remoteReplyEnabled: () => _a2aAskTopicOwner !== null && a2aRelayForwardEnabled(),
|
|
16810
|
+
selfMachineId: () => _meshSelfId,
|
|
16811
|
+
selfMachineName: () => _listPoolMachines?.().find((m) => m.machineId === _meshSelfId)?.nickname ?? _meshSelfId,
|
|
16812
|
+
topicOwnerOf: (topicId) => sessionOwnershipRegistry?.ownerOf(String(topicId)) ?? null,
|
|
16813
|
+
onRemoteReplyEvent: (event) => {
|
|
16814
|
+
if (event === 'ask')
|
|
16815
|
+
a2aRelayForwardCtx.counters.replyAsks++;
|
|
16816
|
+
else if (event === 'injected')
|
|
16817
|
+
a2aRelayForwardCtx.counters.replyInjected++;
|
|
16818
|
+
else
|
|
16819
|
+
a2aRelayForwardCtx.counters.replyFailureVisible++;
|
|
16820
|
+
},
|
|
16785
16821
|
});
|
|
16786
16822
|
threadlineRouter.setTopicLinkageHandler(topicLinkageHandler);
|
|
16787
16823
|
}
|
|
@@ -17098,6 +17134,10 @@ export async function startServer(options) {
|
|
|
17098
17134
|
threadlineShutdown = threadline.shutdown;
|
|
17099
17135
|
threadlineRelayClient = threadline.relayClient;
|
|
17100
17136
|
threadlineGetLastRelayEvent = threadline.getLastRelayEvent;
|
|
17137
|
+
// A2A cross-machine route §1: the boot-time standby fact, threaded from
|
|
17138
|
+
// the bootstrap to the relay-send route. Never recomputed from live config.
|
|
17139
|
+
if (_a2aRelayForwardCtx)
|
|
17140
|
+
_a2aRelayForwardCtx.relaySuppressedByStandby = threadline.relaySuppressedByStandby === true;
|
|
17101
17141
|
// Inbound-id ledger §3/§6: daemon-inbox mode is not covered — never advertise there.
|
|
17102
17142
|
_inboundIdLedgerDaemonDeferred = threadline.daemonHandlingRelay === true;
|
|
17103
17143
|
// Inbound-id ledger §1: the gate consults the ledger AFTER the operation-
|
|
@@ -17478,7 +17518,12 @@ export async function startServer(options) {
|
|
|
17478
17518
|
console.log(`[relay] Resumed session for ${senderName} (thread: ${result.threadId})`);
|
|
17479
17519
|
}
|
|
17480
17520
|
// Relay client is passed to AgentServer → RouteContext for the /threadline/relay-send endpoint
|
|
17481
|
-
|
|
17521
|
+
// Report the client's ACTUAL state. This line used to say "connected"
|
|
17522
|
+
// unconditionally — it only ever meant "handlers wired" — so it could
|
|
17523
|
+
// directly follow a relay rejection (ACT-062).
|
|
17524
|
+
const { describeRelayBootStatus } = await import('../threadline/relayBootStatus.js');
|
|
17525
|
+
const relayBoot = describeRelayBootStatus(config.threadline?.relayUrl ?? DEFAULT_RELAY_HOST, threadlineRelayClient.connectionState, { daemonHandlingRelay: threadline.daemonHandlingRelay === true });
|
|
17526
|
+
console.log((relayBoot.connected ? pc.green : pc.yellow)(` ${relayBoot.text}`));
|
|
17482
17527
|
}
|
|
17483
17528
|
console.log(pc.green(` Threadline: enabled (MCP tools registered, discovery heartbeat active)`));
|
|
17484
17529
|
}
|
|
@@ -22520,6 +22565,37 @@ export async function startServer(options) {
|
|
|
22520
22565
|
: undefined;
|
|
22521
22566
|
return { ...base, journalAdvert, ...(commitmentsAdvert ? { commitmentsAdvert } : {}), ...(preferencesAdvert ? { preferencesAdvert } : {}) };
|
|
22522
22567
|
},
|
|
22568
|
+
// A2A cross-machine route (docs/specs/a2a-cross-machine-route.md).
|
|
22569
|
+
// Both verbs are ALWAYS registered; with the gate off both refuse.
|
|
22570
|
+
// §3 — the holder runs the complete ordinary relay-send route by a
|
|
22571
|
+
// loopback call marked with the boot secret; it refuses when this
|
|
22572
|
+
// machine is itself a relay standby (the loop stop).
|
|
22573
|
+
'a2a-relay-forward': async (cmd, sender) => {
|
|
22574
|
+
const fwd = _a2aRelayForwardCtx;
|
|
22575
|
+
if (!fwd)
|
|
22576
|
+
return { outcome: 'refused', reason: 'relay-forward-not-wired' };
|
|
22577
|
+
const mod = await import('../threadline/relayForward.js');
|
|
22578
|
+
return mod.handleRelayForwardCommand(cmd, sender, {
|
|
22579
|
+
enabled: () => mod.resolveRelayForwardEnabled(liveConfig.get('threadline.relayForward.enabled', undefined), config),
|
|
22580
|
+
relaySuppressedByStandby: () => fwd.relaySuppressedByStandby,
|
|
22581
|
+
secret: fwd.secret,
|
|
22582
|
+
loopbackUrl: `http://127.0.0.1:${config.port}`,
|
|
22583
|
+
authToken: config.authToken ?? '',
|
|
22584
|
+
counters: fwd.counters,
|
|
22585
|
+
});
|
|
22586
|
+
},
|
|
22587
|
+
// §5 — type a reply into THIS machine's own live session for the
|
|
22588
|
+
// topic (the confirmed paste). Never spawns, never moves the topic.
|
|
22589
|
+
'a2a-topic-reply-inject': async (cmd) => {
|
|
22590
|
+
const mod = await import('../threadline/relayForward.js');
|
|
22591
|
+
return mod.handleTopicReplyInjectCommand(cmd, {
|
|
22592
|
+
enabled: () => mod.resolveRelayForwardEnabled(liveConfig.get('threadline.relayForward.enabled', undefined), config),
|
|
22593
|
+
getSessionForTopic: (topicId) => telegram?.getSessionForTopic(topicId) ?? null,
|
|
22594
|
+
isSessionAlive: (name) => sessionManager.isSessionAlive(name),
|
|
22595
|
+
inject: (name, text) => sessionManager.injectPasteNotificationConfirmed(name, text),
|
|
22596
|
+
counters: _a2aRelayForwardCtx?.counters,
|
|
22597
|
+
});
|
|
22598
|
+
},
|
|
22523
22599
|
'a2a-inbox-deliver': async (cmd, sender) => {
|
|
22524
22600
|
const c = cmd;
|
|
22525
22601
|
const { handleA2aMeshInbox } = await import('../core/A2aMeshInbox.js');
|
|
@@ -23017,6 +23093,31 @@ export async function startServer(options) {
|
|
|
23017
23093
|
return 'timeout'; /* @silent-fallback-ok — a transport fault reads as timeout: the holder KEEPS HOLDING (claim-before-release, the safe direction) */
|
|
23018
23094
|
}
|
|
23019
23095
|
};
|
|
23096
|
+
// A2A cross-machine route — the SENDING legs over the signed mesh RPC.
|
|
23097
|
+
// §1/§2: a relay standby finds my relay-holding machine and forwards
|
|
23098
|
+
// one send. §5: the holder asks a topic's machine to inject a reply.
|
|
23099
|
+
if (_a2aRelayForwardCtx) {
|
|
23100
|
+
const fwdMod = await import('../threadline/relayForward.js');
|
|
23101
|
+
const { IdentityManager: ThreadlineIdentityManager } = await import('../threadline/client/IdentityManager.js');
|
|
23102
|
+
const holderFinder = new fwdMod.RelayHolderFinder({
|
|
23103
|
+
listPeers: () => meshIdMgr.getActiveMachines()
|
|
23104
|
+
.filter((m) => m.machineId !== meshSelfId)
|
|
23105
|
+
.map((m) => ({ machineId: m.machineId, url: peerUrl(m.machineId) ?? '', nickname: m.entry.nickname }))
|
|
23106
|
+
.filter((p) => p.url !== ''),
|
|
23107
|
+
ownFingerprint: () => new ThreadlineIdentityManager(config.stateDir).get()?.fingerprint ?? null,
|
|
23108
|
+
});
|
|
23109
|
+
const relayForwarder = new fwdMod.RelayForwarder({
|
|
23110
|
+
finder: holderFinder,
|
|
23111
|
+
send: (peer, command, timeoutMs) => meshClient.send({ machineId: peer.machineId, url: peer.url }, command, 0, { timeoutMs }),
|
|
23112
|
+
});
|
|
23113
|
+
_a2aRelayForwardCtx.forward = (command) => relayForwarder.forward(command);
|
|
23114
|
+
_a2aAskTopicOwner = (machineId, payload, timeoutMs) => fwdMod.askTopicOwner(async (id, command, t) => {
|
|
23115
|
+
const url = peerUrl(id);
|
|
23116
|
+
if (!url)
|
|
23117
|
+
return null;
|
|
23118
|
+
return meshClient.send({ machineId: id, url }, command, 0, { timeoutMs: t });
|
|
23119
|
+
}, machineId, payload, timeoutMs);
|
|
23120
|
+
}
|
|
23020
23121
|
_deliverA2aToMachine = async (input) => {
|
|
23021
23122
|
const url = peerUrl(input.machineId);
|
|
23022
23123
|
if (!url)
|
|
@@ -26377,7 +26478,7 @@ export async function startServer(options) {
|
|
|
26377
26478
|
const server = new AgentServer({ config, singleInstanceLock, terminateSessionAuthority: terminateWithAuthority, subscriptionEmailBinding: credentialLocationLedger, subscriptionEmailBarrier, subscriptionIdentityOracle, sessionManager, llmQueue: sharedLlmQueue, state, scheduler, telegram, telegramOrigin: telegramOriginBoot?.runtime, 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) {
|
|
26378
26479
|
peers = (_listPoolMachines?.() ?? []).filter((m) => m.machineId !== _meshSelfId && !!m.lastKnownUrl).map((m) => ({ machineId: m.machineId, nickname: m.nickname ?? m.machineId, url: m.lastKnownUrl }));
|
|
26379
26480
|
} if (peers.length === 0)
|
|
26380
|
-
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, relayVerdictCounters: threadlineRelayClient ? (() => ({ ...threadlineRelayClient.relayVerdictCounters, expiredMismatchIgnored: a2aDeliveryTracker?.expiredMismatchIgnored ?? 0 })) : undefined, inboundIdLedger: _inboundIdLedger ?? undefined, inboundIdLedgerDaemonDeferred: () => _inboundIdLedgerDaemonDeferred, 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, jevMemoryPicker, 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, passkeyRevokeOutbox: _passkeyRevokeOutbox ? () => _passkeyRevokeOutbox : undefined, passkeyPeerOnline: _passkeyPeerOnline, passkeyPoolReader: _passkeyPoolReader ? () => _passkeyPoolReader : undefined, passkeyProofBrowser: async (profileDir) => { const { ChromeCdpReloginBrowser } = await import('../core/ChromeCdpReloginBrowser.js'); return new ChromeCdpReloginBrowser({ userDataDir: profileDir, passkeyMode: true, headless: true, launchTimeoutMs: 30_000, operationTimeoutMs: 20_000 }); }, 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, standDownRegistry: _standDownRegistry ?? undefined, standDownAudit: _standDownAudit ?? undefined, operatorStopRecorder: recordOperatorStop, sleepWakeDetector, unjustifiedStopGate, stopGateDb, stopNotifier, liveTestGate, liveTestGateMode, liveTestRunnerCtx }); // Resolve the late-bound topic-operator getter (increment 2e): routing was
|
|
26481
|
+
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, a2aRelayForward: _a2aRelayForwardCtx ?? undefined, threadlineReplyWaiters, listenerManager: listenerManager ?? undefined, a2aDeliveryTracker: a2aDeliveryTracker ?? undefined, relayVerdictCounters: threadlineRelayClient ? (() => ({ ...threadlineRelayClient.relayVerdictCounters, expiredMismatchIgnored: a2aDeliveryTracker?.expiredMismatchIgnored ?? 0 })) : undefined, inboundIdLedger: _inboundIdLedger ?? undefined, inboundIdLedgerDaemonDeferred: () => _inboundIdLedgerDaemonDeferred, 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, jevMemoryPicker, 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, passkeyRevokeOutbox: _passkeyRevokeOutbox ? () => _passkeyRevokeOutbox : undefined, passkeyPeerOnline: _passkeyPeerOnline, passkeyPoolReader: _passkeyPoolReader ? () => _passkeyPoolReader : undefined, passkeyProofBrowser: async (profileDir) => { const { ChromeCdpReloginBrowser } = await import('../core/ChromeCdpReloginBrowser.js'); return new ChromeCdpReloginBrowser({ userDataDir: profileDir, passkeyMode: true, headless: true, launchTimeoutMs: 30_000, operationTimeoutMs: 20_000 }); }, 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, standDownRegistry: _standDownRegistry ?? undefined, standDownAudit: _standDownAudit ?? undefined, operatorStopRecorder: recordOperatorStop, sleepWakeDetector, unjustifiedStopGate, stopGateDb, stopNotifier, liveTestGate, liveTestGateMode, liveTestRunnerCtx }); // Resolve the late-bound topic-operator getter (increment 2e): routing was
|
|
26381
26482
|
const readIdentityProjectionPeerRows = async () => {
|
|
26382
26483
|
const peers = _resolvePeerUrls?.() ?? [];
|
|
26383
26484
|
const extra = config.multiMachine?.peerUrlAllowlist;
|