@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,91 @@
1
+ /** CLI boundary for the guarded state-machine API. */
2
+ import { GuardError } from "../guard/errors.js";
3
+ import { guardHistory, guardMigrate, guardOverride, guardTransition, registerGuard, } from "../guard/transition.js";
4
+ const ACTIONS = new Set(["register", "transition", "override", "migrate", "history"]);
5
+ let testJudge;
6
+ /** Replace only the CLI transition judge in isolated tests. */
7
+ export function setGuardJudgeForTests(judge) {
8
+ const previous = testJudge;
9
+ testJudge = judge;
10
+ return () => { testJudge = previous; };
11
+ }
12
+ async function readStdin() {
13
+ let raw = "";
14
+ for await (const chunk of process.stdin)
15
+ raw += String(chunk);
16
+ return raw;
17
+ }
18
+ function writeJson(value) {
19
+ process.stdout.write(`${JSON.stringify(value)}\n`);
20
+ }
21
+ function errorEnvelope(error) {
22
+ if (error instanceof GuardError)
23
+ return error.toEnvelope();
24
+ if (error instanceof Error)
25
+ return { status: "error", error_type: error.name || "unexpected_error", message: error.message };
26
+ return { status: "error", error_type: "unexpected_error", message: String(error) };
27
+ }
28
+ function objectPayload(raw) {
29
+ const value = raw.trim() ? JSON.parse(raw) : {};
30
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
31
+ throw new TypeError("guard stdin payload must be a JSON object");
32
+ }
33
+ return value;
34
+ }
35
+ function assertOnlyKeys(payload, allowed) {
36
+ const unknown = Object.keys(payload).find((key) => !allowed.includes(key));
37
+ if (unknown)
38
+ throw new TypeError(`unexpected guard argument ${JSON.stringify(unknown)}`);
39
+ }
40
+ function required(payload, key) {
41
+ if (!(key in payload))
42
+ throw new TypeError(`missing required guard argument ${JSON.stringify(key)}`);
43
+ return payload[key];
44
+ }
45
+ function optional(payload, key, fallback) {
46
+ const value = payload[key];
47
+ return value === undefined || value === null ? fallback : value;
48
+ }
49
+ async function dispatch(action, payload) {
50
+ switch (action) {
51
+ case "register":
52
+ assertOnlyKeys(payload, ["resource_id", "graph", "edge_predicates", "initial", "terminal", "stakes", "workspace_root"]);
53
+ return registerGuard(required(payload, "resource_id"), required(payload, "graph"), required(payload, "edge_predicates"), required(payload, "initial"), optional(payload, "terminal", []), optional(payload, "stakes", {}), optional(payload, "workspace_root", null));
54
+ case "transition":
55
+ assertOnlyKeys(payload, ["resource_id", "from_state", "to_state", "artifacts", "modified_files", "idempotency_key", "resolved_by"]);
56
+ return guardTransition(required(payload, "resource_id"), required(payload, "from_state"), required(payload, "to_state"), {
57
+ artifacts: required(payload, "artifacts"),
58
+ modifiedFiles: optional(payload, "modified_files", []),
59
+ idempotencyKey: optional(payload, "idempotency_key", null),
60
+ resolvedBy: optional(payload, "resolved_by", "agent"),
61
+ ...(testJudge ? { judge: testJudge } : {}),
62
+ });
63
+ case "override":
64
+ assertOnlyKeys(payload, ["resource_id", "from_state", "to_state", "override_token", "rationale", "resolved_by"]);
65
+ return guardOverride(required(payload, "resource_id"), required(payload, "from_state"), required(payload, "to_state"), required(payload, "override_token"), required(payload, "rationale"), optional(payload, "resolved_by", "human"));
66
+ case "migrate":
67
+ assertOnlyKeys(payload, ["resource_id", "new_graph", "new_edge_predicates", "override_token", "rationale", "new_terminal", "new_stakes"]);
68
+ return guardMigrate(required(payload, "resource_id"), required(payload, "new_graph"), required(payload, "new_edge_predicates"), required(payload, "override_token"), required(payload, "rationale"), optional(payload, "new_terminal", []), optional(payload, "new_stakes", {}));
69
+ case "history":
70
+ assertOnlyKeys(payload, ["resource_id"]);
71
+ return guardHistory(required(payload, "resource_id"));
72
+ default:
73
+ throw new Error(`unreachable guard action ${JSON.stringify(action)}`);
74
+ }
75
+ }
76
+ export async function guardCommand(argv) {
77
+ const action = argv[0];
78
+ if (!action || !ACTIONS.has(action)) {
79
+ process.stderr.write(`Unknown guard action: ${action ?? "(none)"}. Expected one of: ${[...ACTIONS].sort().join(", ")}.\n`);
80
+ return 1;
81
+ }
82
+ try {
83
+ writeJson(await dispatch(action, objectPayload(await readStdin())));
84
+ return 0;
85
+ }
86
+ catch (error) {
87
+ writeJson(errorEnvelope(error));
88
+ return 1;
89
+ }
90
+ }
91
+ //# sourceMappingURL=guard.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guard.js","sourceRoot":"","sources":["../../src/cli/guard.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,302 @@
1
+ import { readFileSync } from "node:fs";
2
+ import { readFile, writeFile } from "node:fs/promises";
3
+ import { homedir } from "node:os";
4
+ import { isAbsolute, join } from "node:path";
5
+ const PACKAGE_NAME = "@smartmemory/stratum";
6
+ const PACKAGE_VERSION = JSON.parse(readFileSync(new URL("../../package.json", import.meta.url), "utf8")).version;
7
+ export async function mcpCommand(args) {
8
+ const options = parseInstall(args);
9
+ if (!options)
10
+ return usageInstall();
11
+ try {
12
+ const result = await writeCanonical(options.project, options.version, false);
13
+ process.stdout.write(`${result.path}: ${result.action}\n`);
14
+ return 0;
15
+ }
16
+ catch (error) {
17
+ process.stderr.write(`stratum mcp install: ${message(error)}\n`);
18
+ return 2;
19
+ }
20
+ }
21
+ export async function doctorCommand(args) {
22
+ const options = parseDoctor(args);
23
+ if (!options)
24
+ return usageDoctor();
25
+ if (!options.all)
26
+ return doctorProject(options.project, options.fix);
27
+ let projects;
28
+ try {
29
+ projects = await registeredConsumers();
30
+ }
31
+ catch (error) {
32
+ process.stderr.write(`stratum doctor: ${message(error)}\n`);
33
+ return 2;
34
+ }
35
+ if (!projects) {
36
+ process.stdout.write("no consumer registry configured\n");
37
+ return 0;
38
+ }
39
+ let exitCode = 0;
40
+ for (const project of projects) {
41
+ const code = await doctorProject(project, options.fix);
42
+ exitCode = Math.max(exitCode, code);
43
+ }
44
+ return exitCode;
45
+ }
46
+ function parseInstall(args) {
47
+ if (args[0] !== "install")
48
+ return undefined;
49
+ const rest = args.slice(1);
50
+ let project = process.cwd();
51
+ let version = PACKAGE_VERSION;
52
+ while (rest.length > 0) {
53
+ const flag = rest.shift();
54
+ if (flag === "--project") {
55
+ const value = rest.shift();
56
+ if (!value)
57
+ return undefined;
58
+ project = value;
59
+ }
60
+ else if (flag === "--version") {
61
+ const value = rest.shift();
62
+ if (!value)
63
+ return undefined;
64
+ version = value;
65
+ }
66
+ else {
67
+ return undefined;
68
+ }
69
+ }
70
+ return { project, version };
71
+ }
72
+ function parseDoctor(args) {
73
+ const rest = [...args];
74
+ let project = process.cwd();
75
+ let projectSet = false;
76
+ let fix = false;
77
+ let all = false;
78
+ while (rest.length > 0) {
79
+ const flag = rest.shift();
80
+ if (flag === "--project") {
81
+ const value = rest.shift();
82
+ if (!value || projectSet)
83
+ return undefined;
84
+ project = value;
85
+ projectSet = true;
86
+ }
87
+ else if (flag === "--fix") {
88
+ if (fix)
89
+ return undefined;
90
+ fix = true;
91
+ }
92
+ else if (flag === "--all") {
93
+ if (all)
94
+ return undefined;
95
+ all = true;
96
+ }
97
+ else {
98
+ return undefined;
99
+ }
100
+ }
101
+ if (all && projectSet)
102
+ return undefined;
103
+ return { project, fix, all };
104
+ }
105
+ function usageInstall() {
106
+ process.stderr.write("Usage: stratum mcp install [--project <dir>] [--version <v>]\n");
107
+ return 2;
108
+ }
109
+ function usageDoctor() {
110
+ process.stderr.write("Usage: stratum doctor [--project <dir>] [--fix] [--all]\n");
111
+ return 2;
112
+ }
113
+ async function doctorProject(project, fix) {
114
+ let findings;
115
+ try {
116
+ findings = await inspect(project);
117
+ }
118
+ catch (error) {
119
+ process.stderr.write(`stratum doctor: ${project}: ${message(error)}\n`);
120
+ return 2;
121
+ }
122
+ if (findings.length === 0) {
123
+ process.stdout.write(`${project}: ok\n`);
124
+ return 0;
125
+ }
126
+ for (const finding of findings)
127
+ printFinding(project, fix ? "before" : undefined, finding);
128
+ if (!fix)
129
+ return 1;
130
+ try {
131
+ await writeCanonical(project, PACKAGE_VERSION, true);
132
+ const after = await inspect(project);
133
+ if (after.length === 0) {
134
+ process.stdout.write(`${project}: after: ok\n`);
135
+ return 0;
136
+ }
137
+ for (const finding of after)
138
+ printFinding(project, "after", finding);
139
+ return 1;
140
+ }
141
+ catch (error) {
142
+ process.stderr.write(`stratum doctor: ${project}: ${message(error)}\n`);
143
+ return 2;
144
+ }
145
+ }
146
+ async function inspect(project) {
147
+ const path = join(project, ".mcp.json");
148
+ let source;
149
+ try {
150
+ source = await readFile(path, "utf8");
151
+ }
152
+ catch (error) {
153
+ if (isNotFound(error)) {
154
+ return [finding("missing-file", "missing", project)];
155
+ }
156
+ throw error;
157
+ }
158
+ let document;
159
+ try {
160
+ document = JSON.parse(source);
161
+ }
162
+ catch (error) {
163
+ return [finding("malformed-json", message(error), project)];
164
+ }
165
+ if (!isRecord(document)) {
166
+ return [finding("malformed-json", JSON.stringify(document), project)];
167
+ }
168
+ if (!isRecord(document.mcpServers) || !("stratum" in document.mcpServers)) {
169
+ return [finding("missing-entry", "missing", project)];
170
+ }
171
+ const entry = document.mcpServers.stratum;
172
+ const current = JSON.stringify(entry);
173
+ if (!isRecord(entry))
174
+ return [finding("invalid-entry", current, project)];
175
+ const command = typeof entry.command === "string" ? entry.command : "";
176
+ const args = Array.isArray(entry.args) && entry.args.every((value) => typeof value === "string")
177
+ ? entry.args
178
+ : [];
179
+ const findings = [];
180
+ if (command === "stratum-mcp" || command === "stratum") {
181
+ findings.push(finding("retired-bin", current, project));
182
+ }
183
+ if ([command, ...args].some(isSourceCheckoutPath)) {
184
+ findings.push(finding("source-path", current, project));
185
+ }
186
+ const packageArg = args.find((arg) => arg.startsWith(`--package=${PACKAGE_NAME}@`));
187
+ if (command === "npx" && packageArg) {
188
+ const pinnedVersion = packageArg.slice(`--package=${PACKAGE_NAME}@`.length);
189
+ if (pinnedVersion !== PACKAGE_VERSION)
190
+ findings.push(finding("version-drift", current, project));
191
+ }
192
+ if (findings.length > 0)
193
+ return findings;
194
+ return sameEntry(entry, canonicalEntry(PACKAGE_VERSION))
195
+ ? []
196
+ : [finding("invalid-entry", current, project)];
197
+ }
198
+ function finding(className, current, project) {
199
+ return {
200
+ className,
201
+ current,
202
+ recommendation: `set ${join(project, ".mcp.json")} mcpServers.stratum to ${JSON.stringify(canonicalEntry(PACKAGE_VERSION))}`,
203
+ };
204
+ }
205
+ function printFinding(project, phase, findingValue) {
206
+ const prefix = phase ? `${project}: ${phase}:` : `${project}:`;
207
+ process.stdout.write(`${prefix} ${findingValue.className}: current=${findingValue.current}; fix=${findingValue.recommendation}\n`);
208
+ }
209
+ async function writeCanonical(project, version, repairMalformed) {
210
+ const path = join(project, ".mcp.json");
211
+ let source;
212
+ try {
213
+ source = await readFile(path, "utf8");
214
+ }
215
+ catch (error) {
216
+ if (!isNotFound(error))
217
+ throw error;
218
+ }
219
+ let document = {};
220
+ if (source !== undefined) {
221
+ try {
222
+ const parsed = JSON.parse(source);
223
+ if (!isRecord(parsed))
224
+ throw new Error("root must be a JSON object");
225
+ document = parsed;
226
+ }
227
+ catch (error) {
228
+ if (!repairMalformed)
229
+ throw new Error(`${path} is malformed: ${message(error)}`);
230
+ }
231
+ }
232
+ let servers;
233
+ if (isRecord(document.mcpServers)) {
234
+ servers = document.mcpServers;
235
+ }
236
+ else if (document.mcpServers === undefined || repairMalformed) {
237
+ servers = {};
238
+ document.mcpServers = servers;
239
+ }
240
+ else {
241
+ throw new Error(`${path} mcpServers must be a JSON object`);
242
+ }
243
+ const canonical = canonicalEntry(version);
244
+ if (source !== undefined && sameEntry(servers.stratum, canonical)) {
245
+ return { path, action: "already-current" };
246
+ }
247
+ servers.stratum = canonical;
248
+ await writeFile(path, `${JSON.stringify(document, null, 2)}\n`, "utf8");
249
+ return { path, action: source === undefined ? "created" : "repointed" };
250
+ }
251
+ function canonicalEntry(version) {
252
+ return {
253
+ command: "npx",
254
+ args: ["-y", `--package=${PACKAGE_NAME}@${version}`, "stratum-mcp"],
255
+ };
256
+ }
257
+ function sameEntry(value, expected) {
258
+ if (!isRecord(value))
259
+ return false;
260
+ return Object.keys(value).length === 2
261
+ && value.command === expected.command
262
+ && Array.isArray(value.args)
263
+ && value.args.length === expected.args.length
264
+ && value.args.every((arg, index) => arg === expected.args[index]);
265
+ }
266
+ function isSourceCheckoutPath(value) {
267
+ if (!isAbsolute(value))
268
+ return false;
269
+ const normalized = value.replaceAll("\\", "/");
270
+ return normalized.endsWith("/ts/src/mcp/bin.mjs")
271
+ || /\/stratum\/.+\/bin\.mjs$/.test(normalized);
272
+ }
273
+ async function registeredConsumers() {
274
+ const fromEnvironment = process.env.STRATUM_CONSUMERS?.split(":").map((value) => value.trim()).filter(Boolean);
275
+ if (fromEnvironment && fromEnvironment.length > 0)
276
+ return [...new Set(fromEnvironment)];
277
+ const path = join(homedir(), ".stratum", "consumers.json");
278
+ let source;
279
+ try {
280
+ source = await readFile(path, "utf8");
281
+ }
282
+ catch (error) {
283
+ if (isNotFound(error))
284
+ return undefined;
285
+ throw error;
286
+ }
287
+ const parsed = JSON.parse(source);
288
+ if (!Array.isArray(parsed) || !parsed.every((value) => typeof value === "string" && value.length > 0)) {
289
+ throw new Error(`${path} must contain a JSON array of consumer directories`);
290
+ }
291
+ return [...new Set(parsed)];
292
+ }
293
+ function isRecord(value) {
294
+ return typeof value === "object" && value !== null && !Array.isArray(value);
295
+ }
296
+ function isNotFound(error) {
297
+ return isRecord(error) && error.code === "ENOENT";
298
+ }
299
+ function message(value) {
300
+ return value instanceof Error ? value.message : String(value);
301
+ }
302
+ //# sourceMappingURL=mcp_install.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"mcp_install.js","sourceRoot":"","sources":["../../src/cli/mcp_install.ts"],"names":[],"mappings":"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"}