@gtc6244/immediacy-daemon 0.1.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.
- package/dist/src/actions.d.ts +22 -0
- package/dist/src/actions.js +44 -0
- package/dist/src/actions.js.map +1 -0
- package/dist/src/agent/agent.d.ts +89 -0
- package/dist/src/agent/agent.js +22 -0
- package/dist/src/agent/agent.js.map +1 -0
- package/dist/src/agent/claude.d.ts +70 -0
- package/dist/src/agent/claude.js +404 -0
- package/dist/src/agent/claude.js.map +1 -0
- package/dist/src/agent/codex.d.ts +44 -0
- package/dist/src/agent/codex.js +303 -0
- package/dist/src/agent/codex.js.map +1 -0
- package/dist/src/agent/mock.d.ts +31 -0
- package/dist/src/agent/mock.js +155 -0
- package/dist/src/agent/mock.js.map +1 -0
- package/dist/src/agent/model-error.d.ts +8 -0
- package/dist/src/agent/model-error.js +25 -0
- package/dist/src/agent/model-error.js.map +1 -0
- package/dist/src/agent/openrouter.d.ts +38 -0
- package/dist/src/agent/openrouter.js +60 -0
- package/dist/src/agent/openrouter.js.map +1 -0
- package/dist/src/agent/workspace-scope.d.ts +25 -0
- package/dist/src/agent/workspace-scope.js +71 -0
- package/dist/src/agent/workspace-scope.js.map +1 -0
- package/dist/src/allowlist.d.ts +56 -0
- package/dist/src/allowlist.js +141 -0
- package/dist/src/allowlist.js.map +1 -0
- package/dist/src/chatlog.d.ts +50 -0
- package/dist/src/chatlog.js +179 -0
- package/dist/src/chatlog.js.map +1 -0
- package/dist/src/cli/paths.d.ts +40 -0
- package/dist/src/cli/paths.js +76 -0
- package/dist/src/cli/paths.js.map +1 -0
- package/dist/src/cli/service.d.ts +20 -0
- package/dist/src/cli/service.js +245 -0
- package/dist/src/cli/service.js.map +1 -0
- package/dist/src/cli.d.ts +2 -0
- package/dist/src/cli.js +227 -0
- package/dist/src/cli.js.map +1 -0
- package/dist/src/config.d.ts +33 -0
- package/dist/src/config.js +122 -0
- package/dist/src/config.js.map +1 -0
- package/dist/src/credentials.d.ts +38 -0
- package/dist/src/credentials.js +120 -0
- package/dist/src/credentials.js.map +1 -0
- package/dist/src/crypto.d.ts +49 -0
- package/dist/src/crypto.js +202 -0
- package/dist/src/crypto.js.map +1 -0
- package/dist/src/daemon-identity.d.ts +31 -0
- package/dist/src/daemon-identity.js +97 -0
- package/dist/src/daemon-identity.js.map +1 -0
- package/dist/src/envelope.d.ts +14 -0
- package/dist/src/envelope.js +28 -0
- package/dist/src/envelope.js.map +1 -0
- package/dist/src/events.d.ts +40 -0
- package/dist/src/events.js +24 -0
- package/dist/src/events.js.map +1 -0
- package/dist/src/forward.d.ts +51 -0
- package/dist/src/forward.js +170 -0
- package/dist/src/forward.js.map +1 -0
- package/dist/src/fs-scope.d.ts +17 -0
- package/dist/src/fs-scope.js +47 -0
- package/dist/src/fs-scope.js.map +1 -0
- package/dist/src/github.d.ts +70 -0
- package/dist/src/github.js +178 -0
- package/dist/src/github.js.map +1 -0
- package/dist/src/gitops.d.ts +113 -0
- package/dist/src/gitops.js +557 -0
- package/dist/src/gitops.js.map +1 -0
- package/dist/src/hub.d.ts +50 -0
- package/dist/src/hub.js +92 -0
- package/dist/src/hub.js.map +1 -0
- package/dist/src/index.d.ts +22 -0
- package/dist/src/index.js +56 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/jobs/scheduler.d.ts +94 -0
- package/dist/src/jobs/scheduler.js +373 -0
- package/dist/src/jobs/scheduler.js.map +1 -0
- package/dist/src/jobs/store.d.ts +33 -0
- package/dist/src/jobs/store.js +111 -0
- package/dist/src/jobs/store.js.map +1 -0
- package/dist/src/log.d.ts +61 -0
- package/dist/src/log.js +166 -0
- package/dist/src/log.js.map +1 -0
- package/dist/src/migrate-state-dir.d.ts +1 -0
- package/dist/src/migrate-state-dir.js +47 -0
- package/dist/src/migrate-state-dir.js.map +1 -0
- package/dist/src/models.d.ts +36 -0
- package/dist/src/models.js +71 -0
- package/dist/src/models.js.map +1 -0
- package/dist/src/permission-gate.d.ts +48 -0
- package/dist/src/permission-gate.js +93 -0
- package/dist/src/permission-gate.js.map +1 -0
- package/dist/src/permission-scope.d.ts +77 -0
- package/dist/src/permission-scope.js +244 -0
- package/dist/src/permission-scope.js.map +1 -0
- package/dist/src/ports.d.ts +71 -0
- package/dist/src/ports.js +216 -0
- package/dist/src/ports.js.map +1 -0
- package/dist/src/projects.d.ts +83 -0
- package/dist/src/projects.js +205 -0
- package/dist/src/projects.js.map +1 -0
- package/dist/src/protocol.d.ts +1226 -0
- package/dist/src/protocol.js +16 -0
- package/dist/src/protocol.js.map +1 -0
- package/dist/src/repo-sync.d.ts +49 -0
- package/dist/src/repo-sync.js +83 -0
- package/dist/src/repo-sync.js.map +1 -0
- package/dist/src/server.d.ts +33 -0
- package/dist/src/server.js +973 -0
- package/dist/src/server.js.map +1 -0
- package/dist/src/terminal.d.ts +32 -0
- package/dist/src/terminal.js +92 -0
- package/dist/src/terminal.js.map +1 -0
- package/dist/src/titler.d.ts +15 -0
- package/dist/src/titler.js +72 -0
- package/dist/src/titler.js.map +1 -0
- package/dist/src/types.d.ts +99 -0
- package/dist/src/types.js +3 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/usage-limit.d.ts +49 -0
- package/dist/src/usage-limit.js +83 -0
- package/dist/src/usage-limit.js.map +1 -0
- package/dist/src/usage.d.ts +23 -0
- package/dist/src/usage.js +63 -0
- package/dist/src/usage.js.map +1 -0
- package/dist/src/workspace.d.ts +303 -0
- package/dist/src/workspace.js +1086 -0
- package/dist/src/workspace.js.map +1 -0
- package/dist/src/worktree.d.ts +133 -0
- package/dist/src/worktree.js +561 -0
- package/dist/src/worktree.js.map +1 -0
- package/package.json +67 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"claude.js","sourceRoot":"","sources":["../../../src/agent/claude.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CodexAgent — real headless OpenAI Codex via the `codex` CLI.
|
|
3
|
+
*
|
|
4
|
+
* Unlike the Claude Agent SDK (one long-lived streaming session), `codex exec`
|
|
5
|
+
* is one process per turn. We therefore spawn a fresh `codex exec` for each
|
|
6
|
+
* prompt and keep continuity by resuming the recorded thread id on later turns
|
|
7
|
+
* (`codex exec resume <thread_id>`). Prompts that arrive mid-turn are queued and
|
|
8
|
+
* run in order.
|
|
9
|
+
*
|
|
10
|
+
* Streaming: `--json` emits JSONL events on stdout; we map them onto the same
|
|
11
|
+
* AgentEvent surface the UI already renders for Claude.
|
|
12
|
+
*
|
|
13
|
+
* Permissions: Codex's non-interactive `exec` mode can't defer each tool call to
|
|
14
|
+
* the phone the way the Claude SDK's `canUseTool` does. Instead we sandbox it —
|
|
15
|
+
* `-s workspace-write` confines writes to the worktree and `approval_policy=never`
|
|
16
|
+
* refuses (rather than performs) any action that would escape the sandbox. We
|
|
17
|
+
* still surface every file edit / command as an `event.tool_use` for visibility.
|
|
18
|
+
* No `--dangerously-bypass-approvals-and-sandbox`, ever.
|
|
19
|
+
*/
|
|
20
|
+
import { BaseAgent, AgentContext, AgentAttachment, PermissionResponse } from "./agent.js";
|
|
21
|
+
export declare class CodexAgent extends BaseAgent {
|
|
22
|
+
private ctx;
|
|
23
|
+
private envOverride?;
|
|
24
|
+
private queue;
|
|
25
|
+
private child;
|
|
26
|
+
private closed;
|
|
27
|
+
private sessionId?;
|
|
28
|
+
/**
|
|
29
|
+
* @param envOverride Extra environment for the `codex` subprocess, merged over
|
|
30
|
+
* `process.env` at spawn (below) without mutating it. Used to inject a stored
|
|
31
|
+
* OPENAI_API_KEY; when omitted, Codex falls back to its own cached ChatGPT
|
|
32
|
+
* login (the SSO path).
|
|
33
|
+
*/
|
|
34
|
+
constructor(ctx: AgentContext, envOverride?: Record<string, string | undefined> | undefined);
|
|
35
|
+
prompt(text: string, attachments?: AgentAttachment[]): void;
|
|
36
|
+
respondPermission(_requestId: string, _decision: PermissionResponse): void;
|
|
37
|
+
stop(): Promise<void>;
|
|
38
|
+
private runNext;
|
|
39
|
+
/** Current process is done; kick off the next queued prompt, if any. */
|
|
40
|
+
private finishTurn;
|
|
41
|
+
private handleLine;
|
|
42
|
+
/** Map a Codex item to assistant text (on completion) or a tool_use event. */
|
|
43
|
+
private handleItem;
|
|
44
|
+
}
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CodexAgent — real headless OpenAI Codex via the `codex` CLI.
|
|
3
|
+
*
|
|
4
|
+
* Unlike the Claude Agent SDK (one long-lived streaming session), `codex exec`
|
|
5
|
+
* is one process per turn. We therefore spawn a fresh `codex exec` for each
|
|
6
|
+
* prompt and keep continuity by resuming the recorded thread id on later turns
|
|
7
|
+
* (`codex exec resume <thread_id>`). Prompts that arrive mid-turn are queued and
|
|
8
|
+
* run in order.
|
|
9
|
+
*
|
|
10
|
+
* Streaming: `--json` emits JSONL events on stdout; we map them onto the same
|
|
11
|
+
* AgentEvent surface the UI already renders for Claude.
|
|
12
|
+
*
|
|
13
|
+
* Permissions: Codex's non-interactive `exec` mode can't defer each tool call to
|
|
14
|
+
* the phone the way the Claude SDK's `canUseTool` does. Instead we sandbox it —
|
|
15
|
+
* `-s workspace-write` confines writes to the worktree and `approval_policy=never`
|
|
16
|
+
* refuses (rather than performs) any action that would escape the sandbox. We
|
|
17
|
+
* still surface every file edit / command as an `event.tool_use` for visibility.
|
|
18
|
+
* No `--dangerously-bypass-approvals-and-sandbox`, ever.
|
|
19
|
+
*/
|
|
20
|
+
import { spawn } from "node:child_process";
|
|
21
|
+
import { BaseAgent } from "./agent.js";
|
|
22
|
+
import { CODEX_DEFAULT_MODEL } from "../models.js";
|
|
23
|
+
export class CodexAgent extends BaseAgent {
|
|
24
|
+
ctx;
|
|
25
|
+
envOverride;
|
|
26
|
+
queue = [];
|
|
27
|
+
child = null;
|
|
28
|
+
closed = false;
|
|
29
|
+
sessionId;
|
|
30
|
+
/**
|
|
31
|
+
* @param envOverride Extra environment for the `codex` subprocess, merged over
|
|
32
|
+
* `process.env` at spawn (below) without mutating it. Used to inject a stored
|
|
33
|
+
* OPENAI_API_KEY; when omitted, Codex falls back to its own cached ChatGPT
|
|
34
|
+
* login (the SSO path).
|
|
35
|
+
*/
|
|
36
|
+
constructor(ctx, envOverride) {
|
|
37
|
+
super();
|
|
38
|
+
this.ctx = ctx;
|
|
39
|
+
this.envOverride = envOverride;
|
|
40
|
+
this.sessionId = ctx.resumeSessionId;
|
|
41
|
+
}
|
|
42
|
+
prompt(text, attachments) {
|
|
43
|
+
if (this.closed)
|
|
44
|
+
return;
|
|
45
|
+
// `codex exec` takes a single text prompt — no content-block channel for
|
|
46
|
+
// images. Inline text/PDF-less documents as fenced blocks, and name any
|
|
47
|
+
// binary/image attachments so the agent at least knows they were sent.
|
|
48
|
+
this.queue.push(inlineAttachments(text, attachments));
|
|
49
|
+
if (!this.child)
|
|
50
|
+
this.runNext();
|
|
51
|
+
}
|
|
52
|
+
// Codex exec has no interactive approval channel in this mode; the sandbox is
|
|
53
|
+
// the boundary. Kept for interface parity with ClaudeAgent/MockAgent.
|
|
54
|
+
respondPermission(_requestId, _decision) { }
|
|
55
|
+
async stop() {
|
|
56
|
+
this.closed = true;
|
|
57
|
+
this.queue = [];
|
|
58
|
+
this.child?.kill("SIGTERM");
|
|
59
|
+
this.child = null;
|
|
60
|
+
}
|
|
61
|
+
runNext() {
|
|
62
|
+
if (this.closed)
|
|
63
|
+
return;
|
|
64
|
+
const text = this.queue.shift();
|
|
65
|
+
if (text === undefined)
|
|
66
|
+
return;
|
|
67
|
+
// The sentinel model means "use the account default" — omit -m (required on
|
|
68
|
+
// ChatGPT-login Codex, which rejects explicit model ids).
|
|
69
|
+
const model = this.ctx.model && this.ctx.model !== CODEX_DEFAULT_MODEL
|
|
70
|
+
? this.ctx.model
|
|
71
|
+
: undefined;
|
|
72
|
+
const flags = [
|
|
73
|
+
"exec",
|
|
74
|
+
"--json",
|
|
75
|
+
"--skip-git-repo-check",
|
|
76
|
+
"-C",
|
|
77
|
+
this.ctx.worktreePath,
|
|
78
|
+
"-s",
|
|
79
|
+
"workspace-write",
|
|
80
|
+
"-c",
|
|
81
|
+
"approval_policy=never",
|
|
82
|
+
...(model ? ["-m", model] : []),
|
|
83
|
+
];
|
|
84
|
+
// Resume the recorded thread on later turns; the prompt is read from stdin
|
|
85
|
+
// (`-`) so it needs no argv escaping.
|
|
86
|
+
const args = this.sessionId
|
|
87
|
+
? [...flags, "resume", this.sessionId, "-"]
|
|
88
|
+
: flags;
|
|
89
|
+
const child = spawn("codex", args, {
|
|
90
|
+
cwd: this.ctx.worktreePath,
|
|
91
|
+
env: this.envOverride
|
|
92
|
+
? { ...process.env, ...this.envOverride }
|
|
93
|
+
: process.env,
|
|
94
|
+
});
|
|
95
|
+
this.child = child;
|
|
96
|
+
this.emitEvent({ kind: "status", status: "running" });
|
|
97
|
+
// A turn settles exactly once. `error` and `close` can both fire (e.g. a
|
|
98
|
+
// failed spawn), which would otherwise double-emit status and race two
|
|
99
|
+
// `runNext` calls on the queue.
|
|
100
|
+
let settled = false;
|
|
101
|
+
const settle = () => {
|
|
102
|
+
if (settled)
|
|
103
|
+
return;
|
|
104
|
+
settled = true;
|
|
105
|
+
this.finishTurn();
|
|
106
|
+
};
|
|
107
|
+
// If codex dies before reading stdin (bad flags / auth failure), writing to
|
|
108
|
+
// the closed pipe emits EPIPE on the stdin stream. With no listener that is
|
|
109
|
+
// an unhandled error that crashes the daemon; swallow it — `close` reports
|
|
110
|
+
// the real exit.
|
|
111
|
+
child.stdin.on("error", () => { });
|
|
112
|
+
child.stdin.write(text);
|
|
113
|
+
child.stdin.end();
|
|
114
|
+
let buf = "";
|
|
115
|
+
child.stdout.on("data", (chunk) => {
|
|
116
|
+
buf += chunk.toString();
|
|
117
|
+
let nl;
|
|
118
|
+
while ((nl = buf.indexOf("\n")) >= 0) {
|
|
119
|
+
const line = buf.slice(0, nl).trim();
|
|
120
|
+
buf = buf.slice(nl + 1);
|
|
121
|
+
if (line)
|
|
122
|
+
this.handleLine(line);
|
|
123
|
+
}
|
|
124
|
+
});
|
|
125
|
+
let stderr = "";
|
|
126
|
+
child.stderr.on("data", (chunk) => {
|
|
127
|
+
stderr += chunk.toString();
|
|
128
|
+
});
|
|
129
|
+
child.on("error", (err) => {
|
|
130
|
+
this.emitEvent({ kind: "error", message: `codex: ${err.message}` });
|
|
131
|
+
this.emitEvent({ kind: "status", status: "error" });
|
|
132
|
+
settle();
|
|
133
|
+
});
|
|
134
|
+
child.on("close", (code) => {
|
|
135
|
+
if (this.closed)
|
|
136
|
+
return;
|
|
137
|
+
if (!settled && code !== 0) {
|
|
138
|
+
const detail = stderr.trim().split("\n").slice(-3).join(" ").trim();
|
|
139
|
+
this.emitEvent({
|
|
140
|
+
kind: "error",
|
|
141
|
+
message: `codex exited ${code}${detail ? `: ${detail}` : ""}`,
|
|
142
|
+
});
|
|
143
|
+
this.emitEvent({ kind: "status", status: "error" });
|
|
144
|
+
}
|
|
145
|
+
settle();
|
|
146
|
+
});
|
|
147
|
+
}
|
|
148
|
+
/** Current process is done; kick off the next queued prompt, if any. */
|
|
149
|
+
finishTurn() {
|
|
150
|
+
this.child = null;
|
|
151
|
+
if (!this.closed && this.queue.length)
|
|
152
|
+
this.runNext();
|
|
153
|
+
}
|
|
154
|
+
handleLine(line) {
|
|
155
|
+
let ev;
|
|
156
|
+
try {
|
|
157
|
+
ev = JSON.parse(line);
|
|
158
|
+
}
|
|
159
|
+
catch {
|
|
160
|
+
return; // non-JSON noise
|
|
161
|
+
}
|
|
162
|
+
switch (ev.type) {
|
|
163
|
+
case "thread.started": {
|
|
164
|
+
const id = ev.thread_id;
|
|
165
|
+
if (typeof id === "string") {
|
|
166
|
+
this.sessionId = id;
|
|
167
|
+
this.emitEvent({ kind: "session", sessionId: id });
|
|
168
|
+
}
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
case "item.started":
|
|
172
|
+
this.handleItem(ev.item, false);
|
|
173
|
+
return;
|
|
174
|
+
case "item.completed":
|
|
175
|
+
this.handleItem(ev.item, true);
|
|
176
|
+
return;
|
|
177
|
+
case "turn.completed":
|
|
178
|
+
this.emitEvent({ kind: "done" });
|
|
179
|
+
this.emitEvent({ kind: "status", status: "done" });
|
|
180
|
+
return;
|
|
181
|
+
case "turn.failed": {
|
|
182
|
+
const msg = extractError(ev);
|
|
183
|
+
this.emitEvent({ kind: "error", message: msg });
|
|
184
|
+
this.emitEvent({ kind: "status", status: "error" });
|
|
185
|
+
return;
|
|
186
|
+
}
|
|
187
|
+
case "error":
|
|
188
|
+
this.emitEvent({ kind: "error", message: extractError(ev) });
|
|
189
|
+
this.emitEvent({ kind: "status", status: "error" });
|
|
190
|
+
return;
|
|
191
|
+
default:
|
|
192
|
+
return; // reasoning/turn.started/etc. — not forwarded
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
/** Map a Codex item to assistant text (on completion) or a tool_use event. */
|
|
196
|
+
handleItem(item, completed) {
|
|
197
|
+
if (!item || typeof item !== "object")
|
|
198
|
+
return;
|
|
199
|
+
const it = item;
|
|
200
|
+
switch (it.type) {
|
|
201
|
+
case "agent_message": {
|
|
202
|
+
// Emit the final text once, on completion.
|
|
203
|
+
if (completed && typeof it.text === "string" && it.text.trim()) {
|
|
204
|
+
this.emitEvent({ kind: "assistant", text: it.text.trim() });
|
|
205
|
+
}
|
|
206
|
+
return;
|
|
207
|
+
}
|
|
208
|
+
case "file_change": {
|
|
209
|
+
if (completed)
|
|
210
|
+
return; // announce once, when it starts
|
|
211
|
+
const paths = Array.isArray(it.changes)
|
|
212
|
+
? it.changes
|
|
213
|
+
.map((c) => c.path)
|
|
214
|
+
.filter((p) => typeof p === "string")
|
|
215
|
+
.map((p) => p.split("/").pop() ?? p)
|
|
216
|
+
.join(", ")
|
|
217
|
+
: "";
|
|
218
|
+
this.emitEvent({ kind: "tool_use", tool: "Edit", inputSummary: paths });
|
|
219
|
+
return;
|
|
220
|
+
}
|
|
221
|
+
case "command_execution": {
|
|
222
|
+
if (completed)
|
|
223
|
+
return;
|
|
224
|
+
const cmd = typeof it.command === "string" ? it.command : "";
|
|
225
|
+
this.emitEvent({ kind: "tool_use", tool: "Bash", inputSummary: cmd });
|
|
226
|
+
return;
|
|
227
|
+
}
|
|
228
|
+
case "mcp_tool_call": {
|
|
229
|
+
if (completed)
|
|
230
|
+
return;
|
|
231
|
+
const name = typeof it.tool === "string"
|
|
232
|
+
? it.tool
|
|
233
|
+
: typeof it.server === "string"
|
|
234
|
+
? String(it.server)
|
|
235
|
+
: "mcp";
|
|
236
|
+
this.emitEvent({ kind: "tool_use", tool: name, inputSummary: "" });
|
|
237
|
+
return;
|
|
238
|
+
}
|
|
239
|
+
default:
|
|
240
|
+
return; // reasoning, todo_list, etc.
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
/** Pull a human-readable message out of a Codex error/turn.failed event. */
|
|
245
|
+
function extractError(ev) {
|
|
246
|
+
const err = ev.error;
|
|
247
|
+
if (typeof err === "string")
|
|
248
|
+
return unwrap(err);
|
|
249
|
+
if (err && typeof err === "object") {
|
|
250
|
+
const m = err.message;
|
|
251
|
+
if (typeof m === "string")
|
|
252
|
+
return unwrap(m);
|
|
253
|
+
}
|
|
254
|
+
if (typeof ev.message === "string")
|
|
255
|
+
return unwrap(ev.message);
|
|
256
|
+
return "codex error";
|
|
257
|
+
}
|
|
258
|
+
/**
|
|
259
|
+
* Codex sometimes nests an API error as a JSON string inside `message`
|
|
260
|
+
* (e.g. `{"type":"error","error":{"message":"…"}}`). Surface the inner text.
|
|
261
|
+
*/
|
|
262
|
+
function unwrap(s) {
|
|
263
|
+
const t = s.trim();
|
|
264
|
+
if (!t.startsWith("{"))
|
|
265
|
+
return t;
|
|
266
|
+
try {
|
|
267
|
+
const j = JSON.parse(t);
|
|
268
|
+
const inner = j.error?.message ?? j.message;
|
|
269
|
+
if (typeof inner === "string")
|
|
270
|
+
return inner;
|
|
271
|
+
}
|
|
272
|
+
catch {
|
|
273
|
+
/* not JSON — fall through */
|
|
274
|
+
}
|
|
275
|
+
return t;
|
|
276
|
+
}
|
|
277
|
+
/**
|
|
278
|
+
* Fold prompt attachments into a single text prompt for the `codex exec` CLI,
|
|
279
|
+
* which has no content-block channel. Text-decodable documents are inlined
|
|
280
|
+
* verbatim; images and other binary files are listed by name so the agent knows
|
|
281
|
+
* they exist even though it can't see their bytes.
|
|
282
|
+
*/
|
|
283
|
+
function inlineAttachments(text, attachments) {
|
|
284
|
+
if (!attachments || attachments.length === 0)
|
|
285
|
+
return text;
|
|
286
|
+
const parts = [];
|
|
287
|
+
if (text.trim().length > 0)
|
|
288
|
+
parts.push(text);
|
|
289
|
+
const unseen = [];
|
|
290
|
+
for (const a of attachments) {
|
|
291
|
+
if (a.mediaType.startsWith("image/") || a.mediaType === "application/pdf") {
|
|
292
|
+
unseen.push(`${a.name} (${a.mediaType})`);
|
|
293
|
+
continue;
|
|
294
|
+
}
|
|
295
|
+
const decoded = Buffer.from(a.data, "base64").toString("utf8");
|
|
296
|
+
parts.push(`<attached file: ${a.name}>\n${decoded}\n</attached file>`);
|
|
297
|
+
}
|
|
298
|
+
if (unseen.length > 0) {
|
|
299
|
+
parts.push(`[The user also attached, but this backend can't display: ${unseen.join(", ")}]`);
|
|
300
|
+
}
|
|
301
|
+
return parts.join("\n\n");
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=codex.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"codex.js","sourceRoot":"","sources":["../../../src/agent/codex.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,OAAO,EAAE,KAAK,EAAuC,MAAM,oBAAoB,CAAC;AAChF,OAAO,EAAE,SAAS,EAAqD,MAAM,YAAY,CAAC;AAC1F,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,MAAM,OAAO,UAAW,SAAQ,SAAS;IAa7B;IACA;IAbF,KAAK,GAAa,EAAE,CAAC;IACrB,KAAK,GAA0C,IAAI,CAAC;IACpD,MAAM,GAAG,KAAK,CAAC;IACf,SAAS,CAAU;IAE3B;;;;;OAKG;IACH,YACU,GAAiB,EACjB,WAAgD;QAExD,KAAK,EAAE,CAAC;QAHA,QAAG,GAAH,GAAG,CAAc;QACjB,gBAAW,GAAX,WAAW,CAAqC;QAGxD,IAAI,CAAC,SAAS,GAAG,GAAG,CAAC,eAAe,CAAC;IACvC,CAAC;IAED,MAAM,CAAC,IAAY,EAAE,WAA+B;QAClD,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,yEAAyE;QACzE,wEAAwE;QACxE,uEAAuE;QACvE,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,KAAK;YAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IAClC,CAAC;IAED,8EAA8E;IAC9E,sEAAsE;IACtE,iBAAiB,CAAC,UAAkB,EAAE,SAA6B,IAAS,CAAC;IAE7E,KAAK,CAAC,IAAI;QACR,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,KAAK,GAAG,EAAE,CAAC;QAChB,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC;QAC5B,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;IACpB,CAAC;IAEO,OAAO;QACb,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;QAChC,IAAI,IAAI,KAAK,SAAS;YAAE,OAAO;QAE/B,4EAA4E;QAC5E,0DAA0D;QAC1D,MAAM,KAAK,GACT,IAAI,CAAC,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,GAAG,CAAC,KAAK,KAAK,mBAAmB;YACtD,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK;YAChB,CAAC,CAAC,SAAS,CAAC;QAChB,MAAM,KAAK,GAAG;YACZ,MAAM;YACN,QAAQ;YACR,uBAAuB;YACvB,IAAI;YACJ,IAAI,CAAC,GAAG,CAAC,YAAY;YACrB,IAAI;YACJ,iBAAiB;YACjB,IAAI;YACJ,uBAAuB;YACvB,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;SAChC,CAAC;QACF,2EAA2E;QAC3E,sCAAsC;QACtC,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS;YACzB,CAAC,CAAC,CAAC,GAAG,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,SAAS,EAAE,GAAG,CAAC;YAC3C,CAAC,CAAC,KAAK,CAAC;QAEV,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,EAAE,IAAI,EAAE;YACjC,GAAG,EAAE,IAAI,CAAC,GAAG,CAAC,YAAY;YAC1B,GAAG,EAAE,IAAI,CAAC,WAAW;gBACnB,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE;gBACzC,CAAC,CAAC,OAAO,CAAC,GAAG;SAChB,CAAC,CAAC;QACH,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAEtD,yEAAyE;QACzE,uEAAuE;QACvE,gCAAgC;QAChC,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,MAAM,MAAM,GAAG,GAAS,EAAE;YACxB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YACf,IAAI,CAAC,UAAU,EAAE,CAAC;QACpB,CAAC,CAAC;QAEF,4EAA4E;QAC5E,4EAA4E;QAC5E,2EAA2E;QAC3E,iBAAiB;QACjB,KAAK,CAAC,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE,GAAE,CAAC,CAAC,CAAC;QAClC,KAAK,CAAC,KAAK,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,KAAK,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;QAElB,IAAI,GAAG,GAAG,EAAE,CAAC;QACb,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,GAAG,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;YACxB,IAAI,EAAU,CAAC;YACf,OAAO,CAAC,EAAE,GAAG,GAAG,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC;gBACrC,MAAM,IAAI,GAAG,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;gBACrC,GAAG,GAAG,GAAG,CAAC,KAAK,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC;gBACxB,IAAI,IAAI;oBAAE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAClC,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,IAAI,MAAM,GAAG,EAAE,CAAC;QAChB,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;YACxC,MAAM,IAAI,KAAK,CAAC,QAAQ,EAAE,CAAC;QAC7B,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,GAAG,EAAE,EAAE;YACxB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,UAAU,GAAG,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;YACpE,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACpD,MAAM,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;QAEH,KAAK,CAAC,EAAE,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE;YACzB,IAAI,IAAI,CAAC,MAAM;gBAAE,OAAO;YACxB,IAAI,CAAC,OAAO,IAAI,IAAI,KAAK,CAAC,EAAE,CAAC;gBAC3B,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;gBACpE,IAAI,CAAC,SAAS,CAAC;oBACb,IAAI,EAAE,OAAO;oBACb,OAAO,EAAE,gBAAgB,IAAI,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE;iBAC9D,CAAC,CAAC;gBACH,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;YACtD,CAAC;YACD,MAAM,EAAE,CAAC;QACX,CAAC,CAAC,CAAC;IACL,CAAC;IAED,wEAAwE;IAChE,UAAU;QAChB,IAAI,CAAC,KAAK,GAAG,IAAI,CAAC;QAClB,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,MAAM;YAAE,IAAI,CAAC,OAAO,EAAE,CAAC;IACxD,CAAC;IAEO,UAAU,CAAC,IAAY;QAC7B,IAAI,EAA2C,CAAC;QAChD,IAAI,CAAC;YACH,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACxB,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,CAAC,iBAAiB;QAC3B,CAAC;QACD,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;YAChB,KAAK,gBAAgB,CAAC,CAAC,CAAC;gBACtB,MAAM,EAAE,GAAG,EAAE,CAAC,SAAS,CAAC;gBACxB,IAAI,OAAO,EAAE,KAAK,QAAQ,EAAE,CAAC;oBAC3B,IAAI,CAAC,SAAS,GAAG,EAAE,CAAC;oBACpB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAC;gBACrD,CAAC;gBACD,OAAO;YACT,CAAC;YACD,KAAK,cAAc;gBACjB,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;gBAChC,OAAO;YACT,KAAK,gBAAgB;gBACnB,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;gBAC/B,OAAO;YACT,KAAK,gBAAgB;gBACnB,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,CAAC;gBACjC,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;gBACnD,OAAO;YACT,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,MAAM,GAAG,GAAG,YAAY,CAAC,EAAE,CAAC,CAAC;gBAC7B,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,GAAG,EAAE,CAAC,CAAC;gBAChD,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;gBACpD,OAAO;YACT,CAAC;YACD,KAAK,OAAO;gBACV,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,YAAY,CAAC,EAAE,CAAC,EAAE,CAAC,CAAC;gBAC7D,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,CAAC,CAAC;gBACpD,OAAO;YACT;gBACE,OAAO,CAAC,8CAA8C;QAC1D,CAAC;IACH,CAAC;IAED,8EAA8E;IACtE,UAAU,CAAC,IAAa,EAAE,SAAkB;QAClD,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ;YAAE,OAAO;QAC9C,MAAM,EAAE,GAAG,IAA+C,CAAC;QAC3D,QAAQ,EAAE,CAAC,IAAI,EAAE,CAAC;YAChB,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,2CAA2C;gBAC3C,IAAI,SAAS,IAAI,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ,IAAI,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC/D,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;gBAC9D,CAAC;gBACD,OAAO;YACT,CAAC;YACD,KAAK,aAAa,CAAC,CAAC,CAAC;gBACnB,IAAI,SAAS;oBAAE,OAAO,CAAC,gCAAgC;gBACvD,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC;oBACrC,CAAC,CAAE,EAAE,CAAC,OAAoC;yBACrC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;yBAClB,MAAM,CAAC,CAAC,CAAC,EAAe,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC;yBACjD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;yBACnC,IAAI,CAAC,IAAI,CAAC;oBACf,CAAC,CAAC,EAAE,CAAC;gBACP,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,CAAC,CAAC;gBACxE,OAAO;YACT,CAAC;YACD,KAAK,mBAAmB,CAAC,CAAC,CAAC;gBACzB,IAAI,SAAS;oBAAE,OAAO;gBACtB,MAAM,GAAG,GAAG,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,CAAC;gBAC7D,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,MAAM,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC,CAAC;gBACtE,OAAO;YACT,CAAC;YACD,KAAK,eAAe,CAAC,CAAC,CAAC;gBACrB,IAAI,SAAS;oBAAE,OAAO;gBACtB,MAAM,IAAI,GACR,OAAO,EAAE,CAAC,IAAI,KAAK,QAAQ;oBACzB,CAAC,CAAC,EAAE,CAAC,IAAI;oBACT,CAAC,CAAC,OAAO,EAAE,CAAC,MAAM,KAAK,QAAQ;wBAC7B,CAAC,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC;wBACnB,CAAC,CAAC,KAAK,CAAC;gBACd,IAAI,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,IAAI,EAAE,YAAY,EAAE,EAAE,EAAE,CAAC,CAAC;gBACnE,OAAO;YACT,CAAC;YACD;gBACE,OAAO,CAAC,6BAA6B;QACzC,CAAC;IACH,CAAC;CACF;AAED,4EAA4E;AAC5E,SAAS,YAAY,CAAC,EAA2B;IAC/C,MAAM,GAAG,GAAG,EAAE,CAAC,KAAK,CAAC;IACrB,IAAI,OAAO,GAAG,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QACnC,MAAM,CAAC,GAAI,GAA6B,CAAC,OAAO,CAAC;QACjD,IAAI,OAAO,CAAC,KAAK,QAAQ;YAAE,OAAO,MAAM,CAAC,CAAC,CAAC,CAAC;IAC9C,CAAC;IACD,IAAI,OAAO,EAAE,CAAC,OAAO,KAAK,QAAQ;QAAE,OAAO,MAAM,CAAC,EAAE,CAAC,OAAO,CAAC,CAAC;IAC9D,OAAO,aAAa,CAAC;AACvB,CAAC;AAED;;;GAGG;AACH,SAAS,MAAM,CAAC,CAAS;IACvB,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC;IACnB,IAAI,CAAC,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC;QAAE,OAAO,CAAC,CAAC;IACjC,IAAI,CAAC;QACH,MAAM,CAAC,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAyD,CAAC;QAChF,MAAM,KAAK,GAAG,CAAC,CAAC,KAAK,EAAE,OAAO,IAAI,CAAC,CAAC,OAAO,CAAC;QAC5C,IAAI,OAAO,KAAK,KAAK,QAAQ;YAAE,OAAO,KAAK,CAAC;IAC9C,CAAC;IAAC,MAAM,CAAC;QACP,6BAA6B;IAC/B,CAAC;IACD,OAAO,CAAC,CAAC;AACX,CAAC;AAED;;;;;GAKG;AACH,SAAS,iBAAiB,CAAC,IAAY,EAAE,WAA+B;IACtE,IAAI,CAAC,WAAW,IAAI,WAAW,CAAC,MAAM,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IAC1D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC,MAAM,GAAG,CAAC;QAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IAC7C,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,WAAW,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,SAAS,KAAK,iBAAiB,EAAE,CAAC;YAC1E,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,IAAI,KAAK,CAAC,CAAC,SAAS,GAAG,CAAC,CAAC;YAC1C,SAAS;QACX,CAAC;QACD,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QAC/D,KAAK,CAAC,IAAI,CAAC,mBAAmB,CAAC,CAAC,IAAI,MAAM,OAAO,oBAAoB,CAAC,CAAC;IACzE,CAAC;IACD,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CACR,4DAA4D,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CACjF,CAAC;IACJ,CAAC;IACD,OAAO,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;AAC5B,CAAC"}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MockAgent — a scripted agent for local/emulator testing.
|
|
3
|
+
*
|
|
4
|
+
* It is NOT a stub: it drives the real permission gate, writes a real file into
|
|
5
|
+
* the real git worktree (so `diff.get` returns genuine hunks), and emits every
|
|
6
|
+
* event type the UI must render. What it does NOT do is call a model or spend
|
|
7
|
+
* credits — the prompt text just chooses a canned script.
|
|
8
|
+
*
|
|
9
|
+
* Flow per prompt:
|
|
10
|
+
* assistant ("on it") → tool_use (Write) → permission_request → [phone] →
|
|
11
|
+
* allow: write file, assistant ("done"), done
|
|
12
|
+
* deny : assistant ("ok, skipped"), done
|
|
13
|
+
*/
|
|
14
|
+
import { BaseAgent, AgentContext, AgentAttachment, PermissionResponse } from "./agent.js";
|
|
15
|
+
export declare class MockAgent extends BaseAgent {
|
|
16
|
+
private ctx;
|
|
17
|
+
private gate;
|
|
18
|
+
/** Live gated calls (see ClaudeAgent) so `allow_all` can derive a rule. */
|
|
19
|
+
private pendingCalls;
|
|
20
|
+
private sessionId;
|
|
21
|
+
private turn;
|
|
22
|
+
constructor(ctx: AgentContext);
|
|
23
|
+
prompt(text: string, attachments?: AgentAttachment[]): void;
|
|
24
|
+
respondPermission(requestId: string, decision: PermissionResponse): void;
|
|
25
|
+
/** See ClaudeAgent.releaseCoveredPending — same retroactive-release sweep. */
|
|
26
|
+
private releaseCoveredPending;
|
|
27
|
+
stop(): Promise<void>;
|
|
28
|
+
private run;
|
|
29
|
+
/** The approved side effect (real worktree write + done events). */
|
|
30
|
+
private performWrite;
|
|
31
|
+
}
|
|
@@ -0,0 +1,155 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* MockAgent — a scripted agent for local/emulator testing.
|
|
3
|
+
*
|
|
4
|
+
* It is NOT a stub: it drives the real permission gate, writes a real file into
|
|
5
|
+
* the real git worktree (so `diff.get` returns genuine hunks), and emits every
|
|
6
|
+
* event type the UI must render. What it does NOT do is call a model or spend
|
|
7
|
+
* credits — the prompt text just chooses a canned script.
|
|
8
|
+
*
|
|
9
|
+
* Flow per prompt:
|
|
10
|
+
* assistant ("on it") → tool_use (Write) → permission_request → [phone] →
|
|
11
|
+
* allow: write file, assistant ("done"), done
|
|
12
|
+
* deny : assistant ("ok, skipped"), done
|
|
13
|
+
*/
|
|
14
|
+
import { randomUUID } from "node:crypto";
|
|
15
|
+
import { writeFile } from "node:fs/promises";
|
|
16
|
+
import { join } from "node:path";
|
|
17
|
+
import { BaseAgent } from "./agent.js";
|
|
18
|
+
import { PermissionGate } from "../permission-gate.js";
|
|
19
|
+
export class MockAgent extends BaseAgent {
|
|
20
|
+
ctx;
|
|
21
|
+
gate = new PermissionGate(120_000);
|
|
22
|
+
/** Live gated calls (see ClaudeAgent) so `allow_all` can derive a rule. */
|
|
23
|
+
pendingCalls = new Map();
|
|
24
|
+
sessionId = randomUUID();
|
|
25
|
+
turn = 0;
|
|
26
|
+
constructor(ctx) {
|
|
27
|
+
super();
|
|
28
|
+
this.ctx = ctx;
|
|
29
|
+
// Surface a session id immediately, like the real init message does.
|
|
30
|
+
queueMicrotask(() => this.emitEvent({ kind: "session", sessionId: this.sessionId }));
|
|
31
|
+
}
|
|
32
|
+
prompt(text, attachments) {
|
|
33
|
+
// The mock doesn't call a model, so attachments only decorate the echoed
|
|
34
|
+
// prompt — enough to prove the plumbing carried them end to end.
|
|
35
|
+
const note = attachments && attachments.length > 0
|
|
36
|
+
? `${text} [${attachments.length} attachment(s): ${attachments.map((a) => a.name).join(", ")}]`
|
|
37
|
+
: text;
|
|
38
|
+
void this.run(note);
|
|
39
|
+
}
|
|
40
|
+
respondPermission(requestId, decision) {
|
|
41
|
+
if (decision === "allow_all") {
|
|
42
|
+
const call = this.pendingCalls.get(requestId);
|
|
43
|
+
if (call && this.ctx.allowlist) {
|
|
44
|
+
void this.ctx.allowlist
|
|
45
|
+
.allowFromCall(call.tool, call.input, this.ctx.worktreePath, this.ctx.workspaceId)
|
|
46
|
+
.catch(() => { });
|
|
47
|
+
}
|
|
48
|
+
this.pendingCalls.delete(requestId);
|
|
49
|
+
this.gate.resolve(requestId, "allow");
|
|
50
|
+
// Mirror ClaudeAgent: a new rule retroactively releases matching pending
|
|
51
|
+
// calls (see claude.ts releaseCoveredPending).
|
|
52
|
+
this.releaseCoveredPending();
|
|
53
|
+
return;
|
|
54
|
+
}
|
|
55
|
+
this.pendingCalls.delete(requestId);
|
|
56
|
+
this.gate.resolve(requestId, decision);
|
|
57
|
+
}
|
|
58
|
+
/** See ClaudeAgent.releaseCoveredPending — same retroactive-release sweep. */
|
|
59
|
+
releaseCoveredPending() {
|
|
60
|
+
const allowlist = this.ctx.allowlist;
|
|
61
|
+
if (!allowlist)
|
|
62
|
+
return;
|
|
63
|
+
for (const [reqId, call] of [...this.pendingCalls]) {
|
|
64
|
+
if (!allowlist.isAllowed(call.tool, call.input, this.ctx.worktreePath))
|
|
65
|
+
continue;
|
|
66
|
+
this.pendingCalls.delete(reqId);
|
|
67
|
+
this.gate.resolve(reqId, "allow");
|
|
68
|
+
this.emitEvent({ kind: "permission_resolved", requestId: reqId, decision: "allow" });
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
async stop() {
|
|
72
|
+
this.pendingCalls.clear();
|
|
73
|
+
this.gate.denyAll();
|
|
74
|
+
}
|
|
75
|
+
async run(promptText) {
|
|
76
|
+
this.turn += 1;
|
|
77
|
+
// QA hook: a prompt that starts with "/limit" simulates a usage limit
|
|
78
|
+
// resetting ~5 minutes out, so the restart-job flow can be exercised without
|
|
79
|
+
// waiting on a real plan limit. Matched as a leading command so a normal
|
|
80
|
+
// prompt merely mentioning "/limit" isn't hijacked.
|
|
81
|
+
if (promptText.trim().startsWith("/limit")) {
|
|
82
|
+
this.emitEvent({ kind: "status", status: "running" });
|
|
83
|
+
await delay(200);
|
|
84
|
+
this.emitEvent({
|
|
85
|
+
kind: "limit",
|
|
86
|
+
message: "Claude AI usage limit reached (simulated)",
|
|
87
|
+
resetAt: Date.now() + 5 * 60 * 1000,
|
|
88
|
+
});
|
|
89
|
+
this.emitEvent({ kind: "status", status: "error" });
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
const fileName = `mock-${this.turn}.txt`;
|
|
93
|
+
const filePath = join(this.ctx.worktreePath, fileName);
|
|
94
|
+
const contents = `Created by MockAgent for prompt:\n${promptText}\n`;
|
|
95
|
+
this.emitEvent({ kind: "status", status: "running" });
|
|
96
|
+
await delay(300);
|
|
97
|
+
this.emitEvent({
|
|
98
|
+
kind: "assistant",
|
|
99
|
+
text: `On it — I'll create \`${fileName}\` in the worktree.`,
|
|
100
|
+
});
|
|
101
|
+
await delay(300);
|
|
102
|
+
const input = { file_path: filePath };
|
|
103
|
+
const inputSummary = `Write ${fileName} (${contents.length} bytes)`;
|
|
104
|
+
this.emitEvent({ kind: "tool_use", tool: "Write", inputSummary });
|
|
105
|
+
// A prior "Allow all" for this folder auto-approves without a round-trip.
|
|
106
|
+
if (this.ctx.allowlist?.isAllowed("Write", input, this.ctx.worktreePath)) {
|
|
107
|
+
await this.performWrite(filePath, contents, fileName);
|
|
108
|
+
return;
|
|
109
|
+
}
|
|
110
|
+
// Defer the write behind the phone, exactly like a real PreToolUse gate.
|
|
111
|
+
const requestId = randomUUID();
|
|
112
|
+
this.pendingCalls.set(requestId, { tool: "Write", input });
|
|
113
|
+
this.emitEvent({ kind: "status", status: "awaiting_permission" });
|
|
114
|
+
this.emitEvent({ kind: "permission", requestId, tool: "Write", inputSummary });
|
|
115
|
+
const decision = await this.gate.wait(requestId);
|
|
116
|
+
this.pendingCalls.delete(requestId);
|
|
117
|
+
if (decision === "deny") {
|
|
118
|
+
this.emitEvent({ kind: "status", status: "running" });
|
|
119
|
+
await delay(200);
|
|
120
|
+
this.emitEvent({
|
|
121
|
+
kind: "assistant",
|
|
122
|
+
text: `Understood — I won't create \`${fileName}\`.`,
|
|
123
|
+
});
|
|
124
|
+
this.emitEvent({ kind: "done", summary: "skipped (denied)", usage: MOCK_USAGE });
|
|
125
|
+
this.emitEvent({ kind: "status", status: "done" });
|
|
126
|
+
return;
|
|
127
|
+
}
|
|
128
|
+
// Approved: perform the real side effect so the diff is genuine.
|
|
129
|
+
await this.performWrite(filePath, contents, fileName);
|
|
130
|
+
}
|
|
131
|
+
/** The approved side effect (real worktree write + done events). */
|
|
132
|
+
async performWrite(filePath, contents, fileName) {
|
|
133
|
+
this.emitEvent({ kind: "status", status: "running" });
|
|
134
|
+
await writeFile(filePath, contents, "utf8");
|
|
135
|
+
await delay(200);
|
|
136
|
+
this.emitEvent({
|
|
137
|
+
kind: "assistant",
|
|
138
|
+
text: `Done. Wrote \`${fileName}\`. Check the Codebase pane for the diff.`,
|
|
139
|
+
});
|
|
140
|
+
this.emitEvent({ kind: "done", summary: `wrote ${fileName}`, usage: MOCK_USAGE });
|
|
141
|
+
this.emitEvent({ kind: "status", status: "done" });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/** Fixed sample usage so the "✓ done" cost line is exercisable under AGENT_MODE=mock. */
|
|
145
|
+
const MOCK_USAGE = {
|
|
146
|
+
inputTokens: 1840,
|
|
147
|
+
outputTokens: 1120,
|
|
148
|
+
cacheReadTokens: 10450,
|
|
149
|
+
cacheCreationTokens: 0,
|
|
150
|
+
costUsd: 0.0412,
|
|
151
|
+
};
|
|
152
|
+
function delay(ms) {
|
|
153
|
+
return new Promise((r) => setTimeout(r, ms));
|
|
154
|
+
}
|
|
155
|
+
//# sourceMappingURL=mock.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock.js","sourceRoot":"","sources":["../../../src/agent/mock.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classify a model-backend failure into a small, stable set of classes so the
|
|
3
|
+
* Logs pane can say *why* a call failed, not just "error". Deterministic and
|
|
4
|
+
* first-match-wins over the error's message + any numeric status, so it unit
|
|
5
|
+
* tests against canned strings without touching the network.
|
|
6
|
+
*/
|
|
7
|
+
export type ModelErrorClass = "auth" | "rate_limit" | "timeout" | "network" | "unknown";
|
|
8
|
+
export declare function classifyModelError(err: unknown): ModelErrorClass;
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Classify a model-backend failure into a small, stable set of classes so the
|
|
3
|
+
* Logs pane can say *why* a call failed, not just "error". Deterministic and
|
|
4
|
+
* first-match-wins over the error's message + any numeric status, so it unit
|
|
5
|
+
* tests against canned strings without touching the network.
|
|
6
|
+
*/
|
|
7
|
+
export function classifyModelError(err) {
|
|
8
|
+
const status = err && typeof err === "object" && "status" in err
|
|
9
|
+
? String(err.status)
|
|
10
|
+
: "";
|
|
11
|
+
const msg = (err instanceof Error ? err.message : String(err ?? "")).toLowerCase();
|
|
12
|
+
const hay = `${status} ${msg}`;
|
|
13
|
+
if (/\b401\b|\b403\b|unauthor|authentication|invalid api key|permission denied/.test(hay)) {
|
|
14
|
+
return "auth";
|
|
15
|
+
}
|
|
16
|
+
if (/\b429\b|\b529\b|rate.?limit|overloaded/.test(hay))
|
|
17
|
+
return "rate_limit";
|
|
18
|
+
if (/etimedout|timed out|\btimeout\b/.test(hay))
|
|
19
|
+
return "timeout";
|
|
20
|
+
if (/econnrefused|enotfound|eai_again|econnreset|fetch failed|network|socket hang up|dns/.test(hay)) {
|
|
21
|
+
return "network";
|
|
22
|
+
}
|
|
23
|
+
return "unknown";
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=model-error.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"model-error.js","sourceRoot":"","sources":["../../../src/agent/model-error.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AASH,MAAM,UAAU,kBAAkB,CAAC,GAAY;IAC7C,MAAM,MAAM,GACV,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,QAAQ,IAAI,GAAG;QAC/C,CAAC,CAAC,MAAM,CAAE,GAA2B,CAAC,MAAM,CAAC;QAC7C,CAAC,CAAC,EAAE,CAAC;IACT,MAAM,GAAG,GAAG,CAAC,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,CAAC,WAAW,EAAE,CAAC;IACnF,MAAM,GAAG,GAAG,GAAG,MAAM,IAAI,GAAG,EAAE,CAAC;IAE/B,IAAI,2EAA2E,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1F,OAAO,MAAM,CAAC;IAChB,CAAC;IACD,IAAI,wCAAwC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,YAAY,CAAC;IAC5E,IAAI,iCAAiC,CAAC,IAAI,CAAC,GAAG,CAAC;QAAE,OAAO,SAAS,CAAC;IAClE,IAAI,qFAAqF,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACpG,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC"}
|