instar 1.3.629 → 1.3.631

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 (61) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +129 -6
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/config/ConfigDefaults.d.ts.map +1 -1
  5. package/dist/config/ConfigDefaults.js +24 -0
  6. package/dist/config/ConfigDefaults.js.map +1 -1
  7. package/dist/core/HttpLeaseTransport.d.ts +56 -3
  8. package/dist/core/HttpLeaseTransport.d.ts.map +1 -1
  9. package/dist/core/HttpLeaseTransport.js +191 -51
  10. package/dist/core/HttpLeaseTransport.js.map +1 -1
  11. package/dist/core/LeaseCoordinator.d.ts +37 -0
  12. package/dist/core/LeaseCoordinator.d.ts.map +1 -1
  13. package/dist/core/LeaseCoordinator.js +40 -0
  14. package/dist/core/LeaseCoordinator.js.map +1 -1
  15. package/dist/core/MachineIdentity.d.ts +11 -0
  16. package/dist/core/MachineIdentity.d.ts.map +1 -1
  17. package/dist/core/MachineIdentity.js +22 -0
  18. package/dist/core/MachineIdentity.js.map +1 -1
  19. package/dist/core/MeshUrlAdvertiser.d.ts +73 -0
  20. package/dist/core/MeshUrlAdvertiser.d.ts.map +1 -1
  21. package/dist/core/MeshUrlAdvertiser.js +152 -0
  22. package/dist/core/MeshUrlAdvertiser.js.map +1 -1
  23. package/dist/core/MultiMachineCoordinator.d.ts +14 -0
  24. package/dist/core/MultiMachineCoordinator.d.ts.map +1 -1
  25. package/dist/core/MultiMachineCoordinator.js +20 -0
  26. package/dist/core/MultiMachineCoordinator.js.map +1 -1
  27. package/dist/core/PeerEndpointResolver.d.ts +0 -0
  28. package/dist/core/PeerEndpointResolver.d.ts.map +1 -0
  29. package/dist/core/PeerEndpointResolver.js +0 -0
  30. package/dist/core/PeerEndpointResolver.js.map +1 -0
  31. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  32. package/dist/core/PostUpdateMigrator.js +10 -0
  33. package/dist/core/PostUpdateMigrator.js.map +1 -1
  34. package/dist/core/devGatedFeatures.d.ts.map +1 -1
  35. package/dist/core/devGatedFeatures.js +5 -0
  36. package/dist/core/devGatedFeatures.js.map +1 -1
  37. package/dist/core/types.d.ts +65 -0
  38. package/dist/core/types.d.ts.map +1 -1
  39. package/dist/core/types.js.map +1 -1
  40. package/dist/scaffold/templates.d.ts.map +1 -1
  41. package/dist/scaffold/templates.js +2 -0
  42. package/dist/scaffold/templates.js.map +1 -1
  43. package/dist/server/AgentServer.d.ts +11 -0
  44. package/dist/server/AgentServer.d.ts.map +1 -1
  45. package/dist/server/AgentServer.js +24 -2
  46. package/dist/server/AgentServer.js.map +1 -1
  47. package/dist/server/machineAuth.d.ts +24 -0
  48. package/dist/server/machineAuth.d.ts.map +1 -1
  49. package/dist/server/machineAuth.js +71 -0
  50. package/dist/server/machineAuth.js.map +1 -1
  51. package/dist/server/machineRoutes.d.ts +7 -1
  52. package/dist/server/machineRoutes.d.ts.map +1 -1
  53. package/dist/server/machineRoutes.js +28 -3
  54. package/dist/server/machineRoutes.js.map +1 -1
  55. package/package.json +1 -1
  56. package/src/data/builtin-manifest.json +22 -22
  57. package/src/scaffold/templates.ts +2 -0
  58. package/upgrades/1.3.630.md +38 -0
  59. package/upgrades/1.3.631.md +35 -0
  60. package/upgrades/side-effects/multi-transport-mesh-bind-predicate-fix.md +26 -0
  61. package/upgrades/side-effects/multi-transport-mesh-comms.md +70 -0
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAoCH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAS3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AAwBjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAkH7D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AAsBtD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC1C,OAAO,CAUT;AAyID,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAy4CD,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,GACpD,IAAI,CA8eN;AA2lBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAy8etE;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;AAoCH,OAAO,EAAE,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAS3D,OAAO,EAAE,eAAe,EAAiC,MAAM,iCAAiC,CAAC;AAwBjG,OAAO,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAGvD,OAAO,EAAE,YAAY,EAAE,MAAM,+BAA+B,CAAC;AAmH7D,OAAO,EAAE,WAAW,EAAE,MAAM,yBAAyB,CAAC;AA+EtD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,yBAAyB,CACvC,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,MAAM,EACf,gBAAgB,EAAE,MAAM,GAAG,IAAI,GAAG,SAAS,GAC1C,OAAO,CAUT;AAyID,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAy4CD,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,GACpD,IAAI,CA8eN;AA2lBD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAohftE;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"}
@@ -85,7 +85,8 @@ import { MultiMachineCoordinator } from '../core/MultiMachineCoordinator.js';
85
85
  import { isRemotelyHandled } from '../core/SessionRouter.js';
