@smartmemory/stratum 0.3.0

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 (81) hide show
  1. package/dist/cli/guard.js +91 -0
  2. package/dist/cli/guard.js.map +1 -0
  3. package/dist/cli/mcp_install.js +302 -0
  4. package/dist/cli/mcp_install.js.map +1 -0
  5. package/dist/cli/query_gate.js +316 -0
  6. package/dist/cli/query_gate.js.map +1 -0
  7. package/dist/cli/stratum.js +291 -0
  8. package/dist/cli/stratum.js.map +1 -0
  9. package/dist/connectors/background.js +531 -0
  10. package/dist/connectors/background.js.map +1 -0
  11. package/dist/connectors/base.js +12 -0
  12. package/dist/connectors/base.js.map +1 -0
  13. package/dist/connectors/claude-bg-worker.js +99 -0
  14. package/dist/connectors/claude-bg-worker.js.map +1 -0
  15. package/dist/connectors/claude.js +170 -0
  16. package/dist/connectors/claude.js.map +1 -0
  17. package/dist/connectors/codex.js +319 -0
  18. package/dist/connectors/codex.js.map +1 -0
  19. package/dist/connectors/index.js +7 -0
  20. package/dist/connectors/index.js.map +1 -0
  21. package/dist/connectors/proc_identity.js +90 -0
  22. package/dist/connectors/proc_identity.js.map +1 -0
  23. package/dist/connectors/runner.js +63 -0
  24. package/dist/connectors/runner.js.map +1 -0
  25. package/dist/contracts/events.json +65 -0
  26. package/dist/contracts/mcp-surface.json +215 -0
  27. package/dist/engine/checkpoint.js +50 -0
  28. package/dist/engine/checkpoint.js.map +1 -0
  29. package/dist/engine/engine.js +2356 -0
  30. package/dist/engine/engine.js.map +1 -0
  31. package/dist/engine/ledger.js +36 -0
  32. package/dist/engine/ledger.js.map +1 -0
  33. package/dist/engine/state.js +42 -0
  34. package/dist/engine/state.js.map +1 -0
  35. package/dist/eval/expr.js +679 -0
  36. package/dist/eval/expr.js.map +1 -0
  37. package/dist/eval/files.js +130 -0
  38. package/dist/eval/files.js.map +1 -0
  39. package/dist/guard/canonical.js +116 -0
  40. package/dist/guard/canonical.js.map +1 -0
  41. package/dist/guard/errors.js +80 -0
  42. package/dist/guard/errors.js.map +1 -0
  43. package/dist/guard/evidence.js +475 -0
  44. package/dist/guard/evidence.js.map +1 -0
  45. package/dist/guard/fingerprint.js +13 -0
  46. package/dist/guard/fingerprint.js.map +1 -0
  47. package/dist/guard/lock.js +360 -0
  48. package/dist/guard/lock.js.map +1 -0
  49. package/dist/guard/store.js +396 -0
  50. package/dist/guard/store.js.map +1 -0
  51. package/dist/guard/transition.js +477 -0
  52. package/dist/guard/transition.js.map +1 -0
  53. package/dist/ir/refs.js +69 -0
  54. package/dist/ir/refs.js.map +1 -0
  55. package/dist/ir/schema.js +123 -0
  56. package/dist/ir/schema.js.map +1 -0
  57. package/dist/ir/validate.js +595 -0
  58. package/dist/ir/validate.js.map +1 -0
  59. package/dist/judge/codex_judged.js +85 -0
  60. package/dist/judge/codex_judged.js.map +1 -0
  61. package/dist/judge/fixture_judged.js +62 -0
  62. package/dist/judge/fixture_judged.js.map +1 -0
  63. package/dist/judge/judged.js +89 -0
  64. package/dist/judge/judged.js.map +1 -0
  65. package/dist/judge/pricing.js +22 -0
  66. package/dist/judge/pricing.js.map +1 -0
  67. package/dist/mcp/contracts.js +162 -0
  68. package/dist/mcp/contracts.js.map +1 -0
  69. package/dist/mcp/main.js +7 -0
  70. package/dist/mcp/main.js.map +1 -0
  71. package/dist/mcp/server.js +370 -0
  72. package/dist/mcp/server.js.map +1 -0
  73. package/dist/migrate/check.js +164 -0
  74. package/dist/migrate/check.js.map +1 -0
  75. package/dist/parallel/certificate.js +37 -0
  76. package/dist/parallel/certificate.js.map +1 -0
  77. package/dist/parallel/evaluate.js +73 -0
  78. package/dist/parallel/evaluate.js.map +1 -0
  79. package/dist/speckit/compiler.js +162 -0
  80. package/dist/speckit/compiler.js.map +1 -0
  81. package/package.json +47 -0
