instar 1.3.18 → 1.3.20

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 (101) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +104 -6
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/FencedLease.d.ts +126 -0
  5. package/dist/core/FencedLease.d.ts.map +1 -0
  6. package/dist/core/FencedLease.js +189 -0
  7. package/dist/core/FencedLease.js.map +1 -0
  8. package/dist/core/GitLeaseStore.d.ts +46 -0
  9. package/dist/core/GitLeaseStore.d.ts.map +1 -0
  10. package/dist/core/GitLeaseStore.js +79 -0
  11. package/dist/core/GitLeaseStore.js.map +1 -0
  12. package/dist/core/GitSync.d.ts +19 -0
  13. package/dist/core/GitSync.d.ts.map +1 -1
  14. package/dist/core/GitSync.js +77 -0
  15. package/dist/core/GitSync.js.map +1 -1
  16. package/dist/core/HandoffSentinel.d.ts +80 -0
  17. package/dist/core/HandoffSentinel.d.ts.map +1 -0
  18. package/dist/core/HandoffSentinel.js +141 -0
  19. package/dist/core/HandoffSentinel.js.map +1 -0
  20. package/dist/core/LeaseCoordinator.d.ts +141 -0
  21. package/dist/core/LeaseCoordinator.d.ts.map +1 -0
  22. package/dist/core/LeaseCoordinator.js +226 -0
  23. package/dist/core/LeaseCoordinator.js.map +1 -0
  24. package/dist/core/LiveTailBuffer.d.ts +64 -0
  25. package/dist/core/LiveTailBuffer.d.ts.map +1 -0
  26. package/dist/core/LiveTailBuffer.js +122 -0
  27. package/dist/core/LiveTailBuffer.js.map +1 -0
  28. package/dist/core/MultiMachineCoordinator.d.ts +49 -0
  29. package/dist/core/MultiMachineCoordinator.d.ts.map +1 -1
  30. package/dist/core/MultiMachineCoordinator.js +136 -0
  31. package/dist/core/MultiMachineCoordinator.js.map +1 -1
  32. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  33. package/dist/core/PostUpdateMigrator.js +24 -0
  34. package/dist/core/PostUpdateMigrator.js.map +1 -1
  35. package/dist/core/RegistrySyncDebouncer.d.ts +77 -0
  36. package/dist/core/RegistrySyncDebouncer.d.ts.map +1 -0
  37. package/dist/core/RegistrySyncDebouncer.js +131 -0
  38. package/dist/core/RegistrySyncDebouncer.js.map +1 -0
  39. package/dist/core/liveTailRedaction.d.ts +36 -0
  40. package/dist/core/liveTailRedaction.d.ts.map +1 -0
  41. package/dist/core/liveTailRedaction.js +57 -0
  42. package/dist/core/liveTailRedaction.js.map +1 -0
  43. package/dist/core/registryReplayGuard.d.ts +59 -0
  44. package/dist/core/registryReplayGuard.d.ts.map +1 -0
  45. package/dist/core/registryReplayGuard.js +86 -0
  46. package/dist/core/registryReplayGuard.js.map +1 -0
  47. package/dist/core/seamlessnessConfig.d.ts +79 -0
  48. package/dist/core/seamlessnessConfig.d.ts.map +1 -0
  49. package/dist/core/seamlessnessConfig.js +131 -0
  50. package/dist/core/seamlessnessConfig.js.map +1 -0
  51. package/dist/core/types.d.ts +117 -0
  52. package/dist/core/types.d.ts.map +1 -1
  53. package/dist/core/types.js.map +1 -1
  54. package/dist/core/wireRegistrySync.d.ts +32 -0
  55. package/dist/core/wireRegistrySync.d.ts.map +1 -0
  56. package/dist/core/wireRegistrySync.js +31 -0
  57. package/dist/core/wireRegistrySync.js.map +1 -0
  58. package/dist/feedback-factory/dispatch/dispatch.d.ts +47 -0
  59. package/dist/feedback-factory/dispatch/dispatch.d.ts.map +1 -0
  60. package/dist/feedback-factory/dispatch/dispatch.js +72 -0
  61. package/dist/feedback-factory/dispatch/dispatch.js.map +1 -0
  62. package/dist/feedback-factory/processor/reopen.d.ts +39 -0
  63. package/dist/feedback-factory/processor/reopen.d.ts.map +1 -0
  64. package/dist/feedback-factory/processor/reopen.js +41 -0
  65. package/dist/feedback-factory/processor/reopen.js.map +1 -0
  66. package/dist/messaging/FencedOutbox.d.ts +42 -0
  67. package/dist/messaging/FencedOutbox.d.ts.map +1 -0
  68. package/dist/messaging/FencedOutbox.js +60 -0
  69. package/dist/messaging/FencedOutbox.js.map +1 -0
  70. package/dist/messaging/MessageProcessingLedger.d.ts +105 -0
  71. package/dist/messaging/MessageProcessingLedger.d.ts.map +1 -0
  72. package/dist/messaging/MessageProcessingLedger.js +206 -0
  73. package/dist/messaging/MessageProcessingLedger.js.map +1 -0
  74. package/dist/messaging/TelegramAdapter.d.ts +18 -1
  75. package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
  76. package/dist/messaging/TelegramAdapter.js +50 -0
  77. package/dist/messaging/TelegramAdapter.js.map +1 -1
  78. package/dist/scaffold/templates.d.ts.map +1 -1
  79. package/dist/scaffold/templates.js +7 -0
  80. package/dist/scaffold/templates.js.map +1 -1
  81. package/dist/server/AgentServer.d.ts.map +1 -1
  82. package/dist/server/AgentServer.js +1 -0
  83. package/dist/server/AgentServer.js.map +1 -1
  84. package/dist/server/routes.d.ts +2 -0
  85. package/dist/server/routes.d.ts.map +1 -1
  86. package/dist/server/routes.js +6 -0
  87. package/dist/server/routes.js.map +1 -1
  88. package/package.json +1 -1
  89. package/src/data/builtin-manifest.json +64 -64
  90. package/src/scaffold/templates.ts +7 -0
  91. package/upgrades/1.3.19.md +23 -0
  92. package/upgrades/1.3.20.md +23 -0
  93. package/upgrades/side-effects/PR-BODY-cross-machine-seamlessness.md +63 -0
  94. package/upgrades/side-effects/cross-machine-seamlessness-g1-lease.md +71 -0
  95. package/upgrades/side-effects/cross-machine-seamlessness-g2-foundation.md +75 -0
  96. package/upgrades/side-effects/cross-machine-seamlessness-g3-telegram-contract.md +36 -0
  97. package/upgrades/side-effects/cross-machine-seamlessness-g3a-ledger-handoff.md +56 -0
  98. package/upgrades/side-effects/cross-machine-seamlessness-g3bc-livetail-outbox.md +51 -0
  99. package/upgrades/side-effects/cross-machine-seamlessness-p4-awareness-observability.md +54 -0
  100. package/upgrades/side-effects/feedback-factory-dispatch.md +31 -0
  101. package/upgrades/side-effects/feedback-factory-reopen.md +31 -0
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA0QH,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAksDD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAiuMtE;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;AAiRH,UAAU,YAAY;IACpB,UAAU,CAAC,EAAE,OAAO,CAAC;IACrB,GAAG,CAAC,EAAE,MAAM,CAAC;IACb;2DACuD;IACvD,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAksDD,wBAAsB,WAAW,CAAC,OAAO,EAAE,YAAY,GAAG,OAAO,CAAC,IAAI,CAAC,CAuzMtE;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"}
@@ -57,6 +57,13 @@ import { SessionMonitor } from '../monitoring/SessionMonitor.js';
57
57
  import { SessionRecovery } from '../monitoring/SessionRecovery.js';