86
86
  import { isSlackSessionKey, reconstructSlackMessage } from '../core/SlackForwardBridge.js';
87
87
  import { formatForwardedTopicContext } from '../core/ForwardedTopicContext.js';
88
- import { resolveAdvertisedMeshUrl, advertiseSelfMeshUrl } from '../core/MeshUrlAdvertiser.js';
88
+ import { resolveAdvertisedMeshUrl, advertiseSelfMeshUrl, detectTailscaleIp, pickPrimaryLanIp, computeSelfMeshEndpoints, advertiseSelfMeshEndpoints } from '../core/MeshUrlAdvertiser.js';
89
+ import { PeerEndpointResolver } from '../core/PeerEndpointResolver.js';
89
90
  import { relayOutbound } from '../core/TelegramRelay.js';
90
91
  import { GitSyncManager } from '../core/GitSync.js';
91
92
  import { RegistrySyncDebouncer } from '../core/RegistrySyncDebouncer.js';
@@ -174,6 +175,62 @@ import { toInjection } from '../types/pipeline.js';
174
175
  import { UserManager } from '../users/UserManager.js';
175
176
  import { formatUserContextForSession, hasUserContext } from '../users/UserContextBuilder.js';
176
177
  import { SafeFsExecutor } from '../core/SafeFsExecutor.js';
