instar 1.3.1674 → 1.3.1675

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 (132) hide show
  1. package/dist/commands/server.d.ts.map +1 -1
  2. package/dist/commands/server.js +55 -6
  3. package/dist/commands/server.js.map +1 -1
  4. package/dist/core/CodexLifecycleProductionComposition.d.ts +1 -1
  5. package/dist/core/CodexLifecycleProductionComposition.d.ts.map +1 -1
  6. package/dist/core/EvolutionArchive.d.ts +79 -0
  7. package/dist/core/EvolutionArchive.d.ts.map +1 -0
  8. package/dist/core/EvolutionArchive.js +309 -0
  9. package/dist/core/EvolutionArchive.js.map +1 -0
  10. package/dist/core/EvolutionArchiveSync.d.ts +26 -0
  11. package/dist/core/EvolutionArchiveSync.d.ts.map +1 -0
  12. package/dist/core/EvolutionArchiveSync.js +109 -0
  13. package/dist/core/EvolutionArchiveSync.js.map +1 -0
  14. package/dist/core/EvolutionManager.d.ts +37 -6
  15. package/dist/core/EvolutionManager.d.ts.map +1 -1
  16. package/dist/core/EvolutionManager.js +210 -149
  17. package/dist/core/EvolutionManager.js.map +1 -1
  18. package/dist/core/FileClassifier.d.ts.map +1 -1
  19. package/dist/core/FileClassifier.js +3 -0
  20. package/dist/core/FileClassifier.js.map +1 -1
  21. package/dist/core/JobCoverage.d.ts +53 -0
  22. package/dist/core/JobCoverage.d.ts.map +1 -0
  23. package/dist/core/JobCoverage.js +194 -0
  24. package/dist/core/JobCoverage.js.map +1 -0
  25. package/dist/core/JobCoverageMonitor.d.ts +84 -0
  26. package/dist/core/JobCoverageMonitor.d.ts.map +1 -0
  27. package/dist/core/JobCoverageMonitor.js +364 -0
  28. package/dist/core/JobCoverageMonitor.js.map +1 -0
  29. package/dist/core/JobDependency.d.ts +4 -0
  30. package/dist/core/JobDependency.d.ts.map +1 -0
  31. package/dist/core/JobDependency.js +30 -0
  32. package/dist/core/JobDependency.js.map +1 -0
  33. package/dist/core/JobPortableBundle.d.ts +61 -0
  34. package/dist/core/JobPortableBundle.d.ts.map +1 -0
  35. package/dist/core/JobPortableBundle.js +302 -0
  36. package/dist/core/JobPortableBundle.js.map +1 -0
  37. package/dist/core/JobPortableFs.d.ts +18 -0
  38. package/dist/core/JobPortableFs.d.ts.map +1 -0
  39. package/dist/core/JobPortableFs.js +65 -0
  40. package/dist/core/JobPortableFs.js.map +1 -0
  41. package/dist/core/JobPortableIntegrity.d.ts +4 -0
  42. package/dist/core/JobPortableIntegrity.d.ts.map +1 -0
  43. package/dist/core/JobPortableIntegrity.js +86 -0
  44. package/dist/core/JobPortableIntegrity.js.map +1 -0
  45. package/dist/core/JobPortableSync.d.ts +79 -0
  46. package/dist/core/JobPortableSync.d.ts.map +1 -0
  47. package/dist/core/JobPortableSync.js +513 -0
  48. package/dist/core/JobPortableSync.js.map +1 -0
  49. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  50. package/dist/core/PostUpdateMigrator.js +38 -3
  51. package/dist/core/PostUpdateMigrator.js.map +1 -1
  52. package/dist/core/ReplicatedStoreReconcilerWiring.d.ts +2 -0
  53. package/dist/core/ReplicatedStoreReconcilerWiring.d.ts.map +1 -1
  54. package/dist/core/ReplicatedStoreReconcilerWiring.js +4 -4
  55. package/dist/core/ReplicatedStoreReconcilerWiring.js.map +1 -1
  56. package/dist/core/WriteDomainRegistry.d.ts.map +1 -1
  57. package/dist/core/WriteDomainRegistry.js +13 -0
  58. package/dist/core/WriteDomainRegistry.js.map +1 -1
  59. package/dist/core/jobMeshAwareness.d.ts +12 -0
  60. package/dist/core/jobMeshAwareness.d.ts.map +1 -0
  61. package/dist/core/jobMeshAwareness.js +37 -0
  62. package/dist/core/jobMeshAwareness.js.map +1 -0
  63. package/dist/core/roleFollowRestart.d.ts +16 -0
  64. package/dist/core/roleFollowRestart.d.ts.map +1 -1
  65. package/dist/core/roleFollowRestart.js +32 -1
  66. package/dist/core/roleFollowRestart.js.map +1 -1
  67. package/dist/core/types.d.ts +24 -4
  68. package/dist/core/types.d.ts.map +1 -1
  69. package/dist/core/types.js.map +1 -1
  70. package/dist/data/standards-guard-index.json +1 -1
  71. package/dist/data/standards-guard-index.meta.json +2 -2
  72. package/dist/data/standards-registry.meta.json +1 -1
  73. package/dist/localVerify/FailedFileDiagnosisPeerService.d.ts.map +1 -1
  74. package/dist/localVerify/FailedFileDiagnosisPeerService.js +3 -1
  75. package/dist/localVerify/FailedFileDiagnosisPeerService.js.map +1 -1
  76. package/dist/messaging/TelegramAdapter.d.ts +4 -0
  77. package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
  78. package/dist/messaging/TelegramAdapter.js +24 -0
  79. package/dist/messaging/TelegramAdapter.js.map +1 -1
  80. package/dist/monitoring/guardManifest.d.ts.map +1 -1
  81. package/dist/monitoring/guardManifest.js +6 -0
  82. package/dist/monitoring/guardManifest.js.map +1 -1
  83. package/dist/native/InstarWedgeCanary.app/Contents/MacOS/InstarWedgeCanary +0 -0
  84. package/dist/native/instar-desktop-host +0 -0
  85. package/dist/scaffold/templates.d.ts.map +1 -1
  86. package/dist/scaffold/templates.js +11 -0
  87. package/dist/scaffold/templates.js.map +1 -1
  88. package/dist/scheduler/AgentMdJobLoader.d.ts +4 -15
  89. package/dist/scheduler/AgentMdJobLoader.d.ts.map +1 -1
  90. package/dist/scheduler/AgentMdJobLoader.js +69 -1
  91. package/dist/scheduler/AgentMdJobLoader.js.map +1 -1
  92. package/dist/scheduler/JobCatalogReconcile.d.ts +2 -0
  93. package/dist/scheduler/JobCatalogReconcile.d.ts.map +1 -0
  94. package/dist/scheduler/JobCatalogReconcile.js +27 -0
  95. package/dist/scheduler/JobCatalogReconcile.js.map +1 -0
  96. package/dist/scheduler/JobLoader.d.ts.map +1 -1
  97. package/dist/scheduler/JobLoader.js +26 -1
  98. package/dist/scheduler/JobLoader.js.map +1 -1
  99. package/dist/scheduler/JobScheduler.d.ts +14 -9
  100. package/dist/scheduler/JobScheduler.d.ts.map +1 -1
  101. package/dist/scheduler/JobScheduler.js +182 -9
  102. package/dist/scheduler/JobScheduler.js.map +1 -1
  103. package/dist/scheduler/PromotionCatchUpStore.d.ts +20 -0
  104. package/dist/scheduler/PromotionCatchUpStore.d.ts.map +1 -0
  105. package/dist/scheduler/PromotionCatchUpStore.js +60 -0
  106. package/dist/scheduler/PromotionCatchUpStore.js.map +1 -0
  107. package/dist/server/AgentServer.d.ts.map +1 -1
  108. package/dist/server/AgentServer.js +1 -0
  109. package/dist/server/AgentServer.js.map +1 -1
  110. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  111. package/dist/server/CapabilityIndex.js +2 -1
  112. package/dist/server/CapabilityIndex.js.map +1 -1
  113. package/dist/server/routes.d.ts +2 -0
  114. package/dist/server/routes.d.ts.map +1 -1
  115. package/dist/server/routes.js +265 -0
  116. package/dist/server/routes.js.map +1 -1
  117. package/dist/testing/selfActionRegistry.d.ts.map +1 -1
  118. package/dist/testing/selfActionRegistry.js +92 -0
  119. package/dist/testing/selfActionRegistry.js.map +1 -1
  120. package/package.json +1 -1
  121. package/scripts/job-portable-fs.py +254 -0
  122. package/scripts/job-portable-sync-rollback.mjs +66 -0
  123. package/src/data/builtin-manifest.json +66 -66
  124. package/src/data/feature-ladders.json +2 -0
  125. package/src/data/standards-guard-index.json +1 -1
  126. package/src/data/standards-guard-index.meta.json +2 -2
  127. package/src/data/standards-registry.meta.json +1 -1
  128. package/src/scaffold/templates.ts +11 -0
  129. package/upgrades/1.3.1675.md +48 -0
  130. package/upgrades/side-effects/evolution-retention-cap-saturation.md +172 -0
  131. package/upgrades/side-effects/lease-job-coverage-and-catchup.md +86 -0
  132. package/upgrades/side-effects/lease-job-definition-replication.md +94 -0