58
58
  import { MultiMachineCoordinator } from '../core/MultiMachineCoordinator.js';
59
59
  import { GitSyncManager } from '../core/GitSync.js';
60
+ import { RegistrySyncDebouncer } from '../core/RegistrySyncDebouncer.js';
61
+ import { wireRegistrySync } from '../core/wireRegistrySync.js';
62
+ import { assertSeamlessnessInvariants } from '../core/seamlessnessConfig.js';
63
+ import { FencedLease } from '../core/FencedLease.js';
64
+ import { GitLeaseStore } from '../core/GitLeaseStore.js';
65
+ import { LeaseCoordinator } from '../core/LeaseCoordinator.js';
66
+ import { sign as signEd25519, verify as verifyEd25519 } from '../core/MachineIdentity.js';
60
67
  import { ProjectMapper } from '../core/ProjectMapper.js';
61
68
  import { CapabilityMapper } from '../core/CapabilityMapper.js';
62
69
  import { ScopeVerifier } from '../core/ScopeVerifier.js';
@@ -2126,6 +2133,11 @@ export async function startServer(options) {
2126
2133
  console.log(pc.yellow(' Standby mode — processing gated, writes disabled'));
2127
2134
  }
2128
2135
  }
2136
+ // Cross-Machine Seamlessness (spec §9) — resolve + validate the tunable
2137
+ // knobs at startup. A violating config (e.g. a widened ingressHeartbeatMs
2138
+ // that breaks the RPO bound) is REJECTED here with a clear message rather
2139
+ // than degrading silently. Default/absent config resolves to valid values.
2140
+ const seamlessness = assertSeamlessnessInvariants(config.multiMachine);
2129
2141
  // Read local signing key for machine route authentication
