@post-print/agent-harness 0.3.4 → 0.3.6
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/README.md +64 -16
- package/dist/adapters/index.d.ts +9 -1
- package/dist/adapters/index.d.ts.map +1 -1
- package/dist/adapters/index.js +88 -6
- package/dist/adapters/index.js.map +1 -1
- package/dist/auth-mode.d.ts +22 -0
- package/dist/auth-mode.d.ts.map +1 -0
- package/dist/auth-mode.js +36 -0
- package/dist/auth-mode.js.map +1 -0
- package/dist/capture.d.ts +0 -2
- package/dist/capture.d.ts.map +1 -1
- package/dist/capture.js +12 -66
- package/dist/capture.js.map +1 -1
- package/dist/classifier.d.ts +13 -0
- package/dist/classifier.d.ts.map +1 -0
- package/dist/classifier.js +91 -0
- package/dist/classifier.js.map +1 -0
- package/dist/claude-run.d.ts +15 -1
- package/dist/claude-run.d.ts.map +1 -1
- package/dist/claude-run.js +54 -8
- package/dist/claude-run.js.map +1 -1
- package/dist/context.d.ts +3 -2
- package/dist/context.d.ts.map +1 -1
- package/dist/context.js +27 -9
- package/dist/context.js.map +1 -1
- package/dist/conversation.d.ts +28 -0
- package/dist/conversation.d.ts.map +1 -0
- package/dist/conversation.js +191 -0
- package/dist/conversation.js.map +1 -0
- package/dist/cursor-run.d.ts +17 -1
- package/dist/cursor-run.d.ts.map +1 -1
- package/dist/cursor-run.js +152 -101
- package/dist/cursor-run.js.map +1 -1
- package/dist/host-registry.d.ts +12 -0
- package/dist/host-registry.d.ts.map +1 -0
- package/dist/host-registry.js +39 -0
- package/dist/host-registry.js.map +1 -0
- package/dist/index.d.ts +19 -7
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +28 -7
- package/dist/index.js.map +1 -1
- package/dist/judge.d.ts +30 -1
- package/dist/judge.d.ts.map +1 -1
- package/dist/judge.js +137 -17
- package/dist/judge.js.map +1 -1
- package/dist/live-agent-event.d.ts +17 -0
- package/dist/live-agent-event.d.ts.map +1 -0
- package/dist/live-agent-event.js +31 -0
- package/dist/live-agent-event.js.map +1 -0
- package/dist/main.d.ts +1 -1
- package/dist/main.d.ts.map +1 -1
- package/dist/main.js +1 -1
- package/dist/main.js.map +1 -1
- package/dist/openai-capture.d.ts +43 -0
- package/dist/openai-capture.d.ts.map +1 -0
- package/dist/openai-capture.js +164 -0
- package/dist/openai-capture.js.map +1 -0
- package/dist/openai-run.d.ts +70 -0
- package/dist/openai-run.d.ts.map +1 -0
- package/dist/openai-run.js +373 -0
- package/dist/openai-run.js.map +1 -0
- package/dist/sealed-workspace.d.ts +37 -0
- package/dist/sealed-workspace.d.ts.map +1 -0
- package/dist/sealed-workspace.js +170 -0
- package/dist/sealed-workspace.js.map +1 -0
- package/dist/skills-context.d.ts +26 -7
- package/dist/skills-context.d.ts.map +1 -1
- package/dist/skills-context.js +105 -40
- package/dist/skills-context.js.map +1 -1
- package/dist/types.d.ts +44 -2
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +13 -1
- package/dist/types.js.map +1 -1
- package/dist/user-simulator.d.ts +10 -0
- package/dist/user-simulator.d.ts.map +1 -0
- package/dist/user-simulator.js +47 -0
- package/dist/user-simulator.js.map +1 -0
- package/dist/user-skills.d.ts +17 -0
- package/dist/user-skills.d.ts.map +1 -0
- package/dist/user-skills.js +32 -0
- package/dist/user-skills.js.map +1 -0
- package/dist/working-tree-guard.d.ts +5 -0
- package/dist/working-tree-guard.d.ts.map +1 -1
- package/dist/working-tree-guard.js +27 -3
- package/dist/working-tree-guard.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1,373 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { access } from "node:fs/promises";
|
|
3
|
+
import { createInterface } from "node:readline";
|
|
4
|
+
import { resolveKeyOrLoginAuthMode } from "./auth-mode.js";
|
|
5
|
+
import { createLiveNotifyState, emitLiveAgentEvents } from "./live-agent-event.js";
|
|
6
|
+
import { resolveMcpServers } from "./mcp.js";
|
|
7
|
+
import { accumulateOpenaiEvent, createOpenaiTraceAccumulator, finalizeOpenaiTraceAccumulator, lastAssistantText, parseOpenaiJsonlLine, } from "./openai-capture.js";
|
|
8
|
+
import { AgentRunTimeoutError, getPartialTrace, isUserInputTool, UserInputRequiredError, withRunTimeout, } from "./run-guards.js";
|
|
9
|
+
import { openaiUserConfigArgs } from "./user-skills.js";
|
|
10
|
+
export const OPENAI_AUTH_MODE_ENV = "OPENAI_AUTH_MODE";
|
|
11
|
+
export const OPENAI_MISSING_KEY_MESSAGE = "OPENAI_API_KEY or CODEX_API_KEY required for OpenAI agent runs, or set OPENAI_AUTH_MODE=subscription after `codex login`";
|
|
12
|
+
export function resolveOpenaiAuthMode(raw = process.env[OPENAI_AUTH_MODE_ENV], apiKey) {
|
|
13
|
+
return resolveKeyOrLoginAuthMode({
|
|
14
|
+
envName: OPENAI_AUTH_MODE_ENV,
|
|
15
|
+
raw,
|
|
16
|
+
hasApiKey: Boolean((apiKey ?? process.env.OPENAI_API_KEY ?? process.env.CODEX_API_KEY)?.trim()),
|
|
17
|
+
missingKeyMessage: OPENAI_MISSING_KEY_MESSAGE,
|
|
18
|
+
});
|
|
19
|
+
}
|
|
20
|
+
let activeOpenaiRun;
|
|
21
|
+
let lastOpenaiRunTrace;
|
|
22
|
+
function stashTrace(acc) {
|
|
23
|
+
const trace = finalizeOpenaiTraceAccumulator(acc);
|
|
24
|
+
lastOpenaiRunTrace = trace;
|
|
25
|
+
return trace;
|
|
26
|
+
}
|
|
27
|
+
export function cancelActiveOpenaiRun() {
|
|
28
|
+
const active = activeOpenaiRun;
|
|
29
|
+
activeOpenaiRun = undefined;
|
|
30
|
+
if (!active) {
|
|
31
|
+
return;
|
|
32
|
+
}
|
|
33
|
+
active.abort.abort();
|
|
34
|
+
killOpenaiChild(active.child);
|
|
35
|
+
}
|
|
36
|
+
export function takeLastOpenaiRunTrace() {
|
|
37
|
+
const trace = lastOpenaiRunTrace;
|
|
38
|
+
lastOpenaiRunTrace = undefined;
|
|
39
|
+
return trace;
|
|
40
|
+
}
|
|
41
|
+
export function formatOpenaiRunFailure(options) {
|
|
42
|
+
const details = [];
|
|
43
|
+
if (options.rawStatus) {
|
|
44
|
+
details.push(`cli: ${options.rawStatus}`);
|
|
45
|
+
}
|
|
46
|
+
if (options.exitCode !== undefined && options.exitCode !== null) {
|
|
47
|
+
details.push(`exit: ${options.exitCode}`);
|
|
48
|
+
}
|
|
49
|
+
if (options.resultError) {
|
|
50
|
+
details.push(`error: ${options.resultError}`);
|
|
51
|
+
}
|
|
52
|
+
else if (options.stderr?.trim()) {
|
|
53
|
+
const compact = options.stderr.trim().replace(/\s+/g, " ").slice(0, 240);
|
|
54
|
+
details.push(`stderr: ${compact}`);
|
|
55
|
+
}
|
|
56
|
+
const suffix = details.length > 0 ? ` (${details.join(", ")})` : "";
|
|
57
|
+
return `openai run status: ${options.status}${suffix}`;
|
|
58
|
+
}
|
|
59
|
+
function destroyChildPipes(child) {
|
|
60
|
+
try {
|
|
61
|
+
child.stdout.destroy();
|
|
62
|
+
}
|
|
63
|
+
catch {
|
|
64
|
+
// best-effort
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
child.stderr.destroy();
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
// best-effort
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
function killOpenaiChild(child) {
|
|
74
|
+
destroyChildPipes(child);
|
|
75
|
+
try {
|
|
76
|
+
child.kill("SIGTERM");
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
// best-effort
|
|
80
|
+
}
|
|
81
|
+
const pid = child.pid;
|
|
82
|
+
if (pid === undefined || pid <= 0 || process.platform === "win32") {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
try {
|
|
86
|
+
process.kill(-pid, "SIGTERM");
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
// best-effort
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
async function pathExists(path) {
|
|
93
|
+
try {
|
|
94
|
+
await access(path);
|
|
95
|
+
return true;
|
|
96
|
+
}
|
|
97
|
+
catch {
|
|
98
|
+
return false;
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
export async function resolveOpenaiBin(override) {
|
|
102
|
+
const candidate = override?.trim() || process.env.CODEX_BIN?.trim() || "codex";
|
|
103
|
+
if (candidate.includes("/") || candidate.includes("\\")) {
|
|
104
|
+
if (!(await pathExists(candidate))) {
|
|
105
|
+
throw new Error(`OpenAI Codex binary not found at ${candidate}`);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
return candidate;
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* Child env for the Codex CLI. Subscription mode drops API keys:
|
|
112
|
+
* the CLI prefers a key over the `codex login` ChatGPT session.
|
|
113
|
+
*/
|
|
114
|
+
export function buildOpenaiEnv(authMode, apiKey) {
|
|
115
|
+
if (authMode === "api-key") {
|
|
116
|
+
const key = apiKey ?? process.env.OPENAI_API_KEY ?? process.env.CODEX_API_KEY;
|
|
117
|
+
if (!key) {
|
|
118
|
+
return { ...process.env };
|
|
119
|
+
}
|
|
120
|
+
return { ...process.env, OPENAI_API_KEY: key, CODEX_API_KEY: key };
|
|
121
|
+
}
|
|
122
|
+
const env = { ...process.env };
|
|
123
|
+
delete env.OPENAI_API_KEY;
|
|
124
|
+
delete env.CODEX_API_KEY;
|
|
125
|
+
return env;
|
|
126
|
+
}
|
|
127
|
+
export function tomlString(value) {
|
|
128
|
+
return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
129
|
+
}
|
|
130
|
+
/** One `-c mcp_servers.name={…}` override for `codex exec`. */
|
|
131
|
+
export function buildOpenaiMcpOverride(name, config) {
|
|
132
|
+
if (!/^[A-Za-z][A-Za-z0-9_]*$/.test(name)) {
|
|
133
|
+
throw new Error(`OpenAI MCP server name must be a TOML key: ${name}`);
|
|
134
|
+
}
|
|
135
|
+
if ("command" in config && config.command) {
|
|
136
|
+
const parts = [`command=${tomlString(config.command)}`];
|
|
137
|
+
if (config.args && config.args.length > 0) {
|
|
138
|
+
parts.push(`args=[${config.args.map((arg) => tomlString(arg)).join(",")}]`);
|
|
139
|
+
}
|
|
140
|
+
if (config.cwd) {
|
|
141
|
+
parts.push(`cwd=${tomlString(config.cwd)}`);
|
|
142
|
+
}
|
|
143
|
+
if (config.env && Object.keys(config.env).length > 0) {
|
|
144
|
+
const env = Object.entries(config.env)
|
|
145
|
+
.map(([key, value]) => `${key}=${tomlString(value)}`)
|
|
146
|
+
.join(",");
|
|
147
|
+
parts.push(`env={${env}}`);
|
|
148
|
+
}
|
|
149
|
+
// Codex 0.154+ rejects MCP calls when approval_policy=never unless
|
|
150
|
+
// the server auto-approves tools.
|
|
151
|
+
parts.push('default_tools_approval_mode="approve"');
|
|
152
|
+
return `mcp_servers.${name}={${parts.join(",")}}`;
|
|
153
|
+
}
|
|
154
|
+
if ("url" in config && config.url) {
|
|
155
|
+
return `mcp_servers.${name}={url=${tomlString(config.url)},default_tools_approval_mode="approve"}`;
|
|
156
|
+
}
|
|
157
|
+
throw new Error(`OpenAI MCP server "${name}" needs a command or url`);
|
|
158
|
+
}
|
|
159
|
+
export function buildOpenaiMcpConfigArgs(servers) {
|
|
160
|
+
if (!servers || Object.keys(servers).length === 0) {
|
|
161
|
+
return [];
|
|
162
|
+
}
|
|
163
|
+
const args = [];
|
|
164
|
+
for (const [name, config] of Object.entries(servers)) {
|
|
165
|
+
args.push("-c", buildOpenaiMcpOverride(name, config));
|
|
166
|
+
}
|
|
167
|
+
return args;
|
|
168
|
+
}
|
|
169
|
+
export function buildOpenaiExecArgs(options) {
|
|
170
|
+
const sandbox = options.sandbox ?? "workspace-write";
|
|
171
|
+
const args = [
|
|
172
|
+
"exec",
|
|
173
|
+
"--json",
|
|
174
|
+
"--sandbox",
|
|
175
|
+
sandbox,
|
|
176
|
+
"--cd",
|
|
177
|
+
options.cwd,
|
|
178
|
+
// Deny keeps ~/.codex/config.toml out. Auth still uses CODEX_HOME.
|
|
179
|
+
// A user model pin (for example gpt-5.6-luna) can fail older Codex CLIs.
|
|
180
|
+
...openaiUserConfigArgs(options.allowUserSkills === true),
|
|
181
|
+
// Headless default is never. Set it explicitly so a leftover config
|
|
182
|
+
// cannot prompt, and so we do not need --approve-for-me (Codex >= 0.147).
|
|
183
|
+
"-c",
|
|
184
|
+
"approval_policy=never",
|
|
185
|
+
];
|
|
186
|
+
args.push(...buildOpenaiMcpConfigArgs(options.mcpServers));
|
|
187
|
+
const model = options.model?.trim() ||
|
|
188
|
+
process.env.CODEX_AGENT_MODEL?.trim() ||
|
|
189
|
+
process.env.OPENAI_AGENT_MODEL?.trim();
|
|
190
|
+
if (model) {
|
|
191
|
+
args.push("--model", model);
|
|
192
|
+
}
|
|
193
|
+
args.push(options.prompt);
|
|
194
|
+
return args;
|
|
195
|
+
}
|
|
196
|
+
async function drainJsonl(child, acc, failOnUserInput, signal, onAgentEvent) {
|
|
197
|
+
const liveState = createLiveNotifyState();
|
|
198
|
+
const stderrChunks = [];
|
|
199
|
+
child.stderr.setEncoding("utf8");
|
|
200
|
+
child.stderr.on("data", (chunk) => {
|
|
201
|
+
stderrChunks.push(chunk);
|
|
202
|
+
});
|
|
203
|
+
const spawnError = new Promise((_, reject) => {
|
|
204
|
+
child.once("error", reject);
|
|
205
|
+
});
|
|
206
|
+
const aborted = new Promise((_, reject) => {
|
|
207
|
+
const fail = () => {
|
|
208
|
+
destroyChildPipes(child);
|
|
209
|
+
reject(new AgentRunTimeoutError(0));
|
|
210
|
+
};
|
|
211
|
+
if (signal.aborted) {
|
|
212
|
+
fail();
|
|
213
|
+
return;
|
|
214
|
+
}
|
|
215
|
+
signal.addEventListener("abort", fail, { once: true });
|
|
216
|
+
});
|
|
217
|
+
const readStdout = async () => {
|
|
218
|
+
const rl = createInterface({ input: child.stdout, crlfDelay: Number.POSITIVE_INFINITY });
|
|
219
|
+
try {
|
|
220
|
+
for await (const line of rl) {
|
|
221
|
+
if (signal.aborted) {
|
|
222
|
+
break;
|
|
223
|
+
}
|
|
224
|
+
const event = parseOpenaiJsonlLine(line);
|
|
225
|
+
if (!event) {
|
|
226
|
+
continue;
|
|
227
|
+
}
|
|
228
|
+
accumulateOpenaiEvent(acc, event);
|
|
229
|
+
emitLiveAgentEvents(acc, liveState, onAgentEvent);
|
|
230
|
+
stashTrace(acc);
|
|
231
|
+
const lastTool = acc.toolCalls.at(-1);
|
|
232
|
+
if (lastTool && isUserInputTool(lastTool.name)) {
|
|
233
|
+
if (failOnUserInput) {
|
|
234
|
+
const userInputError = new UserInputRequiredError(lastTool.name);
|
|
235
|
+
userInputError.trace = stashTrace(acc);
|
|
236
|
+
killOpenaiChild(child);
|
|
237
|
+
throw userInputError;
|
|
238
|
+
}
|
|
239
|
+
killOpenaiChild(child);
|
|
240
|
+
break;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
finally {
|
|
245
|
+
rl.close();
|
|
246
|
+
}
|
|
247
|
+
};
|
|
248
|
+
const waitClose = new Promise((resolve) => {
|
|
249
|
+
child.once("close", (code) => resolve(code));
|
|
250
|
+
});
|
|
251
|
+
try {
|
|
252
|
+
const settled = await Promise.race([
|
|
253
|
+
spawnError,
|
|
254
|
+
aborted,
|
|
255
|
+
Promise.all([readStdout(), waitClose]).then(([, exitCode]) => ({ exitCode })),
|
|
256
|
+
]);
|
|
257
|
+
return { exitCode: settled.exitCode, stderr: stderrChunks.join("") };
|
|
258
|
+
}
|
|
259
|
+
catch (error) {
|
|
260
|
+
killOpenaiChild(child);
|
|
261
|
+
throw error;
|
|
262
|
+
}
|
|
263
|
+
}
|
|
264
|
+
/** Shared Codex CLI path — `codex exec --json` → AgentTrace. */
|
|
265
|
+
export async function runOpenaiAgent(options) {
|
|
266
|
+
const authMode = options.authMode ?? resolveOpenaiAuthMode(undefined, options.apiKey);
|
|
267
|
+
const apiKey = options.apiKey ?? process.env.OPENAI_API_KEY ?? process.env.CODEX_API_KEY;
|
|
268
|
+
if (authMode === "api-key" && !apiKey?.trim()) {
|
|
269
|
+
throw new Error(OPENAI_MISSING_KEY_MESSAGE);
|
|
270
|
+
}
|
|
271
|
+
const bin = await resolveOpenaiBin(options.bin);
|
|
272
|
+
let timedOut = false;
|
|
273
|
+
const args = buildOpenaiExecArgs({
|
|
274
|
+
prompt: options.prompt,
|
|
275
|
+
cwd: options.cwd,
|
|
276
|
+
model: options.model,
|
|
277
|
+
sandbox: options.sandbox,
|
|
278
|
+
mcpServers: resolveMcpServers(options.mcpServers, { cwd: options.cwd }),
|
|
279
|
+
allowUserSkills: options.allowUserSkills === true,
|
|
280
|
+
});
|
|
281
|
+
const execute = async () => {
|
|
282
|
+
const acc = createOpenaiTraceAccumulator();
|
|
283
|
+
const abort = new AbortController();
|
|
284
|
+
const child = spawn(bin, args, {
|
|
285
|
+
cwd: options.cwd,
|
|
286
|
+
env: buildOpenaiEnv(authMode, options.apiKey),
|
|
287
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
288
|
+
detached: process.platform !== "win32",
|
|
289
|
+
});
|
|
290
|
+
activeOpenaiRun = { child, acc, abort };
|
|
291
|
+
if (timedOut) {
|
|
292
|
+
abort.abort();
|
|
293
|
+
killOpenaiChild(child);
|
|
294
|
+
activeOpenaiRun = undefined;
|
|
295
|
+
const timeoutError = new AgentRunTimeoutError(options.timeoutMs ?? 0);
|
|
296
|
+
timeoutError.trace = stashTrace(acc);
|
|
297
|
+
throw timeoutError;
|
|
298
|
+
}
|
|
299
|
+
try {
|
|
300
|
+
const { exitCode, stderr } = await drainJsonl(child, acc, options.failOnUserInput !== false, abort.signal, options.onAgentEvent);
|
|
301
|
+
const trace = stashTrace(acc);
|
|
302
|
+
const rawStatus = acc.rawStatus ?? (exitCode === 0 ? "success" : "error");
|
|
303
|
+
const failed = (exitCode !== null && exitCode !== 0) || rawStatus === "error" || Boolean(acc.resultError);
|
|
304
|
+
return {
|
|
305
|
+
status: failed ? "failed" : "completed",
|
|
306
|
+
trace,
|
|
307
|
+
rawStatus,
|
|
308
|
+
exitCode,
|
|
309
|
+
stderr: stderr || undefined,
|
|
310
|
+
};
|
|
311
|
+
}
|
|
312
|
+
catch (error) {
|
|
313
|
+
abort.abort();
|
|
314
|
+
killOpenaiChild(child);
|
|
315
|
+
const partial = stashTrace(acc);
|
|
316
|
+
if (error instanceof AgentRunTimeoutError || error instanceof UserInputRequiredError) {
|
|
317
|
+
error.trace = error.trace ?? partial;
|
|
318
|
+
throw error;
|
|
319
|
+
}
|
|
320
|
+
if (error && typeof error === "object" && "code" in error) {
|
|
321
|
+
const code = error.code;
|
|
322
|
+
if (code === "ENOENT") {
|
|
323
|
+
throw new Error(`OpenAI Codex binary not found (${bin}). Install the Codex CLI or set CODEX_BIN.`);
|
|
324
|
+
}
|
|
325
|
+
}
|
|
326
|
+
throw error;
|
|
327
|
+
}
|
|
328
|
+
finally {
|
|
329
|
+
if (activeOpenaiRun?.child === child) {
|
|
330
|
+
activeOpenaiRun = undefined;
|
|
331
|
+
}
|
|
332
|
+
}
|
|
333
|
+
};
|
|
334
|
+
if (options.timeoutMs && options.timeoutMs > 0) {
|
|
335
|
+
await options.onDeadlineStart?.();
|
|
336
|
+
try {
|
|
337
|
+
return await withRunTimeout(execute, options.timeoutMs, {
|
|
338
|
+
onTimeout: () => {
|
|
339
|
+
timedOut = true;
|
|
340
|
+
cancelActiveOpenaiRun();
|
|
341
|
+
},
|
|
342
|
+
});
|
|
343
|
+
}
|
|
344
|
+
catch (error) {
|
|
345
|
+
if (error instanceof AgentRunTimeoutError) {
|
|
346
|
+
error.trace = error.trace ?? takeLastOpenaiRunTrace() ?? getPartialTrace(error);
|
|
347
|
+
}
|
|
348
|
+
throw error;
|
|
349
|
+
}
|
|
350
|
+
}
|
|
351
|
+
return execute();
|
|
352
|
+
}
|
|
353
|
+
/** Classifier-only Codex path — read-only sandbox, last assistant text. */
|
|
354
|
+
export async function runOpenaiClassifier(options) {
|
|
355
|
+
const result = await runOpenaiAgent({
|
|
356
|
+
cwd: options.cwd,
|
|
357
|
+
prompt: options.prompt,
|
|
358
|
+
apiKey: options.apiKey,
|
|
359
|
+
bin: options.bin,
|
|
360
|
+
sandbox: "read-only",
|
|
361
|
+
failOnUserInput: true,
|
|
362
|
+
});
|
|
363
|
+
return {
|
|
364
|
+
status: result.status,
|
|
365
|
+
text: lastAssistantText(result.trace),
|
|
366
|
+
rawStatus: result.rawStatus,
|
|
367
|
+
sdkError: result.trace.artifacts.openaiResultError
|
|
368
|
+
? { message: result.trace.artifacts.openaiResultError }
|
|
369
|
+
: undefined,
|
|
370
|
+
usage: result.trace.usage,
|
|
371
|
+
};
|
|
372
|
+
}
|
|
373
|
+
//# sourceMappingURL=openai-run.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"openai-run.js","sourceRoot":"","sources":["../src/openai-run.ts"],"names":[],"mappings":"AAAA,OAAO,EAAqB,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC1C,OAAO,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAGhD,OAAO,EAAqB,yBAAyB,EAAE,MAAM,gBAAgB,CAAC;AAE9E,OAAO,EAAE,qBAAqB,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,EAAwB,iBAAiB,EAAE,MAAM,UAAU,CAAC;AACnE,OAAO,EACN,qBAAqB,EACrB,4BAA4B,EAC5B,8BAA8B,EAC9B,iBAAiB,EAEjB,oBAAoB,GACpB,MAAM,qBAAqB,CAAC;AAC7B,OAAO,EACN,oBAAoB,EACpB,eAAe,EACf,eAAe,EACf,sBAAsB,EACtB,cAAc,GACd,MAAM,iBAAiB,CAAC;AAEzB,OAAO,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AAIxD,MAAM,CAAC,MAAM,oBAAoB,GAAG,kBAAkB,CAAC;AAEvD,MAAM,CAAC,MAAM,0BAA0B,GACtC,0HAA0H,CAAC;AAE5H,MAAM,UAAU,qBAAqB,CACpC,GAAG,GAAuB,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,EAC3D,MAAe;IAEf,OAAO,yBAAyB,CAAC;QAChC,OAAO,EAAE,oBAAoB;QAC7B,GAAG;QACH,SAAS,EAAE,OAAO,CAAC,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC;QAC/F,iBAAiB,EAAE,0BAA0B;KAC7C,CAAC,CAAC;AACJ,CAAC;AAwCD,IAAI,eAA8C,CAAC;AACnD,IAAI,kBAA0C,CAAC;AAE/C,SAAS,UAAU,CAAC,GAA2B;IAC9C,MAAM,KAAK,GAAG,8BAA8B,CAAC,GAAG,CAAC,CAAC;IAClD,kBAAkB,GAAG,KAAK,CAAC;IAC3B,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,qBAAqB;IACpC,MAAM,MAAM,GAAG,eAAe,CAAC;IAC/B,eAAe,GAAG,SAAS,CAAC;IAC5B,IAAI,CAAC,MAAM,EAAE,CAAC;QACb,OAAO;IACR,CAAC;IACD,MAAM,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACrB,eAAe,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AAC/B,CAAC;AAED,MAAM,UAAU,sBAAsB;IACrC,MAAM,KAAK,GAAG,kBAAkB,CAAC;IACjC,kBAAkB,GAAG,SAAS,CAAC;IAC/B,OAAO,KAAK,CAAC;AACd,CAAC;AAED,MAAM,UAAU,sBAAsB,CAAC,OAMtC;IACA,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,IAAI,OAAO,CAAC,SAAS,EAAE,CAAC;QACvB,OAAO,CAAC,IAAI,CAAC,QAAQ,OAAO,CAAC,SAAS,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,CAAC,QAAQ,KAAK,SAAS,IAAI,OAAO,CAAC,QAAQ,KAAK,IAAI,EAAE,CAAC;QACjE,OAAO,CAAC,IAAI,CAAC,SAAS,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,IAAI,OAAO,CAAC,WAAW,EAAE,CAAC;QACzB,OAAO,CAAC,IAAI,CAAC,UAAU,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC/C,CAAC;SAAM,IAAI,OAAO,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QACnC,MAAM,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC;QACzE,OAAO,CAAC,IAAI,CAAC,WAAW,OAAO,EAAE,CAAC,CAAC;IACpC,CAAC;IACD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC;IACpE,OAAO,sBAAsB,OAAO,CAAC,MAAM,GAAG,MAAM,EAAE,CAAC;AACxD,CAAC;AAED,SAAS,iBAAiB,CAAC,KAAyB;IACnD,IAAI,CAAC;QACJ,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACR,cAAc;IACf,CAAC;IACD,IAAI,CAAC;QACJ,KAAK,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;IACxB,CAAC;IAAC,MAAM,CAAC;QACR,cAAc;IACf,CAAC;AACF,CAAC;AAED,SAAS,eAAe,CAAC,KAAyB;IACjD,iBAAiB,CAAC,KAAK,CAAC,CAAC;IACzB,IAAI,CAAC;QACJ,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;IACvB,CAAC;IAAC,MAAM,CAAC;QACR,cAAc;IACf,CAAC;IACD,MAAM,GAAG,GAAG,KAAK,CAAC,GAAG,CAAC;IACtB,IAAI,GAAG,KAAK,SAAS,IAAI,GAAG,IAAI,CAAC,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACnE,OAAO;IACR,CAAC;IACD,IAAI,CAAC;QACJ,OAAO,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;IAC/B,CAAC;IAAC,MAAM,CAAC;QACR,cAAc;IACf,CAAC;AACF,CAAC;AAED,KAAK,UAAU,UAAU,CAAC,IAAY;IACrC,IAAI,CAAC;QACJ,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QACnB,OAAO,IAAI,CAAC;IACb,CAAC;IAAC,MAAM,CAAC;QACR,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB,CAAC,QAAiB;IACvD,MAAM,SAAS,GAAG,QAAQ,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,IAAI,EAAE,IAAI,OAAO,CAAC;IAC/E,IAAI,SAAS,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACzD,IAAI,CAAC,CAAC,MAAM,UAAU,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;YACpC,MAAM,IAAI,KAAK,CAAC,oCAAoC,SAAS,EAAE,CAAC,CAAC;QAClE,CAAC;IACF,CAAC;IACD,OAAO,SAAS,CAAC;AAClB,CAAC;AAED;;;GAGG;AACH,MAAM,UAAU,cAAc,CAAC,QAAwB,EAAE,MAAe;IACvE,IAAI,QAAQ,KAAK,SAAS,EAAE,CAAC;QAC5B,MAAM,GAAG,GAAG,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;QAC9E,IAAI,CAAC,GAAG,EAAE,CAAC;YACV,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;QAC3B,CAAC;QACD,OAAO,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,cAAc,EAAE,GAAG,EAAE,aAAa,EAAE,GAAG,EAAE,CAAC;IACpE,CAAC;IACD,MAAM,GAAG,GAAG,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAC/B,OAAO,GAAG,CAAC,cAAc,CAAC;IAC1B,OAAO,GAAG,CAAC,aAAa,CAAC;IACzB,OAAO,GAAG,CAAC;AACZ,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,KAAa;IACvC,OAAO,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,GAAG,CAAC;AACjE,CAAC;AAED,+DAA+D;AAC/D,MAAM,UAAU,sBAAsB,CAAC,IAAY,EAAE,MAAuB;IAC3E,IAAI,CAAC,yBAAyB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC3C,MAAM,IAAI,KAAK,CAAC,8CAA8C,IAAI,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,IAAI,SAAS,IAAI,MAAM,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,CAAC,WAAW,UAAU,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;QACxD,IAAI,MAAM,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC3C,KAAK,CAAC,IAAI,CAAC,SAAS,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC7E,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;YAChB,KAAK,CAAC,IAAI,CAAC,OAAO,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;QAC7C,CAAC;QACD,IAAI,MAAM,CAAC,GAAG,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACtD,MAAM,GAAG,GAAG,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;iBACpC,GAAG,CAAC,CAAC,CAAC,GAAG,EAAE,KAAK,CAAC,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,UAAU,CAAC,KAAK,CAAC,EAAE,CAAC;iBACpD,IAAI,CAAC,GAAG,CAAC,CAAC;YACZ,KAAK,CAAC,IAAI,CAAC,QAAQ,GAAG,GAAG,CAAC,CAAC;QAC5B,CAAC;QACD,mEAAmE;QACnE,kCAAkC;QAClC,KAAK,CAAC,IAAI,CAAC,uCAAuC,CAAC,CAAC;QACpD,OAAO,eAAe,IAAI,KAAK,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC;IACnD,CAAC;IACD,IAAI,KAAK,IAAI,MAAM,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QACnC,OAAO,eAAe,IAAI,SAAS,UAAU,CAAC,MAAM,CAAC,GAAG,CAAC,yCAAyC,CAAC;IACpG,CAAC;IACD,MAAM,IAAI,KAAK,CAAC,sBAAsB,IAAI,0BAA0B,CAAC,CAAC;AACvE,CAAC;AAED,MAAM,UAAU,wBAAwB,CACvC,OAAoD;IAEpD,IAAI,CAAC,OAAO,IAAI,MAAM,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACnD,OAAO,EAAE,CAAC;IACX,CAAC;IACD,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,KAAK,MAAM,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC;QACtD,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,sBAAsB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,IAAI,CAAC;AACb,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAOnC;IACA,MAAM,OAAO,GAAG,OAAO,CAAC,OAAO,IAAI,iBAAiB,CAAC;IACrD,MAAM,IAAI,GAAG;QACZ,MAAM;QACN,QAAQ;QACR,WAAW;QACX,OAAO;QACP,MAAM;QACN,OAAO,CAAC,GAAG;QACX,mEAAmE;QACnE,yEAAyE;QACzE,GAAG,oBAAoB,CAAC,OAAO,CAAC,eAAe,KAAK,IAAI,CAAC;QACzD,oEAAoE;QACpE,0EAA0E;QAC1E,IAAI;QACJ,uBAAuB;KACvB,CAAC;IACF,IAAI,CAAC,IAAI,CAAC,GAAG,wBAAwB,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC,CAAC;IAC3D,MAAM,KAAK,GACV,OAAO,CAAC,KAAK,EAAE,IAAI,EAAE;QACrB,OAAO,CAAC,GAAG,CAAC,iBAAiB,EAAE,IAAI,EAAE;QACrC,OAAO,CAAC,GAAG,CAAC,kBAAkB,EAAE,IAAI,EAAE,CAAC;IACxC,IAAI,KAAK,EAAE,CAAC;QACX,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC7B,CAAC;IACD,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IAC1B,OAAO,IAAI,CAAC;AACb,CAAC;AAED,KAAK,UAAU,UAAU,CACxB,KAAyB,EACzB,GAA2B,EAC3B,eAAwB,EACxB,MAAmB,EACnB,YAA8C;IAE9C,MAAM,SAAS,GAAG,qBAAqB,EAAE,CAAC;IAC1C,MAAM,YAAY,GAAa,EAAE,CAAC;IAClC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;QACzC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC1B,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QACnD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,IAAI,OAAO,CAAQ,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE;QAChD,MAAM,IAAI,GAAG,GAAG,EAAE;YACjB,iBAAiB,CAAC,KAAK,CAAC,CAAC;YACzB,MAAM,CAAC,IAAI,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC;QACrC,CAAC,CAAC;QACF,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,IAAI,EAAE,CAAC;YACP,OAAO;QACR,CAAC;QACD,MAAM,CAAC,gBAAgB,CAAC,OAAO,EAAE,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;IACxD,CAAC,CAAC,CAAC;IAEH,MAAM,UAAU,GAAG,KAAK,IAAmB,EAAE;QAC5C,MAAM,EAAE,GAAG,eAAe,CAAC,EAAE,KAAK,EAAE,KAAK,CAAC,MAAM,EAAE,SAAS,EAAE,MAAM,CAAC,iBAAiB,EAAE,CAAC,CAAC;QACzF,IAAI,CAAC;YACJ,IAAI,KAAK,EAAE,MAAM,IAAI,IAAI,EAAE,EAAE,CAAC;gBAC7B,IAAI,MAAM,CAAC,OAAO,EAAE,CAAC;oBACpB,MAAM;gBACP,CAAC;gBACD,MAAM,KAAK,GAAG,oBAAoB,CAAC,IAAI,CAAC,CAAC;gBACzC,IAAI,CAAC,KAAK,EAAE,CAAC;oBACZ,SAAS;gBACV,CAAC;gBACD,qBAAqB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;gBAClC,mBAAmB,CAAC,GAAG,EAAE,SAAS,EAAE,YAAY,CAAC,CAAC;gBAClD,UAAU,CAAC,GAAG,CAAC,CAAC;gBAChB,MAAM,QAAQ,GAAG,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC;gBACtC,IAAI,QAAQ,IAAI,eAAe,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;oBAChD,IAAI,eAAe,EAAE,CAAC;wBACrB,MAAM,cAAc,GAAG,IAAI,sBAAsB,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;wBACjE,cAAc,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;wBACvC,eAAe,CAAC,KAAK,CAAC,CAAC;wBACvB,MAAM,cAAc,CAAC;oBACtB,CAAC;oBACD,eAAe,CAAC,KAAK,CAAC,CAAC;oBACvB,MAAM;gBACP,CAAC;YACF,CAAC;QACF,CAAC;gBAAS,CAAC;YACV,EAAE,CAAC,KAAK,EAAE,CAAC;QACZ,CAAC;IACF,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,EAAE;QACxD,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC;IAC9C,CAAC,CAAC,CAAC;IAEH,IAAI,CAAC;QACJ,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC;YAClC,UAAU;YACV,OAAO;YACP,OAAO,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC;SAC7E,CAAC,CAAC;QACH,OAAO,EAAE,QAAQ,EAAE,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;IACtE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAChB,eAAe,CAAC,KAAK,CAAC,CAAC;QACvB,MAAM,KAAK,CAAC;IACb,CAAC;AACF,CAAC;AAED,gEAAgE;AAChE,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,OAAyB;IAC7D,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,qBAAqB,CAAC,SAAS,EAAE,OAAO,CAAC,MAAM,CAAC,CAAC;IACtF,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC,GAAG,CAAC,cAAc,IAAI,OAAO,CAAC,GAAG,CAAC,aAAa,CAAC;IACzF,IAAI,QAAQ,KAAK,SAAS,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE,CAAC;QAC/C,MAAM,IAAI,KAAK,CAAC,0BAA0B,CAAC,CAAC;IAC7C,CAAC;IACD,MAAM,GAAG,GAAG,MAAM,gBAAgB,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAChD,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,MAAM,IAAI,GAAG,mBAAmB,CAAC;QAChC,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,KAAK,EAAE,OAAO,CAAC,KAAK;QACpB,OAAO,EAAE,OAAO,CAAC,OAAO;QACxB,UAAU,EAAE,iBAAiB,CAAC,OAAO,CAAC,UAAU,EAAE,EAAE,GAAG,EAAE,OAAO,CAAC,GAAG,EAAE,CAAC;QACvE,eAAe,EAAE,OAAO,CAAC,eAAe,KAAK,IAAI;KACjD,CAAC,CAAC;IAEH,MAAM,OAAO,GAAG,KAAK,IAA8B,EAAE;QACpD,MAAM,GAAG,GAAG,4BAA4B,EAAE,CAAC;QAC3C,MAAM,KAAK,GAAG,IAAI,eAAe,EAAE,CAAC;QACpC,MAAM,KAAK,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE;YAC9B,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,GAAG,EAAE,cAAc,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC;YAC7C,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;YACjC,QAAQ,EAAE,OAAO,CAAC,QAAQ,KAAK,OAAO;SACtC,CAAuB,CAAC;QAEzB,eAAe,GAAG,EAAE,KAAK,EAAE,GAAG,EAAE,KAAK,EAAE,CAAC;QACxC,IAAI,QAAQ,EAAE,CAAC;YACd,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,eAAe,CAAC,KAAK,CAAC,CAAC;YACvB,eAAe,GAAG,SAAS,CAAC;YAC5B,MAAM,YAAY,GAAG,IAAI,oBAAoB,CAAC,OAAO,CAAC,SAAS,IAAI,CAAC,CAAC,CAAC;YACtE,YAAY,CAAC,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YACrC,MAAM,YAAY,CAAC;QACpB,CAAC;QAED,IAAI,CAAC;YACJ,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,GAAG,MAAM,UAAU,CAC5C,KAAK,EACL,GAAG,EACH,OAAO,CAAC,eAAe,KAAK,KAAK,EACjC,KAAK,CAAC,MAAM,EACZ,OAAO,CAAC,YAAY,CACpB,CAAC;YACF,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAC9B,MAAM,SAAS,GAAG,GAAG,CAAC,SAAS,IAAI,CAAC,QAAQ,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;YAC1E,MAAM,MAAM,GACX,CAAC,QAAQ,KAAK,IAAI,IAAI,QAAQ,KAAK,CAAC,CAAC,IAAI,SAAS,KAAK,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;YAC5F,OAAO;gBACN,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,WAAW;gBACvC,KAAK;gBACL,SAAS;gBACT,QAAQ;gBACR,MAAM,EAAE,MAAM,IAAI,SAAS;aAC3B,CAAC;QACH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,KAAK,CAAC,KAAK,EAAE,CAAC;YACd,eAAe,CAAC,KAAK,CAAC,CAAC;YACvB,MAAM,OAAO,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;YAChC,IAAI,KAAK,YAAY,oBAAoB,IAAI,KAAK,YAAY,sBAAsB,EAAE,CAAC;gBACtF,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC;gBACrC,MAAM,KAAK,CAAC;YACb,CAAC;YACD,IAAI,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,MAAM,IAAI,KAAK,EAAE,CAAC;gBAC3D,MAAM,IAAI,GAAI,KAA+B,CAAC,IAAI,CAAC;gBACnD,IAAI,IAAI,KAAK,QAAQ,EAAE,CAAC;oBACvB,MAAM,IAAI,KAAK,CACd,kCAAkC,GAAG,4CAA4C,CACjF,CAAC;gBACH,CAAC;YACF,CAAC;YACD,MAAM,KAAK,CAAC;QACb,CAAC;gBAAS,CAAC;YACV,IAAI,eAAe,EAAE,KAAK,KAAK,KAAK,EAAE,CAAC;gBACtC,eAAe,GAAG,SAAS,CAAC;YAC7B,CAAC;QACF,CAAC;IACF,CAAC,CAAC;IAEF,IAAI,OAAO,CAAC,SAAS,IAAI,OAAO,CAAC,SAAS,GAAG,CAAC,EAAE,CAAC;QAChD,MAAM,OAAO,CAAC,eAAe,EAAE,EAAE,CAAC;QAClC,IAAI,CAAC;YACJ,OAAO,MAAM,cAAc,CAAC,OAAO,EAAE,OAAO,CAAC,SAAS,EAAE;gBACvD,SAAS,EAAE,GAAG,EAAE;oBACf,QAAQ,GAAG,IAAI,CAAC;oBAChB,qBAAqB,EAAE,CAAC;gBACzB,CAAC;aACD,CAAC,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAChB,IAAI,KAAK,YAAY,oBAAoB,EAAE,CAAC;gBAC3C,KAAK,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,sBAAsB,EAAE,IAAI,eAAe,CAAC,KAAK,CAAC,CAAC;YACjF,CAAC;YACD,MAAM,KAAK,CAAC;QACb,CAAC;IACF,CAAC;IAED,OAAO,OAAO,EAAE,CAAC;AAClB,CAAC;AAED,2EAA2E;AAC3E,MAAM,CAAC,KAAK,UAAU,mBAAmB,CAAC,OAKzC;IACA,MAAM,MAAM,GAAG,MAAM,cAAc,CAAC;QACnC,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,MAAM,EAAE,OAAO,CAAC,MAAM;QACtB,GAAG,EAAE,OAAO,CAAC,GAAG;QAChB,OAAO,EAAE,WAAW;QACpB,eAAe,EAAE,IAAI;KACrB,CAAC,CAAC;IACH,OAAO;QACN,MAAM,EAAE,MAAM,CAAC,MAAM;QACrB,IAAI,EAAE,iBAAiB,CAAC,MAAM,CAAC,KAAK,CAAC;QACrC,SAAS,EAAE,MAAM,CAAC,SAAS;QAC3B,QAAQ,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,iBAAiB;YACjD,CAAC,CAAC,EAAE,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,iBAAiB,EAAE;YACvD,CAAC,CAAC,SAAS;QACZ,KAAK,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK;KACzB,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import type { AgentTrace } from "./types.js";
|
|
2
|
+
export declare const SEALED_WORKSPACE_DIR_PREFIX = "agent-harness-seal-";
|
|
3
|
+
export interface SealedWorkspace {
|
|
4
|
+
path: string;
|
|
5
|
+
cleanup: () => Promise<void>;
|
|
6
|
+
}
|
|
7
|
+
export interface CreateSealedWorkspaceOptions {
|
|
8
|
+
callerCwd: string;
|
|
9
|
+
/** Caller-relative files or directories to overlay after the HEAD snapshot. */
|
|
10
|
+
overlayPaths?: string[];
|
|
11
|
+
/**
|
|
12
|
+
* Caller-relative folder that becomes the sealed repo.
|
|
13
|
+
* Omit, empty, or `"."` keeps `git archive HEAD`.
|
|
14
|
+
*/
|
|
15
|
+
workspace?: string;
|
|
16
|
+
}
|
|
17
|
+
export type ParsedScenarioWorkspace = {
|
|
18
|
+
ok: true;
|
|
19
|
+
rel: string | undefined;
|
|
20
|
+
} | {
|
|
21
|
+
ok: false;
|
|
22
|
+
message: string;
|
|
23
|
+
};
|
|
24
|
+
/**
|
|
25
|
+
* Parse `workspace`. `undefined`, empty, and `"."` mean caller HEAD.
|
|
26
|
+
* Subfolder paths must stay repo-relative and must not contain `..`.
|
|
27
|
+
*/
|
|
28
|
+
export declare function parseScenarioWorkspace(raw: unknown): ParsedScenarioWorkspace;
|
|
29
|
+
/** True when the run should copy caller HEAD instead of a fixture folder. */
|
|
30
|
+
export declare function isCallerHeadWorkspace(raw: unknown): boolean;
|
|
31
|
+
/** Caller-relative trees copied into every sealed run so hosts see local context. */
|
|
32
|
+
export declare function defaultSealedOverlayPaths(extra?: string[], skillPaths?: string[]): string[];
|
|
33
|
+
/** Copy HEAD plus caller context into a temp folder the agent should not leave. */
|
|
34
|
+
export declare function createSealedWorkspace(options: CreateSealedWorkspaceOptions): Promise<SealedWorkspace>;
|
|
35
|
+
/** Tool paths that resolve outside the sealed workspace. */
|
|
36
|
+
export declare function toolPathsOutsideWorkspace(trace: AgentTrace, workspaceRoot: string): string[];
|
|
37
|
+
//# sourceMappingURL=sealed-workspace.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sealed-workspace.d.ts","sourceRoot":"","sources":["../src/sealed-workspace.ts"],"names":[],"mappings":"AAOA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,YAAY,CAAC;AAK7C,eAAO,MAAM,2BAA2B,wBAAwB,CAAC;AAEjE,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAC;CAC7B;AAED,MAAM,WAAW,4BAA4B;IAC5C,SAAS,EAAE,MAAM,CAAC;IAClB,+EAA+E;IAC/E,YAAY,CAAC,EAAE,MAAM,EAAE,CAAC;IACxB;;;OAGG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,MAAM,uBAAuB,GAChC;IAAE,EAAE,EAAE,IAAI,CAAC;IAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,GACrC;IAAE,EAAE,EAAE,KAAK,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC;AAElC;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,GAAG,EAAE,OAAO,GAAG,uBAAuB,CAyB5E;AAED,6EAA6E;AAC7E,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAG3D;AAqDD,qFAAqF;AACrF,wBAAgB,yBAAyB,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,EAAE,UAAU,CAAC,EAAE,MAAM,EAAE,GAAG,MAAM,EAAE,CAc3F;AAcD,mFAAmF;AACnF,wBAAsB,qBAAqB,CAC1C,OAAO,EAAE,4BAA4B,GACnC,OAAO,CAAC,eAAe,CAAC,CAwB1B;AAgBD,4DAA4D;AAC5D,wBAAgB,yBAAyB,CAAC,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,EAAE,CAY5F"}
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import { execFile } from "node:child_process";
|
|
2
|
+
import { cp, mkdir, mkdtemp, rm } from "node:fs/promises";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { dirname, isAbsolute, join, resolve, sep } from "node:path";
|
|
5
|
+
import { promisify } from "node:util";
|
|
6
|
+
import { SKILL_ROOTS, skillOverlayRelPath } from "./skills-context.js";
|
|
7
|
+
import { isPathUnderRoot } from "./working-tree-guard.js";
|
|
8
|
+
const execFileAsync = promisify(execFile);
|
|
9
|
+
export const SEALED_WORKSPACE_DIR_PREFIX = "agent-harness-seal-";
|
|
10
|
+
/**
|
|
11
|
+
* Parse `workspace`. `undefined`, empty, and `"."` mean caller HEAD.
|
|
12
|
+
* Subfolder paths must stay repo-relative and must not contain `..`.
|
|
13
|
+
*/
|
|
14
|
+
export function parseScenarioWorkspace(raw) {
|
|
15
|
+
if (raw === undefined) {
|
|
16
|
+
return { ok: true, rel: undefined };
|
|
17
|
+
}
|
|
18
|
+
if (typeof raw !== "string") {
|
|
19
|
+
return { ok: false, message: `workspace must be a string, got ${JSON.stringify(raw)}` };
|
|
20
|
+
}
|
|
21
|
+
const normalized = raw.replace(/\\/g, "/").replace(/^\.\//, "").trim();
|
|
22
|
+
if (normalized.length === 0 || normalized === ".") {
|
|
23
|
+
return { ok: true, rel: undefined };
|
|
24
|
+
}
|
|
25
|
+
if (isAbsolute(raw) || normalized.startsWith("/")) {
|
|
26
|
+
return {
|
|
27
|
+
ok: false,
|
|
28
|
+
message: `workspace must be a repo-relative folder, got ${JSON.stringify(raw)}`,
|
|
29
|
+
};
|
|
30
|
+
}
|
|
31
|
+
const parts = normalized.split("/").filter((part) => part.length > 0);
|
|
32
|
+
if (parts.some((part) => part === ".." || part === ".")) {
|
|
33
|
+
return {
|
|
34
|
+
ok: false,
|
|
35
|
+
message: `workspace must not contain '..' segments, got ${JSON.stringify(raw)}`,
|
|
36
|
+
};
|
|
37
|
+
}
|
|
38
|
+
return { ok: true, rel: parts.join("/") };
|
|
39
|
+
}
|
|
40
|
+
/** True when the run should copy caller HEAD instead of a fixture folder. */
|
|
41
|
+
export function isCallerHeadWorkspace(raw) {
|
|
42
|
+
const parsed = parseScenarioWorkspace(raw);
|
|
43
|
+
return parsed.ok && parsed.rel === undefined;
|
|
44
|
+
}
|
|
45
|
+
async function materializeGitHead(callerCwd, dest) {
|
|
46
|
+
try {
|
|
47
|
+
await execFileAsync("git", ["rev-parse", "--is-inside-work-tree"], { cwd: callerCwd });
|
|
48
|
+
}
|
|
49
|
+
catch {
|
|
50
|
+
return;
|
|
51
|
+
}
|
|
52
|
+
const archivePath = join(dest, ".git-archive.tar");
|
|
53
|
+
await execFileAsync("git", ["archive", "--format=tar", "-o", archivePath, "HEAD"], {
|
|
54
|
+
cwd: callerCwd,
|
|
55
|
+
});
|
|
56
|
+
await execFileAsync("tar", ["-xf", archivePath, "-C", dest]);
|
|
57
|
+
await rm(archivePath, { force: true });
|
|
58
|
+
}
|
|
59
|
+
function skipNestedGit(source) {
|
|
60
|
+
const parts = source.split(sep);
|
|
61
|
+
return !parts.includes(".git");
|
|
62
|
+
}
|
|
63
|
+
async function materializeWorkspaceFolder(callerCwd, workspaceRel, dest) {
|
|
64
|
+
const root = resolve(callerCwd);
|
|
65
|
+
const from = resolve(callerCwd, workspaceRel);
|
|
66
|
+
if (!isPathUnderRoot(from, root)) {
|
|
67
|
+
throw new Error(`workspace must stay under the caller cwd: ${workspaceRel}`);
|
|
68
|
+
}
|
|
69
|
+
await rm(dest, { recursive: true, force: true });
|
|
70
|
+
await cp(from, dest, { recursive: true, filter: skipNestedGit });
|
|
71
|
+
}
|
|
72
|
+
async function overlayPath(callerCwd, dest, rel) {
|
|
73
|
+
const normalized = rel.replace(/^\.\//, "").trim();
|
|
74
|
+
if (!normalized || normalized.includes("\0")) {
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
const from = resolve(callerCwd, normalized);
|
|
78
|
+
if (!isPathUnderRoot(from, resolve(callerCwd))) {
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
const to = join(dest, normalized);
|
|
82
|
+
try {
|
|
83
|
+
await mkdir(dirname(to), { recursive: true });
|
|
84
|
+
await cp(from, to, { recursive: true, force: true });
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// Missing overlay sources are skipped.
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
/** Caller-relative trees copied into every sealed run so hosts see local context. */
|
|
91
|
+
export function defaultSealedOverlayPaths(extra, skillPaths) {
|
|
92
|
+
const extraSkillOverlays = (skillPaths ?? []).map((path) => skillOverlayRelPath(path));
|
|
93
|
+
return [
|
|
94
|
+
"AGENTS.md",
|
|
95
|
+
"CLAUDE.md",
|
|
96
|
+
".cursor/rules",
|
|
97
|
+
".skeleton/registry.md",
|
|
98
|
+
"skeleton.toml",
|
|
99
|
+
".skeleton/config.yaml",
|
|
100
|
+
".skeleton/customize",
|
|
101
|
+
...SKILL_ROOTS,
|
|
102
|
+
...extraSkillOverlays,
|
|
103
|
+
...(extra ?? []),
|
|
104
|
+
];
|
|
105
|
+
}
|
|
106
|
+
async function initNestedGit(dest) {
|
|
107
|
+
await execFileAsync("git", ["init", "-b", "main"], { cwd: dest });
|
|
108
|
+
await execFileAsync("git", ["config", "user.email", "harness@local"], { cwd: dest });
|
|
109
|
+
await execFileAsync("git", ["config", "user.name", "agent-harness"], { cwd: dest });
|
|
110
|
+
await execFileAsync("git", ["add", "-A"], { cwd: dest });
|
|
111
|
+
try {
|
|
112
|
+
await execFileAsync("git", ["commit", "-m", "sealed workspace"], { cwd: dest });
|
|
113
|
+
}
|
|
114
|
+
catch {
|
|
115
|
+
// Empty tree still keeps .git so git does not walk to the caller repo.
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
/** Copy HEAD plus caller context into a temp folder the agent should not leave. */
|
|
119
|
+
export async function createSealedWorkspace(options) {
|
|
120
|
+
const dest = await mkdtemp(join(tmpdir(), SEALED_WORKSPACE_DIR_PREFIX));
|
|
121
|
+
const parsed = parseScenarioWorkspace(options.workspace);
|
|
122
|
+
if (!parsed.ok) {
|
|
123
|
+
await rm(dest, { recursive: true, force: true });
|
|
124
|
+
throw new Error(parsed.message);
|
|
125
|
+
}
|
|
126
|
+
if (parsed.rel) {
|
|
127
|
+
await materializeWorkspaceFolder(options.callerCwd, parsed.rel, dest);
|
|
128
|
+
}
|
|
129
|
+
else {
|
|
130
|
+
await materializeGitHead(options.callerCwd, dest);
|
|
131
|
+
for (const rel of options.overlayPaths ?? []) {
|
|
132
|
+
await overlayPath(options.callerCwd, dest, rel);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
await initNestedGit(dest);
|
|
136
|
+
return {
|
|
137
|
+
path: dest,
|
|
138
|
+
cleanup: async () => {
|
|
139
|
+
await rm(dest, { recursive: true, force: true });
|
|
140
|
+
},
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
function candidatePathsFromArgs(args) {
|
|
144
|
+
if (!args) {
|
|
145
|
+
return [];
|
|
146
|
+
}
|
|
147
|
+
const paths = [];
|
|
148
|
+
for (const key of ["path", "file_path", "filePath", "target_file", "uri", "cwd"]) {
|
|
149
|
+
const value = args[key];
|
|
150
|
+
if (typeof value === "string") {
|
|
151
|
+
paths.push(value.replace(/^file:\/\//, ""));
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
return paths;
|
|
155
|
+
}
|
|
156
|
+
/** Tool paths that resolve outside the sealed workspace. */
|
|
157
|
+
export function toolPathsOutsideWorkspace(trace, workspaceRoot) {
|
|
158
|
+
const root = resolve(workspaceRoot);
|
|
159
|
+
const escaped = [];
|
|
160
|
+
for (const call of trace.toolCalls) {
|
|
161
|
+
for (const raw of candidatePathsFromArgs(call.args)) {
|
|
162
|
+
const abs = isAbsolute(raw) ? resolve(raw) : resolve(root, raw);
|
|
163
|
+
if (!isPathUnderRoot(abs, root)) {
|
|
164
|
+
escaped.push(raw);
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
return [...new Set(escaped)];
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=sealed-workspace.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sealed-workspace.js","sourceRoot":"","sources":["../src/sealed-workspace.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAC9C,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE,MAAM,kBAAkB,CAAC;AAC1D,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AACjC,OAAO,EAAE,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AACpE,OAAO,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AAEtC,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,MAAM,aAAa,GAAG,SAAS,CAAC,QAAQ,CAAC,CAAC;AAE1C,MAAM,CAAC,MAAM,2BAA2B,GAAG,qBAAqB,CAAC;AAsBjE;;;GAGG;AACH,MAAM,UAAU,sBAAsB,CAAC,GAAY;IAClD,IAAI,GAAG,KAAK,SAAS,EAAE,CAAC;QACvB,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;IACrC,CAAC;IACD,IAAI,OAAO,GAAG,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,OAAO,EAAE,mCAAmC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;IACzF,CAAC;IACD,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACvE,IAAI,UAAU,CAAC,MAAM,KAAK,CAAC,IAAI,UAAU,KAAK,GAAG,EAAE,CAAC;QACnD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC;IACrC,CAAC;IACD,IAAI,UAAU,CAAC,GAAG,CAAC,IAAI,UAAU,CAAC,UAAU,CAAC,GAAG,CAAC,EAAE,CAAC;QACnD,OAAO;YACN,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,iDAAiD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;SAC/E,CAAC;IACH,CAAC;IACD,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;IACtE,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,KAAK,GAAG,CAAC,EAAE,CAAC;QACzD,OAAO;YACN,EAAE,EAAE,KAAK;YACT,OAAO,EAAE,iDAAiD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE;SAC/E,CAAC;IACH,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;AAC3C,CAAC;AAED,6EAA6E;AAC7E,MAAM,UAAU,qBAAqB,CAAC,GAAY;IACjD,MAAM,MAAM,GAAG,sBAAsB,CAAC,GAAG,CAAC,CAAC;IAC3C,OAAO,MAAM,CAAC,EAAE,IAAI,MAAM,CAAC,GAAG,KAAK,SAAS,CAAC;AAC9C,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,SAAiB,EAAE,IAAY;IAChE,IAAI,CAAC;QACJ,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,WAAW,EAAE,uBAAuB,CAAC,EAAE,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,CAAC;IACxF,CAAC;IAAC,MAAM,CAAC;QACR,OAAO;IACR,CAAC;IACD,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;IACnD,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,SAAS,EAAE,cAAc,EAAE,IAAI,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE;QAClF,GAAG,EAAE,SAAS;KACd,CAAC,CAAC;IACH,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,WAAW,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;IAC7D,MAAM,EAAE,CAAC,WAAW,EAAE,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;AACxC,CAAC;AAED,SAAS,aAAa,CAAC,MAAc;IACpC,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAChC,OAAO,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;AAChC,CAAC;AAED,KAAK,UAAU,0BAA0B,CACxC,SAAiB,EACjB,YAAoB,EACpB,IAAY;IAEZ,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,CAAC,CAAC;IAChC,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IAC9C,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,CAAC;QAClC,MAAM,IAAI,KAAK,CAAC,6CAA6C,YAAY,EAAE,CAAC,CAAC;IAC9E,CAAC;IACD,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACjD,MAAM,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,MAAM,EAAE,aAAa,EAAE,CAAC,CAAC;AAClE,CAAC;AAED,KAAK,UAAU,WAAW,CAAC,SAAiB,EAAE,IAAY,EAAE,GAAW;IACtE,MAAM,UAAU,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACnD,IAAI,CAAC,UAAU,IAAI,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QAC9C,OAAO;IACR,CAAC;IACD,MAAM,IAAI,GAAG,OAAO,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;IAC5C,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,SAAS,CAAC,CAAC,EAAE,CAAC;QAChD,OAAO;IACR,CAAC;IACD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IAClC,IAAI,CAAC;QACJ,MAAM,KAAK,CAAC,OAAO,CAAC,EAAE,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC9C,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACtD,CAAC;IAAC,MAAM,CAAC;QACR,uCAAuC;IACxC,CAAC;AACF,CAAC;AAED,qFAAqF;AACrF,MAAM,UAAU,yBAAyB,CAAC,KAAgB,EAAE,UAAqB;IAChF,MAAM,kBAAkB,GAAG,CAAC,UAAU,IAAI,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,mBAAmB,CAAC,IAAI,CAAC,CAAC,CAAC;IACvF,OAAO;QACN,WAAW;QACX,WAAW;QACX,eAAe;QACf,uBAAuB;QACvB,eAAe;QACf,uBAAuB;QACvB,qBAAqB;QACrB,GAAG,WAAW;QACd,GAAG,kBAAkB;QACrB,GAAG,CAAC,KAAK,IAAI,EAAE,CAAC;KAChB,CAAC;AACH,CAAC;AAED,KAAK,UAAU,aAAa,CAAC,IAAY;IACxC,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IAClE,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,YAAY,EAAE,eAAe,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACrF,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,WAAW,EAAE,eAAe,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACpF,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,KAAK,EAAE,IAAI,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,IAAI,CAAC;QACJ,MAAM,aAAa,CAAC,KAAK,EAAE,CAAC,QAAQ,EAAE,IAAI,EAAE,kBAAkB,CAAC,EAAE,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC;IACjF,CAAC;IAAC,MAAM,CAAC;QACR,uEAAuE;IACxE,CAAC;AACF,CAAC;AAED,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,qBAAqB,CAC1C,OAAqC;IAErC,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,2BAA2B,CAAC,CAAC,CAAC;IACxE,MAAM,MAAM,GAAG,sBAAsB,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACzD,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE,CAAC;QAChB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,IAAI,KAAK,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;IACjC,CAAC;IAED,IAAI,MAAM,CAAC,GAAG,EAAE,CAAC;QAChB,MAAM,0BAA0B,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IACvE,CAAC;SAAM,CAAC;QACP,MAAM,kBAAkB,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QAClD,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;YAC9C,MAAM,WAAW,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,EAAE,GAAG,CAAC,CAAC;QACjD,CAAC;IACF,CAAC;IACD,MAAM,aAAa,CAAC,IAAI,CAAC,CAAC;IAE1B,OAAO;QACN,IAAI,EAAE,IAAI;QACV,OAAO,EAAE,KAAK,IAAI,EAAE;YACnB,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;QAClD,CAAC;KACD,CAAC;AACH,CAAC;AAED,SAAS,sBAAsB,CAAC,IAAyC;IACxE,IAAI,CAAC,IAAI,EAAE,CAAC;QACX,OAAO,EAAE,CAAC;IACX,CAAC;IACD,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,KAAK,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,UAAU,EAAE,aAAa,EAAE,KAAK,EAAE,KAAK,CAAC,EAAE,CAAC;QAClF,MAAM,KAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC;QACxB,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;YAC/B,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC,CAAC;QAC7C,CAAC;IACF,CAAC;IACD,OAAO,KAAK,CAAC;AACd,CAAC;AAED,4DAA4D;AAC5D,MAAM,UAAU,yBAAyB,CAAC,KAAiB,EAAE,aAAqB;IACjF,MAAM,IAAI,GAAG,OAAO,CAAC,aAAa,CAAC,CAAC;IACpC,MAAM,OAAO,GAAa,EAAE,CAAC;IAC7B,KAAK,MAAM,IAAI,IAAI,KAAK,CAAC,SAAS,EAAE,CAAC;QACpC,KAAK,MAAM,GAAG,IAAI,sBAAsB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACrD,MAAM,GAAG,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,EAAE,GAAG,CAAC,CAAC;YAChE,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;gBACjC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;YACnB,CAAC;QACF,CAAC;IACF,CAAC;IACD,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC;AAC9B,CAAC"}
|
package/dist/skills-context.d.ts
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
|
+
/** Project skill trees used by Cursor, Claude, Codex, and similar hosts. */
|
|
2
|
+
export declare const SKILL_ROOTS: readonly [".agents/skills", ".cursor/skills", ".codex/skills", ".claude/skills"];
|
|
3
|
+
/** Skill folder name from a host-agnostic SKILL.md or references path. */
|
|
4
|
+
export declare function skillNameFromWorkflowPath(path: string): string | undefined;
|
|
1
5
|
export type SkillContextMode = "none" | "catalog" | "full";
|
|
2
|
-
export
|
|
3
|
-
mode:
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
export type SkillContextOptions = {
|
|
7
|
+
mode: "none";
|
|
8
|
+
include?: readonly string[];
|
|
9
|
+
} | {
|
|
10
|
+
mode?: "catalog" | "full";
|
|
11
|
+
include: readonly string[];
|
|
12
|
+
};
|
|
13
|
+
/** Skill files for one run. Use repo-relative SKILL.md or skill-folder paths. */
|
|
14
|
+
export type SkillContextSetting = "none" | readonly string[] | SkillContextOptions;
|
|
8
15
|
export interface SkillCatalogEntry {
|
|
9
16
|
name: string;
|
|
10
17
|
dir: string;
|
|
@@ -12,7 +19,19 @@ export interface SkillCatalogEntry {
|
|
|
12
19
|
description: string;
|
|
13
20
|
disableModelInvocation: boolean;
|
|
14
21
|
}
|
|
15
|
-
declare function
|
|
22
|
+
export declare function normalizeRelSkillPath(raw: string): string;
|
|
23
|
+
/** True for a repo-relative skill file or folder. Bare names are invalid. */
|
|
24
|
+
export declare function isRepoRelativeSkillPath(raw: string): boolean;
|
|
25
|
+
/** SKILL.md path for a listed skill file or folder. */
|
|
26
|
+
export declare function skillManifestRelPath(raw: string): string;
|
|
27
|
+
/** Folder copied into the sealed workspace for a listed skill path. */
|
|
28
|
+
export declare function skillOverlayRelPath(raw: string): string;
|
|
29
|
+
/** Skill paths this run may load. Empty when skills are off. */
|
|
30
|
+
export declare function skillPathsFromSetting(setting: SkillContextSetting | undefined): string[];
|
|
31
|
+
declare function normalizeSkillContext(setting: SkillContextSetting | undefined): {
|
|
32
|
+
mode: SkillContextMode;
|
|
33
|
+
include: string[];
|
|
34
|
+
};
|
|
16
35
|
export interface LoadedSkillContext {
|
|
17
36
|
mode: SkillContextMode;
|
|
18
37
|
sources: string[];
|