178
+ // setup.ts uses @inquirer/prompts which requires Node 20.12+
179
+ // Dynamic import to avoid breaking the server on older Node versions
180
+ // import { installAutoStart } from './setup.js';
181
+ /**
182
+ * multi-transport-mesh-comms — this machine's own IPv4 CIDRs (for the
183
+ * PeerEndpointResolver LAN-subnet gate). Each non-internal IPv4 interface address
184
+ * with its prefix length, e.g. '192.168.87.67/24'. Pure read of os.networkInterfaces().
185
+ */
186
+ function ownIpv4Cidrs() {
187
+ const out = [];
188
+ const ifaces = os.networkInterfaces();
189
+ for (const addrs of Object.values(ifaces)) {
190
+ for (const a of addrs ?? []) {
191
+ const isV4 = a.family === 'IPv4' || a.family === 4;
192
+ if (isV4 && !a.internal && typeof a.cidr === 'string' && a.cidr)
193
+ out.push(a.cidr);
194
+ }
195
+ }
196
+ return out;
197
+ }
198
+ /**
199
+ * multi-transport-mesh-comms (Layer 0) — compute + advertise THIS machine's mesh
200
+ * endpoint set (Tailscale / LAN / Cloudflare) into its registry entry, co-located
201
+ * with the lastKnownUrl advertise. Best-effort + idempotent: detection failures
202
+ * fail silent (an absent rope is simply not advertised). No-op when the mesh
203
+ * transport is disabled. Called at boot + on sleep/wake tunnel restart.
204
+ */
205
+ async function advertiseSelfMeshEndpointsNow(identityManager, machineId, cfg, cloudflareUrl) {
206
+ try {
207
+ // Gate on the CANONICAL multi-machine signal (has a machine identity) — NOT the
208
+ // near-dead `multiMachine.enabled` field a real multi-machine agent never sets
209
+ // (that wrong predicate shipped the advertiser inert in 1.3.630; caught in
210
+ // live-verify). meshTransport.enabled:false is the explicit opt-out.
211
+ if (!identityManager.hasIdentity() || cfg.multiMachine?.meshTransport?.enabled === false)
212
+ return;
213
+ const tailscaleEnabled = cfg.multiMachine?.meshTransport?.tailscaleEnabled !== false;
214
+ const tailscaleIp = tailscaleEnabled ? await detectTailscaleIp() : null;
215
+ const lanIp = pickPrimaryLanIp(os.networkInterfaces());
216
+ const endpoints = computeSelfMeshEndpoints({
217
+ cloudflareUrl,
218
+ lanIp,
219
+ tailscaleIp,
220
+ port: cfg.port ?? 4042,
221
+ tailscaleEnabled,
222
+ });
223
+ // E2E-PAIRING: EXEMPT — this commit is comment-only (@silent-fallback-ok ratchet
224
+ // tags); it adds NO new route. The mesh routes/fields shipped in the prior commit
225
+ // (1cd2618e) with their integration + 2-server tests.
226
+ advertiseSelfMeshEndpoints(identityManager, machineId, endpoints, (m) => console.log(pc.dim(m)));
227
+ }
228
+ catch {
229
+ // @silent-fallback-ok: best-effort — endpoint advertisement must never break boot
230
+ // (a Tailscale-detect/registry hiccup just means fewer advertised ropes this tick;
231
+ // the next heartbeat retries and the mesh degrades to the remaining ropes).
232
+ }
233
+ }
177
234
  /**
178
235
  * Pure: should the emergency "fix command" gate intercept this message?
179
236
  *
@@ -3895,14 +3952,47 @@ export async function startServer(options) {
3895
3952
  // stays true, so the lease behaves exactly as git-only. Multi-machine
3896
3953
  // meshes get RTT-bounded acquisition + the renewal-requires-medium rule.
3897
3954
  let leaseSeq = Date.now();
3955
+ // multi-transport-mesh-comms (Layer 1) — the hedged-failover resolver,
3956
+ // built from the FLAT meshTransport config. Injected into the transport;
3957
+ // when meshTransport.enabled is false the transport falls back to the
3958
+ // single-`url` legacy path (byte-for-byte today).
3959
+ const meshCfg = config.multiMachine?.meshTransport;
3960
+ const meshEnabled = () => meshCfg?.enabled !== false; // default ON
3961
+ const meshResolver = new PeerEndpointResolver({
3962
+ config: {
3963
+ enabled: meshCfg?.enabled !== false,
3964
+ hedgeDelayMs: meshCfg?.hedgeDelayMs ?? 1500,
3965
+ priorityTailscale: meshCfg?.priorityTailscale ?? 10,
3966
+ priorityLan: meshCfg?.priorityLan ?? 20,
3967
+ priorityCloudflare: meshCfg?.priorityCloudflare ?? 30,
3968
+ tailscaleEnabled: meshCfg?.tailscaleEnabled !== false,
3969
+ lanSubnetGate: meshCfg?.lanSubnetGate !== false,
3970
+ unhealthyAfterFailures: meshCfg?.unhealthyAfterFailures ?? 3,
3971
+ endpointEvictionMs: meshCfg?.endpointEvictionMs ?? 3_600_000,
3972
+ maxProbeBackoffMs: meshCfg?.maxProbeBackoffMs ?? 300_000,
3973
+ requestTimeoutMs: Math.min(seamlessness.leaseTtlMs / 2, 30_000),
3974
+ },
3975
+ ownCidrs: () => ownIpv4Cidrs(),
3976
+ logger: (m) => console.log(pc.dim(m)),
3977
+ });
3898
3978
  leaseTransport = new HttpLeaseTransport({
3899
3979
  selfMachineId,
3900
3980
  signingKeyPem: idMgr.loadSigningKey(),
3901
3981
  peers: () => {
3902
3982
  const reg = idMgr.loadRegistry();
3903
3983
  return Object.entries(reg.machines ?? {})
3904
- .filter(([id, e]) => id !== selfMachineId && !!e.lastKnownUrl && !e.revokedAt)
3905
- .map(([id, e]) => ({ machineId: id, url: e.lastKnownUrl }));
3984
+ .filter(([id, e]) => id !== selfMachineId && (!!e.lastKnownUrl || (e.endpoints?.length ?? 0) > 0) && !e.revokedAt)
3985
+ .map(([id, e]) => ({
3986
+ machineId: id,
3987
+ url: (e.lastKnownUrl ?? ''),
3988
+ endpoints: e.endpoints,
3989
+ publicKeyPem: idMgr.getSigningPublicKeyPem(id),
3990
+ // Rolling-deploy gate: a peer that advertises an endpoint set is
3991
+ // running THIS build (the field + the accept-ack receiver ship
3992
+ // atomically), so it is ack-capable. An older peer (no endpoints,
3993
+ // or no resolvable pubkey) stays on the 2xx back-compat path.
3994
+ meshAckCapable: (e.endpoints?.length ?? 0) > 0 && !!idMgr.getSigningPublicKeyPem(id),
3995
+ }));
3906
3996
  },
3907
3997
  nextSequence: () => ++leaseSeq,
3908
3998
  reachabilityWindowMs: seamlessness.leaseTtlMs,
@@ -3911,6 +4001,9 @@ export async function startServer(options) {
3911
4001
  // the whole TTL, but ABOVE the fleet's 5-40s receiver-stall envelope
3912
4002
  // so a slow-but-alive peer isn't converted into "no medium".
3913
4003
  requestTimeoutMs: Math.min(seamlessness.leaseTtlMs / 2, 30_000),
4004
+ resolver: meshResolver,
4005
+ meshTransportEnabled: meshEnabled,
4006
+ hedgeDelayMs: meshCfg?.hedgeDelayMs ?? 1500,
3914
4007
  logger: (m) => console.log(pc.dim(m)),
3915
4008
  });
3916
4009
  const leaseCoordinator = new LeaseCoordinator({
@@ -3940,6 +4033,30 @@ export async function startServer(options) {
3940
4033
  return null;
3941
4034
  return { enabled: true, nonRenewalMissedObservations: sht.nonRenewalMissedObservations ?? 6 };
3942
4035
  },
4036
+ // multi-transport-mesh-comms Layer 3 (soloCaptainHold) — DARK by default.
4037
+ // Resolved live; the three gates are EXISTING signals: the F4 preferred-awake
4038
+ // config (this machine is the named preferred), every peer presumed-gone by
4039
+ // the same liveness timeout presumedDeadHolders uses, and (checked inside the
4040
+ // coordinator) no higher epoch.
4041
+ soloCaptainHold: () => {
4042
+ const sch = config.multiMachine?.leaseSelfHeal?.soloCaptainHold;
4043
+ return sch?.enabled ? { enabled: true } : null;
4044
+ },
4045
+ isPreferredAwakeAgreed: () => {
4046
+ const pref = config.multiMachine?.leaseSelfHeal?.preferredAwakeMachineId;
4047
+ return !!pref && pref === selfMachineId;
4048
+ },
4049
+ allPeersPresumedGone: () => {
4050
+ const reg = idMgr.loadRegistry();
4051
+ const nowMs = Date.now();
4052
+ const peerIds = Object.keys(reg.machines ?? {}).filter((id) => id !== selfMachineId && !reg.machines[id].revokedAt);
4053
+ if (peerIds.length === 0)
4054
+ return false; // a solo machine never "holds against" a peer
4055
+ return peerIds.every((id) => {
4056
+ const last = Date.parse(reg.machines[id].lastSeen);
4057
+ return !Number.isNaN(last) && nowMs - last > seamlessness.failoverThresholdMs;
4058
+ });
4059
+ },
3943
4060
  onSelfSuspend: (reason) => console.log(pc.yellow(` [lease] self-suspend: ${reason}`)),
3944
4061
  onEscalate: (info) => console.log(pc.yellow(` [lease] split-brain escalation: ${info.reason} (holder ${info.holder})`)),
3945
4062
  logger: (m) => console.log(pc.dim(m)),
@@ -11128,7 +11245,10 @@ export async function startServer(options) {
11128
11245
  // now stale; peers must learn the new one or cross-machine routing
11129
11246
  // silently breaks post-wake.
11130
11247
  if (coordinator.enabled && coordinator.identity) {
11131
- advertiseSelfMeshUrl(coordinator.managers.identityManager, coordinator.identity.machineId, resolveAdvertisedMeshUrl(config.tunnel, tunnelUrl), (m) => console.log(pc.dim(m)));
11248
+ const cfUrl = resolveAdvertisedMeshUrl(config.tunnel, tunnelUrl);
11249
+ advertiseSelfMeshUrl(coordinator.managers.identityManager, coordinator.identity.machineId, cfUrl, (m) => console.log(pc.dim(m)));
11250
+ // multi-transport-mesh-comms — re-advertise endpoints post-wake.
11251
+ await advertiseSelfMeshEndpointsNow(coordinator.managers.identityManager, coordinator.identity.machineId, config, cfUrl);
11132
11252
  }
11133
11253
  // Re-broadcast dashboard URL after tunnel restart (quick tunnels get new URL)
11134
11254
  if (tunnelUrl) {
@@ -17073,7 +17193,7 @@ export async function startServer(options) {
17073
17193
  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, cartographer: cartographer ?? 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) {
17074
17194
  peers = (_listPoolMachines?.() ?? []).filter((m) => m.machineId !== _meshSelfId && !!m.lastKnownUrl).map((m) => ({ machineId: m.machineId, nickname: m.nickname ?? m.machineId, url: m.lastKnownUrl }));
17075
17195
  } if (peers.length === 0)
17076
- 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, 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, threadLog, threadMessageRecorder, 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, getInboundQueue: () => _inboundQueue, meshRpcDispatcher, workingSetPullCoordinator, commitmentReplicaStore, preferenceReplicaStore, replicatedRecordEmitter, conflictStore, rollbackUnmerge, droppedOriginRegistry, preferencesUnionReader, forwardCommitmentMutate, sessionOwnershipRegistry, topicPinStore: _topicPinStore ?? 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, orphanedWorkSentinel, mcpProcessReaper, geminiLoopRunner, sleepController, agentActivityState, reapLog, resumeQueue, resumeDrainer, autonomousLivenessReconciler, prHandLease: prHandLease ?? undefined, operatorStopRecorder: recordOperatorStop, sleepWakeDetector, unjustifiedStopGate, stopGateDb, stopNotifier, liveTestGate, liveTestGateMode, liveTestRunnerCtx }); // Resolve the late-bound topic-operator getter (increment 2e): routing was
17196
+ 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, 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, threadLog, threadMessageRecorder, 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, getInboundQueue: () => _inboundQueue, meshRpcDispatcher, workingSetPullCoordinator, commitmentReplicaStore, preferenceReplicaStore, replicatedRecordEmitter, conflictStore, rollbackUnmerge, droppedOriginRegistry, preferencesUnionReader, forwardCommitmentMutate, sessionOwnershipRegistry, topicPinStore: _topicPinStore ?? 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, orphanedWorkSentinel, mcpProcessReaper, geminiLoopRunner, sleepController, agentActivityState, reapLog, resumeQueue, resumeDrainer, autonomousLivenessReconciler, prHandLease: prHandLease ?? undefined, operatorStopRecorder: recordOperatorStop, sleepWakeDetector, unjustifiedStopGate, stopGateDb, stopNotifier, liveTestGate, liveTestGateMode, liveTestRunnerCtx }); // Resolve the late-bound topic-operator getter (increment 2e): routing was
17077
17197
  // wired before the server existed; from here on inbound binds use the
17078
17198
  // server's own store instance.
17079
17199
  _agentServerRef = server;
@@ -17584,7 +17704,10 @@ export async function startServer(options) {
17584
17704
  // out (the session pool is inert across machines). The existing
17585
17705
  // RegistrySyncDebouncer propagates the populated entry to peers.
17586
17706
  if (coordinator.enabled && coordinator.identity) {
17587
- advertiseSelfMeshUrl(coordinator.managers.identityManager, coordinator.identity.machineId, resolveAdvertisedMeshUrl(config.tunnel, tunnelUrl), (m) => console.log(pc.dim(m)));
17707
+ const cfUrl = resolveAdvertisedMeshUrl(config.tunnel, tunnelUrl);
17708
+ advertiseSelfMeshUrl(coordinator.managers.identityManager, coordinator.identity.machineId, cfUrl, (m) => console.log(pc.dim(m)));
17709
+ // multi-transport-mesh-comms (Layer 0) — advertise the full endpoint set.
17710
+ await advertiseSelfMeshEndpointsNow(coordinator.managers.identityManager, coordinator.identity.machineId, config, cfUrl);
17588
17711
  }
17589
17712
  }
17590
17713
  catch (err) {