@@ -0,0 +1,396 @@
1
+ /** Guard registry and tamper-evident ledger persistence. */
2
+ import { createHash, randomUUID } from "node:crypto";
3
+ import { closeSync, constants, existsSync, fsyncSync, mkdirSync, openSync, readFileSync, renameSync, unlinkSync, writeFileSync, } from "node:fs";
4
+ import { homedir } from "node:os";
5
+ import { dirname, join } from "node:path";
6
+ import { canonicalJson } from "./canonical.js";
7
+ import { LedgerCorrupt, ResourceIdMismatch } from "./errors.js";
8
+ // Module-global and read at call time, matching Python's monkeypatchable GUARDS_DIR.
9
+ export let GUARDS_DIR = join(homedir(), ".stratum", "guards");
10
+ export function setGuardsDir(path) {
11
+ GUARDS_DIR = path;
12
+ }
13
+ export function resourceHash(resourceId) {
14
+ return createHash("sha256").update(resourceId, "utf8").digest("hex").slice(0, 32);
15
+ }
16
+ function validateResourceId(resourceId) {
17
+ if (typeof resourceId !== "string" || resourceId.length === 0) {
18
+ throw new TypeError("resource_id must be a non-empty string");
19
+ }
20
+ if (resourceId.includes("\0"))
21
+ throw new TypeError("resource_id must not contain NUL");
22
+ if (resourceId === "." || resourceId === "..")
23
+ throw new TypeError("resource_id cannot be '.' or '..'");
24
+ }
25
+ export function resourceDir(resourceId) {
26
+ validateResourceId(resourceId);
27
+ return join(GUARDS_DIR, resourceHash(resourceId));
28
+ }
29
+ const STATE_NAME_RE = /^[A-Za-z0-9_.-]+$/;
30
+ export function isValidStateName(name) {
31
+ return typeof name === "string" && STATE_NAME_RE.test(name);
32
+ }
33
+ function requiredField(record, name) {
34
+ if (!Object.hasOwn(record, name))
35
+ throw new TypeError(`missing required field ${name}`);
36
+ return record[name];
37
+ }
38
+ function asRecord(value) {
39
+ if (value === null || typeof value !== "object" || Array.isArray(value)) {
40
+ throw new TypeError("expected an object");
41
+ }
42
+ return value;
43
+ }
44
+ export class GuardRegistry {
45
+ resource_id;
46
+ graph;
47
+ edge_predicates;
48
+ initial;
49
+ terminal;
50
+ stakes;
51
+ checksum;
52
+ graph_version;
53
+ workspace_root;
54
+ current_state;
55
+ constructor(fields) {
56
+ this.resource_id = fields.resource_id;
57
+ this.graph = fields.graph;
58
+ this.edge_predicates = fields.edge_predicates;
59
+ this.initial = fields.initial;
60
+ this.terminal = fields.terminal ?? [];
61
+ this.stakes = fields.stakes ?? {};
62
+ this.checksum = fields.checksum ?? "";
63
+ this.graph_version = fields.graph_version ?? 1;
64
+ this.workspace_root = fields.workspace_root ?? null;
65
+ this.current_state = fields.current_state ?? "";
66
+ }
67
+ toDict() {
68
+ return {
69
+ resource_id: this.resource_id,
70
+ graph: this.graph,
71
+ edge_predicates: this.edge_predicates,
72
+ initial: this.initial,
73
+ terminal: this.terminal,
74
+ stakes: this.stakes,
75
+ checksum: this.checksum,
76
+ graph_version: this.graph_version,
77
+ workspace_root: this.workspace_root,
78
+ current_state: this.current_state,
79
+ };
80
+ }
81
+ static fromDict(value) {
82
+ const record = asRecord(value);
83
+ return new GuardRegistry({
84
+ resource_id: requiredField(record, "resource_id"),
85
+ graph: requiredField(record, "graph"),
86
+ edge_predicates: requiredField(record, "edge_predicates"),
87
+ initial: requiredField(record, "initial"),
88
+ ...(Object.hasOwn(record, "terminal") ? { terminal: record.terminal } : {}),
89
+ ...(Object.hasOwn(record, "stakes") ? { stakes: record.stakes } : {}),
90
+ ...(Object.hasOwn(record, "checksum") ? { checksum: record.checksum } : {}),
91
+ ...(Object.hasOwn(record, "graph_version") ? { graph_version: record.graph_version } : {}),
92
+ ...(Object.hasOwn(record, "workspace_root") ? { workspace_root: record.workspace_root } : {}),
93
+ ...(Object.hasOwn(record, "current_state") ? { current_state: record.current_state } : {}),
94
+ });
95
+ }
96
+ }
97
+ export class LedgerEntry {
98
+ ts_ms;
99
+ from_state;
100
+ to_state;
101
+ outcome;
102
+ kind;
103
+ resolved_by;
104
+ idempotency_key;
105
+ payload_digest;
106
+ rationale;
107
+ verdict;
108
+ prev_digest;
109
+ entry_digest;
110
+ constructor(fields) {
111
+ this.ts_ms = fields.ts_ms;
112
+ this.from_state = fields.from_state;
113
+ this.to_state = fields.to_state;
114
+ this.outcome = fields.outcome;
115
+ this.kind = fields.kind;
116
+ this.resolved_by = fields.resolved_by ?? "agent";
117
+ this.idempotency_key = fields.idempotency_key ?? null;
118
+ this.payload_digest = fields.payload_digest ?? null;
119
+ this.rationale = fields.rationale ?? null;
120
+ this.verdict = fields.verdict ?? null;
121
+ this.prev_digest = fields.prev_digest ?? "";
122
+ this.entry_digest = fields.entry_digest ?? "";
123
+ }
124
+ core() {
125
+ const { entry_digest: _entryDigest, ...core } = this.toDict();
126
+ return core;
127
+ }
128
+ toDict() {
129
+ return {
130
+ ts_ms: this.ts_ms,
131
+ from_state: this.from_state,
132
+ to_state: this.to_state,
133
+ outcome: this.outcome,
134
+ kind: this.kind,
135
+ resolved_by: this.resolved_by,
136
+ idempotency_key: this.idempotency_key,
137
+ payload_digest: this.payload_digest,
138
+ rationale: this.rationale,
139
+ verdict: this.verdict,
140
+ prev_digest: this.prev_digest,
141
+ entry_digest: this.entry_digest,
142
+ };
143
+ }
144
+ static fromDict(value) {
145
+ const record = asRecord(value);
146
+ return new LedgerEntry({
147
+ ts_ms: requiredField(record, "ts_ms"),
148
+ from_state: requiredField(record, "from_state"),
149
+ to_state: requiredField(record, "to_state"),
150
+ outcome: requiredField(record, "outcome"),
151
+ kind: requiredField(record, "kind"),
152
+ ...(Object.hasOwn(record, "resolved_by") ? { resolved_by: record.resolved_by } : {}),
153
+ ...(Object.hasOwn(record, "idempotency_key") ? { idempotency_key: record.idempotency_key } : {}),
154
+ ...(Object.hasOwn(record, "payload_digest") ? { payload_digest: record.payload_digest } : {}),
155
+ ...(Object.hasOwn(record, "rationale") ? { rationale: record.rationale } : {}),
156
+ ...(Object.hasOwn(record, "verdict") ? { verdict: record.verdict } : {}),
157
+ ...(Object.hasOwn(record, "prev_digest") ? { prev_digest: record.prev_digest } : {}),
158
+ ...(Object.hasOwn(record, "entry_digest") ? { entry_digest: record.entry_digest } : {}),
159
+ });
160
+ }
161
+ }
162
+ export function computeEntryDigest(entryCore, prevDigest) {
163
+ return createHash("sha256").update(canonicalJson(entryCore) + prevDigest, "utf8").digest("hex");
164
+ }
165
+ function prettyCanonicalJson(value) {
166
+ const compact = canonicalJson(value);
167
+ let output = "";
168
+ let indent = 0;
169
+ let inString = false;
170
+ let escaped = false;
171
+ for (let index = 0; index < compact.length; index += 1) {
172
+ const char = compact[index];
173
+ if (inString) {
174
+ output += char;
175
+ if (escaped)
176
+ escaped = false;
177
+ else if (char === "\\")
178
+ escaped = true;
179
+ else if (char === '"')
180
+ inString = false;
181
+ continue;
182
+ }
183
+ if (char === '"') {
184
+ inString = true;
185
+ output += char;
186
+ }
187
+ else if (char === "{" || char === "[") {
188
+ output += char;
189
+ if (compact[index + 1] !== (char === "{" ? "}" : "]")) {
190
+ indent += 1;
191
+ output += `\n${" ".repeat(indent)}`;
192
+ }
193
+ }
194
+ else if (char === "}" || char === "]") {
195
+ if (compact[index - 1] !== (char === "}" ? "{" : "[")) {
196
+ indent -= 1;
197
+ output += `\n${" ".repeat(indent)}`;
198
+ }
199
+ output += char;
200
+ }
201
+ else if (char === ",") {
202
+ output += `,\n${" ".repeat(indent)}`;
203
+ }
204
+ else if (char === ":") {
205
+ output += ": ";
206
+ }
207
+ else {
208
+ output += char;
209
+ }
210
+ }
211
+ return output;
212
+ }
213
+ export function atomicWrite(path, content) {
214
+ mkdirSync(dirname(path), { recursive: true });
215
+ const temporaryPath = join(dirname(path), `.${randomUUID()}.tmp`);
216
+ let descriptor;
217
+ try {
218
+ descriptor = openSync(temporaryPath, constants.O_WRONLY | constants.O_CREAT | constants.O_EXCL, 0o600);
219
+ writeFileSync(descriptor, content, "utf8");
220
+ fsyncSync(descriptor);
221
+ closeSync(descriptor);
222
+ descriptor = undefined;
223
+ renameSync(temporaryPath, path);
224
+ }
225
+ catch (error) {
226
+ if (descriptor !== undefined)
227
+ closeSync(descriptor);
228
+ try {
229
+ unlinkSync(temporaryPath);
230
+ }
231
+ catch {
232
+ // The temporary file may not have been created or may already be renamed.
233
+ }
234
+ throw error;
235
+ }
236
+ }
237
+ export function registryExists(resourceId) {
238
+ return existsSync(join(resourceDir(resourceId), "registry.json"));
239
+ }
240
+ export function readEngineOwner(resourceId) {
241
+ const path = join(resourceDir(resourceId), "engine.json");
242
+ if (!existsSync(path))
243
+ return null;
244
+ try {
245
+ const marker = JSON.parse(readFileSync(path, "utf8"));
246
+ if (marker === null || typeof marker !== "object" || Array.isArray(marker))
247
+ return null;
248
+ const owner = marker.owner;
249
+ return typeof owner === "string" ? owner : null;
250
+ }
251
+ catch {
252
+ return null;
253
+ }
254
+ }
255
+ export function writeTsOwnerMarker(resourceId) {
256
+ atomicWrite(join(resourceDir(resourceId), "engine.json"), `${canonicalJson({ owner: "ts", since: new Date().toISOString() })}\n`);
257
+ }
258
+ export function persistRegistry(registry) {
259
+ atomicWrite(join(resourceDir(registry.resource_id), "registry.json"), prettyCanonicalJson(registry.toDict()));
260
+ }
261
+ export function loadRegistryRaw(resourceId) {
262
+ const path = join(resourceDir(resourceId), "registry.json");
263
+ if (!existsSync(path))
264
+ return null;
265
+ let payload;
266
+ try {
267
+ payload = JSON.parse(readFileSync(path, "utf8"));
268
+ }
269
+ catch {
270
+ return null;
271
+ }
272
+ const registry = GuardRegistry.fromDict(payload);
273
+ if (registry.resource_id !== resourceId) {
274
+ throw new ResourceIdMismatch(`registry stores resource_id ${JSON.stringify(registry.resource_id)} but ${JSON.stringify(resourceId)} requested`);
275
+ }
276
+ return registry;
277
+ }
278
+ function ledgerPath(resourceId) {
279
+ return join(resourceDir(resourceId), "ledger.jsonl");
280
+ }
281
+ const ENTRY_DIGEST_PREFIX_RE = /^\{"entry_digest":"([0-9a-f]{64})",/;
282
+ function splitLedgerLines(raw) {
283
+ // Python's splitlines() covers these three ledger line endings. Unicode line
284
+ // separators are not expected in canonical JSONL ledger files.
285
+ return raw.split(/\r\n|\r|\n/).filter((line) => line.trim().length > 0);
286
+ }
287
+ function digestFromRawLine(line, prevDigest) {
288
+ const match = ENTRY_DIGEST_PREFIX_RE.exec(line);
289
+ if (match === null)
290
+ return null;
291
+ const coreCanonical = line.replace(ENTRY_DIGEST_PREFIX_RE, "{");
292
+ const expected = createHash("sha256").update(coreCanonical + prevDigest, "utf8").digest("hex");
293
+ return { expected, stored: match[1] };
294
+ }
295
+ export function readLedger(resourceId) {
296
+ const path = ledgerPath(resourceId);
297
+ if (!existsSync(path))
298
+ return [];
299
+ const lines = splitLedgerLines(readFileSync(path, "utf8"));
300
+ const entries = [];
301
+ let prev = "";
302
+ for (let index = 0; index < lines.length; index += 1) {
303
+ const isLast = index === lines.length - 1;
304
+ let entry;
305
+ try {
306
+ entry = LedgerEntry.fromDict(JSON.parse(lines[index]));
307
+ }
308
+ catch {
309
+ if (isLast)
310
+ break;
311
+ throw new LedgerCorrupt(`ledger line ${index} is not valid JSON (interior)`);
312
+ }
313
+ // JSON.parse collapses Python's 0.0 to 0, so parsed JS numbers cannot
314
+ // reproduce Python's canonical bytes. Ledger lines are already canonical:
315
+ // excising their alphabetically-first entry_digest preserves the exact core.
316
+ const digest = digestFromRawLine(lines[index], prev);
317
+ if (digest === null || digest.stored !== digest.expected || entry.prev_digest !== prev) {
318
+ if (isLast)
319
+ break;
320
+ throw new LedgerCorrupt(`ledger chain broken at line ${index} (interior tampering)`);
321
+ }
322
+ entries.push(entry);
323
+ prev = digest.stored;
324
+ }
325
+ return entries;
326
+ }
327
+ export function verifyChain(source) {
328
+ // Unlike Python, JavaScript loses the float-vs-int spelling during JSON.parse.
329
+ // Verification must therefore consume raw canonical lines, never parsed entries.
330
+ const lines = typeof source === "string"
331
+ ? splitLedgerLines(existsSync(source) ? readFileSync(source, "utf8") : source)
332
+ : source.filter((line) => line.trim().length > 0);
333
+ let prev = "";
334
+ for (const line of lines) {
335
+ let entry;
336
+ try {
337
+ entry = LedgerEntry.fromDict(JSON.parse(line));
338
+ }
339
+ catch {
340
+ return false;
341
+ }
342
+ const digest = digestFromRawLine(line, prev);
343
+ if (digest === null || entry.prev_digest !== prev || digest.stored !== digest.expected)
344
+ return false;
345
+ prev = digest.stored;
346
+ }
347
+ return true;
348
+ }
349
+ export function appendLedger(resourceId, entry) {
350
+ const entries = readLedger(resourceId);
351
+ const prev = entries.at(-1)?.entry_digest ?? "";
352
+ entry.prev_digest = prev;
353
+ entry.entry_digest = computeEntryDigest(entry.core(), prev);
354
+ const path = ledgerPath(resourceId);
355
+ mkdirSync(dirname(path), { recursive: true });
356
+ const line = `${canonicalJson(entry.toDict())}\n`;
357
+ const descriptor = openSync(path, constants.O_WRONLY | constants.O_CREAT | constants.O_APPEND, 0o644);
358
+ try {
359
+ writeFileSync(descriptor, line, "utf8");
360
+ fsyncSync(descriptor);
361
+ }
362
+ finally {
363
+ closeSync(descriptor);
364
+ }
365
+ return entry.entry_digest;
366
+ }
367
+ export function findByIdempotencyKey(resourceId, key) {
368
+ if (!key)
369
+ return null;
370
+ const entries = readLedger(resourceId);
371
+ for (let index = entries.length - 1; index >= 0; index -= 1) {
372
+ const entry = entries[index];
373
+ if (entry.idempotency_key === key)
374
+ return entry;
375
+ }
376
+ return null;
377
+ }
378
+ export function currentStateFromLedger(entries, initial) {
379
+ for (let index = entries.length - 1; index >= 0; index -= 1) {
380
+ const entry = entries[index];
381
+ if (entry.outcome === "applied" || entry.outcome === "deviation")
382
+ return entry.to_state;
383
+ }
384
+ return initial;
385
+ }
386
+ export function loadRegistry(resourceId) {
387
+ const registry = loadRegistryRaw(resourceId);
388
+ if (registry === null)
389
+ return null;
390
+ registry.current_state = currentStateFromLedger(readLedger(resourceId), registry.initial);
391
+ return registry;
392
+ }
393
+ // Slice D uses these through the guard store seam: resourceLock supplies the
394
+ // token and assertStillHeld fences the append immediately before it is written.
395
+ export { LockFenceError, LockTimeoutError, ProcessIdentityUnverifiableError, ResourceLockManager, assertStillHeld, processIdentity, resourceLock, } from "./lock.js";
396
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/guard/store.ts"],"names":[],"mappings":"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"}