memorix 1.2.1 → 1.2.2
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/CHANGELOG.md +16 -0
- package/README.md +14 -2
- package/README.zh-CN.md +14 -2
- package/TEAM.md +86 -86
- package/dist/cli/index.js +15407 -13779
- package/dist/cli/index.js.map +1 -1
- package/dist/index.js +1321 -529
- package/dist/index.js.map +1 -1
- package/dist/maintenance-runner.d.ts +1 -1
- package/dist/maintenance-runner.js +8458 -8087
- package/dist/maintenance-runner.js.map +1 -1
- package/dist/memcode-runtime/CHANGELOG.md +16 -0
- package/dist/sdk.d.ts +7 -2
- package/dist/sdk.js +1349 -535
- package/dist/sdk.js.map +1 -1
- package/dist/types.d.ts +49 -1
- package/dist/types.js.map +1 -1
- package/docs/1.2.2-MEMORY-CONTROL-PLANE.md +434 -0
- package/docs/AGENT_OPERATOR_PLAYBOOK.md +4 -0
- package/docs/API_REFERENCE.md +24 -4
- package/docs/DESIGN_DECISIONS.md +357 -357
- package/docs/README.md +1 -1
- package/docs/dev-log/progress.txt +91 -11
- package/package.json +1 -1
- package/plugins/codex/memorix/.codex-plugin/plugin.json +1 -1
- package/src/audit/index.ts +156 -156
- package/src/cli/command-guide.ts +192 -0
- package/src/cli/commands/audit-list.ts +89 -89
- package/src/cli/commands/audit.ts +9 -4
- package/src/cli/commands/background.ts +659 -659
- package/src/cli/commands/cleanup.ts +5 -1
- package/src/cli/commands/codegraph.ts +15 -5
- package/src/cli/commands/context.ts +3 -2
- package/src/cli/commands/doctor.ts +4 -2
- package/src/cli/commands/explain.ts +9 -3
- package/src/cli/commands/formation.ts +48 -48
- package/src/cli/commands/git-hook-install.ts +111 -111
- package/src/cli/commands/handoff.ts +75 -61
- package/src/cli/commands/hooks-status.ts +63 -63
- package/src/cli/commands/identity.ts +116 -0
- package/src/cli/commands/ingest-commit.ts +153 -153
- package/src/cli/commands/ingest-image.ts +71 -69
- package/src/cli/commands/ingest-log.ts +180 -180
- package/src/cli/commands/ingest.ts +44 -44
- package/src/cli/commands/integrate-shared.ts +15 -15
- package/src/cli/commands/lock.ts +93 -92
- package/src/cli/commands/memory.ts +58 -21
- package/src/cli/commands/message.ts +123 -118
- package/src/cli/commands/operator-shared.ts +98 -3
- package/src/cli/commands/poll.ts +74 -64
- package/src/cli/commands/purge-all-memory.ts +85 -85
- package/src/cli/commands/purge-project-memory.ts +83 -83
- package/src/cli/commands/reasoning.ts +135 -121
- package/src/cli/commands/retention.ts +9 -4
- package/src/cli/commands/serve-http.ts +8 -2
- package/src/cli/commands/serve-shared.ts +118 -118
- package/src/cli/commands/session.ts +29 -3
- package/src/cli/commands/skills.ts +124 -119
- package/src/cli/commands/status.ts +4 -3
- package/src/cli/commands/task.ts +193 -184
- package/src/cli/commands/team.ts +14 -10
- package/src/cli/commands/transfer.ts +108 -55
- package/src/cli/commands/uninstall-project-artifacts.ts +85 -85
- package/src/cli/identity.ts +89 -0
- package/src/cli/index.ts +96 -19
- package/src/cli/invocation.ts +115 -0
- package/src/cli/tui/ChatView.tsx +234 -234
- package/src/cli/tui/CommandBar.tsx +312 -312
- package/src/cli/tui/ContextRail.tsx +118 -118
- package/src/cli/tui/HeaderBar.tsx +72 -72
- package/src/cli/tui/LogoBanner.tsx +51 -51
- package/src/cli/tui/Sidebar.tsx +179 -179
- package/src/cli/tui/chat-service.ts +41 -18
- package/src/cli/tui/data.ts +23 -44
- package/src/cli/tui/index.ts +41 -41
- package/src/cli/tui/markdown-render.tsx +371 -371
- package/src/cli/tui/operator-context.ts +60 -0
- package/src/cli/tui/use-mouse.ts +157 -157
- package/src/cli/tui/useNavigation.ts +56 -56
- package/src/cli/tui/views/MemoryView.tsx +10 -8
- package/src/cli/update-checker.ts +211 -211
- package/src/cli/version.ts +7 -7
- package/src/cli/workbench.ts +1 -1
- package/src/codegraph/auto-context.ts +31 -2
- package/src/codegraph/context-pack.ts +1 -0
- package/src/codegraph/project-context.ts +2 -0
- package/src/compact/engine.ts +26 -10
- package/src/compact/index-format.ts +25 -2
- package/src/compact/token-budget.ts +74 -74
- package/src/dashboard/project-classification.ts +64 -64
- package/src/dashboard/server.ts +46 -9
- package/src/embedding/fastembed-provider.ts +142 -142
- package/src/embedding/transformers-provider.ts +111 -111
- package/src/git/extractor.ts +209 -209
- package/src/git/hooks-path.ts +85 -85
- package/src/hooks/admission.ts +117 -0
- package/src/hooks/handler.ts +98 -91
- package/src/hooks/pattern-detector.ts +173 -173
- package/src/hooks/significance-filter.ts +250 -250
- package/src/knowledge/context-assembly.ts +97 -0
- package/src/knowledge/workset.ts +179 -10
- package/src/llm/memory-manager.ts +328 -328
- package/src/llm/provider.ts +885 -885
- package/src/llm/quality.ts +248 -248
- package/src/memory/admission.ts +57 -0
- package/src/memory/attribution-guard.ts +249 -249
- package/src/memory/consolidation.ts +13 -2
- package/src/memory/disclosure-policy.ts +140 -135
- package/src/memory/entity-extractor.ts +197 -197
- package/src/memory/export-import.ts +11 -3
- package/src/memory/formation/evaluate.ts +217 -217
- package/src/memory/formation/extract.ts +361 -361
- package/src/memory/formation/index.ts +417 -417
- package/src/memory/formation/resolve.ts +344 -344
- package/src/memory/formation/types.ts +315 -315
- package/src/memory/freshness.ts +122 -122
- package/src/memory/graph-context.ts +8 -2
- package/src/memory/graph.ts +197 -197
- package/src/memory/observations.ts +162 -4
- package/src/memory/quality-audit.ts +2 -0
- package/src/memory/refs.ts +94 -94
- package/src/memory/retention.ts +22 -2
- package/src/memory/secret-filter.ts +79 -79
- package/src/memory/session.ts +5 -2
- package/src/memory/visibility.ts +80 -0
- package/src/multimodal/image-loader.ts +143 -143
- package/src/orchestrate/adapters/claude-stream.ts +192 -192
- package/src/orchestrate/adapters/claude.ts +111 -111
- package/src/orchestrate/adapters/codex-stream.ts +134 -134
- package/src/orchestrate/adapters/codex.ts +41 -41
- package/src/orchestrate/adapters/gemini-stream.ts +166 -166
- package/src/orchestrate/adapters/gemini.ts +42 -42
- package/src/orchestrate/adapters/index.ts +73 -73
- package/src/orchestrate/adapters/opencode-stream.ts +143 -143
- package/src/orchestrate/adapters/opencode.ts +47 -47
- package/src/orchestrate/adapters/spawn-helper.ts +286 -286
- package/src/orchestrate/adapters/types.ts +77 -77
- package/src/orchestrate/capability-router.ts +284 -284
- package/src/orchestrate/context-compact.ts +188 -188
- package/src/orchestrate/cost-tracker.ts +219 -219
- package/src/orchestrate/error-recovery.ts +191 -191
- package/src/orchestrate/evidence.ts +140 -140
- package/src/orchestrate/ledger.ts +110 -110
- package/src/orchestrate/memorix-bridge.ts +378 -340
- package/src/orchestrate/output-budget.ts +80 -80
- package/src/orchestrate/permission.ts +152 -152
- package/src/orchestrate/pipeline-trace.ts +131 -131
- package/src/orchestrate/prompt-builder.ts +155 -155
- package/src/orchestrate/ring-buffer.ts +37 -37
- package/src/orchestrate/task-graph.ts +389 -389
- package/src/orchestrate/worktree.ts +232 -232
- package/src/project/aliases.ts +374 -374
- package/src/project/detector.ts +268 -268
- package/src/rules/adapters/claude-code.ts +99 -99
- package/src/rules/adapters/codex.ts +97 -97
- package/src/rules/adapters/copilot.ts +124 -124
- package/src/rules/adapters/cursor.ts +114 -114
- package/src/rules/adapters/kiro.ts +126 -126
- package/src/rules/adapters/trae.ts +56 -56
- package/src/rules/adapters/windsurf.ts +83 -83
- package/src/rules/syncer.ts +235 -235
- package/src/runtime/control-plane-maintenance.ts +1 -0
- package/src/runtime/isolated-maintenance.ts +1 -0
- package/src/runtime/lifecycle.ts +18 -0
- package/src/runtime/maintenance-jobs.ts +1 -0
- package/src/runtime/maintenance-runner.ts +2 -0
- package/src/runtime/project-maintenance.ts +89 -0
- package/src/sdk.ts +334 -304
- package/src/search/intent-detector.ts +289 -289
- package/src/search/query-expansion.ts +52 -52
- package/src/server/formation-timeout.ts +27 -27
- package/src/server.ts +260 -81
- package/src/skills/mini-skills.ts +386 -386
- package/src/store/chat-store.ts +119 -119
- package/src/store/graph-store.ts +249 -249
- package/src/store/mini-skill-store.ts +349 -349
- package/src/store/orama-store.ts +61 -6
- package/src/store/persistence-json.ts +212 -212
- package/src/store/persistence.ts +291 -291
- package/src/store/project-affinity.ts +195 -195
- package/src/store/sqlite-db.ts +23 -1
- package/src/store/sqlite-store.ts +12 -2
- package/src/team/event-bus.ts +76 -76
- package/src/team/file-locks.ts +173 -173
- package/src/team/handoff.ts +168 -161
- package/src/team/messages.ts +203 -203
- package/src/team/poll.ts +132 -132
- package/src/team/tasks.ts +211 -211
- package/src/types.ts +51 -0
- package/src/wiki/generator.ts +2 -0
- package/src/workspace/mcp-adapters/codex.ts +191 -191
- package/src/workspace/mcp-adapters/copilot.ts +105 -105
- package/src/workspace/mcp-adapters/cursor.ts +53 -53
- package/src/workspace/mcp-adapters/kiro.ts +64 -64
- package/src/workspace/mcp-adapters/opencode.ts +123 -123
- package/src/workspace/mcp-adapters/trae.ts +134 -134
- package/src/workspace/mcp-adapters/windsurf.ts +91 -91
- package/src/workspace/sanitizer.ts +60 -60
- package/src/workspace/workflow-sync.ts +131 -131
|
@@ -1,134 +1,134 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Codex CLI JSONL parser.
|
|
3
|
-
*
|
|
4
|
-
* Parses NDJSON from `codex exec --json`
|
|
5
|
-
* into AgentMessage events.
|
|
6
|
-
*
|
|
7
|
-
* Event types (from real codex-cli 0.97.0 output):
|
|
8
|
-
* - "thread.started" → thread_id (session)
|
|
9
|
-
* - "turn.started" → turn begins
|
|
10
|
-
* - "item.completed" → agent_message / tool_call / tool_result items
|
|
11
|
-
* - "turn.completed" → usage summary
|
|
12
|
-
*/
|
|
13
|
-
|
|
14
|
-
import type { AgentMessage, TokenUsage } from './types.js';
|
|
15
|
-
|
|
16
|
-
// ── Codex JSONL shapes ──────────────────────────────────────
|
|
17
|
-
|
|
18
|
-
interface CodexEvent {
|
|
19
|
-
type: string;
|
|
20
|
-
thread_id?: string;
|
|
21
|
-
item?: {
|
|
22
|
-
id?: string;
|
|
23
|
-
type?: string;
|
|
24
|
-
text?: string;
|
|
25
|
-
name?: string;
|
|
26
|
-
arguments?: string;
|
|
27
|
-
output?: string;
|
|
28
|
-
call_id?: string;
|
|
29
|
-
};
|
|
30
|
-
usage?: {
|
|
31
|
-
input_tokens?: number;
|
|
32
|
-
output_tokens?: number;
|
|
33
|
-
cached_input_tokens?: number;
|
|
34
|
-
};
|
|
35
|
-
}
|
|
36
|
-
|
|
37
|
-
// ── State ───────────────────────────────────────────────────
|
|
38
|
-
|
|
39
|
-
export interface CodexStreamState {
|
|
40
|
-
sessionId?: string;
|
|
41
|
-
usage: Record<string, TokenUsage>;
|
|
42
|
-
isError: boolean;
|
|
43
|
-
}
|
|
44
|
-
|
|
45
|
-
// ── Parser ──────────────────────────────────────────────────
|
|
46
|
-
|
|
47
|
-
/**
|
|
48
|
-
* Parse a single NDJSON line from Codex --json output.
|
|
49
|
-
* Returns zero or more AgentMessage events.
|
|
50
|
-
*/
|
|
51
|
-
export function parseCodexStreamLine(
|
|
52
|
-
raw: string,
|
|
53
|
-
state: CodexStreamState,
|
|
54
|
-
): AgentMessage[] {
|
|
55
|
-
const line = raw.trim();
|
|
56
|
-
if (!line) return [];
|
|
57
|
-
|
|
58
|
-
let parsed: CodexEvent;
|
|
59
|
-
try {
|
|
60
|
-
parsed = JSON.parse(line);
|
|
61
|
-
} catch {
|
|
62
|
-
return [];
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
const messages: AgentMessage[] = [];
|
|
66
|
-
|
|
67
|
-
switch (parsed.type) {
|
|
68
|
-
case 'thread.started':
|
|
69
|
-
if (parsed.thread_id) {
|
|
70
|
-
state.sessionId = parsed.thread_id;
|
|
71
|
-
}
|
|
72
|
-
break;
|
|
73
|
-
|
|
74
|
-
case 'item.completed':
|
|
75
|
-
if (parsed.item) {
|
|
76
|
-
switch (parsed.item.type) {
|
|
77
|
-
case 'agent_message':
|
|
78
|
-
if (parsed.item.text) {
|
|
79
|
-
messages.push({ type: 'text', content: parsed.item.text });
|
|
80
|
-
}
|
|
81
|
-
break;
|
|
82
|
-
case 'tool_call':
|
|
83
|
-
case 'function_call':
|
|
84
|
-
messages.push({
|
|
85
|
-
type: 'tool_use',
|
|
86
|
-
tool: parsed.item.name ?? 'unknown',
|
|
87
|
-
callId: parsed.item.call_id ?? parsed.item.id,
|
|
88
|
-
input: parsed.item.arguments ? { raw: parsed.item.arguments } : undefined,
|
|
89
|
-
});
|
|
90
|
-
break;
|
|
91
|
-
case 'tool_output':
|
|
92
|
-
case 'function_call_output':
|
|
93
|
-
messages.push({
|
|
94
|
-
type: 'tool_result',
|
|
95
|
-
callId: parsed.item.call_id ?? parsed.item.id,
|
|
96
|
-
output: parsed.item.output
|
|
97
|
-
? (parsed.item.output.length > 4096 ? parsed.item.output.slice(0, 4096) : parsed.item.output)
|
|
98
|
-
: undefined,
|
|
99
|
-
});
|
|
100
|
-
break;
|
|
101
|
-
}
|
|
102
|
-
}
|
|
103
|
-
break;
|
|
104
|
-
|
|
105
|
-
case 'turn.completed':
|
|
106
|
-
// Extract token usage — Codex doesn't provide per-model breakdown,
|
|
107
|
-
// so we use a generic "codex" model key
|
|
108
|
-
if (parsed.usage) {
|
|
109
|
-
const model = 'codex';
|
|
110
|
-
state.usage[model] = {
|
|
111
|
-
inputTokens: parsed.usage.input_tokens ?? 0,
|
|
112
|
-
outputTokens: parsed.usage.output_tokens ?? 0,
|
|
113
|
-
cacheReadTokens: parsed.usage.cached_input_tokens ?? 0,
|
|
114
|
-
cacheWriteTokens: 0,
|
|
115
|
-
model,
|
|
116
|
-
};
|
|
117
|
-
}
|
|
118
|
-
break;
|
|
119
|
-
|
|
120
|
-
case 'error':
|
|
121
|
-
state.isError = true;
|
|
122
|
-
messages.push({ type: 'error', content: String((parsed as unknown as Record<string, unknown>).message ?? 'Unknown error') });
|
|
123
|
-
break;
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
return messages;
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
/**
|
|
130
|
-
* Create a fresh parser state.
|
|
131
|
-
*/
|
|
132
|
-
export function createCodexStreamState(): CodexStreamState {
|
|
133
|
-
return { usage: {}, isError: false };
|
|
134
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI JSONL parser.
|
|
3
|
+
*
|
|
4
|
+
* Parses NDJSON from `codex exec --json`
|
|
5
|
+
* into AgentMessage events.
|
|
6
|
+
*
|
|
7
|
+
* Event types (from real codex-cli 0.97.0 output):
|
|
8
|
+
* - "thread.started" → thread_id (session)
|
|
9
|
+
* - "turn.started" → turn begins
|
|
10
|
+
* - "item.completed" → agent_message / tool_call / tool_result items
|
|
11
|
+
* - "turn.completed" → usage summary
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
import type { AgentMessage, TokenUsage } from './types.js';
|
|
15
|
+
|
|
16
|
+
// ── Codex JSONL shapes ──────────────────────────────────────
|
|
17
|
+
|
|
18
|
+
interface CodexEvent {
|
|
19
|
+
type: string;
|
|
20
|
+
thread_id?: string;
|
|
21
|
+
item?: {
|
|
22
|
+
id?: string;
|
|
23
|
+
type?: string;
|
|
24
|
+
text?: string;
|
|
25
|
+
name?: string;
|
|
26
|
+
arguments?: string;
|
|
27
|
+
output?: string;
|
|
28
|
+
call_id?: string;
|
|
29
|
+
};
|
|
30
|
+
usage?: {
|
|
31
|
+
input_tokens?: number;
|
|
32
|
+
output_tokens?: number;
|
|
33
|
+
cached_input_tokens?: number;
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
// ── State ───────────────────────────────────────────────────
|
|
38
|
+
|
|
39
|
+
export interface CodexStreamState {
|
|
40
|
+
sessionId?: string;
|
|
41
|
+
usage: Record<string, TokenUsage>;
|
|
42
|
+
isError: boolean;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// ── Parser ──────────────────────────────────────────────────
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Parse a single NDJSON line from Codex --json output.
|
|
49
|
+
* Returns zero or more AgentMessage events.
|
|
50
|
+
*/
|
|
51
|
+
export function parseCodexStreamLine(
|
|
52
|
+
raw: string,
|
|
53
|
+
state: CodexStreamState,
|
|
54
|
+
): AgentMessage[] {
|
|
55
|
+
const line = raw.trim();
|
|
56
|
+
if (!line) return [];
|
|
57
|
+
|
|
58
|
+
let parsed: CodexEvent;
|
|
59
|
+
try {
|
|
60
|
+
parsed = JSON.parse(line);
|
|
61
|
+
} catch {
|
|
62
|
+
return [];
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
const messages: AgentMessage[] = [];
|
|
66
|
+
|
|
67
|
+
switch (parsed.type) {
|
|
68
|
+
case 'thread.started':
|
|
69
|
+
if (parsed.thread_id) {
|
|
70
|
+
state.sessionId = parsed.thread_id;
|
|
71
|
+
}
|
|
72
|
+
break;
|
|
73
|
+
|
|
74
|
+
case 'item.completed':
|
|
75
|
+
if (parsed.item) {
|
|
76
|
+
switch (parsed.item.type) {
|
|
77
|
+
case 'agent_message':
|
|
78
|
+
if (parsed.item.text) {
|
|
79
|
+
messages.push({ type: 'text', content: parsed.item.text });
|
|
80
|
+
}
|
|
81
|
+
break;
|
|
82
|
+
case 'tool_call':
|
|
83
|
+
case 'function_call':
|
|
84
|
+
messages.push({
|
|
85
|
+
type: 'tool_use',
|
|
86
|
+
tool: parsed.item.name ?? 'unknown',
|
|
87
|
+
callId: parsed.item.call_id ?? parsed.item.id,
|
|
88
|
+
input: parsed.item.arguments ? { raw: parsed.item.arguments } : undefined,
|
|
89
|
+
});
|
|
90
|
+
break;
|
|
91
|
+
case 'tool_output':
|
|
92
|
+
case 'function_call_output':
|
|
93
|
+
messages.push({
|
|
94
|
+
type: 'tool_result',
|
|
95
|
+
callId: parsed.item.call_id ?? parsed.item.id,
|
|
96
|
+
output: parsed.item.output
|
|
97
|
+
? (parsed.item.output.length > 4096 ? parsed.item.output.slice(0, 4096) : parsed.item.output)
|
|
98
|
+
: undefined,
|
|
99
|
+
});
|
|
100
|
+
break;
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
break;
|
|
104
|
+
|
|
105
|
+
case 'turn.completed':
|
|
106
|
+
// Extract token usage — Codex doesn't provide per-model breakdown,
|
|
107
|
+
// so we use a generic "codex" model key
|
|
108
|
+
if (parsed.usage) {
|
|
109
|
+
const model = 'codex';
|
|
110
|
+
state.usage[model] = {
|
|
111
|
+
inputTokens: parsed.usage.input_tokens ?? 0,
|
|
112
|
+
outputTokens: parsed.usage.output_tokens ?? 0,
|
|
113
|
+
cacheReadTokens: parsed.usage.cached_input_tokens ?? 0,
|
|
114
|
+
cacheWriteTokens: 0,
|
|
115
|
+
model,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
break;
|
|
119
|
+
|
|
120
|
+
case 'error':
|
|
121
|
+
state.isError = true;
|
|
122
|
+
messages.push({ type: 'error', content: String((parsed as unknown as Record<string, unknown>).message ?? 'Unknown error') });
|
|
123
|
+
break;
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
return messages;
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* Create a fresh parser state.
|
|
131
|
+
*/
|
|
132
|
+
export function createCodexStreamState(): CodexStreamState {
|
|
133
|
+
return { usage: {}, isError: false };
|
|
134
|
+
}
|
|
@@ -1,41 +1,41 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Codex CLI adapter.
|
|
3
|
-
*
|
|
4
|
-
* Invocation: codex "<prompt>"
|
|
5
|
-
*/
|
|
6
|
-
|
|
7
|
-
import { spawnAgentWithStream, isCommandAvailable } from './spawn-helper.js';
|
|
8
|
-
import { parseCodexStreamLine, createCodexStreamState } from './codex-stream.js';
|
|
9
|
-
import type { AgentAdapter, AgentProcess, SpawnOptions } from './types.js';
|
|
10
|
-
|
|
11
|
-
export class CodexAdapter implements AgentAdapter {
|
|
12
|
-
name = 'codex';
|
|
13
|
-
|
|
14
|
-
async available(): Promise<boolean> {
|
|
15
|
-
return isCommandAvailable('codex');
|
|
16
|
-
}
|
|
17
|
-
|
|
18
|
-
spawn(prompt: string, opts: SpawnOptions): AgentProcess {
|
|
19
|
-
const state = createCodexStreamState();
|
|
20
|
-
|
|
21
|
-
// Use stdin ('-') to avoid shell escaping issues with long prompts
|
|
22
|
-
// --dangerously-bypass-approvals-and-sandbox: auto-approve + full write access for orchestrated headless mode
|
|
23
|
-
// --json: emit JSONL events to stdout for streaming + token tracking
|
|
24
|
-
const args = opts.resumeSessionId
|
|
25
|
-
? ['exec', 'resume', opts.resumeSessionId, '--dangerously-bypass-approvals-and-sandbox', '--json', '-']
|
|
26
|
-
: ['exec', '--dangerously-bypass-approvals-and-sandbox', '--json', '-'];
|
|
27
|
-
|
|
28
|
-
return spawnAgentWithStream(
|
|
29
|
-
'codex',
|
|
30
|
-
args,
|
|
31
|
-
opts,
|
|
32
|
-
prompt,
|
|
33
|
-
(line) => parseCodexStreamLine(line, state),
|
|
34
|
-
(result) => ({
|
|
35
|
-
...result,
|
|
36
|
-
tokenUsage: Object.keys(state.usage).length > 0 ? { ...state.usage } : undefined,
|
|
37
|
-
sessionId: state.sessionId,
|
|
38
|
-
}),
|
|
39
|
-
);
|
|
40
|
-
}
|
|
41
|
-
}
|
|
1
|
+
/**
|
|
2
|
+
* Codex CLI adapter.
|
|
3
|
+
*
|
|
4
|
+
* Invocation: codex "<prompt>"
|
|
5
|
+
*/
|
|
6
|
+
|
|
7
|
+
import { spawnAgentWithStream, isCommandAvailable } from './spawn-helper.js';
|
|
8
|
+
import { parseCodexStreamLine, createCodexStreamState } from './codex-stream.js';
|
|
9
|
+
import type { AgentAdapter, AgentProcess, SpawnOptions } from './types.js';
|
|
10
|
+
|
|
11
|
+
export class CodexAdapter implements AgentAdapter {
|
|
12
|
+
name = 'codex';
|
|
13
|
+
|
|
14
|
+
async available(): Promise<boolean> {
|
|
15
|
+
return isCommandAvailable('codex');
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
spawn(prompt: string, opts: SpawnOptions): AgentProcess {
|
|
19
|
+
const state = createCodexStreamState();
|
|
20
|
+
|
|
21
|
+
// Use stdin ('-') to avoid shell escaping issues with long prompts
|
|
22
|
+
// --dangerously-bypass-approvals-and-sandbox: auto-approve + full write access for orchestrated headless mode
|
|
23
|
+
// --json: emit JSONL events to stdout for streaming + token tracking
|
|
24
|
+
const args = opts.resumeSessionId
|
|
25
|
+
? ['exec', 'resume', opts.resumeSessionId, '--dangerously-bypass-approvals-and-sandbox', '--json', '-']
|
|
26
|
+
: ['exec', '--dangerously-bypass-approvals-and-sandbox', '--json', '-'];
|
|
27
|
+
|
|
28
|
+
return spawnAgentWithStream(
|
|
29
|
+
'codex',
|
|
30
|
+
args,
|
|
31
|
+
opts,
|
|
32
|
+
prompt,
|
|
33
|
+
(line) => parseCodexStreamLine(line, state),
|
|
34
|
+
(result) => ({
|
|
35
|
+
...result,
|
|
36
|
+
tokenUsage: Object.keys(state.usage).length > 0 ? { ...state.usage } : undefined,
|
|
37
|
+
sessionId: state.sessionId,
|
|
38
|
+
}),
|
|
39
|
+
);
|
|
40
|
+
}
|
|
41
|
+
}
|