instar 1.3.1674 → 1.3.1676

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 (142) 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/LeaseCoordinator.d.ts.map +1 -1
  50. package/dist/core/LeaseCoordinator.js +4 -3
  51. package/dist/core/LeaseCoordinator.js.map +1 -1
  52. package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
  53. package/dist/core/PostUpdateMigrator.js +38 -3
  54. package/dist/core/PostUpdateMigrator.js.map +1 -1
  55. package/dist/core/ReplicatedStoreReconcilerWiring.d.ts +2 -0
  56. package/dist/core/ReplicatedStoreReconcilerWiring.d.ts.map +1 -1
  57. package/dist/core/ReplicatedStoreReconcilerWiring.js +4 -4
  58. package/dist/core/ReplicatedStoreReconcilerWiring.js.map +1 -1
  59. package/dist/core/WriteDomainRegistry.d.ts.map +1 -1
  60. package/dist/core/WriteDomainRegistry.js +13 -0
  61. package/dist/core/WriteDomainRegistry.js.map +1 -1
  62. package/dist/core/jobMeshAwareness.d.ts +12 -0
  63. package/dist/core/jobMeshAwareness.d.ts.map +1 -0
  64. package/dist/core/jobMeshAwareness.js +37 -0
  65. package/dist/core/jobMeshAwareness.js.map +1 -0
  66. package/dist/core/roleFollowRestart.d.ts +16 -0
  67. package/dist/core/roleFollowRestart.d.ts.map +1 -1
  68. package/dist/core/roleFollowRestart.js +32 -1
  69. package/dist/core/roleFollowRestart.js.map +1 -1
  70. package/dist/core/types.d.ts +24 -4
  71. package/dist/core/types.d.ts.map +1 -1
  72. package/dist/core/types.js.map +1 -1
  73. package/dist/data/standards-guard-index.json +1 -1
  74. package/dist/data/standards-guard-index.meta.json +2 -2
  75. package/dist/data/standards-registry.meta.json +1 -1
  76. package/dist/localVerify/FailedFileDiagnosisPeerService.d.ts.map +1 -1
  77. package/dist/localVerify/FailedFileDiagnosisPeerService.js +3 -1
  78. package/dist/localVerify/FailedFileDiagnosisPeerService.js.map +1 -1
  79. package/dist/messaging/TelegramAdapter.d.ts +4 -0
  80. package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
  81. package/dist/messaging/TelegramAdapter.js +24 -0
  82. package/dist/messaging/TelegramAdapter.js.map +1 -1
  83. package/dist/monitoring/guardManifest.d.ts.map +1 -1
  84. package/dist/monitoring/guardManifest.js +6 -0
  85. package/dist/monitoring/guardManifest.js.map +1 -1
  86. package/dist/native/InstarWedgeCanary.app/Contents/MacOS/InstarWedgeCanary +0 -0
  87. package/dist/native/instar-desktop-host +0 -0
  88. package/dist/scaffold/templates.d.ts.map +1 -1
  89. package/dist/scaffold/templates.js +11 -0
  90. package/dist/scaffold/templates.js.map +1 -1
  91. package/dist/scheduler/AgentMdJobLoader.d.ts +4 -15
  92. package/dist/scheduler/AgentMdJobLoader.d.ts.map +1 -1
  93. package/dist/scheduler/AgentMdJobLoader.js +69 -1
  94. package/dist/scheduler/AgentMdJobLoader.js.map +1 -1
  95. package/dist/scheduler/JobCatalogReconcile.d.ts +2 -0
  96. package/dist/scheduler/JobCatalogReconcile.d.ts.map +1 -0
  97. package/dist/scheduler/JobCatalogReconcile.js +27 -0
  98. package/dist/scheduler/JobCatalogReconcile.js.map +1 -0
  99. package/dist/scheduler/JobLoader.d.ts.map +1 -1
  100. package/dist/scheduler/JobLoader.js +26 -1
  101. package/dist/scheduler/JobLoader.js.map +1 -1
  102. package/dist/scheduler/JobScheduler.d.ts +14 -9
  103. package/dist/scheduler/JobScheduler.d.ts.map +1 -1
  104. package/dist/scheduler/JobScheduler.js +182 -9
  105. package/dist/scheduler/JobScheduler.js.map +1 -1
  106. package/dist/scheduler/PromotionCatchUpStore.d.ts +20 -0
  107. package/dist/scheduler/PromotionCatchUpStore.d.ts.map +1 -0
  108. package/dist/scheduler/PromotionCatchUpStore.js +60 -0
  109. package/dist/scheduler/PromotionCatchUpStore.js.map +1 -0
  110. package/dist/server/AgentServer.d.ts.map +1 -1
  111. package/dist/server/AgentServer.js +1 -0
  112. package/dist/server/AgentServer.js.map +1 -1
  113. package/dist/server/CapabilityIndex.d.ts.map +1 -1
  114. package/dist/server/CapabilityIndex.js +2 -1
  115. package/dist/server/CapabilityIndex.js.map +1 -1
  116. package/dist/server/leaseRenewalDependencies.d.ts +4 -0
  117. package/dist/server/leaseRenewalDependencies.d.ts.map +1 -1
  118. package/dist/server/leaseRenewalDependencies.js +2 -0
  119. package/dist/server/leaseRenewalDependencies.js.map +1 -1
  120. package/dist/server/routes.d.ts +2 -0
  121. package/dist/server/routes.d.ts.map +1 -1
  122. package/dist/server/routes.js +265 -0
  123. package/dist/server/routes.js.map +1 -1
  124. package/dist/testing/selfActionRegistry.d.ts.map +1 -1
  125. package/dist/testing/selfActionRegistry.js +92 -0
  126. package/dist/testing/selfActionRegistry.js.map +1 -1
  127. package/package.json +1 -1
  128. package/scripts/job-portable-fs.py +254 -0
  129. package/scripts/job-portable-sync-rollback.mjs +66 -0
  130. package/src/data/builtin-manifest.json +66 -66
  131. package/src/data/feature-ladders.json +2 -0
  132. package/src/data/standards-guard-index.json +1 -1
  133. package/src/data/standards-guard-index.meta.json +2 -2
  134. package/src/data/standards-registry.meta.json +1 -1
  135. package/src/scaffold/templates.ts +11 -0
  136. package/upgrades/1.3.1675.md +48 -0
  137. package/upgrades/1.3.1676.md +18 -0
  138. package/upgrades/side-effects/evolution-retention-cap-saturation.md +172 -0
  139. package/upgrades/side-effects/lease-job-coverage-and-catchup.md +86 -0
  140. package/upgrades/side-effects/lease-job-definition-replication.md +94 -0
  141. package/upgrades/side-effects/takeover-keeps-lease.md +17 -0
  142. package/upgrades/takeover-keeps-lease.eli16.md +22 -0
