@galaxy-stack/ai-coder-core 0.3.0-alpha.1 → 0.3.0-alpha.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.d/2026-09-19-research-rejection-evidence.md +15 -0
- package/CHANGELOG.d/2026-09-21-evidence-missing-remediation.md +15 -0
- package/CHANGELOG.d/2026-09-21-observation-nudge-context.md +12 -0
- package/CHANGELOG.d/2026-09-22-model-retry-budget.md +18 -0
- package/CHANGELOG.d/2026-09-22-no-progress-recovery-turn.md +19 -0
- package/CHANGELOG.d/2026-09-23-agent-platform.md +5 -0
- package/CHANGELOG.d/2026-09-23-conservative-output-reserve.md +16 -0
- package/CHANGELOG.d/2026-09-24-approval-workspace-review.md +7 -0
- package/CHANGELOG.d/2026-09-24-incremental-ollama.md +5 -0
- package/CHANGELOG.md +71 -1
- package/README.md +78 -4
- package/dist/adapters/node/config/manual-provider-config.d.ts +19 -0
- package/dist/adapters/node/config/manual-provider-config.d.ts.map +1 -0
- package/dist/adapters/node/config/manual-provider-config.js +91 -0
- package/dist/adapters/node/config/manual-provider-config.js.map +1 -0
- package/dist/adapters/node/host/command-containment.d.ts +45 -0
- package/dist/adapters/node/host/command-containment.d.ts.map +1 -0
- package/dist/adapters/node/host/command-containment.js +580 -0
- package/dist/adapters/node/host/command-containment.js.map +1 -0
- package/dist/adapters/node/host/content-hash.d.ts +2 -0
- package/dist/adapters/node/host/content-hash.d.ts.map +1 -0
- package/dist/adapters/node/host/content-hash.js +5 -0
- package/dist/adapters/node/host/content-hash.js.map +1 -0
- package/dist/adapters/node/host/file-run-store.d.ts +29 -0
- package/dist/adapters/node/host/file-run-store.d.ts.map +1 -0
- package/dist/adapters/node/host/file-run-store.js +94 -0
- package/dist/adapters/node/host/file-run-store.js.map +1 -0
- package/dist/adapters/node/host/host-environment.d.ts +9 -0
- package/dist/adapters/node/host/host-environment.d.ts.map +1 -0
- package/dist/adapters/node/host/host-environment.js +29 -0
- package/dist/adapters/node/host/host-environment.js.map +1 -0
- package/dist/adapters/node/host/node-command-port.d.ts +21 -0
- package/dist/adapters/node/host/node-command-port.d.ts.map +1 -0
- package/dist/adapters/node/host/node-command-port.js +281 -0
- package/dist/adapters/node/host/node-command-port.js.map +1 -0
- package/dist/adapters/node/host/node-workspace-evidence-verifier.d.ts +22 -0
- package/dist/adapters/node/host/node-workspace-evidence-verifier.d.ts.map +1 -0
- package/dist/adapters/node/host/node-workspace-evidence-verifier.js +384 -0
- package/dist/adapters/node/host/node-workspace-evidence-verifier.js.map +1 -0
- package/dist/adapters/node/host/node-workspace-port.d.ts +87 -0
- package/dist/adapters/node/host/node-workspace-port.d.ts.map +1 -0
- package/dist/adapters/node/host/node-workspace-port.js +860 -0
- package/dist/adapters/node/host/node-workspace-port.js.map +1 -0
- package/dist/adapters/node/host/node-workspace-snapshot.d.ts +61 -0
- package/dist/adapters/node/host/node-workspace-snapshot.d.ts.map +1 -0
- package/dist/adapters/node/host/node-workspace-snapshot.js +281 -0
- package/dist/adapters/node/host/node-workspace-snapshot.js.map +1 -0
- package/dist/adapters/node/host/path-scope.d.ts +17 -0
- package/dist/adapters/node/host/path-scope.d.ts.map +1 -0
- package/dist/adapters/node/host/path-scope.js +89 -0
- package/dist/adapters/node/host/path-scope.js.map +1 -0
- package/dist/adapters/node/host/project-tools.d.ts +42 -0
- package/dist/adapters/node/host/project-tools.d.ts.map +1 -0
- package/dist/adapters/node/host/project-tools.js +362 -0
- package/dist/adapters/node/host/project-tools.js.map +1 -0
- package/dist/adapters/node/mcp/mcp-client.d.ts +206 -0
- package/dist/adapters/node/mcp/mcp-client.d.ts.map +1 -0
- package/dist/adapters/node/mcp/mcp-client.js +123 -0
- package/dist/adapters/node/mcp/mcp-client.js.map +1 -0
- package/dist/adapters/node/mcp/oauth-provider.d.ts +39 -0
- package/dist/adapters/node/mcp/oauth-provider.d.ts.map +1 -0
- package/dist/adapters/node/mcp/oauth-provider.js +168 -0
- package/dist/adapters/node/mcp/oauth-provider.js.map +1 -0
- package/dist/adapters/node/memory/sqlite-memory.d.ts +22 -0
- package/dist/adapters/node/memory/sqlite-memory.d.ts.map +1 -0
- package/dist/adapters/node/memory/sqlite-memory.js +83 -0
- package/dist/adapters/node/memory/sqlite-memory.js.map +1 -0
- package/dist/adapters/node/provider/ollama-chat-stream.d.ts +17 -0
- package/dist/adapters/node/provider/ollama-chat-stream.d.ts.map +1 -0
- package/dist/adapters/node/provider/ollama-chat-stream.js +176 -0
- package/dist/adapters/node/provider/ollama-chat-stream.js.map +1 -0
- package/dist/adapters/node/provider/ollama-coding-model.d.ts +89 -0
- package/dist/adapters/node/provider/ollama-coding-model.d.ts.map +1 -0
- package/dist/adapters/node/provider/ollama-coding-model.js +464 -0
- package/dist/adapters/node/provider/ollama-coding-model.js.map +1 -0
- package/dist/adapters/node/provider/ollama-research-port.d.ts +32 -0
- package/dist/adapters/node/provider/ollama-research-port.d.ts.map +1 -0
- package/dist/adapters/node/provider/ollama-research-port.js +346 -0
- package/dist/adapters/node/provider/ollama-research-port.js.map +1 -0
- package/dist/adapters/node/skills/directory-skills.d.ts +12 -0
- package/dist/adapters/node/skills/directory-skills.d.ts.map +1 -0
- package/dist/adapters/node/skills/directory-skills.js +90 -0
- package/dist/adapters/node/skills/directory-skills.js.map +1 -0
- package/dist/adapters/node/tools/tool-executor.d.ts +91 -0
- package/dist/adapters/node/tools/tool-executor.d.ts.map +1 -0
- package/dist/adapters/node/tools/tool-executor.js +948 -0
- package/dist/adapters/node/tools/tool-executor.js.map +1 -0
- package/dist/adapters/node/tools/workspace-review.d.ts +13 -0
- package/dist/adapters/node/tools/workspace-review.d.ts.map +1 -0
- package/dist/adapters/node/tools/workspace-review.js +81 -0
- package/dist/adapters/node/tools/workspace-review.js.map +1 -0
- package/dist/agent/index.d.ts +79 -0
- package/dist/agent/index.d.ts.map +1 -0
- package/dist/agent/index.js +97 -0
- package/dist/agent/index.js.map +1 -0
- package/dist/approval/approval-policy.d.ts.map +1 -1
- package/dist/approval/approval-policy.js +4 -1
- package/dist/approval/approval-policy.js.map +1 -1
- package/dist/context/context-profile.d.ts +1 -1
- package/dist/context/context-profile.js +2 -2
- package/dist/prompt/prompt-assembler.d.ts +1 -0
- package/dist/prompt/prompt-assembler.d.ts.map +1 -1
- package/dist/prompt/prompt-assembler.js +16 -2
- package/dist/prompt/prompt-assembler.js.map +1 -1
- package/dist/runtime/run-controller.d.ts.map +1 -1
- package/dist/runtime/run-controller.js +126 -23
- package/dist/runtime/run-controller.js.map +1 -1
- package/dist/runtime/runtime-types.d.ts +19 -0
- package/dist/runtime/runtime-types.d.ts.map +1 -1
- package/docs/AGENT_PLATFORM.md +91 -0
- package/docs/GALAXY_AGENT_PLATFORM_PLAN.md +318 -0
- package/docs/GALAXY_AGENT_PLATFORM_TODO.md +158 -0
- package/package.json +19 -5
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { assertAiCoderRunCheckpoint, } from "../../../index.js";
|
|
2
|
+
import { randomUUID } from "node:crypto";
|
|
3
|
+
import { lstat, mkdir, readFile, realpath, rename, unlink, writeFile } from "node:fs/promises";
|
|
4
|
+
import { basename, join, resolve } from "node:path";
|
|
5
|
+
import { sha256Text } from "./content-hash.js";
|
|
6
|
+
function assertActive(context) {
|
|
7
|
+
if (context.signal.aborted)
|
|
8
|
+
throw context.signal.reason ?? new Error("Run-store operation was canceled.");
|
|
9
|
+
if (Date.now() >= context.deadline)
|
|
10
|
+
throw new Error("Run-store operation deadline elapsed.");
|
|
11
|
+
}
|
|
12
|
+
async function writeJsonAtomically(path, value) {
|
|
13
|
+
const temporary = join(resolve(path, ".."), `.${basename(path)}.${process.pid}.${randomUUID()}.tmp`);
|
|
14
|
+
try {
|
|
15
|
+
await writeFile(temporary, `${JSON.stringify(value)}\n`, { encoding: "utf8", flag: "wx", mode: 0o600 });
|
|
16
|
+
await rename(temporary, path);
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
await unlink(temporary).catch((error) => {
|
|
20
|
+
if (error.code !== "ENOENT")
|
|
21
|
+
throw error;
|
|
22
|
+
});
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Minimal durable host store for the CLI laboratory. The configured directory
|
|
27
|
+
* must be outside model-writable workspace roots in production hosts.
|
|
28
|
+
*/
|
|
29
|
+
export class FileRunStore {
|
|
30
|
+
root;
|
|
31
|
+
checkpointTrust = "trusted_host";
|
|
32
|
+
constructor(root) {
|
|
33
|
+
this.root = root;
|
|
34
|
+
}
|
|
35
|
+
static async create(root) {
|
|
36
|
+
const target = resolve(root);
|
|
37
|
+
await mkdir(target, { recursive: true, mode: 0o700 });
|
|
38
|
+
const info = await lstat(target);
|
|
39
|
+
if (!info.isDirectory() || info.isSymbolicLink()) {
|
|
40
|
+
throw new Error("FileRunStore root must be a real directory.");
|
|
41
|
+
}
|
|
42
|
+
return new FileRunStore(await realpath(target));
|
|
43
|
+
}
|
|
44
|
+
async runDirectory(runId) {
|
|
45
|
+
const directory = join(this.root, sha256Text(runId));
|
|
46
|
+
await mkdir(directory, { recursive: true, mode: 0o700 });
|
|
47
|
+
const info = await lstat(directory);
|
|
48
|
+
if (!info.isDirectory() || info.isSymbolicLink()) {
|
|
49
|
+
throw new Error("FileRunStore run path must be a real directory.");
|
|
50
|
+
}
|
|
51
|
+
return directory;
|
|
52
|
+
}
|
|
53
|
+
async loadLatestCheckpoint(runId, context) {
|
|
54
|
+
assertActive(context);
|
|
55
|
+
const path = join(await this.runDirectory(runId), "checkpoint.json");
|
|
56
|
+
let raw;
|
|
57
|
+
try {
|
|
58
|
+
raw = await readFile(path, "utf8");
|
|
59
|
+
}
|
|
60
|
+
catch (error) {
|
|
61
|
+
if (error.code === "ENOENT")
|
|
62
|
+
return null;
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
assertActive(context);
|
|
66
|
+
return assertAiCoderRunCheckpoint(JSON.parse(raw));
|
|
67
|
+
}
|
|
68
|
+
async saveCheckpoint(checkpoint, context) {
|
|
69
|
+
assertActive(context);
|
|
70
|
+
const verified = await assertAiCoderRunCheckpoint(checkpoint);
|
|
71
|
+
const directory = await this.runDirectory(verified.runId);
|
|
72
|
+
await writeJsonAtomically(join(directory, "checkpoint.json"), verified);
|
|
73
|
+
assertActive(context);
|
|
74
|
+
return Object.freeze({ artifactRef: `galaxy-checkpoint://${sha256Text(verified.runId)}/${verified.contentHash}` });
|
|
75
|
+
}
|
|
76
|
+
async saveFinalReport(report, context) {
|
|
77
|
+
assertActive(context);
|
|
78
|
+
const directory = await this.runDirectory(report.runId);
|
|
79
|
+
await writeJsonAtomically(join(directory, "final-report.json"), report);
|
|
80
|
+
assertActive(context);
|
|
81
|
+
}
|
|
82
|
+
async loadFinalReport(runId) {
|
|
83
|
+
const path = join(await this.runDirectory(runId), "final-report.json");
|
|
84
|
+
try {
|
|
85
|
+
return JSON.parse(await readFile(path, "utf8"));
|
|
86
|
+
}
|
|
87
|
+
catch (error) {
|
|
88
|
+
if (error.code === "ENOENT")
|
|
89
|
+
return null;
|
|
90
|
+
throw error;
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
//# sourceMappingURL=file-run-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-run-store.js","sourceRoot":"","sources":["../../../../src/adapters/node/host/file-run-store.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,0BAA0B,GAE3B,MAAM,mBAAmB,CAAC;AAK3B,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AACzC,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC/F,OAAO,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpD,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAE/C,SAAS,YAAY,CAAC,OAA4D;IAChF,IAAI,OAAO,CAAC,MAAM,CAAC,OAAO;QAAE,MAAM,OAAO,CAAC,MAAM,CAAC,MAAM,IAAI,IAAI,KAAK,CAAC,mCAAmC,CAAC,CAAC;IAC1G,IAAI,IAAI,CAAC,GAAG,EAAE,IAAI,OAAO,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,uCAAuC,CAAC,CAAC;AAC/F,CAAC;AAED,KAAK,UAAU,mBAAmB,CAAC,IAAY,EAAE,KAAc;IAC7D,MAAM,SAAS,GAAG,IAAI,CACpB,OAAO,CAAC,IAAI,EAAE,IAAI,CAAC,EACnB,IAAI,QAAQ,CAAC,IAAI,CAAC,IAAI,OAAO,CAAC,GAAG,IAAI,UAAU,EAAE,MAAM,CACxD,CAAC;IACF,IAAI,CAAC;QACH,MAAM,SAAS,CAAC,SAAS,EAAE,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACxG,MAAM,MAAM,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;IAChC,CAAC;YAAS,CAAC;QACT,MAAM,MAAM,CAAC,SAAS,CAAC,CAAC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;YAC/C,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,MAAM,KAAK,CAAC;QACtE,CAAC,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AAED;;;GAGG;AACH,MAAM,OAAO,YAAY;IAGc;IAF5B,eAAe,GAAG,cAAuB,CAAC;IAEnD,YAAqC,IAAY;QAAZ,SAAI,GAAJ,IAAI,CAAQ;IAAG,CAAC;IAErD,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAY;QAC9B,MAAM,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;QAC7B,MAAM,KAAK,CAAC,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACtD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,6CAA6C,CAAC,CAAC;QACjE,CAAC;QACD,OAAO,IAAI,YAAY,CAAC,MAAM,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC;IAClD,CAAC;IAEO,KAAK,CAAC,YAAY,CAAC,KAAa;QACtC,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,UAAU,CAAC,KAAK,CAAC,CAAC,CAAC;QACrD,MAAM,KAAK,CAAC,SAAS,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAC;QACzD,MAAM,IAAI,GAAG,MAAM,KAAK,CAAC,SAAS,CAAC,CAAC;QACpC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,IAAI,IAAI,CAAC,cAAc,EAAE,EAAE,CAAC;YACjD,MAAM,IAAI,KAAK,CAAC,iDAAiD,CAAC,CAAC;QACrE,CAAC;QACD,OAAO,SAAS,CAAC;IACnB,CAAC;IAED,KAAK,CAAC,oBAAoB,CACxB,KAAa,EACb,OAA4D;QAE5D,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,iBAAiB,CAAC,CAAC;QACrE,IAAI,GAAW,CAAC;QAChB,IAAI,CAAC;YACH,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QACrC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YACpE,MAAM,KAAK,CAAC;QACd,CAAC;QACD,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO,0BAA0B,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAY,CAAC,CAAC;IAChE,CAAC;IAED,KAAK,CAAC,cAAc,CAClB,UAAgC,EAChC,OAA4D;QAE5D,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,QAAQ,GAAG,MAAM,0BAA0B,CAAC,UAAU,CAAC,CAAC;QAC9D,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;QAC1D,MAAM,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,iBAAiB,CAAC,EAAE,QAAQ,CAAC,CAAC;QACxE,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,OAAO,MAAM,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,uBAAuB,UAAU,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IACrH,CAAC;IAED,KAAK,CAAC,eAAe,CACnB,MAA0B,EAC1B,OAA4D;QAE5D,YAAY,CAAC,OAAO,CAAC,CAAC;QACtB,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QACxD,MAAM,mBAAmB,CAAC,IAAI,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,MAAM,CAAC,CAAC;QACxE,YAAY,CAAC,OAAO,CAAC,CAAC;IACxB,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,KAAa;QACjC,MAAM,IAAI,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,mBAAmB,CAAC,CAAC;QACvE,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAuB,CAAC;QACxE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAK,KAA+B,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;YACpE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { AiCoderHostEnvironment } from "../../../index.js";
|
|
2
|
+
/**
|
|
3
|
+
* Resolve the exact interpreter contract used by NodeCommandPort.
|
|
4
|
+
*
|
|
5
|
+
* This is deliberately independent of the user's login shell. The same frozen
|
|
6
|
+
* value is exposed to the model and used to build the child-process argv.
|
|
7
|
+
*/
|
|
8
|
+
export declare function nodeCommandHostEnvironment(platform?: NodeJS.Platform, architecture?: string): AiCoderHostEnvironment;
|
|
9
|
+
//# sourceMappingURL=host-environment.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-environment.d.ts","sourceRoot":"","sources":["../../../../src/adapters/node/host/host-environment.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAEhE;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,YAAY,GAAE,MAAqB,GAClC,sBAAsB,CAqBxB"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Resolve the exact interpreter contract used by NodeCommandPort.
|
|
3
|
+
*
|
|
4
|
+
* This is deliberately independent of the user's login shell. The same frozen
|
|
5
|
+
* value is exposed to the model and used to build the child-process argv.
|
|
6
|
+
*/
|
|
7
|
+
export function nodeCommandHostEnvironment(platform = process.platform, architecture = process.arch) {
|
|
8
|
+
if (platform !== "darwin" && platform !== "linux" && platform !== "win32") {
|
|
9
|
+
throw Object.assign(new Error(`run_command is not supported on platform '${platform}'.`), {
|
|
10
|
+
code: "UNAVAILABLE",
|
|
11
|
+
});
|
|
12
|
+
}
|
|
13
|
+
const windows = platform === "win32";
|
|
14
|
+
return Object.freeze({
|
|
15
|
+
architecture: architecture.trim() || "unknown",
|
|
16
|
+
command: Object.freeze({
|
|
17
|
+
argumentsPrefix: Object.freeze(windows ? ["/d", "/s", "/v:off", "/c"] : ["-c"]),
|
|
18
|
+
commandMode: "shell_string",
|
|
19
|
+
executable: windows ? "cmd.exe" : "/bin/sh",
|
|
20
|
+
interactive: false,
|
|
21
|
+
pathStyle: windows ? "windows" : "posix",
|
|
22
|
+
shell: windows ? "cmd" : "sh",
|
|
23
|
+
stdin: "closed",
|
|
24
|
+
tty: false,
|
|
25
|
+
}),
|
|
26
|
+
operatingSystem: platform,
|
|
27
|
+
});
|
|
28
|
+
}
|
|
29
|
+
//# sourceMappingURL=host-environment.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"host-environment.js","sourceRoot":"","sources":["../../../../src/adapters/node/host/host-environment.ts"],"names":[],"mappings":"AAEA;;;;;GAKG;AACH,MAAM,UAAU,0BAA0B,CACxC,WAA4B,OAAO,CAAC,QAAQ,EAC5C,eAAuB,OAAO,CAAC,IAAI;IAEnC,IAAI,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,OAAO,IAAI,QAAQ,KAAK,OAAO,EAAE,CAAC;QAC1E,MAAM,MAAM,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,6CAA6C,QAAQ,IAAI,CAAC,EAAE;YACxF,IAAI,EAAE,aAAa;SACpB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,OAAO,GAAG,QAAQ,KAAK,OAAO,CAAC;IACrC,OAAO,MAAM,CAAC,MAAM,CAAC;QACnB,YAAY,EAAE,YAAY,CAAC,IAAI,EAAE,IAAI,SAAS;QAC9C,OAAO,EAAE,MAAM,CAAC,MAAM,CAAC;YACrB,eAAe,EAAE,MAAM,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YAC/E,WAAW,EAAE,cAAc;YAC3B,UAAU,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,SAAS;YAC3C,WAAW,EAAE,KAAK;YAClB,SAAS,EAAE,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,OAAO;YACxC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;YAC7B,KAAK,EAAE,QAAQ;YACf,GAAG,EAAE,KAAK;SACX,CAAC;QACF,eAAe,EAAE,QAAQ;KAC1B,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import type { CommandRunnerPort, CommandRunResult, PortResult, ToolExecutionContext } from "../../../ports/index.js";
|
|
2
|
+
import { type CommandContainmentMode, type CommandContainmentProbeResult, type CommandContainmentStatus } from "./command-containment.js";
|
|
3
|
+
import { nodeCommandHostEnvironment } from "./host-environment.js";
|
|
4
|
+
export declare class NodeCommandPort implements CommandRunnerPort {
|
|
5
|
+
private readonly scope;
|
|
6
|
+
readonly containmentStatus: CommandContainmentStatus;
|
|
7
|
+
readonly hostEnvironment: ReturnType<typeof nodeCommandHostEnvironment>;
|
|
8
|
+
private constructor();
|
|
9
|
+
static create(workspaceRoot: string, options?: Readonly<{
|
|
10
|
+
containment?: CommandContainmentMode;
|
|
11
|
+
}>): Promise<NodeCommandPort>;
|
|
12
|
+
static probeContainment(): Promise<CommandContainmentProbeResult>;
|
|
13
|
+
run(input: Readonly<{
|
|
14
|
+
command: string;
|
|
15
|
+
cwd?: string;
|
|
16
|
+
env?: Readonly<Record<string, string>>;
|
|
17
|
+
maxOutputBytes?: number;
|
|
18
|
+
timeoutMs?: number;
|
|
19
|
+
}>, context: ToolExecutionContext): Promise<PortResult<CommandRunResult>>;
|
|
20
|
+
}
|
|
21
|
+
//# sourceMappingURL=node-command-port.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-command-port.d.ts","sourceRoot":"","sources":["../../../../src/adapters/node/host/node-command-port.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,iBAAiB,EACjB,gBAAgB,EAGhB,UAAU,EACV,oBAAoB,EACrB,MAAM,yBAAyB,CAAC;AAIjC,OAAO,EAKL,KAAK,sBAAsB,EAC3B,KAAK,6BAA6B,EAClC,KAAK,wBAAwB,EAC9B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAgHnE,qBAAa,eAAgB,YAAW,iBAAiB;IAErD,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,QAAQ,CAAC,iBAAiB,EAAE,wBAAwB;IACpD,QAAQ,CAAC,eAAe,EAAE,UAAU,CAAC,OAAO,0BAA0B,CAAC;IAHzE,OAAO;WAMM,MAAM,CACjB,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,QAAQ,CAAC;QAAE,WAAW,CAAC,EAAE,sBAAsB,CAAA;KAAE,CAAM,GAC/D,OAAO,CAAC,eAAe,CAAC;WAYd,gBAAgB,IAAI,OAAO,CAAC,6BAA6B,CAAC;IAIjE,GAAG,CACP,KAAK,EAAE,QAAQ,CAAC;QACd,OAAO,EAAE,MAAM,CAAC;QAChB,GAAG,CAAC,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;QACvC,cAAc,CAAC,EAAE,MAAM,CAAC;QACxB,SAAS,CAAC,EAAE,MAAM,CAAC;KACpB,CAAC,EACF,OAAO,EAAE,oBAAoB,GAC5B,OAAO,CAAC,UAAU,CAAC,gBAAgB,CAAC,CAAC;CA2IzC"}
|
|
@@ -0,0 +1,281 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { lstat } from "node:fs/promises";
|
|
3
|
+
import { assertWorkspaceHasNoHardLinks, buildBubblewrapArguments, containmentStatus, probeCommandContainment, } from "./command-containment.js";
|
|
4
|
+
import { nodeCommandHostEnvironment } from "./host-environment.js";
|
|
5
|
+
import { WorkspaceScope } from "./path-scope.js";
|
|
6
|
+
const DEFAULT_TIMEOUT_MS = 120_000;
|
|
7
|
+
const DEFAULT_MAX_OUTPUT_BYTES = 256 * 1024;
|
|
8
|
+
const MAX_OUTPUT_BYTES = 4 * 1024 * 1024;
|
|
9
|
+
function failure(code, message, retryable = false) {
|
|
10
|
+
return Object.freeze({ ok: false, error: Object.freeze({ code, message, retryable }) });
|
|
11
|
+
}
|
|
12
|
+
class TailBuffer {
|
|
13
|
+
maxBytes;
|
|
14
|
+
value = Buffer.alloc(0);
|
|
15
|
+
didTruncate = false;
|
|
16
|
+
constructor(maxBytes) {
|
|
17
|
+
this.maxBytes = maxBytes;
|
|
18
|
+
}
|
|
19
|
+
append(chunk) {
|
|
20
|
+
const buffer = Buffer.isBuffer(chunk) ? chunk : Buffer.from(chunk, "utf8");
|
|
21
|
+
const combined = Buffer.concat([this.value, buffer]);
|
|
22
|
+
if (combined.length > this.maxBytes) {
|
|
23
|
+
this.didTruncate = true;
|
|
24
|
+
this.value = combined.subarray(combined.length - this.maxBytes);
|
|
25
|
+
}
|
|
26
|
+
else {
|
|
27
|
+
this.value = combined;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
get text() {
|
|
31
|
+
let decoded = this.value.toString("utf8");
|
|
32
|
+
// stdout/stderr are byte streams and may be truncated in the middle of a
|
|
33
|
+
// UTF-8 sequence. Replacement characters can encode to more bytes than
|
|
34
|
+
// the retained buffer, so trim complete code points until the public text
|
|
35
|
+
// representation also honours maxOutputBytes.
|
|
36
|
+
while (Buffer.byteLength(decoded, "utf8") > this.maxBytes) {
|
|
37
|
+
const first = decoded.codePointAt(0);
|
|
38
|
+
if (first === undefined)
|
|
39
|
+
break;
|
|
40
|
+
decoded = decoded.slice(first > 0xffff ? 2 : 1);
|
|
41
|
+
}
|
|
42
|
+
return decoded;
|
|
43
|
+
}
|
|
44
|
+
get truncated() {
|
|
45
|
+
return this.didTruncate;
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
function terminate(child, signal) {
|
|
49
|
+
if (child.pid === undefined)
|
|
50
|
+
return;
|
|
51
|
+
if (process.platform === "win32") {
|
|
52
|
+
try {
|
|
53
|
+
const killer = spawn("taskkill", ["/pid", String(child.pid), "/T", "/F"], {
|
|
54
|
+
stdio: "ignore",
|
|
55
|
+
windowsHide: true,
|
|
56
|
+
});
|
|
57
|
+
killer.once("error", () => child.kill(signal));
|
|
58
|
+
killer.unref();
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
catch {
|
|
62
|
+
child.kill(signal);
|
|
63
|
+
return;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
try {
|
|
67
|
+
process.kill(-child.pid, signal);
|
|
68
|
+
return;
|
|
69
|
+
}
|
|
70
|
+
catch {
|
|
71
|
+
// Fall through when the process group has already ended.
|
|
72
|
+
}
|
|
73
|
+
child.kill(signal);
|
|
74
|
+
}
|
|
75
|
+
function commandEnvironment(overrides) {
|
|
76
|
+
if (overrides !== undefined && (typeof overrides !== "object" || overrides === null || Array.isArray(overrides))) {
|
|
77
|
+
throw Object.assign(new Error("Command environment overrides must be an object."), { code: "INVALID_INPUT" });
|
|
78
|
+
}
|
|
79
|
+
const inheritedNames = ["PATH", "LANG", "LC_ALL", "TERM", "TMPDIR", "TMP", "TEMP", "SystemRoot", "ComSpec", "PATHEXT"];
|
|
80
|
+
const environment = { CI: "1", FORCE_COLOR: "0" };
|
|
81
|
+
for (const name of inheritedNames) {
|
|
82
|
+
const value = process.env[name];
|
|
83
|
+
if (value !== undefined)
|
|
84
|
+
environment[name] = value;
|
|
85
|
+
}
|
|
86
|
+
for (const [name, value] of Object.entries(overrides ?? {})) {
|
|
87
|
+
if (typeof value !== "string" || !/^[A-Za-z_][A-Za-z0-9_]*$/.test(name) || value.includes("\0")) {
|
|
88
|
+
throw Object.assign(new Error(`Invalid environment entry '${name}'.`), { code: "INVALID_INPUT" });
|
|
89
|
+
}
|
|
90
|
+
environment[name] = value;
|
|
91
|
+
}
|
|
92
|
+
return environment;
|
|
93
|
+
}
|
|
94
|
+
function exceptionFailure(error) {
|
|
95
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
96
|
+
const nativeCode = typeof error === "object" && error !== null && "code" in error
|
|
97
|
+
? String(error.code ?? "COMMAND_ERROR")
|
|
98
|
+
: "COMMAND_ERROR";
|
|
99
|
+
const code = nativeCode === "INVALID_INPUT"
|
|
100
|
+
? "INVALID_INPUT"
|
|
101
|
+
: nativeCode === "PERMISSION_DENIED" || nativeCode === "EACCES" || nativeCode === "EPERM"
|
|
102
|
+
? "PERMISSION_DENIED"
|
|
103
|
+
: nativeCode === "ENOENT" || nativeCode === "ENOTDIR"
|
|
104
|
+
? "NOT_FOUND"
|
|
105
|
+
: nativeCode === "CANCELED" || nativeCode === "ABORT_ERR"
|
|
106
|
+
? "CANCELED"
|
|
107
|
+
: nativeCode === "DEADLINE_EXCEEDED"
|
|
108
|
+
? "DEADLINE_EXCEEDED"
|
|
109
|
+
: nativeCode === "EAGAIN" || nativeCode === "EBUSY"
|
|
110
|
+
? "UNAVAILABLE"
|
|
111
|
+
: "IO_ERROR";
|
|
112
|
+
return failure(code, message, code === "UNAVAILABLE");
|
|
113
|
+
}
|
|
114
|
+
export class NodeCommandPort {
|
|
115
|
+
scope;
|
|
116
|
+
containmentStatus;
|
|
117
|
+
hostEnvironment;
|
|
118
|
+
constructor(scope, containmentStatus, hostEnvironment) {
|
|
119
|
+
this.scope = scope;
|
|
120
|
+
this.containmentStatus = containmentStatus;
|
|
121
|
+
this.hostEnvironment = hostEnvironment;
|
|
122
|
+
}
|
|
123
|
+
static async create(workspaceRoot, options = {}) {
|
|
124
|
+
const mode = options.containment ?? "best_effort";
|
|
125
|
+
if (mode !== "best_effort" && mode !== "required") {
|
|
126
|
+
throw Object.assign(new Error("containment must be 'best_effort' or 'required'."), { code: "INVALID_INPUT" });
|
|
127
|
+
}
|
|
128
|
+
const [scope, probe] = await Promise.all([
|
|
129
|
+
WorkspaceScope.create(workspaceRoot),
|
|
130
|
+
probeCommandContainment(),
|
|
131
|
+
]);
|
|
132
|
+
return new NodeCommandPort(scope, containmentStatus(mode, probe), nodeCommandHostEnvironment());
|
|
133
|
+
}
|
|
134
|
+
static async probeContainment() {
|
|
135
|
+
return await probeCommandContainment();
|
|
136
|
+
}
|
|
137
|
+
async run(input, context) {
|
|
138
|
+
if (context.signal.aborted)
|
|
139
|
+
return failure("CANCELED", "The run was canceled.");
|
|
140
|
+
if (context.deadline <= Date.now())
|
|
141
|
+
return failure("DEADLINE_EXCEEDED", "The run deadline elapsed.");
|
|
142
|
+
if (typeof input.command !== "string" || input.command.trim().length === 0 || input.command.length > 32_768) {
|
|
143
|
+
return failure("INVALID_INPUT", "Command must contain between 1 and 32768 characters.");
|
|
144
|
+
}
|
|
145
|
+
try {
|
|
146
|
+
const cwd = await this.scope.resolveExisting(input.cwd ?? ".");
|
|
147
|
+
if (!(await lstat(cwd)).isDirectory()) {
|
|
148
|
+
return failure("INVALID_INPUT", "Command cwd must be a workspace directory.");
|
|
149
|
+
}
|
|
150
|
+
if (context.signal.aborted)
|
|
151
|
+
return failure("CANCELED", "The run was canceled.");
|
|
152
|
+
const deadlineRemaining = context.deadline - Date.now();
|
|
153
|
+
if (deadlineRemaining <= 0)
|
|
154
|
+
return failure("DEADLINE_EXCEEDED", "The run deadline elapsed.");
|
|
155
|
+
const requestedTimeout = input.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
156
|
+
if (!Number.isSafeInteger(requestedTimeout) || requestedTimeout < 1) {
|
|
157
|
+
return failure("INVALID_INPUT", "timeoutMs must be a positive integer.");
|
|
158
|
+
}
|
|
159
|
+
const timeoutMs = Math.min(requestedTimeout, deadlineRemaining);
|
|
160
|
+
const maxOutputBytes = input.maxOutputBytes ?? DEFAULT_MAX_OUTPUT_BYTES;
|
|
161
|
+
if (!Number.isSafeInteger(maxOutputBytes) || maxOutputBytes < 1 || maxOutputBytes > MAX_OUTPUT_BYTES) {
|
|
162
|
+
return failure("INVALID_INPUT", `maxOutputBytes must be between 1 and ${MAX_OUTPUT_BYTES}.`);
|
|
163
|
+
}
|
|
164
|
+
const stdout = new TailBuffer(maxOutputBytes);
|
|
165
|
+
const stderr = new TailBuffer(maxOutputBytes);
|
|
166
|
+
const environment = commandEnvironment(input.env);
|
|
167
|
+
const startedAt = Date.now();
|
|
168
|
+
if (this.containmentStatus.mode === "required" && !this.containmentStatus.active) {
|
|
169
|
+
return failure("UNAVAILABLE", `Required command containment is unavailable (${this.containmentStatus.backend}/${this.containmentStatus.state}): ${this.containmentStatus.reason ?? "the backend did not pass conformance"}`);
|
|
170
|
+
}
|
|
171
|
+
let launchCommand = this.hostEnvironment.command.executable;
|
|
172
|
+
let launchArguments = Object.freeze([
|
|
173
|
+
...this.hostEnvironment.command.argumentsPrefix,
|
|
174
|
+
input.command,
|
|
175
|
+
]);
|
|
176
|
+
let launchCwd = cwd;
|
|
177
|
+
let launchEnvironment = environment;
|
|
178
|
+
if (this.containmentStatus.active) {
|
|
179
|
+
if (this.containmentStatus.backend !== "linux_bubblewrap" || this.containmentStatus.executable === null) {
|
|
180
|
+
return failure("UNAVAILABLE", "The active command-containment backend has no executable implementation.");
|
|
181
|
+
}
|
|
182
|
+
await assertWorkspaceHasNoHardLinks(this.scope.root);
|
|
183
|
+
launchCommand = this.containmentStatus.executable;
|
|
184
|
+
launchEnvironment = {
|
|
185
|
+
...environment,
|
|
186
|
+
HOME: "/tmp",
|
|
187
|
+
TEMP: "/tmp",
|
|
188
|
+
TMP: "/tmp",
|
|
189
|
+
TMPDIR: "/tmp",
|
|
190
|
+
};
|
|
191
|
+
launchArguments = buildBubblewrapArguments({
|
|
192
|
+
command: this.hostEnvironment.command.executable,
|
|
193
|
+
commandArguments: Object.freeze([
|
|
194
|
+
...this.hostEnvironment.command.argumentsPrefix,
|
|
195
|
+
input.command,
|
|
196
|
+
]),
|
|
197
|
+
cwd,
|
|
198
|
+
environment: launchEnvironment,
|
|
199
|
+
workspace: this.scope.root,
|
|
200
|
+
});
|
|
201
|
+
launchCwd = this.scope.root;
|
|
202
|
+
}
|
|
203
|
+
return await new Promise((resolveResult) => {
|
|
204
|
+
const child = spawn(launchCommand, [...launchArguments], {
|
|
205
|
+
cwd: launchCwd,
|
|
206
|
+
env: launchEnvironment,
|
|
207
|
+
shell: false,
|
|
208
|
+
detached: process.platform !== "win32",
|
|
209
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
210
|
+
windowsHide: true,
|
|
211
|
+
});
|
|
212
|
+
let status = "exited";
|
|
213
|
+
let settled = false;
|
|
214
|
+
let terminationRequested = false;
|
|
215
|
+
let killTimer;
|
|
216
|
+
const abort = () => {
|
|
217
|
+
if (settled || terminationRequested)
|
|
218
|
+
return;
|
|
219
|
+
terminationRequested = true;
|
|
220
|
+
status = "canceled";
|
|
221
|
+
terminate(child, "SIGTERM");
|
|
222
|
+
killTimer = setTimeout(() => terminate(child, "SIGKILL"), 750);
|
|
223
|
+
killTimer.unref();
|
|
224
|
+
};
|
|
225
|
+
const timeout = setTimeout(() => {
|
|
226
|
+
if (settled || terminationRequested)
|
|
227
|
+
return;
|
|
228
|
+
terminationRequested = true;
|
|
229
|
+
status = "timed_out";
|
|
230
|
+
terminate(child, "SIGTERM");
|
|
231
|
+
killTimer = setTimeout(() => terminate(child, "SIGKILL"), 750);
|
|
232
|
+
killTimer.unref();
|
|
233
|
+
}, timeoutMs);
|
|
234
|
+
timeout.unref();
|
|
235
|
+
context.signal.addEventListener("abort", abort, { once: true });
|
|
236
|
+
// AbortSignal may have fired between the preflight check and listener
|
|
237
|
+
// registration. Re-read it after subscribing to close that race.
|
|
238
|
+
if (context.signal.aborted)
|
|
239
|
+
abort();
|
|
240
|
+
child.stdout?.on("data", (chunk) => stdout.append(chunk));
|
|
241
|
+
child.stderr?.on("data", (chunk) => stderr.append(chunk));
|
|
242
|
+
child.once("error", (error) => {
|
|
243
|
+
if (settled)
|
|
244
|
+
return;
|
|
245
|
+
settled = true;
|
|
246
|
+
clearTimeout(timeout);
|
|
247
|
+
if (killTimer !== undefined)
|
|
248
|
+
clearTimeout(killTimer);
|
|
249
|
+
context.signal.removeEventListener("abort", abort);
|
|
250
|
+
resolveResult(exceptionFailure(error));
|
|
251
|
+
});
|
|
252
|
+
child.once("close", (exitCode) => {
|
|
253
|
+
if (settled)
|
|
254
|
+
return;
|
|
255
|
+
settled = true;
|
|
256
|
+
clearTimeout(timeout);
|
|
257
|
+
if (killTimer !== undefined)
|
|
258
|
+
clearTimeout(killTimer);
|
|
259
|
+
context.signal.removeEventListener("abort", abort);
|
|
260
|
+
resolveResult({
|
|
261
|
+
ok: true,
|
|
262
|
+
data: Object.freeze({
|
|
263
|
+
command: input.command,
|
|
264
|
+
durationMs: Date.now() - startedAt,
|
|
265
|
+
exitCode,
|
|
266
|
+
status,
|
|
267
|
+
stdout: stdout.text,
|
|
268
|
+
stderr: stderr.text,
|
|
269
|
+
stdoutTruncated: stdout.truncated,
|
|
270
|
+
stderrTruncated: stderr.truncated,
|
|
271
|
+
}),
|
|
272
|
+
});
|
|
273
|
+
});
|
|
274
|
+
});
|
|
275
|
+
}
|
|
276
|
+
catch (error) {
|
|
277
|
+
return exceptionFailure(error);
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
}
|
|
281
|
+
//# sourceMappingURL=node-command-port.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-command-port.js","sourceRoot":"","sources":["../../../../src/adapters/node/host/node-command-port.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { type AiCoderResumeWorkspaceVerifier, type AiCoderWorkspaceCheckpointSnapshot, type PortResult, type RunExecutionContext } from "../../../index.js";
|
|
2
|
+
export interface NodeWorkspaceEvidenceVerifierOptions {
|
|
3
|
+
/** Content bytes hashed for authored files. Derived-directory files use metadata. */
|
|
4
|
+
readonly maxHashedBytes?: number;
|
|
5
|
+
readonly maxEntries?: number;
|
|
6
|
+
}
|
|
7
|
+
export declare class NodeWorkspaceEvidenceVerifier implements AiCoderResumeWorkspaceVerifier {
|
|
8
|
+
private readonly workspaceRoot;
|
|
9
|
+
private readonly scope;
|
|
10
|
+
private readonly maxEntries;
|
|
11
|
+
private readonly maxHashedBytes;
|
|
12
|
+
readonly consistency: "serialized_workspace";
|
|
13
|
+
private constructor();
|
|
14
|
+
static create(workspaceRoot: string, options?: NodeWorkspaceEvidenceVerifierOptions): Promise<NodeWorkspaceEvidenceVerifier>;
|
|
15
|
+
private fingerprint;
|
|
16
|
+
capture(input: Parameters<AiCoderResumeWorkspaceVerifier["capture"]>[0], context: RunExecutionContext): Promise<PortResult<AiCoderWorkspaceCheckpointSnapshot>>;
|
|
17
|
+
verify(snapshot: AiCoderWorkspaceCheckpointSnapshot, context: RunExecutionContext): Promise<PortResult<Readonly<{
|
|
18
|
+
currentFingerprint: string;
|
|
19
|
+
matches: boolean;
|
|
20
|
+
}>>>;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=node-workspace-evidence-verifier.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"node-workspace-evidence-verifier.d.ts","sourceRoot":"","sources":["../../../../src/adapters/node/host/node-workspace-evidence-verifier.ts"],"names":[],"mappings":"AAAA,OAAO,EAGL,KAAK,8BAA8B,EACnC,KAAK,kCAAkC,EACvC,KAAK,UAAU,EACf,KAAK,mBAAmB,EACzB,MAAM,mBAAmB,CAAC;AA4B3B,MAAM,WAAW,oCAAoC;IACnD,qFAAqF;IACrF,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;CAC9B;AAgED,qBAAa,6BAA8B,YAAW,8BAA8B;IAGhF,OAAO,CAAC,QAAQ,CAAC,aAAa;IAC9B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc;IALjC,QAAQ,CAAC,WAAW,EAAG,sBAAsB,CAAU;IACvD,OAAO;WAOM,MAAM,CACjB,aAAa,EAAE,MAAM,EACrB,OAAO,GAAE,oCAAyC,GACjD,OAAO,CAAC,6BAA6B,CAAC;YAkB3B,WAAW;IA0PnB,OAAO,CACX,KAAK,EAAE,UAAU,CAAC,8BAA8B,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,EAC/D,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,UAAU,CAAC,kCAAkC,CAAC,CAAC;IAYpD,MAAM,CACV,QAAQ,EAAE,kCAAkC,EAC5C,OAAO,EAAE,mBAAmB,GAC3B,OAAO,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,kBAAkB,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,OAAO,CAAA;KAAE,CAAC,CAAC,CAAC;CAWnF"}
|