2130
2142
  let localSigningKeyPem = '';
2131
2143
  if (coordinator.enabled && coordinator.identity) {
@@ -2141,9 +2153,15 @@ export async function startServer(options) {
2141
2153
  // Only attempt git sync if the project directory is actually a git repo.
2142
2154
  // Standalone agents don't have git repos unless the user opted into cloud backup.
2143
2155
  let gitSync;
2156
+ let registrySyncDebouncer;
2144
2157
  const isGitRepo = fs.existsSync(path.join(config.projectDir, '.git'));
2145
2158
  const gitBackupEnabled = config.gitBackup?.enabled !== false;
2146
- if (coordinator.enabled && coordinator.isAwake && isGitRepo && gitBackupEnabled) {
2159
+ // Construct gitSync for BOTH roles when this is a git-backed mesh machine:
2160
+ // a standby needs it to pull, and a standby that later self-elects to awake
2161
+ // (the Phase-0 scenario) must ALREADY have it so its role-change push fires.
2162
+ // Only an awake machine pulls+pushes at boot; the durable registry push is
2163
+ // driven by the RegistrySyncDebouncer below, gated on authority.
2164
+ if (coordinator.enabled && isGitRepo && gitBackupEnabled) {
2147
2165
  try {
2148
2166
  gitSync = new GitSyncManager({
2149
2167
  projectDir: config.projectDir,
@@ -2157,11 +2175,90 @@ export async function startServer(options) {
2157
2175
  gitSync.configureCommitSigning();
2158
2176
  console.log(pc.green(' Git commit signing configured'));
2159
2177
  }
2160
- // Pull latest on startup
2161
- const syncResult = await gitSync.sync();
2162
- if (syncResult.pulled) {
2163
- console.log(pc.green(` Git sync: pulled ${syncResult.commitsPulled} commit(s)`));
2164
- }
2178
+ // Pull (and auto-push) latest on startup — awake machine only.
2179
+ if (coordinator.isAwake) {
2180
+ const syncResult = await gitSync.sync();
2181
+ if (syncResult.pulled) {
2182
+ console.log(pc.green(` Git sync: pulled ${syncResult.commitsPulled} commit(s)`));
2183
+ }
2184
+ }
2185
+ // ── G2 wiring (spec §8 G2) — the Phase-0 fix, named explicitly ──
2186
+ // MultiMachineCoordinator emits roleChange / leaseEpochChange; without
2187
+ // a subscriber the durable push never fired. wireRegistrySync connects
2188
+ // those events to a debounced, single-writer registry push. A
2189
+ // wiring-integrity test asserts this subscription exists.
2190
+ const gitSyncRef = gitSync;
2191
+ registrySyncDebouncer = new RegistrySyncDebouncer({
2192
+ commitAndPush: (msg, paths) => gitSyncRef.commitAndPush(msg, paths),
2193
+ registryAbsPath: coordinator.managers.identityManager.registryPath,
2194
+ isAuthoritative: () => coordinator.isAwake,
2195
+ debounceMs: seamlessness.registrySyncDebounceMs,
2196
+ logger: (m) => console.log(pc.dim(m)),
2197
+ });
2198
+ wireRegistrySync(coordinator, registrySyncDebouncer);
2199
+ console.log(pc.dim(' Registry sync wired (roleChange/leaseEpoch → durable push)'));
2200
+ // ── G1 fenced-lease integration (spec §6) ──────────────────
2201
+ // The lease becomes the authority for awake/standby. git is the durable
2202
+ // CAS substrate (correct, bounded by git cadence — the tunnel accelerator
2203
+ // is a tracked follow-on, ACT-156-adjacent). A holder that cannot refresh
2204
+ // its lease over git for > leaseTtlMs self-suspends, preventing the
2205
+ // partitioned-old-awake split-brain.
2206
+ const idMgr = coordinator.managers.identityManager;
2207
+ const selfMachineId = coordinator.identity.machineId;
2208
+ const leaseCrypto = {
2209
+ selfMachineId,
2210
+ sign: (canonical) => signEd25519(canonical, idMgr.loadSigningKey()),
2211
+ verify: (canonical, signature, holderMachineId) => {
2212
+ const pub = idMgr.getSigningPublicKeyPem(holderMachineId);
2213
+ if (!pub)
2214
+ return false;
2215
+ try {
2216
+ return verifyEd25519(canonical, signature, pub);
2217
+ }
2218
+ catch {
2219
+ return false;
2220
+ }
2221
+ },
2222
+ };
2223
+ const fencedLease = new FencedLease(leaseCrypto, {
2224
+ leaseTtlMs: seamlessness.leaseTtlMs,
2225
+ failoverThresholdMs: seamlessness.failoverThresholdMs,
2226
+ });
2227
+ const leaseStore = new GitLeaseStore({
2228
+ machineId: selfMachineId,
2229
+ loadRegistry: () => idMgr.loadRegistry(),
2230
+ saveRegistry: (r) => idMgr.saveRegistry(r),
2231
+ registryAbsPath: idMgr.registryPath,
2232
+ pullRebase: () => gitSyncRef.pullRebase(),
2233
+ commitAndPush: (msg, paths) => gitSyncRef.commitAndPush(msg, paths),
2234
+ logger: (m) => console.log(pc.dim(m)),
2235
+ });
2236
+ const leaseCoordinator = new LeaseCoordinator({
2237
+ lease: fencedLease,
2238
+ store: leaseStore,
2239
+ // tunnel accelerator omitted for the launch increment (git-only is
2240
+ // correct; tunnel transport tracked for the follow-on).
2241
+ presumedDeadHolders: () => {
2242
+ const reg = idMgr.loadRegistry();
2243
+ const nowMs = Date.now();
2244
+ const dead = new Set();
2245
+ for (const [id, e] of Object.entries(reg.machines ?? {})) {
2246
+ if (id === selfMachineId)
2247
+ continue;
2248
+ const last = Date.parse(e.lastSeen);
2249
+ if (!Number.isNaN(last) && nowMs - last > seamlessness.failoverThresholdMs)
2250
+ dead.add(id);
2251
+ }
2252
+ return dead;
2253
+ },
2254
+ onEpochAdvance: (epoch) => coordinator.emit('leaseEpochChange', epoch),
2255
+ onSelfSuspend: (reason) => console.log(pc.yellow(` [lease] self-suspend: ${reason}`)),
2256
+ onEscalate: (info) => console.log(pc.yellow(` [lease] split-brain escalation: ${info.reason} (holder ${info.holder})`)),
2257
+ logger: (m) => console.log(pc.dim(m)),
2258
+ });
2259
+ coordinator.attachLeaseCoordinator(leaseCoordinator);
2260
+ await coordinator.initializeLease();
2261
+ console.log(pc.dim(` Fenced lease active (epoch ${leaseCoordinator.currentEpoch()}, holder=${leaseCoordinator.currentHolder() ?? 'none'})`));
2165
2262
  }
2166
2263
  catch (err) {
2167
2264
  // @silent-fallback-ok — git sync disabled gracefully
@@ -7692,6 +7789,7 @@ export async function startServer(options) {
7692
7789
  console.error('[shutdown] Failed to save resume UUIDs:', err);
7693
7790
  }
7694
7791
  }
7792
+ registrySyncDebouncer?.stop();
7695
7793
  gitSync?.stop();
7696
7794
  coordinator.stop();
7697
7795
  coherenceMonitor.stop();