instar 1.3.18 → 1.3.19
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 +104 -6
- package/dist/commands/server.js.map +1 -1
- package/dist/core/FencedLease.d.ts +126 -0
- package/dist/core/FencedLease.d.ts.map +1 -0
- package/dist/core/FencedLease.js +189 -0
- package/dist/core/FencedLease.js.map +1 -0
- package/dist/core/GitLeaseStore.d.ts +46 -0
- package/dist/core/GitLeaseStore.d.ts.map +1 -0
- package/dist/core/GitLeaseStore.js +79 -0
- package/dist/core/GitLeaseStore.js.map +1 -0
- package/dist/core/GitSync.d.ts +19 -0
- package/dist/core/GitSync.d.ts.map +1 -1
- package/dist/core/GitSync.js +77 -0
- package/dist/core/GitSync.js.map +1 -1
- package/dist/core/HandoffSentinel.d.ts +80 -0
- package/dist/core/HandoffSentinel.d.ts.map +1 -0
- package/dist/core/HandoffSentinel.js +141 -0
- package/dist/core/HandoffSentinel.js.map +1 -0
- package/dist/core/LeaseCoordinator.d.ts +141 -0
- package/dist/core/LeaseCoordinator.d.ts.map +1 -0
- package/dist/core/LeaseCoordinator.js +226 -0
- package/dist/core/LeaseCoordinator.js.map +1 -0
- package/dist/core/LiveTailBuffer.d.ts +64 -0
- package/dist/core/LiveTailBuffer.d.ts.map +1 -0
- package/dist/core/LiveTailBuffer.js +122 -0
- package/dist/core/LiveTailBuffer.js.map +1 -0
- package/dist/core/MultiMachineCoordinator.d.ts +49 -0
- package/dist/core/MultiMachineCoordinator.d.ts.map +1 -1
- package/dist/core/MultiMachineCoordinator.js +136 -0
- package/dist/core/MultiMachineCoordinator.js.map +1 -1
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +24 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/RegistrySyncDebouncer.d.ts +77 -0
- package/dist/core/RegistrySyncDebouncer.d.ts.map +1 -0
- package/dist/core/RegistrySyncDebouncer.js +131 -0
- package/dist/core/RegistrySyncDebouncer.js.map +1 -0
- package/dist/core/liveTailRedaction.d.ts +36 -0
- package/dist/core/liveTailRedaction.d.ts.map +1 -0
- package/dist/core/liveTailRedaction.js +57 -0
- package/dist/core/liveTailRedaction.js.map +1 -0
- package/dist/core/registryReplayGuard.d.ts +59 -0
- package/dist/core/registryReplayGuard.d.ts.map +1 -0
- package/dist/core/registryReplayGuard.js +86 -0
- package/dist/core/registryReplayGuard.js.map +1 -0
- package/dist/core/seamlessnessConfig.d.ts +79 -0
- package/dist/core/seamlessnessConfig.d.ts.map +1 -0
- package/dist/core/seamlessnessConfig.js +131 -0
- package/dist/core/seamlessnessConfig.js.map +1 -0
- package/dist/core/types.d.ts +117 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/core/wireRegistrySync.d.ts +32 -0
- package/dist/core/wireRegistrySync.d.ts.map +1 -0
- package/dist/core/wireRegistrySync.js +31 -0
- package/dist/core/wireRegistrySync.js.map +1 -0
- package/dist/feedback-factory/dispatch/dispatch.d.ts +47 -0
- package/dist/feedback-factory/dispatch/dispatch.d.ts.map +1 -0
- package/dist/feedback-factory/dispatch/dispatch.js +72 -0
- package/dist/feedback-factory/dispatch/dispatch.js.map +1 -0
- package/dist/messaging/FencedOutbox.d.ts +42 -0
- package/dist/messaging/FencedOutbox.d.ts.map +1 -0
- package/dist/messaging/FencedOutbox.js +60 -0
- package/dist/messaging/FencedOutbox.js.map +1 -0
- package/dist/messaging/MessageProcessingLedger.d.ts +105 -0
- package/dist/messaging/MessageProcessingLedger.d.ts.map +1 -0
- package/dist/messaging/MessageProcessingLedger.js +206 -0
- package/dist/messaging/MessageProcessingLedger.js.map +1 -0
- package/dist/messaging/TelegramAdapter.d.ts +18 -1
- package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
- package/dist/messaging/TelegramAdapter.js +50 -0
- package/dist/messaging/TelegramAdapter.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +7 -0
- package/dist/scaffold/templates.js.map +1 -1
- 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 +2 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +6 -0
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +64 -64
- package/src/scaffold/templates.ts +7 -0
- package/upgrades/1.3.19.md +23 -0
- package/upgrades/side-effects/PR-BODY-cross-machine-seamlessness.md +63 -0
- package/upgrades/side-effects/cross-machine-seamlessness-g1-lease.md +71 -0
- package/upgrades/side-effects/cross-machine-seamlessness-g2-foundation.md +75 -0
- package/upgrades/side-effects/cross-machine-seamlessness-g3-telegram-contract.md +36 -0
- package/upgrades/side-effects/cross-machine-seamlessness-g3a-ledger-handoff.md +56 -0
- package/upgrades/side-effects/cross-machine-seamlessness-g3bc-livetail-outbox.md +51 -0
- package/upgrades/side-effects/cross-machine-seamlessness-p4-awareness-observability.md +54 -0
- package/upgrades/side-effects/feedback-factory-dispatch.md +31 -0
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
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"}
|
package/dist/commands/server.js
CHANGED
|
@@ -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
|
-
|
|
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
|
-
|
|
2162
|
-
|
|
2163
|
-
|
|
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();
|