@@ -1 +1 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../../src/commands/server.ts"],"names":[],"mappings":"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"}
@@ -261,6 +261,7 @@ import { StaleProcessGuard } from '../core/StaleProcessGuard.js';
261
261
  import { cleanupGlobalInstalls } from '../core/GlobalInstallCleanup.js';
262
262
  import { ForegroundRestartWatcher } from '../core/ForegroundRestartWatcher.js';
263
263
  import { NotificationBatcher } from '../messaging/NotificationBatcher.js';
264
+ import { EvolutionArchiveSync } from '../core/EvolutionArchiveSync.js';
264
265
  import { admitNoticeToHub, recordHeldHubPost, resolveHubFilterMode } from '../messaging/attentionHubPolicy.js';
265
266
  import { formatLocalTimestamp } from '../utils/localTime.js';
266
267
  import { resolveTelegramStartupTopology, wireTelegramSendSide } from '../messaging/telegramSendSideComposition.js';
@@ -7924,7 +7925,7 @@ export async function startServer(options) {
7924
7925
  });
7925
7926
  if (decision === 'restart') {
7926
7927
  console.log(pc.yellow(` [lease] role is now ${coordinator.role}: restarting once so boot builds what it needs`));
7927
- requestRoleRestart({ stateDir: config.stateDir }, nowAwake);
7928
+ requestRoleRestart({ stateDir: config.stateDir, leaseEpoch: coordinator.getLeaseEpoch(), machineId: coordinator.identity?.machineId }, nowAwake);
7928
7929
  }
