@galaxy-foundry/gxwf-pi-harness 0.0.0 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/runner.js ADDED
@@ -0,0 +1,556 @@
1
+ import { spawnSync } from "node:child_process";
2
+ import { createHash, randomUUID } from "node:crypto";
3
+ import { chmodSync, cpSync, existsSync, lstatSync, mkdirSync, readFileSync, readdirSync, realpathSync, symlinkSync, unlinkSync, writeFileSync, } from "node:fs";
4
+ import path from "node:path";
5
+ import { fileURLToPath } from "node:url";
6
+ import { RpcClient, VERSION as PI_VERSION, } from "@earendil-works/pi-coding-agent";
7
+ import { DEFAULT_CONTAINER_IMAGE, inspectContainerImage, } from "./container.js";
8
+ import { inspectPiTestAuth, PI_TEST_AUTH_PROVIDER, piTestAuthPath } from "./pi-test-auth.js";
9
+ const DEFAULT_TOOLS = ["read", "write", "edit", "bash", "grep", "find", "ls"];
10
+ const SUPPORTED_TOOLS = new Set([...DEFAULT_TOOLS, "powershell"]);
11
+ const SKILL_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
12
+ const ARTIFACT_ID = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
13
+ function sha256Text(value) {
14
+ return createHash("sha256").update(value).digest("hex");
15
+ }
16
+ function relativeRecordPath(runDir, filePath) {
17
+ return path.relative(runDir, filePath).split(path.sep).join("/");
18
+ }
19
+ function listTree(root, current = root) {
20
+ const entries = readdirSync(current, { withFileTypes: true }).sort((a, b) => a.name.localeCompare(b.name));
21
+ const files = [];
22
+ for (const entry of entries) {
23
+ const fullPath = path.join(current, entry.name);
24
+ if (entry.isDirectory())
25
+ files.push(...listTree(root, fullPath));
26
+ else
27
+ files.push(path.relative(root, fullPath).split(path.sep).join("/"));
28
+ }
29
+ return files;
30
+ }
31
+ export function sha256Path(filePath) {
32
+ const resolved = realpathSync(filePath);
33
+ const stat = lstatSync(resolved);
34
+ if (stat.isFile())
35
+ return createHash("sha256").update(readFileSync(resolved)).digest("hex");
36
+ if (!stat.isDirectory())
37
+ throw new Error(`cannot hash unsupported path: ${filePath}`);
38
+ const hash = createHash("sha256");
39
+ for (const relative of listTree(resolved)) {
40
+ hash.update(relative);
41
+ hash.update("\0");
42
+ hash.update(readFileSync(path.join(resolved, relative)));
43
+ hash.update("\0");
44
+ }
45
+ return hash.digest("hex");
46
+ }
47
+ function readSkillName(skillDir) {
48
+ const skillPath = path.join(skillDir, "SKILL.md");
49
+ if (!existsSync(skillPath))
50
+ throw new Error(`${skillPath}: missing SKILL.md`);
51
+ const source = readFileSync(skillPath, "utf8");
52
+ const frontmatter = source.match(/^---\s*\n([\s\S]*?)\n---\s*\n/);
53
+ const name = frontmatter?.[1]?.match(/^name:\s*["']?([^\s"']+)["']?\s*$/m)?.[1];
54
+ if (!name || !SKILL_NAME.test(name))
55
+ throw new Error(`${skillPath}: invalid or missing skill name`);
56
+ return name;
57
+ }
58
+ function resolveWorkspacePath(workspace, relativePath) {
59
+ if (!relativePath || path.isAbsolute(relativePath)) {
60
+ throw new Error(`expected artifact path must be relative: ${relativePath}`);
61
+ }
62
+ const resolved = path.resolve(workspace, relativePath);
63
+ const relation = path.relative(workspace, resolved);
64
+ if (relation.startsWith("..") || path.isAbsolute(relation)) {
65
+ throw new Error(`path escapes worker directory: ${relativePath}`);
66
+ }
67
+ return resolved;
68
+ }
69
+ function makeReadOnly(filePath) {
70
+ const stat = lstatSync(filePath);
71
+ if (stat.isDirectory()) {
72
+ for (const entry of readdirSync(filePath))
73
+ makeReadOnly(path.join(filePath, entry));
74
+ chmodSync(filePath, 0o555);
75
+ }
76
+ else {
77
+ chmodSync(filePath, 0o444);
78
+ }
79
+ }
80
+ function stageInputs(inputPaths, inputsDir, stagedPrefix) {
81
+ if (inputPaths.length === 0)
82
+ return [];
83
+ mkdirSync(inputsDir);
84
+ const names = new Set();
85
+ return inputPaths.map((inputPath) => {
86
+ const source = realpathSync(inputPath);
87
+ const name = path.basename(source);
88
+ if (names.has(name))
89
+ throw new Error(`declared inputs share basename '${name}'`);
90
+ names.add(name);
91
+ const destination = path.join(inputsDir, name);
92
+ cpSync(source, destination, { recursive: true, dereference: true, force: false });
93
+ makeReadOnly(destination);
94
+ return {
95
+ source,
96
+ staged_path: `${stagedPrefix}/${name}`,
97
+ sha256: sha256Path(source),
98
+ };
99
+ });
100
+ }
101
+ function loadVerifyEntries(skillDir) {
102
+ const verifyPath = path.join(skillDir, "_verify.json");
103
+ if (!existsSync(verifyPath))
104
+ return new Map();
105
+ const manifest = JSON.parse(readFileSync(verifyPath, "utf8"));
106
+ if (manifest.verify_schema_version !== 1 || !Array.isArray(manifest.entries)) {
107
+ throw new Error(`${verifyPath}: invalid verify manifest`);
108
+ }
109
+ return new Map(manifest.entries.map((entry) => [entry.artifact_id, entry]));
110
+ }
111
+ function substituteArtifactPath(args, artifactPath) {
112
+ return args.length
113
+ ? args.map((arg) => arg.replaceAll("{artifact_path}", artifactPath))
114
+ : [artifactPath];
115
+ }
116
+ function validatorCommand(bin) {
117
+ if (bin !== "foundry")
118
+ return { executable: bin, prefixArgs: [] };
119
+ const packageEntry = fileURLToPath(import.meta.resolve("@galaxy-foundry/gxwf-foundry"));
120
+ return {
121
+ executable: process.execPath,
122
+ prefixArgs: [path.join(path.dirname(packageEntry), "bin", "foundry.js")],
123
+ };
124
+ }
125
+ function validateArtifacts(expected, workspace, runDir, skillDir) {
126
+ const verify = loadVerifyEntries(skillDir);
127
+ const validationDir = path.join(runDir, "validation");
128
+ return expected.map((artifact) => {
129
+ if (!ARTIFACT_ID.test(artifact.id))
130
+ throw new Error(`invalid artifact id: ${artifact.id}`);
131
+ const artifactPath = resolveWorkspacePath(workspace, artifact.path);
132
+ const recordPath = path.relative(workspace, artifactPath).split(path.sep).join("/");
133
+ if (!existsSync(artifactPath))
134
+ return { id: artifact.id, path: recordPath, status: "missing" };
135
+ const result = {
136
+ id: artifact.id,
137
+ path: recordPath,
138
+ status: "present",
139
+ sha256: sha256Path(artifactPath),
140
+ };
141
+ const entry = verify.get(artifact.id);
142
+ if (!entry)
143
+ return result;
144
+ mkdirSync(validationDir, { recursive: true });
145
+ const command = validatorCommand(entry.validator_bin);
146
+ const validatorArgs = substituteArtifactPath(entry.args, artifactPath);
147
+ const executed = spawnSync(command.executable, [...command.prefixArgs, ...validatorArgs], {
148
+ cwd: workspace,
149
+ encoding: "utf8",
150
+ stdio: ["ignore", "pipe", "pipe"],
151
+ });
152
+ const stdoutPath = path.join(validationDir, `${artifact.id}.stdout`);
153
+ const stderrPath = path.join(validationDir, `${artifact.id}.stderr`);
154
+ writeFileSync(stdoutPath, executed.stdout ?? "");
155
+ writeFileSync(stderrPath, executed.stderr ?? "");
156
+ result.status = executed.error ? "error" : executed.status === 0 ? "passed" : "failed";
157
+ result.validator = {
158
+ bin: entry.validator_bin,
159
+ args: substituteArtifactPath(entry.args, recordPath),
160
+ exit_code: typeof executed.status === "number" ? executed.status : null,
161
+ stdout_path: relativeRecordPath(runDir, stdoutPath),
162
+ stderr_path: relativeRecordPath(runDir, stderrPath),
163
+ error: executed.error?.message,
164
+ };
165
+ return result;
166
+ });
167
+ }
168
+ function isAgentFailure(events) {
169
+ return events.some((event) => {
170
+ if (event.type !== "message_end" || event.message.role !== "assistant")
171
+ return false;
172
+ return event.message.stopReason === "error" || event.message.stopReason === "aborted";
173
+ });
174
+ }
175
+ function invocationPrompt(skill, prompt, inputs) {
176
+ const inputNote = inputs.length
177
+ ? `\n\nDeclared inputs staged in this worker:\n${inputs.map((input) => `- ${input.staged_path}`).join("\n")}`
178
+ : "";
179
+ return `/skill:${skill}\n\n${prompt}${inputNote}`;
180
+ }
181
+ function prepareRunDirectory(runDir, sandbox) {
182
+ if (existsSync(runDir))
183
+ throw new Error(`run directory already exists: ${runDir}`);
184
+ mkdirSync(path.dirname(runDir), { recursive: true });
185
+ mkdirSync(runDir, { mode: 0o700 });
186
+ const workspace = path.join(runDir, "workspace");
187
+ mkdirSync(workspace);
188
+ const inputsDir = sandbox === "local" ? path.join(workspace, "inputs") : path.join(runDir, "inputs");
189
+ if (sandbox === "container")
190
+ return { workspace, inputsDir };
191
+ const agentDir = path.join(runDir, "pi-agent");
192
+ mkdirSync(agentDir);
193
+ return { workspace, agentDir, inputsDir };
194
+ }
195
+ function writeRecord(runDir, record) {
196
+ writeFileSync(path.join(runDir, "run.json"), `${JSON.stringify(record, null, 2)}\n`);
197
+ }
198
+ function unlinkIfPresent(filePath) {
199
+ if (!filePath)
200
+ return;
201
+ try {
202
+ lstatSync(filePath);
203
+ unlinkSync(filePath);
204
+ }
205
+ catch (error) {
206
+ if (error.code !== "ENOENT")
207
+ throw error;
208
+ }
209
+ }
210
+ const ENVIRONMENT_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
211
+ function resolveCredentialEnv(names) {
212
+ const unique = [...new Set(names)];
213
+ for (const name of unique) {
214
+ if (!ENVIRONMENT_NAME.test(name))
215
+ throw new Error(`invalid credential environment name: ${name}`);
216
+ if (process.env[name] === undefined) {
217
+ throw new Error(`credential environment variable is not set: ${name}`);
218
+ }
219
+ }
220
+ return unique.sort();
221
+ }
222
+ function containerMounts(skillDir, inputsDir, workspace, hasInputs) {
223
+ return [
224
+ {
225
+ type: "bind",
226
+ source: skillDir,
227
+ target: "/skill",
228
+ read_only: true,
229
+ purpose: "skill",
230
+ },
231
+ ...(hasInputs
232
+ ? [
233
+ {
234
+ type: "bind",
235
+ source: inputsDir,
236
+ target: "/inputs",
237
+ read_only: true,
238
+ purpose: "inputs",
239
+ },
240
+ ]
241
+ : []),
242
+ {
243
+ type: "bind",
244
+ source: workspace,
245
+ target: "/workspace",
246
+ read_only: false,
247
+ purpose: "output",
248
+ },
249
+ {
250
+ type: "tmpfs",
251
+ target: "/pi-agent",
252
+ read_only: false,
253
+ purpose: "agent-config",
254
+ },
255
+ {
256
+ type: "tmpfs",
257
+ target: "/tmp",
258
+ read_only: false,
259
+ purpose: "temporary-files",
260
+ },
261
+ ];
262
+ }
263
+ export function expectedArtifactsFromSkill(skillDir) {
264
+ const provenancePath = path.join(skillDir, "_provenance.json");
265
+ if (!existsSync(provenancePath))
266
+ return [];
267
+ const provenance = JSON.parse(readFileSync(provenancePath, "utf8"));
268
+ const produces = provenance.artifacts?.produces ?? [];
269
+ return produces.flatMap((artifact) => typeof artifact.id === "string" && typeof artifact.default_filename === "string"
270
+ ? [
271
+ {
272
+ id: artifact.id,
273
+ path: artifact.default_filename,
274
+ optional: artifact.optional === true ? true : undefined,
275
+ },
276
+ ]
277
+ : []);
278
+ }
279
+ export async function runPiSkill(options, dependencies = {}) {
280
+ const now = dependencies.now ?? (() => new Date());
281
+ const runId = (dependencies.id ?? randomUUID)();
282
+ const started = now();
283
+ const runDir = path.resolve(options.runDir);
284
+ const skillDir = realpathSync(options.skillDir);
285
+ const sandbox = options.sandbox ?? "local";
286
+ const dockerBin = options.dockerBin ?? "docker";
287
+ const sandboxNetwork = options.sandboxNetwork ?? "bridge";
288
+ const timeoutMs = options.timeoutMs ?? 10 * 60 * 1000;
289
+ const tools = [...(options.tools ?? DEFAULT_TOOLS)];
290
+ if (sandbox !== "local" && sandbox !== "container") {
291
+ throw new Error(`unsupported sandbox mode: ${String(sandbox)}`);
292
+ }
293
+ if (sandboxNetwork !== "bridge" && sandboxNetwork !== "none") {
294
+ throw new Error(`unsupported container network policy: ${String(sandboxNetwork)}`);
295
+ }
296
+ if (sandbox === "local" && (options.sandboxImage || options.credentialEnv?.length)) {
297
+ throw new Error("container image and credential options require sandbox=container");
298
+ }
299
+ if (options.piTestAuthDir && sandbox === "container") {
300
+ throw new Error("pi-test-auth requires the local sandbox until host-side tool isolation is available");
301
+ }
302
+ if (options.piTestAuthDir && options.provider !== PI_TEST_AUTH_PROVIDER) {
303
+ throw new Error(`pi-test-auth requires provider=${PI_TEST_AUTH_PROVIDER}`);
304
+ }
305
+ if (options.piTestAuthDir && !inspectPiTestAuth(options.piTestAuthDir).configured) {
306
+ throw new Error(`pi-test-auth is not configured; run foundry-build pi-test-auth login first`);
307
+ }
308
+ if (!options.provider.trim() || !options.model.trim()) {
309
+ throw new Error("provider and model are required");
310
+ }
311
+ if (!Number.isFinite(timeoutMs) || timeoutMs <= 0) {
312
+ throw new Error("timeoutMs must be a positive finite number");
313
+ }
314
+ if (tools.length === 0 || tools.some((tool) => !SUPPORTED_TOOLS.has(tool))) {
315
+ throw new Error(`tools must be a non-empty subset of: ${[...SUPPORTED_TOOLS].join(", ")}`);
316
+ }
317
+ const credentialEnv = sandbox === "container" ? resolveCredentialEnv(options.credentialEnv ?? []) : [];
318
+ const image = sandbox === "container"
319
+ ? (dependencies.inspectContainerImage ?? inspectContainerImage)(options.sandboxImage ?? DEFAULT_CONTAINER_IMAGE, dockerBin)
320
+ : undefined;
321
+ const skill = readSkillName(skillDir);
322
+ const expectedArtifacts = options.expectedArtifacts ?? expectedArtifactsFromSkill(skillDir);
323
+ loadVerifyEntries(skillDir);
324
+ const { workspace, agentDir, inputsDir } = prepareRunDirectory(runDir, sandbox);
325
+ const authLinkPath = options.piTestAuthDir && agentDir ? path.join(agentDir, "auth.json") : undefined;
326
+ const workerSkillDir = path.join(runDir, "skill");
327
+ cpSync(skillDir, workerSkillDir, {
328
+ recursive: true,
329
+ dereference: true,
330
+ force: false,
331
+ });
332
+ makeReadOnly(workerSkillDir);
333
+ for (const artifact of expectedArtifacts) {
334
+ if (!ARTIFACT_ID.test(artifact.id))
335
+ throw new Error(`invalid artifact id: ${artifact.id}`);
336
+ resolveWorkspacePath(workspace, artifact.path);
337
+ }
338
+ const inputPaths = options.inputPaths ?? [];
339
+ const inputs = stageInputs(inputPaths, inputsDir, sandbox === "container" ? "/inputs" : "inputs");
340
+ const prompt = invocationPrompt(skill, options.prompt, inputs);
341
+ const tracePath = path.join(runDir, "trace.jsonl");
342
+ const stderrPath = path.join(runDir, "stderr.log");
343
+ writeFileSync(tracePath, "");
344
+ writeFileSync(stderrPath, "");
345
+ const provenancePath = path.join(skillDir, "_provenance.json");
346
+ const mounts = sandbox === "container"
347
+ ? containerMounts(workerSkillDir, inputsDir, workspace, inputPaths.length > 0)
348
+ : undefined;
349
+ const containerName = `foundry-pi-${runId.toLowerCase()}`;
350
+ const baseRecord = {
351
+ run_schema_version: 1,
352
+ run_id: runId,
353
+ started_at: started.toISOString(),
354
+ engine: {
355
+ name: "pi",
356
+ version: PI_VERSION,
357
+ provider: options.provider,
358
+ requested_model: options.model,
359
+ requested_thinking: options.thinking,
360
+ },
361
+ invocation: {
362
+ skill,
363
+ skill_path: skillDir,
364
+ skill_sha256: sha256Path(skillDir),
365
+ provenance_sha256: existsSync(provenancePath) ? sha256Path(provenancePath) : undefined,
366
+ prompt_sha256: sha256Text(prompt),
367
+ explicit_activation: `/skill:${skill}`,
368
+ tools,
369
+ timeout_ms: timeoutMs,
370
+ ambient_discovery_disabled: true,
371
+ },
372
+ sandbox: sandbox === "container"
373
+ ? {
374
+ mode: "container",
375
+ security_boundary: true,
376
+ network_policy: sandboxNetwork,
377
+ credential_policy: credentialEnv.length
378
+ ? "allowlisted-environment"
379
+ : "none",
380
+ credential_env: credentialEnv,
381
+ workdir: "/workspace",
382
+ agent_config_dir: "/pi-agent",
383
+ image: image,
384
+ mounts: mounts,
385
+ container_name: containerName,
386
+ }
387
+ : {
388
+ mode: "local",
389
+ security_boundary: false,
390
+ network_policy: "host",
391
+ credential_policy: "ambient-environment",
392
+ credential_auth_store: options.piTestAuthDir
393
+ ? "pi-test-auth"
394
+ : "none",
395
+ workdir: relativeRecordPath(runDir, workspace),
396
+ agent_config_dir: relativeRecordPath(runDir, agentDir),
397
+ },
398
+ inputs,
399
+ trace_path: relativeRecordPath(runDir, tracePath),
400
+ stderr_path: relativeRecordPath(runDir, stderrPath),
401
+ };
402
+ const cliPath = sandbox === "container"
403
+ ? fileURLToPath(new URL("./container-rpc-entry.js", import.meta.url))
404
+ : fileURLToPath(import.meta.resolve("@earendil-works/pi-coding-agent/rpc-entry"));
405
+ const launchConfig = sandbox === "container"
406
+ ? {
407
+ docker_bin: dockerBin,
408
+ container_name: containerName,
409
+ image_id: image.resolved_id,
410
+ network: sandboxNetwork,
411
+ credential_env: credentialEnv,
412
+ user: typeof process.getuid === "function" && typeof process.getgid === "function"
413
+ ? `${process.getuid()}:${process.getgid()}`
414
+ : undefined,
415
+ mounts: mounts,
416
+ }
417
+ : undefined;
418
+ const clientOptions = {
419
+ cliPath,
420
+ cwd: workspace,
421
+ env: sandbox === "container"
422
+ ? { FOUNDRY_CONTAINER_LAUNCH_CONFIG: JSON.stringify(launchConfig) }
423
+ : { PI_CODING_AGENT_DIR: agentDir },
424
+ provider: options.provider,
425
+ model: options.model,
426
+ args: [
427
+ "--no-session",
428
+ "--no-context-files",
429
+ "--no-extensions",
430
+ "--no-prompt-templates",
431
+ "--no-skills",
432
+ "--skill",
433
+ sandbox === "container" ? "/skill" : workerSkillDir,
434
+ "--tools",
435
+ tools.join(","),
436
+ ...(options.thinking ? ["--thinking", options.thinking] : []),
437
+ ],
438
+ };
439
+ let client;
440
+ try {
441
+ // Pi is exactly pinned at 0.84.4, whose FileAuthStorageBackend updates auth.json in place.
442
+ // Refresh therefore follows this link into the shared store. Re-audit this assumption with
443
+ // any Pi version bump; unlinkIfPresent also removes a broken or unexpectedly replaced link.
444
+ if (authLinkPath)
445
+ symlinkSync(piTestAuthPath(options.piTestAuthDir), authLinkPath);
446
+ client = (dependencies.createClient ?? ((value) => new RpcClient(value)))(clientOptions);
447
+ }
448
+ catch (error) {
449
+ unlinkIfPresent(authLinkPath);
450
+ throw error;
451
+ }
452
+ const events = [];
453
+ let state;
454
+ let stats;
455
+ let finalOutput;
456
+ let status;
457
+ let failureKind;
458
+ let error;
459
+ let timedOut = false;
460
+ let cancelled = false;
461
+ const unsubscribe = client.onEvent((event) => {
462
+ events.push(event);
463
+ writeFileSync(tracePath, `${JSON.stringify(event)}\n`, { flag: "a" });
464
+ options.onEvent?.(event);
465
+ });
466
+ const abort = () => {
467
+ cancelled = !timedOut;
468
+ void client.abort().catch(() => undefined);
469
+ };
470
+ options.signal?.addEventListener("abort", abort, { once: true });
471
+ try {
472
+ await client.start();
473
+ let timer;
474
+ const timeout = new Promise((_, reject) => {
475
+ timer = setTimeout(() => {
476
+ timedOut = true;
477
+ void client.abort().catch(() => undefined);
478
+ reject(new Error(`Pi worker exceeded wall timeout of ${timeoutMs}ms`));
479
+ }, timeoutMs);
480
+ });
481
+ try {
482
+ await Promise.race([client.promptAndWait(prompt, undefined, timeoutMs), timeout]);
483
+ if (options.signal?.aborted)
484
+ throw new Error("Pi worker was cancelled");
485
+ }
486
+ finally {
487
+ if (timer)
488
+ clearTimeout(timer);
489
+ }
490
+ state = await client.getState();
491
+ stats = await client.getSessionStats();
492
+ finalOutput = (await client.getLastAssistantText()) ?? undefined;
493
+ const artifacts = validateArtifacts(expectedArtifacts, workspace, runDir, skillDir);
494
+ const optionalIds = new Set(expectedArtifacts.filter((artifact) => artifact.optional).map((artifact) => artifact.id));
495
+ const artifactFailure = artifacts.some((artifact) => ["failed", "error"].includes(artifact.status) ||
496
+ (artifact.status === "missing" && !optionalIds.has(artifact.id)));
497
+ const agentFailure = isAgentFailure(events);
498
+ status = artifactFailure || agentFailure ? "failed" : "passed";
499
+ if (status === "failed")
500
+ failureKind = "skill";
501
+ const finished = now();
502
+ const record = {
503
+ ...baseRecord,
504
+ status,
505
+ failure_kind: failureKind,
506
+ finished_at: finished.toISOString(),
507
+ duration_ms: finished.getTime() - started.getTime(),
508
+ engine: {
509
+ ...baseRecord.engine,
510
+ resolved_model: state?.model ? `${state.model.provider}/${state.model.id}` : undefined,
511
+ },
512
+ artifacts,
513
+ usage: stats
514
+ ? {
515
+ input_tokens: stats.tokens.input,
516
+ output_tokens: stats.tokens.output,
517
+ cache_read_tokens: stats.tokens.cacheRead,
518
+ cache_write_tokens: stats.tokens.cacheWrite,
519
+ total_tokens: stats.tokens.total,
520
+ cost: stats.cost,
521
+ turns: stats.assistantMessages,
522
+ tool_calls: stats.toolCalls,
523
+ }
524
+ : undefined,
525
+ final_output: finalOutput,
526
+ };
527
+ writeRecord(runDir, record);
528
+ return record;
529
+ }
530
+ catch (caught) {
531
+ error = caught instanceof Error ? caught.message : String(caught);
532
+ status = timedOut ? "timed_out" : cancelled || options.signal?.aborted ? "cancelled" : "error";
533
+ failureKind = status === "error" ? "infrastructure" : undefined;
534
+ const artifacts = validateArtifacts(expectedArtifacts, workspace, runDir, skillDir);
535
+ const finished = now();
536
+ const record = {
537
+ ...baseRecord,
538
+ status,
539
+ failure_kind: failureKind,
540
+ error,
541
+ finished_at: finished.toISOString(),
542
+ duration_ms: finished.getTime() - started.getTime(),
543
+ artifacts,
544
+ };
545
+ writeRecord(runDir, record);
546
+ return record;
547
+ }
548
+ finally {
549
+ options.signal?.removeEventListener("abort", abort);
550
+ unsubscribe();
551
+ await client.stop().catch(() => undefined);
552
+ writeFileSync(stderrPath, client.getStderr());
553
+ unlinkIfPresent(authLinkPath);
554
+ }
555
+ }
556
+ //# sourceMappingURL=runner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"runner.js","sourceRoot":"","sources":["../src/runner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ export declare function resolveInstalledSkill(skillsRoot: string, skill: string): string;
2
+ export declare function resolveDeclaredInput(cwd: string, input: string): string;
3
+ //# sourceMappingURL=skill-resolution.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-resolution.d.ts","sourceRoot":"","sources":["../src/skill-resolution.ts"],"names":[],"mappings":"AAKA,wBAAgB,qBAAqB,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAQ/E;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAUvE"}
@@ -0,0 +1,25 @@
1
+ import { realpathSync } from "node:fs";
2
+ import path from "node:path";
3
+ const SKILL_NAME = /^[a-z0-9]+(?:-[a-z0-9]+)*$/;
4
+ export function resolveInstalledSkill(skillsRoot, skill) {
5
+ if (!SKILL_NAME.test(skill))
6
+ throw new Error(`invalid Foundry skill name: ${skill}`);
7
+ const root = realpathSync(skillsRoot);
8
+ const resolved = realpathSync(path.join(root, skill));
9
+ if (path.dirname(resolved) !== root) {
10
+ throw new Error(`Foundry skill resolves outside installed skill root: ${skill}`);
11
+ }
12
+ return resolved;
13
+ }
14
+ export function resolveDeclaredInput(cwd, input) {
15
+ if (path.isAbsolute(input))
16
+ throw new Error(`declared input must be relative to the run: ${input}`);
17
+ const root = realpathSync(cwd);
18
+ const resolved = realpathSync(path.resolve(root, input));
19
+ const relation = path.relative(root, resolved);
20
+ if (relation.startsWith("..") || path.isAbsolute(relation)) {
21
+ throw new Error(`declared input escapes the Pipeline run directory: ${input}`);
22
+ }
23
+ return resolved;
24
+ }
25
+ //# sourceMappingURL=skill-resolution.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"skill-resolution.js","sourceRoot":"","sources":["../src/skill-resolution.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,UAAU,GAAG,4BAA4B,CAAC;AAEhD,MAAM,UAAU,qBAAqB,CAAC,UAAkB,EAAE,KAAa;IACrE,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,KAAK,EAAE,CAAC,CAAC;IACrF,MAAM,IAAI,GAAG,YAAY,CAAC,UAAU,CAAC,CAAC;IACtC,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACtD,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,IAAI,EAAE,CAAC;QACpC,MAAM,IAAI,KAAK,CAAC,wDAAwD,KAAK,EAAE,CAAC,CAAC;IACnF,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,GAAW,EAAE,KAAa;IAC7D,IAAI,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,+CAA+C,KAAK,EAAE,CAAC,CAAC;IAC1E,MAAM,IAAI,GAAG,YAAY,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC;IACzD,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IAC/C,IAAI,QAAQ,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QAC3D,MAAM,IAAI,KAAK,CAAC,sDAAsD,KAAK,EAAE,CAAC,CAAC;IACjF,CAAC;IACD,OAAO,QAAQ,CAAC;AAClB,CAAC"}