@@ -58,10 +58,10 @@ export declare function createInboundDeliveryTransferHandler(deps: {
58
58
  accepted: boolean;
59
59
  reason: string;
60
60
  } | {
61
- reason?: undefined;
62
61
  imported: number;
63
62
  duplicate: number;
64
63
  activeEpoch: number;
64
+ reason?: undefined;
65
65
  accepted: boolean;
66
66
  };
67
67
  export declare function createProductionSessionRecoveryConsumer(input: {
@@ -1 +1 @@
1
- {"version":3,"file":"CodexLifecycleProductionComposition.d.ts","sourceRoot":"","sources":["../../src/core/CodexLifecycleProductionComposition.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"CodexLifecycleProductionComposition.d.ts","sourceRoot":"","sources":["../../src/core/CodexLifecycleProductionComposition.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,79 @@
1
+ import type { ActionArchiveEntry, ActionItem, CapabilityGap, EvolutionProposal, LearningEntry } from './types.js';
2
+ export declare const EVOLUTION_ARCHIVE_MAX_BYTES: number;
3
+ export declare const EVOLUTION_ARCHIVE_PAGE_BYTES: number;
4
+ export type EvolutionArchiveKind = 'proposals' | 'learnings' | 'gaps' | 'actions';
5
+ export type EvolutionArchiveRecord = EvolutionProposal | LearningEntry | CapabilityGap | ActionItem;
6
+ export interface EvolutionArchiveEnvelope {
7
+ origin: string;
8
+ kind: EvolutionArchiveKind;
9
+ record: EvolutionArchiveRecord;
10
+ digest: string;
11
+ }
12
+ export interface EvolutionRetentionEntry {
13
+ kind: EvolutionArchiveKind;
14
+ record: EvolutionArchiveRecord;
15
+ archivedAt: string;
16
+ }
17
+ export interface EvolutionArchiveSyncPeer {
18
+ url: string;
19
+ offset: number;
20
+ incarnation?: string;
21
+ failures: number;
22
+ nextAttemptAt: number;
23
+ parked: boolean;
24
+ }
25
+ export interface EvolutionArchiveDocument {
26
+ entries: ActionArchiveEntry[];
27
+ retentionEntries?: EvolutionRetentionEntry[];
28
+ replicaEntries?: EvolutionArchiveEnvelope[];
29
+ archiveId?: string;
30
+ exportOrder?: string[];
31
+ syncPeers?: Record<string, EvolutionArchiveSyncPeer>;
32
+ [key: string]: unknown;
33
+ }
34
+ export interface EvolutionArchivePage {
35
+ entries: EvolutionArchiveEnvelope[];
36
+ nextOffset: number | null;
37
+ incarnation: string;
38
+ offset: number;
39
+ total: number;
40
+ oversized?: Array<{
41
+ digest: string;
42
+ origin: string;
43
+ kind: EvolutionArchiveKind;
44
+ id: string;
45
+ reason: 'oversized';
46
+ }>;
47
+ }
48
+ /** Historical IDs are opaque labels. New allocation syntax must not invalidate old references. */
49
+ export declare function isEvolutionRecordId(value: unknown): value is string;
50
+ /** Structural custody validation only. Received content never becomes a local work item. */
51
+ export declare function validateEvolutionArchiveRecord(kind: EvolutionArchiveKind, record: unknown): asserts record is EvolutionArchiveRecord;
52
+ export declare function evolutionArchiveDigest(origin: string, kind: EvolutionArchiveKind, record: EvolutionArchiveRecord): string;
53
+ export declare class EvolutionArchive {
54
+ private readonly explicitOrigin?;
55
+ readonly filePath: string;
56
+ private originValue;
57
+ private readonly generatedOrigin;
58
+ private readonly emptyIncarnation;
59
+ constructor(stateDir: string, explicitOrigin?: string | undefined);
60
+ get origin(): string;
61
+ read(): EvolutionArchiveDocument;
62
+ private envelope;
63
+ private envelopes;
64
+ /** Fsync archive contents and directory before readback; callers may evict only after return. */
65
+ write(doc: EvolutionArchiveDocument): void;
66
+ preserve(kind: EvolutionArchiveKind, records: readonly EvolutionArchiveRecord[]): void;
67
+ localEntries(kind: EvolutionArchiveKind): EvolutionArchiveRecord[];
68
+ /** Read-only pagination. Persisted export order never shifts when a different kind is appended. */
69
+ page(opts?: {
70
+ kind?: EvolutionArchiveKind;
71
+ id?: string;
72
+ offset?: number;
73
+ limit?: number;
74
+ }): EvolutionArchivePage;
75
+ /** Validate the complete page before changing any memory or advancing its peer cursor. */
76
+ importPage(page: EvolutionArchivePage): void;
77
+ static validatePage(page: unknown): asserts page is EvolutionArchivePage;
78
+ }
79
+ //# sourceMappingURL=EvolutionArchive.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvolutionArchive.d.ts","sourceRoot":"","sources":["../../src/core/EvolutionArchive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,309 @@
1
+ /** EVO-022: full memory custody, shared with the existing action auto-expiry archive. */
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { createHash, randomUUID } from 'node:crypto';
5
+ import { stableJson } from './stableJson.js';
6
+ import { SafeFsExecutor } from './SafeFsExecutor.js';
7
+ export const EVOLUTION_ARCHIVE_MAX_BYTES = 64 * 1024 * 1024;
8
+ export const EVOLUTION_ARCHIVE_PAGE_BYTES = 1024 * 1024;
9
+ const kinds = new Set(['proposals', 'learnings', 'gaps', 'actions']);
10
+ const object = (x) => !!x && typeof x === 'object' && !Array.isArray(x);
11
+ const integer = (x) => Number.isSafeInteger(x) && x >= 0;
12
+ /** Historical IDs are opaque labels. New allocation syntax must not invalidate old references. */
13
+ export function isEvolutionRecordId(value) {
14
+ return typeof value === 'string' && value.length > 0 && value.length <= 100 && !value.includes(String.fromCharCode(0));
15
+ }
16
+ /** Structural custody validation only. Received content never becomes a local work item. */
17
+ export function validateEvolutionArchiveRecord(kind, record) {
18
+ if (!object(record) || typeof record.id !== 'string' || typeof record.title !== 'string' || typeof record.description !== 'string')
19
+ throw new Error('invalid evolution archive record');
20
+ if (!isEvolutionRecordId(record.id))
21
+ throw new Error('invalid evolution archive id');
22
+ if (kind === 'learnings') {
23
+ if (typeof record.applied !== 'boolean')
24
+ throw new Error('invalid archived learning applied flag');
25
+ }
26
+ else {
27
+ const statuses = kind === 'proposals' ? ['proposed', 'approved', 'in_progress', 'implemented', 'rejected', 'deferred']
28
+ : kind === 'actions' ? ['pending', 'in_progress', 'completed', 'cancelled'] : ['identified', 'addressed', 'wont_fix'];
29
+ if (!statuses.includes(record.status))
30
+ throw new Error('invalid evolution archive status');
31
+ }
32
+ }
33
+ export function evolutionArchiveDigest(origin, kind, record) {
34
+ return createHash('sha256').update(stableJson({ origin, kind, record })).digest('hex');
35
+ }
36
+ function assertEnvelope(raw) {
37
+ if (!object(raw) || typeof raw.origin !== 'string' || !raw.origin || raw.origin.length > 200 || !kinds.has(raw.kind) || typeof raw.digest !== 'string')
38
+ throw new Error('invalid evolution archive envelope');
39
+ validateEvolutionArchiveRecord(raw.kind, raw.record);
40
+ if (raw.digest !== evolutionArchiveDigest(raw.origin, raw.kind, raw.record))
41
+ throw new Error('evolution archive digest mismatch');
42
+ }
43
+ function assertDocument(raw) {
44
+ if (!object(raw) || !Array.isArray(raw.entries))
45
+ throw new Error('archive has no entries array');
46
+ for (const entry of raw.entries) {
47
+ if (!object(entry) || typeof entry.archivedAt !== 'string' || typeof entry.class !== 'string' || typeof entry.ageDays !== 'number' || !Number.isFinite(entry.ageDays))
48
+ throw new Error('invalid action archive entry');
49
+ validateEvolutionArchiveRecord('actions', entry.action);
50
+ if (entry.restoredAt !== undefined && typeof entry.restoredAt !== 'string')
51
+ throw new Error('invalid archive restore marker');
52
+ }
53
+ if (raw.retentionEntries !== undefined) {
54
+ if (!Array.isArray(raw.retentionEntries))
55
+ throw new Error('invalid retention archive entries');
56
+ for (const entry of raw.retentionEntries) {
57
+ if (!object(entry) || !kinds.has(entry.kind) || typeof entry.archivedAt !== 'string')
58
+ throw new Error('invalid retention archive entry');
59
+ validateEvolutionArchiveRecord(entry.kind, entry.record);
60
+ }
61
+ }
62
+ if (raw.replicaEntries !== undefined) {
63
+ if (!Array.isArray(raw.replicaEntries))
64
+ throw new Error('invalid archive replicas');
65
+ for (const entry of raw.replicaEntries)
66
+ assertEnvelope(entry);
67
+ }
68
+ if (raw.archiveId !== undefined && (typeof raw.archiveId !== 'string' || !raw.archiveId))
69
+ throw new Error('invalid archive incarnation');
70
+ if (raw.exportOrder !== undefined && (!Array.isArray(raw.exportOrder) || raw.exportOrder.some(x => typeof x !== 'string' || !/^[a-f0-9]{64}$/.test(x)) || new Set(raw.exportOrder).size !== raw.exportOrder.length))
71
+ throw new Error('invalid archive export order');
72
+ if (raw.syncPeers !== undefined) {
73
+ if (!object(raw.syncPeers))
74
+ throw new Error('invalid archive sync state');
75
+ for (const peer of Object.values(raw.syncPeers)) {
76
+ if (!object(peer) || typeof peer.url !== 'string' || !integer(peer.offset) || !integer(peer.failures) || typeof peer.nextAttemptAt !== 'number' || !Number.isFinite(peer.nextAttemptAt) || typeof peer.parked !== 'boolean' || (peer.incarnation !== undefined && typeof peer.incarnation !== 'string'))
77
+ throw new Error('invalid archive peer state');
78
+ }
79
+ }
80
+ }
81
+ export class EvolutionArchive {
82
+ explicitOrigin;
83
+ filePath;
84
+ originValue;
85
+ generatedOrigin = `archive:${randomUUID()}`;
86
+ emptyIncarnation = randomUUID();
87
+ constructor(stateDir, explicitOrigin) {
88
+ this.explicitOrigin = explicitOrigin;
89
+ this.filePath = path.join(stateDir, 'state', 'evolution', 'action-archive.json');
90
+ }
91
+ get origin() {
92
+ if (this.originValue === undefined)
93
+ this.read();
94
+ return this.originValue;
95
+ }
96
+ read() {
97
+ let text;
98
+ try {
99
+ const stat = fs.statSync(this.filePath);
100
+ if (stat.size > EVOLUTION_ARCHIVE_MAX_BYTES)
101
+ throw new Error('evolution archive exceeds 64 MiB ceiling');
102
+ text = fs.readFileSync(this.filePath, 'utf8');
103
+ }
104
+ catch (err) {
105
+ if (err.code === 'ENOENT') {
106
+ this.originValue ??= this.explicitOrigin ?? this.generatedOrigin;
107
+ return { entries: [], archiveId: this.emptyIncarnation, localOrigin: this.originValue };
108
+ }
109
+ throw err;
110
+ }
111
+ if (Buffer.byteLength(text) > EVOLUTION_ARCHIVE_MAX_BYTES)
112
+ throw new Error('evolution archive exceeds 64 MiB ceiling');
113
+ const doc = JSON.parse(text);
114
+ assertDocument(doc);
115
+ if (doc.localOrigin !== undefined && (typeof doc.localOrigin !== 'string' || !doc.localOrigin || doc.localOrigin.length > 200))
116
+ throw new Error('invalid archive local origin');
117
+ // Legacy read-only exports must be stable across processes before adoption writes.
118
+ // A missing empty archive may use a new UUID; an existing legacy document may not.
119
+ this.originValue = typeof doc.localOrigin === 'string' ? doc.localOrigin : this.explicitOrigin
120
+ ?? `legacy:${createHash('sha256').update(stableJson(doc)).digest('hex')}`;
121
+ return doc;
122
+ }
123
+ envelope(kind, record) {
124
+ return { origin: this.origin, kind, record, digest: evolutionArchiveDigest(this.origin, kind, record) };
125
+ }
126
+ envelopes(doc) {
127
+ const all = new Map();
128
+ for (const entry of doc.entries) {
129
+ const e = this.envelope('actions', entry.action);
130
+ all.set(e.digest, e);
131
+ }
132
+ for (const entry of doc.retentionEntries ?? []) {
133
+ const e = this.envelope(entry.kind, entry.record);
134
+ all.set(e.digest, e);
135
+ }
136
+ for (const e of doc.replicaEntries ?? [])
137
+ all.set(e.digest, e);
138
+ return all;
139
+ }
140
+ /** Fsync archive contents and directory before readback; callers may evict only after return. */
141
+ write(doc) {
142
+ assertDocument(doc);
143
+ const prior = this.read();
144
+ if (doc.localOrigin !== undefined && doc.localOrigin !== this.origin)
145
+ throw new Error('archive origin cannot change');
146
+ const all = this.envelopes(doc);
147
+ for (const digest of this.envelopes(prior).keys())
148
+ if (!all.has(digest))
149
+ throw new Error('archive write would remove exported memory');
150
+ const order = [...(prior.exportOrder ?? doc.exportOrder ?? [])];
151
+ if (order.some(digest => !all.has(digest)))
152
+ throw new Error('archive write would remove exported memory');
153
+ const seen = new Set(order);
154
+ for (const digest of all.keys())
155
+ if (!seen.has(digest)) {
156
+ order.push(digest);
157
+ seen.add(digest);
158
+ }
159
+ const stored = { ...doc, localOrigin: doc.localOrigin ?? this.origin, archiveId: doc.archiveId ?? randomUUID(), exportOrder: order };
160
+ const serialized = JSON.stringify(stored, null, 2);
161
+ if (Buffer.byteLength(serialized) > EVOLUTION_ARCHIVE_MAX_BYTES)
162
+ throw new Error('evolution archive write exceeds 64 MiB ceiling');
163
+ const dir = path.dirname(this.filePath);
164
+ fs.mkdirSync(dir, { recursive: true });
165
+ const temp = `${this.filePath}.${process.pid}.${randomUUID()}.tmp`;
166
+ try {
167
+ const fd = fs.openSync(temp, 'wx', 0o600);
168
+ try {
169
+ fs.writeFileSync(fd, serialized);
170
+ fs.fsyncSync(fd);
171
+ }
172
+ finally {
173
+ fs.closeSync(fd);
174
+ }
175
+ fs.renameSync(temp, this.filePath);
176
+ const directoryFd = fs.openSync(dir, 'r');
177
+ try {
178
+ fs.fsyncSync(directoryFd);
179
+ }
180
+ finally {
181
+ fs.closeSync(directoryFd);
182
+ }
183
+ if (fs.readFileSync(this.filePath, 'utf8') !== serialized)
184
+ throw new Error('evolution archive readback mismatch');
185
+ }
186
+ catch (err) {
187
+ try {
188
+ SafeFsExecutor.safeUnlinkSync(temp, { operation: 'EvolutionArchive:failed-write-temp' });
189
+ }
190
+ catch { /* original error preserved */ }
191
+ throw err;
192
+ }
193
+ }
194
+ preserve(kind, records) {
195
+ const doc = this.read();
196
+ const existing = this.envelopes(doc);
197
+ for (const record of records) {
198
+ validateEvolutionArchiveRecord(kind, record);
199
+ // Normalize JSON once so equality/digests match persisted content, including undefined members.
200
+ const clone = JSON.parse(JSON.stringify(record));
201
+ const e = this.envelope(kind, clone);
202
+ if (Buffer.byteLength(JSON.stringify(e)) > EVOLUTION_ARCHIVE_PAGE_BYTES - 65536)
203
+ throw new Error('oversized evolution archive record; retain hot record');
204
+ if (kind === 'actions') {
205
+ // A restored occurrence no longer licenses restore. Re-eviction needs a
206
+ // new unrestored custody occurrence even when its content digest repeats.
207
+ if (doc.entries.some(entry => !entry.restoredAt && this.envelope('actions', entry.action).digest === e.digest))
208
+ continue;
209
+ doc.entries.push({ action: clone, archivedAt: new Date().toISOString(), ageDays: 0, class: 'retention' });
210
+ }
211
+ else {
212
+ if (existing.has(e.digest))
213
+ continue;
214
+ (doc.retentionEntries ??= []).push({ kind, record: clone, archivedAt: new Date().toISOString() });
215
+ }
216
+ existing.set(e.digest, e);
217
+ }
218
+ this.write(doc);
219
+ const verified = this.envelopes(this.read());
220
+ for (const record of records)
221
+ if (!verified.has(this.envelope(kind, record).digest))
222
+ throw new Error('evolution archive preservation readback missing record');
223
+ }
224
+ localEntries(kind) {
225
+ const doc = this.read();
226
+ return kind === 'actions' ? doc.entries.map(e => e.action) : (doc.retentionEntries ?? []).filter(e => e.kind === kind).map(e => e.record);
227
+ }
228
+ /** Read-only pagination. Persisted export order never shifts when a different kind is appended. */
229
+ page(opts = {}) {
230
+ const offset = opts.offset ?? 0, limit = opts.limit ?? 50;
231
+ if (!integer(offset) || !integer(limit) || limit < 1 || limit > 50)
232
+ throw new Error('invalid archive pagination');
233
+ const doc = this.read(), all = this.envelopes(doc);
234
+ const order = [...(doc.exportOrder ?? [])];
235
+ const seen = new Set(order);
236
+ for (const digest of all.keys())
237
+ if (!seen.has(digest)) {
238
+ order.push(digest);
239
+ seen.add(digest);
240
+ }
241
+ const selected = order.map(d => all.get(d)).filter((e) => !!e && (!opts.kind || e.kind === opts.kind) && (!opts.id || e.record.id === opts.id));
242
+ const entries = [], oversized = [];
243
+ let index = Math.min(offset, selected.length), bytes = 65536;
244
+ while (index < selected.length && entries.length + oversized.length < limit) {
245
+ const entry = selected[index], size = Buffer.byteLength(JSON.stringify(entry));
246
+ if (size > EVOLUTION_ARCHIVE_PAGE_BYTES - 65536) {
247
+ oversized.push({ digest: entry.digest, origin: entry.origin, kind: entry.kind, id: entry.record.id, reason: 'oversized' });
248
+ index++;
249
+ continue;
250
+ }
251
+ if (bytes + size > EVOLUTION_ARCHIVE_PAGE_BYTES)
252
+ break;
253
+ entries.push(entry);
254
+ bytes += size;
255
+ index++;
256
+ }
257
+ return { entries, nextOffset: index < selected.length ? index : null, incarnation: doc.archiveId ?? createHash('sha256').update(stableJson(doc)).digest('hex'), offset, total: selected.length, ...(oversized.length ? { oversized } : {}) };
258
+ }
259
+ /** Validate the complete page before changing any memory or advancing its peer cursor. */
260
+ importPage(page) {
261
+ EvolutionArchive.validatePage(page);
262
+ if (page.oversized?.length)
263
+ throw new Error('peer archive contains oversized records; incomplete preservation');
264
+ const doc = this.read(), known = this.envelopes(doc);
265
+ for (const entry of page.entries) {
266
+ if (known.has(entry.digest))
267
+ continue;
268
+ (doc.replicaEntries ??= []).push(entry);
269
+ known.set(entry.digest, entry);
270
+ }
271
+ this.write(doc);
272
+ }
273
+ static validatePage(page) {
274
+ if (!object(page) || !Array.isArray(page.entries) || page.entries.length > 50 || typeof page.incarnation !== 'string' || !page.incarnation || page.incarnation.length > 200 || !integer(page.offset) || !integer(page.total) || (page.nextOffset !== null && !integer(page.nextOffset)))
275
+ throw new Error('invalid evolution archive page');
276
+ if (Buffer.byteLength(JSON.stringify(page)) > EVOLUTION_ARCHIVE_PAGE_BYTES)
277
+ throw new Error('evolution archive page exceeds byte ceiling');
278
+ if (page.oversized !== undefined && (!Array.isArray(page.oversized) || page.oversized.length > 50))
279
+ throw new Error('invalid oversized archive metadata');
280
+ const oversized = (page.oversized ?? []);
281
+ for (const entry of oversized) {
282
+ if (!object(entry) || typeof entry.digest !== 'string' || !/^[a-f0-9]{64}$/.test(entry.digest)
283
+ || typeof entry.origin !== 'string' || !entry.origin || entry.origin.length > 200
284
+ || !kinds.has(entry.kind) || typeof entry.id !== 'string' || entry.id.length > 100
285
+ || entry.reason !== 'oversized')
286
+ throw new Error('invalid oversized archive metadata');
287
+ if (!isEvolutionRecordId(entry.id))
288
+ throw new Error('invalid oversized archive id');
289
+ }
290
+ const delivered = page.entries.length + oversized.length;
291
+ if (delivered > 50)
292
+ throw new Error('evolution archive page exceeds record ceiling');
293
+ if (page.nextOffset !== null) {
294
+ if (page.nextOffset !== page.offset + delivered || page.nextOffset <= page.offset || page.nextOffset > page.total)
295
+ throw new Error('invalid archive cursor coverage');
296
+ }
297
+ else if (page.offset + delivered !== page.total && !(page.offset > page.total && delivered === 0)) {
298
+ // A rebuilt stream may answer an old cursor past its new end. The worker
299
+ // verifies incarnation and rescans zero, rather than accepting missing rows.
300
+ throw new Error('invalid terminal archive coverage');
301
+ }
302
+ for (const entry of page.entries)
303
+ assertEnvelope(entry);
304
+ const digests = [...page.entries.map((entry) => entry.digest), ...oversized.map(entry => entry.digest)];
305
+ if (new Set(digests).size !== digests.length)
306
+ throw new Error('duplicate evolution archive page digest');
307
+ }
308
+ }
309
+ //# sourceMappingURL=EvolutionArchive.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvolutionArchive.js","sourceRoot":"","sources":["../../src/core/EvolutionArchive.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,26 @@
1
+ /** Bounded archive anti-entropy on the existing authenticated peer-presence cadence. */
2
+ import { EvolutionArchive, type EvolutionArchivePage, type EvolutionArchiveSyncPeer } from './EvolutionArchive.js';
3
+ export declare const EVOLUTION_ARCHIVE_SYNC_MAX_FAILURES = 6;
4
+ /** Shared runtime/ratchet brake: unchanged evidence eventually permits no more requests. */
5
+ export declare function evolutionArchiveSyncAttemptDue(peer: EvolutionArchiveSyncPeer, now: number): boolean;
6
+ /** Pessimistic attempt reservation: only durable validated import earns the budget back. */
7
+ export declare function advanceEvolutionArchiveFailure(peer: EvolutionArchiveSyncPeer, now: number): EvolutionArchiveSyncPeer;
8
+ export interface EvolutionArchiveSyncDeps {
9
+ fetchPage(peerId: string, url: string, offset: number, signal: AbortSignal): Promise<EvolutionArchivePage>;
10
+ now?: () => number;
11
+ log?: (event: string, detail: Record<string, unknown>) => void;
12
+ }
13
+ export declare class EvolutionArchiveSync {
14
+ private readonly archive;
15
+ private readonly deps;
16
+ private readonly active;
17
+ private stopped;
18
+ constructor(archive: EvolutionArchive, deps: EvolutionArchiveSyncDeps);
19
+ private peer;
20
+ private persist;
21
+ /** Explicit agent-owned re-arm; repeated presence alone never resets a parked peer. */
22
+ resetPeer(peerId: string): void;
23
+ onPeerRecorded(peerId: string, url: string): Promise<void>;
24
+ stop(): void;
25
+ }
26
+ //# sourceMappingURL=EvolutionArchiveSync.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvolutionArchiveSync.d.ts","sourceRoot":"","sources":["../../src/core/EvolutionArchiveSync.ts"],"names":[],"mappings":"AAAA,wFAAwF;AACxF,OAAO,EAAE,gBAAgB,EAAE,KAAK,oBAAoB,EAAE,KAAK,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAEnH,eAAO,MAAM,mCAAmC,IAAI,CAAC;AAErD,4FAA4F;AAC5F,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,wBAAwB,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAEnG;AAED,4FAA4F;AAC5F,wBAAgB,8BAA8B,CAAC,IAAI,EAAE,wBAAwB,EAAE,GAAG,EAAE,MAAM,GAAG,wBAAwB,CAIpH;AAED,MAAM,WAAW,wBAAwB;IACvC,SAAS,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAAC;IAC3G,GAAG,CAAC,EAAE,MAAM,MAAM,CAAC;IACnB,GAAG,CAAC,EAAE,CAAC,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAK,IAAI,CAAC;CAChE;AAED,qBAAa,oBAAoB;IAGnB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAAoB,OAAO,CAAC,QAAQ,CAAC,IAAI;IAF7E,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAsC;IAC7D,OAAO,CAAC,OAAO,CAAS;IACxB,YAA6B,OAAO,EAAE,gBAAgB,EAAmB,IAAI,EAAE,wBAAwB,EAAI;IAE3G,OAAO,CAAC,IAAI;IAKZ,OAAO,CAAC,OAAO;IAKf,uFAAuF;IACvF,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAM9B;IACK,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CA+C/D;IACD,IAAI,IAAI,IAAI,CAGX;CACF"}
@@ -0,0 +1,109 @@
1
+ /** Bounded archive anti-entropy on the existing authenticated peer-presence cadence. */
2
+ import { EvolutionArchive } from './EvolutionArchive.js';
3
+ export const EVOLUTION_ARCHIVE_SYNC_MAX_FAILURES = 6;
4
+ /** Shared runtime/ratchet brake: unchanged evidence eventually permits no more requests. */
5
+ export function evolutionArchiveSyncAttemptDue(peer, now) {
6
+ return !peer.parked && peer.failures < EVOLUTION_ARCHIVE_SYNC_MAX_FAILURES && now >= peer.nextAttemptAt;
7
+ }
8
+ /** Pessimistic attempt reservation: only durable validated import earns the budget back. */
9
+ export function advanceEvolutionArchiveFailure(peer, now) {
10
+ const failures = peer.failures + 1;
11
+ return { ...peer, failures, nextAttemptAt: now + Math.min(30 * 60_000, 30_000 * 2 ** (failures - 1)),
12
+ parked: failures >= EVOLUTION_ARCHIVE_SYNC_MAX_FAILURES };
13
+ }
14
+ /* @self-action-controller: evolution-archive-sync */
15
+ export class EvolutionArchiveSync {
16
+ archive;
17
+ deps;
18
+ active = new Map();
19
+ stopped = false;
20
+ constructor(archive, deps) {
21
+ this.archive = archive;
22
+ this.deps = deps;
23
+ }
24
+ peer(peerId, url) {
25
+ const doc = this.archive.read();
26
+ const prior = doc.syncPeers?.[peerId];
27
+ return prior?.url === url ? { ...prior } : { url, offset: 0, failures: 0, nextAttemptAt: 0, parked: false };
28
+ }
29
+ persist(peerId, peer) {
30
+ const doc = this.archive.read(); // Always re-read after any asynchronous fetch/import.
31
+ doc.syncPeers = { ...(doc.syncPeers ?? {}), [peerId]: peer };
32
+ this.archive.write(doc);
33
+ }
34
+ /** Explicit agent-owned re-arm; repeated presence alone never resets a parked peer. */
35
+ resetPeer(peerId) {
36
+ const doc = this.archive.read();
37
+ if (doc.syncPeers?.[peerId]) {
38
+ doc.syncPeers[peerId] = { ...doc.syncPeers[peerId], failures: 0, nextAttemptAt: 0, parked: false };
39
+ this.archive.write(doc);
40
+ }
41
+ }
42
+ async onPeerRecorded(peerId, url) {
43
+ if (this.stopped || this.active.has(peerId))
44
+ return;
45
+ const now = this.deps.now ?? Date.now;
46
+ // A corrupt ledger must refuse ALL requests; never silently reset its bound.
47
+ let peer;
48
+ try {
49
+ peer = this.peer(peerId, url);
50
+ }
51
+ catch (err) {
52
+ this.deps.log?.('evolution-archive-sync-unavailable', { peerId, error: String(err) });
53
+ return;
54
+ }
55
+ if (!evolutionArchiveSyncAttemptDue(peer, now()))
56
+ return;
57
+ const controller = new AbortController();
58
+ this.active.set(peerId, controller);
59
+ const deadline = setTimeout(() => controller.abort(), 5_000);
60
+ deadline.unref();
61
+ try {
62
+ for (let pages = 0; pages < 4 && !this.stopped && !controller.signal.aborted; pages++) {
63
+ if (!evolutionArchiveSyncAttemptDue(peer, now()))
64
+ return;
65
+ // Spend and fsync the retry budget BEFORE sending. A full/unwritable archive
66
+ // authorizes zero requests; process loss or failed custody cannot reset attempts.
67
+ const reserved = advanceEvolutionArchiveFailure(peer, now());
68
+ this.persist(peerId, reserved);
69
+ peer = reserved;
70
+ const page = await this.deps.fetchPage(peerId, url, peer.offset, controller.signal);
71
+ if (this.stopped || controller.signal.aborted)
72
+ return;
73
+ EvolutionArchive.validatePage(page);
74
+ if (peer.incarnation !== undefined && peer.incarnation !== page.incarnation && peer.offset !== 0) {
75
+ // Do not accept a stale-offset page from a rebuilt stream; rescan its beginning.
76
+ const reset = { ...peer, offset: 0, incarnation: page.incarnation, failures: 0, nextAttemptAt: 0, parked: false };
77
+ this.persist(peerId, reset);
78
+ peer = reset;
79
+ continue;
80
+ }
81
+ if (page.offset !== peer.offset)
82
+ throw new Error('peer archive offset mismatch');
83
+ this.archive.importPage(page); // fsync custody first; cursor is durable only afterwards.
84
+ const imported = { ...peer, incarnation: page.incarnation, offset: page.nextOffset ?? 0, failures: 0, nextAttemptAt: 0, parked: false };
85
+ this.persist(peerId, imported);
86
+ peer = imported;
87
+ if (page.nextOffset === null)
88
+ return;
89
+ }
90
+ }
91
+ catch (err) {
92
+ if (!this.stopped) {
93
+ // The attempt was already charged before fetch; never double-charge or
94
+ // depend on a second write succeeding after a disk/custody failure.
95
+ this.deps.log?.(peer.parked ? 'evolution-archive-sync-parked' : 'evolution-archive-sync-failed', { peerId, failures: peer.failures, nextAttemptAt: peer.nextAttemptAt, error: String(err) });
96
+ }
97
+ }
98
+ finally {
99
+ clearTimeout(deadline);
100
+ this.active.delete(peerId);
101
+ }
102
+ }
103
+ stop() {
104
+ this.stopped = true;
105
+ for (const controller of this.active.values())
106
+ controller.abort();
107
+ }
108
+ }
109
+ //# sourceMappingURL=EvolutionArchiveSync.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"EvolutionArchiveSync.js","sourceRoot":"","sources":["../../src/core/EvolutionArchiveSync.ts"],"names":[],"mappings":"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"}