7929
7930
  }
7930
7931
  catch (err) {
@@ -7966,6 +7967,13 @@ export async function startServer(options) {
7966
7967
  // Wire machine identity for machine-scoped job filtering
7967
7968
  if (coordinator.identity) {
7968
7969
  scheduler.setMachineIdentity(coordinator.identity.machineId, coordinator.identity.name);
7970
+ scheduler.setPromotionLeaseProvider(() => ({
7971
+ leaseEpoch: coordinator.getLeaseEpoch(), machineId: coordinator.identity.machineId,
7972
+ holdsLease: coordinator.holdsLease(),
7973
+ // The local journal cannot prove what a prior holder launched.
7974
+ // A registry count is not a cross-machine decision witness.
7975
+ runOnceWitness: false,
7976
+ }));
7969
7977
  }
7970
7978
  if (quotaTracker) {
7971
7979
  // Basic binding — QuotaManager will override this once wired
@@ -13360,8 +13368,43 @@ export async function startServer(options) {
13360
13368
  const evolution = new EvolutionManager({
13361
13369
  stateDir: config.stateDir,
13362
13370
  ...(config.evolution || {}),
13371
+ archiveOrigin: cjOwnMachineId ?? undefined,
13363
13372
  autoExpiry: config.evolutionActions?.autoExpiry,
13364
13373
  });
13374
+ const evolutionArchiveSync = new EvolutionArchiveSync(evolution.archive, {
13375
+ fetchPage: async (_peerId, url, offset, signal) => {
13376
+ const extra = config.multiMachine?.peerUrlAllowlist;
13377
+ if (!isPeerUrlAllowedForCredentials({ url, kind: 'last-known-url' }, extra).ok)
13378
+ throw new Error('archive peer URL rejected');
13379
+ const response = await fetch(`${url}/evolution/archive?offset=${offset}&limit=50`, {
13380
+ headers: { Authorization: `Bearer ${config.authToken}` }, signal, redirect: 'error',
13381
+ });
13382
+ if (!response.ok)
13383
+ throw new Error(`archive peer HTTP ${response.status}`);
13384
+ // Bound bytes while streaming, before parsing; Content-Length alone is not evidence.
13385
+ const reader = response.body?.getReader();
13386
+ if (!reader)
13387
+ throw new Error('archive peer missing body');
13388
+ const chunks = [];
13389
+ let size = 0;
13390
+ try {
13391
+ for (;;) {
13392
+ const next = await reader.read();
13393
+ if (next.done)
13394
+ break;
13395
+ size += next.value.byteLength;
13396
+ if (size > 1024 * 1024)
13397
+ throw new Error('archive peer response oversized');
13398
+ chunks.push(next.value);
13399
+ }
13400
+ }
13401
+ finally {
13402
+ await reader.cancel().catch(() => { });
13403
+ }
13404
+ return JSON.parse(Buffer.concat(chunks).toString('utf8'));
13405
+ },
13406
+ log: (event, detail) => console.warn(`[EvolutionManager] ${event} ${JSON.stringify(detail)}`),
13407
+ });
13365
13408
  console.log(pc.green(' Evolution system enabled'));
13366
13409
  // WS2.2 — the bypass-proof union reader for the `learnings` store. The single funnel
13367
13410
  // every replicated learning read routes through, so no caller reads a raw replica
@@ -13396,7 +13439,7 @@ export async function startServer(options) {
13396
13439
  void learningsUnionReader; // consumed by the learnings peer-read surface (the E2E reads through it) + future session-context injection
13397
13440
  // WS2 SEND-SIDE: attach the journal-backed emitter to the EvolutionManager's
13398
13441
  // learning hooks. The call sites already fire emitPut/emitDelete on every
13399
- // saveLearnings (prune→emitDelete, survivor→emitPut); the adapter maps the
13442
+ // saveLearnings (final puts including eviction, no retention tombstones); the adapter maps the
13400
13443
  // manager's emit signature to the store's build*RecordData. The emitter owns the
13401
13444
  // dark gate, HLC tick, `observed` witness, and journal append. Attached only when
13402
13445
  // the emitter exists (journal live); when dark the hooks stay no-ops (byte-
@@ -13576,7 +13619,7 @@ export async function startServer(options) {
13576
13619
  loadOriginRecords: (store, recordKey) => {
13577
13620
  if (store !== EVOLUTION_ACTION_STORE_KEY || _meshSelfId === null)
13578
13621
  return [];
13579
- for (const a of evolution.listActions()) {
13622
+ for (const a of evolution.listActionsForReplication()) {
13580
13623
  if (deriveEvolutionActionRecordKey(a.title, a.commitTo, a.createdAt) === recordKey) {
13581
13624
  const o = evolutionActionToOriginRecord(a, _meshSelfId);
13582
13625
  return o ? [o] : [];
@@ -13588,7 +13631,7 @@ export async function startServer(options) {
13588
13631
  if (store !== EVOLUTION_ACTION_STORE_KEY)
13589
13632
  return [];
13590
13633
  const keys = [];
13591
- for (const a of evolution.listActions()) {
13634
+ for (const a of evolution.listActionsForReplication()) {
13592
13635
  const k = deriveEvolutionActionRecordKey(a.title, a.commitTo, a.createdAt);
13593
13636
  if (k !== null)
13594
13637
  keys.push(k);
@@ -13602,8 +13645,8 @@ export async function startServer(options) {
13602
13645
  // WS2.5 SEND-SIDE: attach the journal-backed emitter to the EvolutionManager's
13603
13646
  // action-queue hooks. saveActions already fires emitPut on every surviving action
13604
13647
  // (so a STATUS CHANGE re-emits — a peer SEES completed/in_progress and won't redo it)
13605
- // and emitDelete on every action actually pruned out of the queue (a RETAINED terminal
13606
- // action is never tombstoned — only a real queue-removal is). The adapter maps the
13648
+ // including final puts for archived terminal records. Hot eviction never emits
13649
+ // deletion authority; archive custody and repair preserve memory. The adapter maps the
13607
13650
  // manager's emit signature to the action build*RecordData projection; the generic emitter
13608
13651
  // owns the dark gate, HLC tick, `observed` witness, journal append, and ALL the safety
13609
13652
  // guards (null recordKey ⇒ skip, null projection ⇒ skip, over-cap throw ⇒ counted no-op).
@@ -28791,6 +28834,11 @@ export async function startServer(options) {
28791
28834
  // intact): working-set pending-pull drain (§3.4) + queued
28792
28835
  // commitment-mutate re-fire (P1.5b §3.4). Both no-op while dark.
28793
28836
  const onPeerBack = (machineId) => {
28837
+ const archivePeer = (_resolvePeerUrls?.() ?? []).find(peer => peer.machineId === machineId);
28838
+ if (archivePeer)
28839
+ void evolutionArchiveSync.onPeerRecorded(machineId, archivePeer.url).catch(error => {
28840
+ console.warn(`[EvolutionManager] archive-sync-failed ${String(error)}`);
28841
+ });
28794
28842
  workingSetPullCoordinator?.onPeerRecorded(machineId);
28795
28843
  void _commitmentReFire?.(machineId).catch(() => { });
28796
28844
  // §5.3(e): a returning peer drains any pending topic-profile pulls
@@ -32363,6 +32411,7 @@ export async function startServer(options) {
32363
32411
  let _shuttingDown = false;
32364
32412
  let shutdownStep = 'start';
32365
32413
  const shutdown = async () => {
32414
+ evolutionArchiveSync.stop();
32366
32415
  // Re-entrancy guard: SIGINT+SIGTERM (or a restartDetected racing a signal)
32367
32416
  // must not run the teardown twice. closeAllSqlite() is itself idempotent,
32368
32417
  // but the resume-UUID save + sidecar flush should run once.