instar 1.3.338 → 1.3.340
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 +166 -10
- package/dist/commands/server.js.map +1 -1
- package/dist/config/ConfigDefaults.d.ts.map +1 -1
- package/dist/config/ConfigDefaults.js +17 -0
- package/dist/config/ConfigDefaults.js.map +1 -1
- package/dist/core/AutonomousSessions.d.ts +17 -2
- package/dist/core/AutonomousSessions.d.ts.map +1 -1
- package/dist/core/AutonomousSessions.js +30 -4
- package/dist/core/AutonomousSessions.js.map +1 -1
- package/dist/core/CoherenceJournal.d.ts +326 -0
- package/dist/core/CoherenceJournal.d.ts.map +1 -0
- package/dist/core/CoherenceJournal.js +999 -0
- package/dist/core/CoherenceJournal.js.map +1 -0
- package/dist/core/CoherenceJournalReader.d.ts +158 -0
- package/dist/core/CoherenceJournalReader.d.ts.map +1 -0
- package/dist/core/CoherenceJournalReader.js +450 -0
- package/dist/core/CoherenceJournalReader.js.map +1 -0
- package/dist/core/JournalSyncApplier.d.ts +272 -0
- package/dist/core/JournalSyncApplier.d.ts.map +1 -0
- package/dist/core/JournalSyncApplier.js +835 -0
- package/dist/core/JournalSyncApplier.js.map +1 -0
- package/dist/core/LearningVelocityScorer.d.ts +40 -0
- package/dist/core/LearningVelocityScorer.d.ts.map +1 -0
- package/dist/core/LearningVelocityScorer.js +67 -0
- package/dist/core/LearningVelocityScorer.js.map +1 -0
- package/dist/core/PostUpdateMigrator.d.ts.map +1 -1
- package/dist/core/PostUpdateMigrator.js +17 -0
- package/dist/core/PostUpdateMigrator.js.map +1 -1
- package/dist/core/StateManager.d.ts +41 -0
- package/dist/core/StateManager.d.ts.map +1 -1
- package/dist/core/StateManager.js +100 -0
- package/dist/core/StateManager.js.map +1 -1
- package/dist/core/types.d.ts +35 -0
- package/dist/core/types.d.ts.map +1 -1
- package/dist/core/types.js.map +1 -1
- package/dist/messaging/TelegramAdapter.d.ts +14 -0
- package/dist/messaging/TelegramAdapter.d.ts.map +1 -1
- package/dist/messaging/TelegramAdapter.js +16 -1
- package/dist/messaging/TelegramAdapter.js.map +1 -1
- package/dist/scaffold/templates.d.ts.map +1 -1
- package/dist/scaffold/templates.js +11 -0
- package/dist/scaffold/templates.js.map +1 -1
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +116 -3
- package/dist/server/routes.js.map +1 -1
- package/package.json +2 -2
- package/scripts/lint-cas-emit-placement.js +87 -0
- package/scripts/lint-journal-actuation-ban.js +63 -0
- package/scripts/lint-state-registry.js +313 -0
- package/src/data/builtin-manifest.json +63 -63
- package/src/data/state-coherence-registry.json +880 -0
- package/src/scaffold/templates.ts +11 -0
- package/upgrades/1.3.340.md +132 -0
- package/upgrades/coherence-journal-p1-1.eli16.md +11 -0
- package/upgrades/coherence-journal-p1-2.eli16.md +11 -0
- package/upgrades/coherence-journal-p1-3.eli16.md +13 -0
- package/upgrades/side-effects/coherence-journal-p1-1.md +68 -0
- package/upgrades/side-effects/coherence-journal-p1-2.md +54 -0
- package/upgrades/side-effects/coherence-journal-p1-3.md +49 -0
- package/upgrades/side-effects/exo3-g5-ci-greening.md +29 -0
|
@@ -0,0 +1,272 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JournalSyncApplier — the RECEIVE (and own-stream SERVE) side of coherence
|
|
3
|
+
* journal replication (P1.3 of multi-machine coherence).
|
|
4
|
+
*
|
|
5
|
+
* Spec: docs/specs/COHERENCE-JOURNAL-SPEC.md §3.4 (replication trust model —
|
|
6
|
+
* ALL seven rules), §3.1 (stream/meta layout), §5 (trust model).
|
|
7
|
+
*
|
|
8
|
+
* This class is PURE and MESH-INDEPENDENT. It owns disk state only; another
|
|
9
|
+
* workstream wires the `journal-sync` MeshRpc verb, the `session-status`
|
|
10
|
+
* advert, and the delta-request loop on top of it. It NEVER imports MeshRpc,
|
|
11
|
+
* the server, or the mesh dispatcher — it is the engine those call.
|
|
12
|
+
*
|
|
13
|
+
* Replica layout (§3.1): peer copies of machine M's stream of kind K live at
|
|
14
|
+
* <stateDir>/state/coherence-journal/peers/<safeMachineId(M)>.<kind>.jsonl
|
|
15
|
+
* with one sidecar
|
|
16
|
+
* <stateDir>/state/coherence-journal/peers/<safeMachineId(M)>.meta.json
|
|
17
|
+
* holding the stream-set incarnation token (top-level, mirroring the writer's
|
|
18
|
+
* own meta so `CoherenceJournalReader.readIncarnation` parses it) plus per-kind
|
|
19
|
+
* apply bookkeeping (lastHeldSeq, status, suspect/flap counters, gap sentinels)
|
|
20
|
+
* and the bounded quarantine record.
|
|
21
|
+
*
|
|
22
|
+
* The receive-side §4.1 durability rule lives HERE: a replica append fsyncs
|
|
23
|
+
* BEFORE the entries are reported `applied`, so a journal-sync ack is an
|
|
24
|
+
* ack-after-durable-commit. Author-side durability is the writer's separate
|
|
25
|
+
* best-effort flush window — this is the receiver's contract.
|
|
26
|
+
*
|
|
27
|
+
* Trust model enforced (§3.4):
|
|
28
|
+
* 1. FIRST-HOP SENDER BINDING — every entry's `machine` must === the
|
|
29
|
+
* authenticated sender; the target file derives from the sender, NEVER a
|
|
30
|
+
* payload field. Forged entries are rejected + counted, never appended.
|
|
31
|
+
* 2. SCHEMA-VALIDATED APPLY — per entry: parseable + size-cap, seq exactly
|
|
32
|
+
* lastHeldSeq+1, ts parses, kind known-or-ignorable, data passes the kind's
|
|
33
|
+
* typed schema. ANY failure marks the stream `suspect` and STOPS the batch
|
|
34
|
+
* at the last valid line. `suspect` self-clears after K=20 consecutive
|
|
35
|
+
* valid in-order applies.
|
|
36
|
+
* 3. INCARNATION FENCING — a known stream arriving with a NEW incarnation
|
|
37
|
+
* quarantines the old replica (rename aside, ≤2 kept per stream), starts
|
|
38
|
+
* fresh, and surfaces a coalesced divergence signal (per-machine 10min
|
|
39
|
+
* window); >3 flips in the window → status `reset-flapping`, surfaced once.
|
|
40
|
+
* 4. TRUNCATION SIGNALS — a batch may carry `oldestRetainedSeq`; when
|
|
41
|
+
* lastHeldSeq+1 < oldestRetainedSeq the receiver records a gap sentinel in
|
|
42
|
+
* the replica meta (NOT a fake journal line), fast-forwards lastHeldSeq to
|
|
43
|
+
* oldestRetainedSeq-1, and marks the stream `gapped` until the next clean
|
|
44
|
+
* apply. (Gap re-request PACING is the caller's job; this exposes status.)
|
|
45
|
+
*
|
|
46
|
+
* All replica writes go through the injected guardWrite seam (same seam as the
|
|
47
|
+
* writer) and O_APPEND single-line writes. The applier is tolerant + bounded
|
|
48
|
+
* everywhere and NEVER throws into its caller; degradation is surfaced via
|
|
49
|
+
* counters and per-stream status.
|
|
50
|
+
*/
|
|
51
|
+
import { type JournalEntry, type JournalKind, type JournalFs } from './CoherenceJournal.js';
|
|
52
|
+
/** Per-entry size cap on the receive side (§3.4 rule 2). Mirrors the writer's
|
|
53
|
+
* DEFAULT_MAX_ENTRY_BYTES (source of truth: CoherenceJournal.ts). */
|
|
54
|
+
export declare const APPLIER_MAX_ENTRY_BYTES: number;
|
|
55
|
+
/** Consecutive valid in-order applies that self-clear `suspect` (§3.4 rule 2). */
|
|
56
|
+
export declare const SUSPECT_CLEAR_THRESHOLD = 20;
|
|
57
|
+
/** Quarantined replica files kept per stream before evicting the oldest (rule 3). */
|
|
58
|
+
export declare const MAX_QUARANTINE_PER_STREAM = 2;
|
|
59
|
+
/** Incarnation-flap coalescing window per machine (rule 3). */
|
|
60
|
+
export declare const FLAP_WINDOW_MS: number;
|
|
61
|
+
/** Flips within the window past this → `reset-flapping`, surfaced once (rule 3). */
|
|
62
|
+
export declare const FLAP_RESET_THRESHOLD = 3;
|
|
63
|
+
/** Default serve-batch size cap (§3.4 rule 5 — journalSyncMaxBatchBytes). */
|
|
64
|
+
export declare const DEFAULT_MAX_BATCH_BYTES = 262144;
|
|
65
|
+
/** Per-stream replication status surfaced to the caller (§3.4 rule 4). */
|
|
66
|
+
export type StreamReplStatus = 'current' | 'behind' | 'gapped' | 'suspect' | 'reset-flapping';
|
|
67
|
+
/** One stream's apply bookkeeping, persisted in the peer meta sidecar. */
|
|
68
|
+
export interface PeerKindState {
|
|
69
|
+
/** Highest contiguously-applied seq held locally for this peer+kind. */
|
|
70
|
+
lastHeldSeq: number;
|
|
71
|
+
status: StreamReplStatus;
|
|
72
|
+
/** Consecutive valid in-order applies since the stream last went `suspect`. */
|
|
73
|
+
consecutiveValid: number;
|
|
74
|
+
/** Gap sentinels recorded by truncation fast-forwards (§3.4 rule 4). */
|
|
75
|
+
gaps: GapSentinel[];
|
|
76
|
+
}
|
|
77
|
+
/** A recorded hole in a replica stream (rule 4) — meta bookkeeping, NOT a line. */
|
|
78
|
+
export interface GapSentinel {
|
|
79
|
+
/** First seq known-missing (the old lastHeldSeq+1). */
|
|
80
|
+
fromSeq: number;
|
|
81
|
+
/** Last seq known-missing (oldestRetainedSeq-1). */
|
|
82
|
+
toSeq: number;
|
|
83
|
+
/** When this machine recorded the gap. */
|
|
84
|
+
recordedAt: string;
|
|
85
|
+
}
|
|
86
|
+
/** The peer meta sidecar (§3.1) — incarnation top-level (reader-compatible). */
|
|
87
|
+
export interface PeerMeta {
|
|
88
|
+
incarnation: string;
|
|
89
|
+
/** Per-kind apply bookkeeping. */
|
|
90
|
+
kinds: Partial<Record<JournalKind, PeerKindState>>;
|
|
91
|
+
/** Incarnation flips observed (timestamps ms) for the flap window. */
|
|
92
|
+
flipsMs: number[];
|
|
93
|
+
/** Sticky once a machine has been flagged reset-flapping (surfaced once). */
|
|
94
|
+
resetFlapping: boolean;
|
|
95
|
+
}
|
|
96
|
+
/** A divergence signal coalesced per machine within FLAP_WINDOW_MS (rule 3). */
|
|
97
|
+
export interface DivergenceSignal {
|
|
98
|
+
machineId: string;
|
|
99
|
+
kind: JournalKind;
|
|
100
|
+
oldIncarnation: string;
|
|
101
|
+
newIncarnation: string;
|
|
102
|
+
at: string;
|
|
103
|
+
}
|
|
104
|
+
/** One stream's slice of an inbound batch. */
|
|
105
|
+
export interface ApplyBatchStream {
|
|
106
|
+
kind: JournalKind;
|
|
107
|
+
incarnation: string;
|
|
108
|
+
entries: JournalEntry[];
|
|
109
|
+
/** Optional truncation watermark (§3.4 rule 4). */
|
|
110
|
+
oldestRetainedSeq?: number;
|
|
111
|
+
}
|
|
112
|
+
/** Result of an apply() call — never thrown, fully observable. */
|
|
113
|
+
export interface ApplyResult {
|
|
114
|
+
/** Total entries durably appended across all streams in this call. */
|
|
115
|
+
applied: number;
|
|
116
|
+
/** Entries rejected by first-hop sender binding (rule 1). */
|
|
117
|
+
forgedEntries: number;
|
|
118
|
+
/** Entries dropped as duplicates (seq <= lastHeldSeq) — silent (rule 2). */
|
|
119
|
+
duplicates: number;
|
|
120
|
+
/** Entries failing schema/seq/size/ts validation (rule 2). */
|
|
121
|
+
invalidEntries: number;
|
|
122
|
+
/** Streams marked suspect in this call (rule 2). */
|
|
123
|
+
suspectStreams: number;
|
|
124
|
+
/** Streams quarantined for a new incarnation in this call (rule 3). */
|
|
125
|
+
quarantined: number;
|
|
126
|
+
/** Truncation gaps recorded in this call (rule 4). */
|
|
127
|
+
gapsRecorded: number;
|
|
128
|
+
/** Append batches skipped because guardWrite refused (never thrown). */
|
|
129
|
+
guardSkips: number;
|
|
130
|
+
/** Divergence signals emitted (coalesced) in this call (rule 3). */
|
|
131
|
+
signals: DivergenceSignal[];
|
|
132
|
+
/** Per-stream final status after this call. */
|
|
133
|
+
statuses: Record<string, StreamReplStatus>;
|
|
134
|
+
}
|
|
135
|
+
/** Aggregate degradation counters (lifetime). */
|
|
136
|
+
export interface ApplierDegradation {
|
|
137
|
+
applied: number;
|
|
138
|
+
forgedEntries: number;
|
|
139
|
+
duplicates: number;
|
|
140
|
+
invalidEntries: number;
|
|
141
|
+
suspectMarks: number;
|
|
142
|
+
quarantines: number;
|
|
143
|
+
gapsRecorded: number;
|
|
144
|
+
guardSkips: number;
|
|
145
|
+
appendErrors: number;
|
|
146
|
+
signals: number;
|
|
147
|
+
}
|
|
148
|
+
export interface JournalSyncApplierConfig {
|
|
149
|
+
/** Absolute path to the agent's `.instar/` directory (the stateDir). */
|
|
150
|
+
stateDir: string;
|
|
151
|
+
/**
|
|
152
|
+
* Injected standby read-only guard (§3.1). Called with the target replica
|
|
153
|
+
* file path before each append batch; throwing skips the batch + counts.
|
|
154
|
+
* Same seam the writer uses (`StateManager.guardJournalWrite`).
|
|
155
|
+
*/
|
|
156
|
+
guardWrite?: (filePath: string) => void;
|
|
157
|
+
/** Optional clock override (tests). */
|
|
158
|
+
now?: () => Date;
|
|
159
|
+
/** Optional logger; called once per failure class. */
|
|
160
|
+
logger?: (msg: string) => void;
|
|
161
|
+
/** Optional fs seam for fault-injection tests. Defaults to node:fs. */
|
|
162
|
+
fsImpl?: JournalFs;
|
|
163
|
+
/** Per-entry size cap override. Default APPLIER_MAX_ENTRY_BYTES. */
|
|
164
|
+
maxEntryBytes?: number;
|
|
165
|
+
}
|
|
166
|
+
export declare class JournalSyncApplier {
|
|
167
|
+
private readonly stateDir;
|
|
168
|
+
private readonly guardWrite?;
|
|
169
|
+
private readonly now;
|
|
170
|
+
private readonly logger?;
|
|
171
|
+
private readonly io;
|
|
172
|
+
private readonly maxEntryBytes;
|
|
173
|
+
/** In-memory meta cache per peer machine (keyed by RAW machineId). */
|
|
174
|
+
private metaCache;
|
|
175
|
+
private degradation;
|
|
176
|
+
private loggedClasses;
|
|
177
|
+
constructor(config: JournalSyncApplierConfig);
|
|
178
|
+
getDegradation(): Readonly<ApplierDegradation>;
|
|
179
|
+
/**
|
|
180
|
+
* What this machine holds per peer stream — `{ machineId → { kind →
|
|
181
|
+
* { incarnation, lastSeq } } }` — so the caller can compare against a peer's
|
|
182
|
+
* advert and request only the missing ranges (§3.4 rule 5). Sourced from the
|
|
183
|
+
* persisted peer meta (incarnation + per-kind lastHeldSeq).
|
|
184
|
+
*/
|
|
185
|
+
getAdvertState(): Record<string, Record<string, {
|
|
186
|
+
incarnation: string;
|
|
187
|
+
lastSeq: number;
|
|
188
|
+
}>>;
|
|
189
|
+
/** Per-stream replication status (§3.4 rule 4 — caller drives gap pacing). */
|
|
190
|
+
getStreamStatus(): Record<string, StreamReplStatus>;
|
|
191
|
+
/**
|
|
192
|
+
* Apply an inbound batch from `senderMachineId` (the AUTHENTICATED envelope
|
|
193
|
+
* identity). Implements §3.4 rules 1-4. Never throws; the result is fully
|
|
194
|
+
* observable. The target replica files derive from `senderMachineId` only —
|
|
195
|
+
* NEVER from any payload field.
|
|
196
|
+
*/
|
|
197
|
+
apply(senderMachineId: string, batch: ApplyBatchStream[]): ApplyResult;
|
|
198
|
+
private applyStream;
|
|
199
|
+
/**
|
|
200
|
+
* Per-entry verdict (§3.4 rules 1 + 2). `expectedSeq` is lastHeldSeq + count
|
|
201
|
+
* already queued this batch, so seq must be exactly contiguous.
|
|
202
|
+
*/
|
|
203
|
+
private validateEntry;
|
|
204
|
+
/**
|
|
205
|
+
* §3.2 typed schema validation — MIRRORED from CoherenceJournal.validate()
|
|
206
|
+
* (source of truth: src/core/CoherenceJournal.ts). The applier validates
|
|
207
|
+
* STRICTLY (reject on unknown/extra fields too) so a peer's buggy/forged
|
|
208
|
+
* writer cannot smuggle free text past the receiver. Returns true if the
|
|
209
|
+
* data is a well-formed instance of the kind's schema.
|
|
210
|
+
*/
|
|
211
|
+
private validateData;
|
|
212
|
+
private handleIncarnationFlip;
|
|
213
|
+
/**
|
|
214
|
+
* Rename a peer replica file aside as `<file>.quarantine.<stamp>`, keeping at
|
|
215
|
+
* most MAX_QUARANTINE_PER_STREAM per stream (oldest evicted). Bounded disk.
|
|
216
|
+
*/
|
|
217
|
+
private quarantineReplica;
|
|
218
|
+
private pruneQuarantine;
|
|
219
|
+
/**
|
|
220
|
+
* Append validated lines to the peer replica file with O_APPEND single-line
|
|
221
|
+
* writes, then fdatasync BEFORE returning the applied count (§4.1 — the
|
|
222
|
+
* receiver's durability-before-ack rule lives HERE). Returns the number of
|
|
223
|
+
* lines durably committed (0 if the guard refused or the open/write failed
|
|
224
|
+
* before any byte landed). Never throws.
|
|
225
|
+
*/
|
|
226
|
+
private durablyAppend;
|
|
227
|
+
/**
|
|
228
|
+
* Build a delta batch from THIS machine's OWN stream for a peer that is
|
|
229
|
+
* behind (§3.4 rule 5). Reads the FILE (never any queue) so only
|
|
230
|
+
* durably-flushed entries are served — a §3.4-rule-3 corollary the writer
|
|
231
|
+
* guarantees by advertising only flushed seqs. First-hop only: this serves
|
|
232
|
+
* exactly one own stream of one kind.
|
|
233
|
+
*
|
|
234
|
+
* @param kind which own stream to serve.
|
|
235
|
+
* @param fromSeq serve entries with seq > fromSeq (the peer's lastSeq).
|
|
236
|
+
* @param maxBatchBytes total serialized byte cap (default DEFAULT_MAX_BATCH_BYTES).
|
|
237
|
+
* @param ownMachineId this machine's id (the producer of the served stream).
|
|
238
|
+
*/
|
|
239
|
+
buildServeBatch(kind: JournalKind, fromSeq: number, ownMachineId: string, maxBatchBytes?: number): {
|
|
240
|
+
kind: JournalKind;
|
|
241
|
+
incarnation: string;
|
|
242
|
+
entries: JournalEntry[];
|
|
243
|
+
oldestRetainedSeq?: number;
|
|
244
|
+
};
|
|
245
|
+
private ensureKind;
|
|
246
|
+
private markSuspect;
|
|
247
|
+
private loadMeta;
|
|
248
|
+
private normalizeKinds;
|
|
249
|
+
private persistMeta;
|
|
250
|
+
private mintIncarnation;
|
|
251
|
+
/** Discover peer machine ids from the peers/ meta sidecars + replica files. */
|
|
252
|
+
private discoverPeerMachines;
|
|
253
|
+
/**
|
|
254
|
+
* The peer file grammar uses the SANITIZED machine id as the literal. The raw
|
|
255
|
+
* id is only needed for first-hop binding (which uses the sender id directly,
|
|
256
|
+
* not a derived one) — for advert/status keys we surface the on-disk literal
|
|
257
|
+
* (already sanitized + injective), so reverse-mapping is unnecessary and we
|
|
258
|
+
* keep the literal as the machine key. (sanitizeMachineId is injective, so
|
|
259
|
+
* the literal is a faithful, stable handle.)
|
|
260
|
+
*/
|
|
261
|
+
private unsanitizeBestEffort;
|
|
262
|
+
/** Own current + archive stream files (newest-first) for serve reads. */
|
|
263
|
+
private ownStreamFilesNewestFirst;
|
|
264
|
+
private readOwnIncarnation;
|
|
265
|
+
private dirPath;
|
|
266
|
+
private peersDirPath;
|
|
267
|
+
private replicaFilePath;
|
|
268
|
+
private metaPath;
|
|
269
|
+
private ensurePeersDir;
|
|
270
|
+
private log;
|
|
271
|
+
}
|
|
272
|
+
//# sourceMappingURL=JournalSyncApplier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"JournalSyncApplier.d.ts","sourceRoot":"","sources":["../../src/core/JournalSyncApplier.ts"],"names":[],"mappings":"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"}
|