@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,99 @@
1
+ // ts/src/connectors/claude-bg-worker.ts
2
+ // Worker thread entry point for claude background runs.
3
+ // Receives workerData from background.ts, runs ClaudeConnector, writes normalized
4
+ // JSONL to the shared stream file in the same format as the Codex shell wrapper.
5
+ // This lets scanStream() parse both without branching per agent type (D2).
6
+ import { appendFileSync, createWriteStream } from "node:fs";
7
+ import { workerData } from "node:worker_threads";
8
+ import { ClaudeConnector } from "./claude.js";
9
+ import { T2F5_DONE_SENTINEL } from "./background.js";
10
+ const { prompt, connectorOptions, streamPath } = workerData;
11
+ const stream = createWriteStream(streamPath, { flags: "a", encoding: "utf8" });
12
+ // A WriteStream 'error' with no listener is an uncaught exception that kills the
13
+ // worker outside the run() catch path. Individual write failures already reject
14
+ // their writeLine promises (routed to the catch block); this listener only stops
15
+ // the duplicate crash path.
16
+ stream.on("error", () => { });
17
+ function writeLine(record) {
18
+ return new Promise((resolve, reject) => {
19
+ stream.write(JSON.stringify(record) + "\n", (err) => (err ? reject(err) : resolve()));
20
+ });
21
+ }
22
+ async function run() {
23
+ // STRATUM_TEST_WORKER=1: bypass real SDK and emit a synthetic response immediately.
24
+ // Tests set this env var to avoid real API calls. The `.then()` continuation writes
25
+ // the rc=0 sentinel after run() returns. Do not set this in production.
26
+ if (process.env.STRATUM_TEST_WORKER === "1") {
27
+ await writeLine({ type: "item.completed", item: { type: "agent_message", text: "stub response" } });
28
+ await writeLine({ type: "turn.completed", usage: { input_tokens: 1, output_tokens: 1 } });
29
+ return;
30
+ }
31
+ // STRATUM_TEST_WORKER=fail: simulate run() throwing before any sentinel is written.
32
+ // The .catch() block writes the error message to workerData.stderrPath via appendFileSync,
33
+ // then writes the rc=1 sentinel. Used by background-claude.test.ts (Step 7c) to drive
34
+ // the stderr-plumbing assertion without mocking the Worker constructor.
35
+ if (process.env.STRATUM_TEST_WORKER === "fail") {
36
+ throw new Error("STRATUM_TEST_WORKER=fail: simulated run() failure");
37
+ }
38
+ // STRATUM_TEST_WORKER=stream-error: write one record, then destroy the stream with
39
+ // an error mid-run. Exercises the stream 'error' listener (absorbs the emitted
40
+ // error instead of crashing the worker) and the catch containment path: the
41
+ // sentinel writeLine rejects, the catch writes stderr, and the parent exit
42
+ // handler commits the rc=1 sentinel via writeSentinelIfAbsent.
43
+ if (process.env.STRATUM_TEST_WORKER === "stream-error") {
44
+ await writeLine({ type: "item.completed", item: { type: "agent_message", text: "before stream failure" } });
45
+ stream.destroy(new Error("simulated stream failure"));
46
+ return;
47
+ }
48
+ let inputTokens = 0;
49
+ let outputTokens = 0;
50
+ // Inject a query seam that intercepts SDK events and writes normalized JSONL
51
+ // before yielding them to the connector's accumulator.
52
+ const connector = new ClaudeConnector({
53
+ ...connectorOptions,
54
+ query: async function* ({ prompt: p, options }) {
55
+ const { query: sdkQuery } = await import("@anthropic-ai/claude-agent-sdk");
56
+ for await (const raw of sdkQuery({ prompt: p, options })) {
57
+ const r = raw;
58
+ // Normalize assistant text blocks → item.completed records (D2)
59
+ if (r.type === "assistant" && isRecord(r.message) && Array.isArray(r.message.content)) {
60
+ for (const block of r.message.content) {
61
+ if (isRecord(block) && block.type === "text" && typeof block.text === "string") {
62
+ await writeLine({ type: "item.completed", item: { type: "agent_message", text: block.text } });
63
+ }
64
+ }
65
+ }
66
+ // Normalize result → turn.completed
67
+ if (r.type === "result" && isRecord(r.usage)) {
68
+ inputTokens += Number(r.usage.input_tokens) || 0;
69
+ outputTokens += Number(r.usage.output_tokens) || 0;
70
+ await writeLine({ type: "turn.completed", usage: { input_tokens: inputTokens, output_tokens: outputTokens } });
71
+ }
72
+ yield raw;
73
+ }
74
+ },
75
+ });
76
+ await connector.run(prompt);
77
+ }
78
+ run()
79
+ .then(() => writeLine({ [T2F5_DONE_SENTINEL]: 0 }))
80
+ .catch(async (err) => {
81
+ // Write an error record then the sentinel. Both writes are best-effort:
82
+ // if the stream is broken, the parent exit handler fires and writes the sentinel.
83
+ const msg = (err instanceof Error ? err.message : String(err)).slice(0, 2000);
84
+ // Stderr plumbing (design.md:648): write error message to .err file so the MCP server
85
+ // can surface it via tailText(stderrPath). appendFileSync is used synchronously to avoid
86
+ // timing races in the catch block. The try/catch wrapper ensures a filesystem failure
87
+ // writing the .err file never prevents the sentinel write below.
88
+ try {
89
+ appendFileSync(workerData.stderrPath, `${msg}\n`, "utf8");
90
+ }
91
+ catch { /* best-effort */ }
92
+ await writeLine({ type: "error", message: msg }).catch(() => { });
93
+ await writeLine({ [T2F5_DONE_SENTINEL]: 1 }).catch(() => { });
94
+ })
95
+ .finally(() => { stream.end(); });
96
+ function isRecord(v) {
97
+ return typeof v === "object" && v !== null && !Array.isArray(v);
98
+ }
99
+ //# sourceMappingURL=claude-bg-worker.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude-bg-worker.js","sourceRoot":"","sources":["../../src/connectors/claude-bg-worker.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,170 @@
1
+ import { query as sdkQuery } from "@anthropic-ai/claude-agent-sdk";
2
+ import { finiteNonnegative } from "./base.js";
3
+ const defaultQuery = (params) => sdkQuery(params);
4
+ const SENSITIVE_ENV_VARS = ["ANTHROPIC_API_KEY", "OPENAI_API_KEY", "CLAUDE_API_KEY", "CLAUDECODE"];
5
+ export class ClaudeConnector {
6
+ options;
7
+ query;
8
+ onEvent;
9
+ constructor(options = {}) {
10
+ this.options = options;
11
+ this.query = options.query ?? defaultQuery;
12
+ this.onEvent = options.onEvent;
13
+ }
14
+ async run(prompt) {
15
+ const requestedModel = this.options.model ?? process.env.CLAUDE_MODEL ?? "claude-sonnet-4-6";
16
+ const env = { ...(this.options.env ?? process.env) };
17
+ for (const key of SENSITIVE_ENV_VARS)
18
+ delete env[key];
19
+ const sdkOptions = {
20
+ cwd: this.options.cwd ?? process.cwd(),
21
+ model: requestedModel,
22
+ permissionMode: "acceptEdits",
23
+ env,
24
+ };
25
+ if (this.options.allowedTools !== undefined) {
26
+ sdkOptions.tools = this.options.allowedTools;
27
+ if (this.options.disallowedTools !== undefined)
28
+ sdkOptions.disallowedTools = this.options.disallowedTools;
29
+ }
30
+ else {
31
+ sdkOptions.tools = { type: "preset", preset: "claude_code" };
32
+ if (this.options.disallowedTools !== undefined)
33
+ sdkOptions.disallowedTools = this.options.disallowedTools;
34
+ }
35
+ if (this.options.thinking !== undefined)
36
+ sdkOptions.thinking = this.options.thinking;
37
+ let resolvedModel = requestedModel;
38
+ let finalText;
39
+ let assistantText = "";
40
+ let durationMs = 0;
41
+ let inputTokens = 0;
42
+ let outputTokens = 0;
43
+ let costUsd = 0;
44
+ await this.emit({
45
+ kind: "agent_started",
46
+ metadata: { agent: "claude", model: requestedModel, prompt_chars: prompt.length },
47
+ });
48
+ for await (const raw of this.query({ prompt, options: sdkOptions })) {
49
+ if (!isRecord(raw))
50
+ continue;
51
+ if (raw.type === "system" && raw.subtype === "init" && typeof raw.model === "string")
52
+ resolvedModel = raw.model;
53
+ if (raw.type === "assistant" && isRecord(raw.message) && Array.isArray(raw.message.content)) {
54
+ for (const block of raw.message.content) {
55
+ if (!isRecord(block))
56
+ continue;
57
+ if (block.type === "text" && typeof block.text === "string" && block.text) {
58
+ assistantText += block.text;
59
+ await this.emit({ kind: "agent_relay", metadata: { text: block.text, role: "assistant" } });
60
+ }
61
+ else if (block.type === "tool_use" && typeof block.name === "string") {
62
+ const input = "input" in block ? block.input : {};
63
+ await this.emit({
64
+ kind: "tool_use_summary",
65
+ metadata: {
66
+ tool: block.name,
67
+ summary: shortInputSummary(input),
68
+ ok: true,
69
+ duration_ms: 0,
70
+ input: cappedToolInput(input),
71
+ ...(typeof block.id === "string" ? { tool_use_id: block.id } : {}),
72
+ },
73
+ });
74
+ }
75
+ }
76
+ }
77
+ if (raw.type === "user" && isRecord(raw.message) && Array.isArray(raw.message.content)) {
78
+ for (const block of raw.message.content) {
79
+ if (!isRecord(block) || block.type !== "tool_result" || typeof block.tool_use_id !== "string")
80
+ continue;
81
+ await this.emit({
82
+ kind: "tool_result",
83
+ metadata: {
84
+ tool_use_id: block.tool_use_id,
85
+ ok: block.is_error !== true,
86
+ output: capText(toolResultText(block.content)),
87
+ },
88
+ });
89
+ }
90
+ }
91
+ if (raw.type !== "result")
92
+ continue;
93
+ durationMs = finiteNonnegative(raw.duration_ms);
94
+ if (raw.subtype !== "success") {
95
+ const errors = Array.isArray(raw.errors) ? raw.errors.filter((value) => typeof value === "string") : [];
96
+ throw new Error(errors.join("; ") || `claude query failed: ${String(raw.subtype)}`);
97
+ }
98
+ if (typeof raw.result === "string")
99
+ finalText = raw.result;
100
+ costUsd = finiteNonnegative(raw.total_cost_usd);
101
+ if (isRecord(raw.usage)) {
102
+ inputTokens = finiteNonnegative(raw.usage.input_tokens);
103
+ outputTokens = finiteNonnegative(raw.usage.output_tokens);
104
+ await this.emit({
105
+ kind: "step_usage",
106
+ metadata: {
107
+ input_tokens: inputTokens,
108
+ output_tokens: outputTokens,
109
+ cache_creation_input_tokens: finiteNonnegative(raw.usage.cache_creation_input_tokens),
110
+ cache_read_input_tokens: finiteNonnegative(raw.usage.cache_read_input_tokens),
111
+ model: requestedModel,
112
+ },
113
+ });
114
+ }
115
+ }
116
+ return {
117
+ text: finalText ?? assistantText,
118
+ usage: { usd: costUsd, tokens: inputTokens + outputTokens, ms: durationMs },
119
+ telemetry: { durationMs, model: resolvedModel },
120
+ };
121
+ }
122
+ async emit(event) {
123
+ await this.onEvent?.(event);
124
+ }
125
+ }
126
+ function isRecord(value) {
127
+ return typeof value === "object" && value !== null && !Array.isArray(value);
128
+ }
129
+ const TOOL_DETAIL_CAP = 2_048;
130
+ function shortInputSummary(input, limit = 80) {
131
+ if (isRecord(input)) {
132
+ const values = Object.values(input);
133
+ if (values.length === 1 && typeof values[0] === "string")
134
+ return truncate(values[0], limit);
135
+ }
136
+ return truncate(safeStringify(input), limit);
137
+ }
138
+ function cappedToolInput(input) {
139
+ const normalized = input ?? {};
140
+ const serialized = safeStringify(normalized);
141
+ return serialized.length <= TOOL_DETAIL_CAP ? normalized : capText(serialized);
142
+ }
143
+ function toolResultText(content) {
144
+ if (content === undefined || content === null)
145
+ return "";
146
+ if (typeof content === "string")
147
+ return content;
148
+ if (Array.isArray(content)) {
149
+ return content.map((item) => isRecord(item) && typeof item.text === "string" ? item.text : safeStringify(item)).join("\n");
150
+ }
151
+ return String(content);
152
+ }
153
+ function capText(value, limit = TOOL_DETAIL_CAP) {
154
+ if (value.length <= limit)
155
+ return value;
156
+ const keep = Math.max(0, limit - `…[truncated ${value.length} chars]`.length);
157
+ return `${value.slice(0, keep)}…[truncated ${value.length - keep} chars]`;
158
+ }
159
+ function truncate(value, limit) {
160
+ return value.length <= limit ? value : `${value.slice(0, limit - 3)}...`;
161
+ }
162
+ function safeStringify(value) {
163
+ try {
164
+ return JSON.stringify(value) ?? String(value);
165
+ }
166
+ catch {
167
+ return String(value);
168
+ }
169
+ }
170
+ //# sourceMappingURL=claude.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"claude.js","sourceRoot":"","sources":["../../src/connectors/claude.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,IAAI,QAAQ,EAAE,MAAM,gCAAgC,CAAC;AAEnE,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAsB9C,MAAM,YAAY,GAAkB,CAAC,MAAM,EAAE,EAAE,CAAC,QAAQ,CAAC,MAAwC,CAAC,CAAC;AACnG,MAAM,kBAAkB,GAAG,CAAC,mBAAmB,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,YAAY,CAAU,CAAC;AAE5G,MAAM,OAAO,eAAe;IACT,OAAO,CAAyB;IAChC,KAAK,CAAgB;IACrB,OAAO,CAAoC;IAE5D,YAAY,UAAkC,EAAE;QAC9C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;QACvB,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,KAAK,IAAI,YAAY,CAAC;QAC3C,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,GAAG,CAAC,MAAc;QACtB,MAAM,cAAc,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,mBAAmB,CAAC;QAC7F,MAAM,GAAG,GAAG,EAAE,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACrD,KAAK,MAAM,GAAG,IAAI,kBAAkB;YAAE,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;QACtD,MAAM,UAAU,GAA4B;YAC1C,GAAG,EAAE,IAAI,CAAC,OAAO,CAAC,GAAG,IAAI,OAAO,CAAC,GAAG,EAAE;YACtC,KAAK,EAAE,cAAc;YACrB,cAAc,EAAE,aAAa;YAC7B,GAAG;SACJ,CAAC;QACF,IAAI,IAAI,CAAC,OAAO,CAAC,YAAY,KAAK,SAAS,EAAE,CAAC;YAC5C,UAAU,CAAC,KAAK,GAAG,IAAI,CAAC,OAAO,CAAC,YAAY,CAAC;YAC7C,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS;gBAAE,UAAU,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;QAC5G,CAAC;aAAM,CAAC;YACN,UAAU,CAAC,KAAK,GAAG,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC;YAC7D,IAAI,IAAI,CAAC,OAAO,CAAC,eAAe,KAAK,SAAS;gBAAE,UAAU,CAAC,eAAe,GAAG,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC;QAC5G,CAAC;QACD,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,SAAS;YAAE,UAAU,CAAC,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC;QAErF,IAAI,aAAa,GAAG,cAAc,CAAC;QACnC,IAAI,SAA6B,CAAC;QAClC,IAAI,aAAa,GAAG,EAAE,CAAC;QACvB,IAAI,UAAU,GAAG,CAAC,CAAC;QACnB,IAAI,WAAW,GAAG,CAAC,CAAC;QACpB,IAAI,YAAY,GAAG,CAAC,CAAC;QACrB,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,IAAI,CAAC,IAAI,CAAC;YACd,IAAI,EAAE,eAAe;YACrB,QAAQ,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,KAAK,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE;SAClF,CAAC,CAAC;QACH,IAAI,KAAK,EAAE,MAAM,GAAG,IAAI,IAAI,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,CAAC,EAAE,CAAC;YACpE,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;gBAAE,SAAS;YAC7B,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,GAAG,CAAC,OAAO,KAAK,MAAM,IAAI,OAAO,GAAG,CAAC,KAAK,KAAK,QAAQ;gBAAE,aAAa,GAAG,GAAG,CAAC,KAAK,CAAC;YAChH,IAAI,GAAG,CAAC,IAAI,KAAK,WAAW,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC5F,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;oBACxC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC;wBAAE,SAAS;oBAC/B,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;wBAC1E,aAAa,IAAI,KAAK,CAAC,IAAI,CAAC;wBAC5B,MAAM,IAAI,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,aAAa,EAAE,QAAQ,EAAE,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,EAAE,CAAC,CAAC;oBAC9F,CAAC;yBAAM,IAAI,KAAK,CAAC,IAAI,KAAK,UAAU,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;wBACvE,MAAM,KAAK,GAAG,OAAO,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,CAAC;wBAClD,MAAM,IAAI,CAAC,IAAI,CAAC;4BACd,IAAI,EAAE,kBAAkB;4BACxB,QAAQ,EAAE;gCACR,IAAI,EAAE,KAAK,CAAC,IAAI;gCAChB,OAAO,EAAE,iBAAiB,CAAC,KAAK,CAAC;gCACjC,EAAE,EAAE,IAAI;gCACR,WAAW,EAAE,CAAC;gCACd,KAAK,EAAE,eAAe,CAAC,KAAK,CAAC;gCAC7B,GAAG,CAAC,OAAO,KAAK,CAAC,EAAE,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,WAAW,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;6BACnE;yBACF,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,KAAK,MAAM,IAAI,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;gBACvF,KAAK,MAAM,KAAK,IAAI,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;oBACxC,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,IAAI,KAAK,aAAa,IAAI,OAAO,KAAK,CAAC,WAAW,KAAK,QAAQ;wBAAE,SAAS;oBACxG,MAAM,IAAI,CAAC,IAAI,CAAC;wBACd,IAAI,EAAE,aAAa;wBACnB,QAAQ,EAAE;4BACR,WAAW,EAAE,KAAK,CAAC,WAAW;4BAC9B,EAAE,EAAE,KAAK,CAAC,QAAQ,KAAK,IAAI;4BAC3B,MAAM,EAAE,OAAO,CAAC,cAAc,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;yBAC/C;qBACF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YACD,IAAI,GAAG,CAAC,IAAI,KAAK,QAAQ;gBAAE,SAAS;YACpC,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAChD,IAAI,GAAG,CAAC,OAAO,KAAK,SAAS,EAAE,CAAC;gBAC9B,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC,KAAK,EAAmB,EAAE,CAAC,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzH,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,wBAAwB,MAAM,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACtF,CAAC;YACD,IAAI,OAAO,GAAG,CAAC,MAAM,KAAK,QAAQ;gBAAE,SAAS,GAAG,GAAG,CAAC,MAAM,CAAC;YAC3D,OAAO,GAAG,iBAAiB,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;YAChD,IAAI,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxB,WAAW,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;gBACxD,YAAY,GAAG,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,aAAa,CAAC,CAAC;gBAC1D,MAAM,IAAI,CAAC,IAAI,CAAC;oBACd,IAAI,EAAE,YAAY;oBAClB,QAAQ,EAAE;wBACR,YAAY,EAAE,WAAW;wBACzB,aAAa,EAAE,YAAY;wBAC3B,2BAA2B,EAAE,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,2BAA2B,CAAC;wBACrF,uBAAuB,EAAE,iBAAiB,CAAC,GAAG,CAAC,KAAK,CAAC,uBAAuB,CAAC;wBAC7E,KAAK,EAAE,cAAc;qBACtB;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QACD,OAAO;YACL,IAAI,EAAE,SAAS,IAAI,aAAa;YAChC,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,GAAG,YAAY,EAAE,EAAE,EAAE,UAAU,EAAE;YAC3E,SAAS,EAAE,EAAE,UAAU,EAAE,KAAK,EAAE,aAAa,EAAE;SAChD,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,IAAI,CAAC,KAAqB;QACtC,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,CAAC,CAAC;IAC9B,CAAC;CACF;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,eAAe,GAAG,KAAK,CAAC;AAE9B,SAAS,iBAAiB,CAAC,KAAc,EAAE,KAAK,GAAG,EAAE;IACnD,IAAI,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACpC,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,OAAO,MAAM,CAAC,CAAC,CAAC,KAAK,QAAQ;YAAE,OAAO,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC;IAC9F,CAAC;IACD,OAAO,QAAQ,CAAC,aAAa,CAAC,KAAK,CAAC,EAAE,KAAK,CAAC,CAAC;AAC/C,CAAC;AAED,SAAS,eAAe,CAAC,KAAc;IACrC,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE,CAAC;IAC/B,MAAM,UAAU,GAAG,aAAa,CAAC,UAAU,CAAC,CAAC;IAC7C,OAAO,UAAU,CAAC,MAAM,IAAI,eAAe,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;AACjF,CAAC;AAED,SAAS,cAAc,CAAC,OAAgB;IACtC,IAAI,OAAO,KAAK,SAAS,IAAI,OAAO,KAAK,IAAI;QAAE,OAAO,EAAE,CAAC;IACzD,IAAI,OAAO,OAAO,KAAK,QAAQ;QAAE,OAAO,OAAO,CAAC;IAChD,IAAI,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QAC3B,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,IAAI,CAAC,IAAI,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7H,CAAC;IACD,OAAO,MAAM,CAAC,OAAO,CAAC,CAAC;AACzB,CAAC;AAED,SAAS,OAAO,CAAC,KAAa,EAAE,KAAK,GAAG,eAAe;IACrD,IAAI,KAAK,CAAC,MAAM,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC;IACxC,MAAM,IAAI,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,KAAK,GAAG,eAAe,KAAK,CAAC,MAAM,SAAS,CAAC,MAAM,CAAC,CAAC;IAC9E,OAAO,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC,eAAe,KAAK,CAAC,MAAM,GAAG,IAAI,SAAS,CAAC;AAC5E,CAAC;AAED,SAAS,QAAQ,CAAC,KAAa,EAAE,KAAa;IAC5C,OAAO,KAAK,CAAC,MAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC;AAC3E,CAAC;AAED,SAAS,aAAa,CAAC,KAAc;IACnC,IAAI,CAAC;QAAC,OAAO,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;IAAC,MAAM,CAAC;QAAC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC;IAAC,CAAC;AACxF,CAAC"}
@@ -0,0 +1,319 @@
1
+ import { spawn as nodeSpawn } from "node:child_process";
2
+ import { Codex } from "@openai/codex-sdk";
3
+ import { finiteNonnegative, modelIdentity } from "./base.js";
4
+ const CODEX_SCRUB_VARS = ["ANTHROPIC_API_KEY", "CLAUDE_API_KEY", "CLAUDECODE"];
5
+ export function defaultCodexModel() {
6
+ return process.env.CODEX_MODEL ?? "gpt-5.6-terra/high";
7
+ }
8
+ export function resolveCodexTransport(env = process.env) {
9
+ const raw = (env.STRATUM_CODEX_TRANSPORT ?? "sdk").trim().toLowerCase();
10
+ if (raw === "sdk" || raw === "exec")
11
+ return raw;
12
+ throw new Error(`invalid STRATUM_CODEX_TRANSPORT ${JSON.stringify(raw)}; expected sdk or exec`);
13
+ }
14
+ /** Same knob and bounds as the Python connector (STRAT-MCP-CHUNK-SIZE):
15
+ * codex's --json preamble routinely exceeds 64 KiB, but an unbounded child
16
+ * must not be able to exhaust the connector's memory. */
17
+ export function resolveStdoutLimit() {
18
+ const raw = process.env.STRATUM_CODEX_STREAM_LIMIT_BYTES;
19
+ const parsed = raw ? Number.parseInt(raw, 10) : Number.NaN;
20
+ const value = Number.isFinite(parsed) ? parsed : 4 * 1024 * 1024;
21
+ return Math.max(value, 64 * 1024);
22
+ }
23
+ /** Exact TypeScript port of Python CodexConnector._exec_args. */
24
+ export function codexExecArgs(modelId, cwd, sandboxMode = "read-only") {
25
+ const { model, effort } = modelIdentity(modelId);
26
+ const args = [
27
+ "exec",
28
+ "--json",
29
+ "--skip-git-repo-check",
30
+ "--sandbox",
31
+ sandboxMode,
32
+ "-m",
33
+ model,
34
+ "-C",
35
+ cwd,
36
+ ];
37
+ if (effort)
38
+ args.push("-c", `model_reasoning_effort="${effort}"`);
39
+ args.push("-");
40
+ return args;
41
+ }
42
+ export function codexCommand(modelId, cwd, sandboxMode) {
43
+ return ["codex", ...codexExecArgs(modelId, cwd, sandboxMode)];
44
+ }
45
+ export class CodexConnector {
46
+ model;
47
+ cwd;
48
+ sandboxMode;
49
+ env;
50
+ transport;
51
+ sdkFactory;
52
+ spawn;
53
+ onEvent;
54
+ constructor(options = {}) {
55
+ this.model = options.model ?? defaultCodexModel();
56
+ this.cwd = options.cwd ?? process.cwd();
57
+ this.sandboxMode = options.sandboxMode ?? "read-only";
58
+ this.env = { ...(options.env ?? process.env) };
59
+ for (const key of CODEX_SCRUB_VARS)
60
+ delete this.env[key];
61
+ // Passing an injected spawn is itself an explicit request for the legacy
62
+ // process seam. Production selects exec with STRATUM_CODEX_TRANSPORT=exec.
63
+ this.transport = options.transport ?? (options.spawn ? "exec" : resolveCodexTransport(this.env));
64
+ this.sdkFactory = options.sdkFactory ?? defaultSdkFactory;
65
+ this.spawn = options.spawn ?? nodeSpawn;
66
+ this.onEvent = options.onEvent;
67
+ }
68
+ async run(prompt) {
69
+ return this.transport === "sdk" ? this.runSdk(prompt) : this.runExec(prompt);
70
+ }
71
+ async runSdk(prompt) {
72
+ const startedAt = Date.now();
73
+ const stdoutLimit = resolveStdoutLimit();
74
+ const controller = new AbortController();
75
+ const identity = modelIdentity(this.model);
76
+ const options = {
77
+ approvalPolicy: "never",
78
+ model: identity.model,
79
+ sandboxMode: this.sandboxMode,
80
+ skipGitRepoCheck: true,
81
+ workingDirectory: this.cwd,
82
+ ...(identity.effort !== undefined ? { modelReasoningEffort: reasoningEffort(identity.effort) } : {}),
83
+ };
84
+ const client = this.sdkFactory({ env: stringEnvironment(this.env) });
85
+ const streamed = await client.startThread(options).runStreamed(prompt, { signal: controller.signal });
86
+ const text = [];
87
+ let inputTokens = 0;
88
+ let outputTokens = 0;
89
+ // Consume SDK events directly rather than run(), which buffers every tool
90
+ // and file-change item for the whole turn. Stratum only retains the final
91
+ // agent text and accounting data, matching the direct JSONL transport. The
92
+ // SDK does not expose its raw readline/stderr buffers, so this enforces the
93
+ // same per-JSONL-line bound immediately after each event is yielded.
94
+ for await (const event of streamed.events) {
95
+ if (exceedsStreamLimit(JSON.stringify(event), stdoutLimit)) {
96
+ controller.abort();
97
+ throw stdoutOverrunError(stdoutLimit);
98
+ }
99
+ for (const connectorEvent of codexConnectorEvents(event, this.model, prompt)) {
100
+ await this.emit(connectorEvent);
101
+ }
102
+ if (event.type === "error")
103
+ throw new Error(event.message);
104
+ if (event.type === "turn.failed")
105
+ throw new Error(event.error.message);
106
+ if (event.type === "item.completed" && event.item.type === "agent_message" && event.item.text) {
107
+ text.push(event.item.text);
108
+ }
109
+ if (event.type === "turn.completed") {
110
+ inputTokens += finiteNonnegative(event.usage.input_tokens);
111
+ outputTokens += finiteNonnegative(event.usage.output_tokens);
112
+ }
113
+ }
114
+ const durationMs = Math.max(0, Date.now() - startedAt);
115
+ return {
116
+ text: text.join(""),
117
+ usage: { tokens: inputTokens + outputTokens, ms: durationMs },
118
+ telemetry: { durationMs, ...identity },
119
+ };
120
+ }
121
+ async runExec(prompt) {
122
+ const startedAt = Date.now();
123
+ const child = this.spawn("codex", codexExecArgs(this.model, this.cwd, this.sandboxMode), {
124
+ cwd: this.cwd,
125
+ env: this.env,
126
+ });
127
+ const stdoutLimit = resolveStdoutLimit();
128
+ const text = [];
129
+ let inputTokens = 0;
130
+ let outputTokens = 0;
131
+ let codexError;
132
+ let eventDelivery = Promise.resolve();
133
+ const handleLine = (line) => {
134
+ const record = parseRecord(line);
135
+ if (!record)
136
+ return;
137
+ const connectorEvents = codexConnectorEvents(record, this.model, prompt);
138
+ if (connectorEvents.length > 0) {
139
+ eventDelivery = eventDelivery.then(async () => {
140
+ for (const connectorEvent of connectorEvents)
141
+ await this.emit(connectorEvent);
142
+ });
143
+ }
144
+ if (record.type === "error" && codexError === undefined) {
145
+ codexError = typeof record.message === "string" ? record.message : "codex error";
146
+ }
147
+ if (record.type === "item.completed" && isRecord(record.item) && record.item.type === "agent_message") {
148
+ if (typeof record.item.text === "string" && record.item.text)
149
+ text.push(record.item.text);
150
+ }
151
+ if (record.type === "turn.completed" && isRecord(record.usage)) {
152
+ inputTokens += finiteNonnegative(record.usage.input_tokens);
153
+ outputTokens += finiteNonnegative(record.usage.output_tokens);
154
+ }
155
+ };
156
+ // Lines are parsed as they stream, so only one pending partial line is
157
+ // ever held; a line past the limit fails the run loudly, like Python's
158
+ // LimitOverrunError path.
159
+ let pending = "";
160
+ let pendingBytes = 0;
161
+ let overrun = false;
162
+ let stderr = "";
163
+ child.stdout.setEncoding("utf8");
164
+ child.stderr.setEncoding("utf8");
165
+ const declareOverrun = () => {
166
+ overrun = true;
167
+ pending = "";
168
+ pendingBytes = 0;
169
+ child.kill("SIGKILL");
170
+ };
171
+ child.stdout.on("data", (chunk) => {
172
+ if (overrun)
173
+ return;
174
+ pending += chunk;
175
+ pendingBytes += Buffer.byteLength(chunk);
176
+ let newline = pending.indexOf("\n");
177
+ while (newline >= 0) {
178
+ // Enforced per UTF-8-byte line, terminated or not — Python's readline
179
+ // raises LimitOverrunError for any line past the byte limit.
180
+ const line = pending.slice(0, newline);
181
+ const lineBytes = Buffer.byteLength(line);
182
+ if (exceedsStreamLimit(line, stdoutLimit))
183
+ return declareOverrun();
184
+ handleLine(line);
185
+ pending = pending.slice(newline + 1);
186
+ pendingBytes -= lineBytes + 1;
187
+ newline = pending.indexOf("\n");
188
+ }
189
+ if (pendingBytes > stdoutLimit)
190
+ declareOverrun();
191
+ });
192
+ child.stderr.on("data", (chunk) => { stderr = (stderr + chunk).slice(-stdoutLimit); });
193
+ child.stdin.end(prompt, "utf8");
194
+ const exitCode = await new Promise((resolve, reject) => {
195
+ child.once("error", reject);
196
+ child.once("close", (code) => resolve(code ?? 1));
197
+ });
198
+ if (overrun) {
199
+ throw stdoutOverrunError(stdoutLimit);
200
+ }
201
+ if (pending)
202
+ handleLine(pending);
203
+ await eventDelivery;
204
+ if (codexError)
205
+ throw new Error(codexError);
206
+ if (exitCode !== 0 && text.length === 0)
207
+ throw new Error(stderr.trim() || `codex exited with code ${exitCode}`);
208
+ const durationMs = Math.max(0, Date.now() - startedAt);
209
+ return {
210
+ text: text.join(""),
211
+ usage: { tokens: inputTokens + outputTokens, ms: durationMs },
212
+ telemetry: { durationMs, ...modelIdentity(this.model) },
213
+ };
214
+ }
215
+ async emit(event) {
216
+ await this.onEvent?.(event);
217
+ }
218
+ }
219
+ const defaultSdkFactory = (options) => {
220
+ const codex = new Codex(options);
221
+ return { startThread: (threadOptions) => codex.startThread(threadOptions) };
222
+ };
223
+ function stringEnvironment(env) {
224
+ const result = {};
225
+ for (const [key, value] of Object.entries(env))
226
+ if (typeof value === "string")
227
+ result[key] = value;
228
+ return result;
229
+ }
230
+ function reasoningEffort(value) {
231
+ if (value === "minimal" || value === "low" || value === "medium" || value === "high" || value === "xhigh")
232
+ return value;
233
+ throw new Error(`unsupported Codex reasoning effort ${JSON.stringify(value)}`);
234
+ }
235
+ function isRecord(value) {
236
+ return typeof value === "object" && value !== null && !Array.isArray(value);
237
+ }
238
+ function parseRecord(line) {
239
+ if (!line.trim())
240
+ return undefined;
241
+ try {
242
+ const value = JSON.parse(line);
243
+ return isRecord(value) ? value : undefined;
244
+ }
245
+ catch {
246
+ return undefined;
247
+ }
248
+ }
249
+ const TOOL_DETAIL_CAP = 2_048;
250
+ function codexConnectorEvents(value, model, prompt) {
251
+ if (!isRecord(value))
252
+ return [];
253
+ if (value.type === "thread.started") {
254
+ return [{ kind: "agent_started", metadata: { agent: "codex", model, prompt_chars: prompt.length } }];
255
+ }
256
+ if (value.type === "turn.completed" && isRecord(value.usage)) {
257
+ return [{
258
+ kind: "step_usage",
259
+ metadata: {
260
+ input_tokens: finiteNonnegative(value.usage.input_tokens),
261
+ output_tokens: finiteNonnegative(value.usage.output_tokens),
262
+ cache_creation_input_tokens: 0,
263
+ cache_read_input_tokens: finiteNonnegative(value.usage.cached_input_tokens),
264
+ cost_usd: 0,
265
+ model,
266
+ },
267
+ }];
268
+ }
269
+ if (value.type !== "item.completed" || !isRecord(value.item))
270
+ return [];
271
+ const item = value.item;
272
+ if (item.type === "agent_message" && typeof item.text === "string" && item.text) {
273
+ return [{ kind: "agent_relay", metadata: { text: item.text, role: "assistant" } }];
274
+ }
275
+ if (item.type === "reasoning" && typeof item.text === "string" && item.text) {
276
+ return [{ kind: "agent_relay", metadata: { text: item.text, role: "system" } }];
277
+ }
278
+ if (item.type === "command_execution") {
279
+ const command = typeof item.command === "string"
280
+ ? item.command
281
+ : isRecord(item.input) && typeof item.input.command === "string" ? item.input.command : "";
282
+ const exitCode = typeof item.exit_code === "number" ? item.exit_code : undefined;
283
+ return [{
284
+ kind: "tool_use_summary",
285
+ metadata: {
286
+ tool: "bash",
287
+ summary: command.length <= 80 ? command : `${command.slice(0, 77)}...`,
288
+ ok: exitCode === undefined || exitCode === 0,
289
+ duration_ms: Math.trunc(finiteNonnegative(item.duration_ms)),
290
+ input: { command: command.slice(0, TOOL_DETAIL_CAP) },
291
+ },
292
+ }];
293
+ }
294
+ if (item.type === "file_change") {
295
+ const path = typeof item.path === "string"
296
+ ? item.path
297
+ : Array.isArray(item.changes) && isRecord(item.changes[0]) && typeof item.changes[0].path === "string"
298
+ ? item.changes[0].path
299
+ : "";
300
+ return [{
301
+ kind: "tool_use_summary",
302
+ metadata: {
303
+ tool: "edit",
304
+ summary: `edit ${path}`.slice(0, 80),
305
+ ok: true,
306
+ duration_ms: 0,
307
+ input: { file_path: path },
308
+ },
309
+ }];
310
+ }
311
+ return [];
312
+ }
313
+ function exceedsStreamLimit(value, limit) {
314
+ return Buffer.byteLength(value) > limit;
315
+ }
316
+ function stdoutOverrunError(limit) {
317
+ return new Error(`codex stdout exceeded STRATUM_CODEX_STREAM_LIMIT_BYTES (current limit ${limit} bytes). Raise the env knob and retry.`);
318
+ }
319
+ //# sourceMappingURL=codex.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"codex.js","sourceRoot":"","sources":["../../src/connectors/codex.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ export * from "./background.js";
2
+ export * from "./base.js";
3
+ export * from "./claude.js";
4
+ export * from "./codex.js";
5
+ export * from "./proc_identity.js";
6
+ export * from "./runner.js";
7
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/connectors/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC;AACnC,cAAc,aAAa,CAAC"}