@shield-agent/kya 0.1.18 → 0.1.20
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/.mcp.json +1 -1
- package/LIMITATIONS.md +1 -0
- package/README.md +15 -3
- package/claude/claude_desktop_config.example.json +1 -1
- package/dist/cli.d.ts.map +1 -1
- package/dist/cli.js +6 -0
- package/dist/cli.js.map +1 -1
- package/dist/client.d.ts +2 -0
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +1 -0
- package/dist/client.js.map +1 -1
- package/dist/commands/eval-tool.d.ts +2 -0
- package/dist/commands/eval-tool.d.ts.map +1 -1
- package/dist/commands/eval-tool.js +12 -2
- package/dist/commands/eval-tool.js.map +1 -1
- package/dist/commands/orr.d.ts +3 -0
- package/dist/commands/orr.d.ts.map +1 -1
- package/dist/commands/orr.js +23 -51
- package/dist/commands/orr.js.map +1 -1
- package/dist/commands/sandbox.d.ts +3 -0
- package/dist/commands/sandbox.d.ts.map +1 -0
- package/dist/commands/sandbox.js +82 -0
- package/dist/commands/sandbox.js.map +1 -0
- package/dist/commands/wrap.d.ts +1 -0
- package/dist/commands/wrap.d.ts.map +1 -1
- package/dist/offline-evaluate.d.ts.map +1 -1
- package/dist/offline-evaluate.js +15 -0
- package/dist/offline-evaluate.js.map +1 -1
- package/dist/orr/scorecard.d.ts +30 -0
- package/dist/orr/scorecard.d.ts.map +1 -0
- package/dist/orr/scorecard.js +107 -0
- package/dist/orr/scorecard.js.map +1 -0
- package/dist/sample-tools.d.ts +2 -0
- package/dist/sample-tools.d.ts.map +1 -1
- package/dist/sample-tools.js +38 -0
- package/dist/sample-tools.js.map +1 -1
- package/dist/sandbox/firecracker-driver.d.ts +7 -0
- package/dist/sandbox/firecracker-driver.d.ts.map +1 -0
- package/dist/sandbox/firecracker-driver.js +99 -0
- package/dist/sandbox/firecracker-driver.js.map +1 -0
- package/dist/sandbox/id.d.ts +4 -0
- package/dist/sandbox/id.d.ts.map +1 -0
- package/dist/sandbox/id.js +11 -0
- package/dist/sandbox/id.js.map +1 -0
- package/dist/sandbox/mock-driver.d.ts +6 -0
- package/dist/sandbox/mock-driver.d.ts.map +1 -0
- package/dist/sandbox/mock-driver.js +25 -0
- package/dist/sandbox/mock-driver.js.map +1 -0
- package/dist/sandbox/path-jail.d.ts +4 -0
- package/dist/sandbox/path-jail.d.ts.map +1 -0
- package/dist/sandbox/path-jail.js +22 -0
- package/dist/sandbox/path-jail.js.map +1 -0
- package/dist/sandbox/runtime.d.ts +18 -0
- package/dist/sandbox/runtime.d.ts.map +1 -0
- package/dist/sandbox/runtime.js +71 -0
- package/dist/sandbox/runtime.js.map +1 -0
- package/dist/sandbox/types.d.ts +26 -0
- package/dist/sandbox/types.d.ts.map +1 -0
- package/dist/sandbox/types.js +2 -0
- package/dist/sandbox/types.js.map +1 -0
- package/gemini/settings.example.json +1 -1
- package/grok/README.md +1 -1
- package/manifest.json +1 -1
- package/mcp.json +1 -1
- package/openai/codex.config.example.toml +1 -1
- package/package.json +1 -1
- package/server.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.d.ts","sourceRoot":"","sources":["../../src/commands/sandbox.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAkBnD,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,MAAM,CAAC,CAiG3E"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { resolveConfig } from "../config.js";
|
|
2
|
+
import { UsageError } from "../errors.js";
|
|
3
|
+
import { flagBool, flagString } from "../parse-args.js";
|
|
4
|
+
import { runEvalTool } from "./eval-tool.js";
|
|
5
|
+
import { assertSandboxId } from "../sandbox/id.js";
|
|
6
|
+
import { jailRoot } from "../sandbox/path-jail.js";
|
|
7
|
+
import { killSandbox, loadSandboxState, resolveSandboxDriver, spawnSandbox, } from "../sandbox/runtime.js";
|
|
8
|
+
function verdictExit(verdict) {
|
|
9
|
+
if (verdict === "DENY")
|
|
10
|
+
return 1;
|
|
11
|
+
if (verdict === "REQUIRE_APPROVE")
|
|
12
|
+
return 4;
|
|
13
|
+
return 0;
|
|
14
|
+
}
|
|
15
|
+
export async function runSandboxCommand(parsed) {
|
|
16
|
+
const sub = parsed.positionals[0];
|
|
17
|
+
if (!sub) {
|
|
18
|
+
throw new UsageError("sandbox requires a subcommand: spawn | exec | kill | status");
|
|
19
|
+
}
|
|
20
|
+
const offlineFlag = flagBool(parsed.flags, "offline");
|
|
21
|
+
const apiKey = process.env.KYA_API_KEY?.trim();
|
|
22
|
+
const useOffline = offlineFlag || !apiKey;
|
|
23
|
+
const config = resolveConfig({
|
|
24
|
+
flags: parsed.flags,
|
|
25
|
+
requireApiKey: !useOffline,
|
|
26
|
+
allowMissingApiKey: useOffline,
|
|
27
|
+
offline: useOffline,
|
|
28
|
+
});
|
|
29
|
+
const root = jailRoot(flagString(parsed.flags, "path") ?? process.cwd());
|
|
30
|
+
const driver = resolveSandboxDriver(flagString(parsed.flags, "sandbox") ?? process.env.KYA_SANDBOX);
|
|
31
|
+
async function evaluate(toolId, irreversible, sandboxId) {
|
|
32
|
+
const result = await runEvalTool(config, {
|
|
33
|
+
toolId,
|
|
34
|
+
irreversible,
|
|
35
|
+
sandboxId,
|
|
36
|
+
offline: useOffline,
|
|
37
|
+
});
|
|
38
|
+
return result.response;
|
|
39
|
+
}
|
|
40
|
+
if (sub === "spawn") {
|
|
41
|
+
const policy = await evaluate("org.sample.sandbox.spawn", true);
|
|
42
|
+
if (policy.verdict !== "ALLOW") {
|
|
43
|
+
process.stdout.write(`verdict: ${policy.verdict}\nreasonCode: ${policy.reasonCode}\nsideEffect: blocked\n`);
|
|
44
|
+
return verdictExit(policy.verdict);
|
|
45
|
+
}
|
|
46
|
+
const row = await spawnSandbox({
|
|
47
|
+
root,
|
|
48
|
+
driver,
|
|
49
|
+
agentId: config.agentId,
|
|
50
|
+
});
|
|
51
|
+
process.stdout.write([`sandboxId: ${row.sandboxId}`, `backend: ${row.backend}`, ""].join("\n"));
|
|
52
|
+
return 0;
|
|
53
|
+
}
|
|
54
|
+
if (sub === "exec") {
|
|
55
|
+
const sandboxId = assertSandboxId(flagString(parsed.flags, "sandbox-id", "sandboxId"));
|
|
56
|
+
const policy = await evaluate("org.sample.sandbox.exec", true, sandboxId);
|
|
57
|
+
if (policy.verdict !== "ALLOW") {
|
|
58
|
+
process.stdout.write(`verdict: ${policy.verdict}\nreasonCode: ${policy.reasonCode}\nsideEffect: blocked\n`);
|
|
59
|
+
return verdictExit(policy.verdict);
|
|
60
|
+
}
|
|
61
|
+
const cmdRaw = flagString(parsed.flags, "cmd") ?? "true";
|
|
62
|
+
const result = await driver.exec({
|
|
63
|
+
sandboxId,
|
|
64
|
+
command: cmdRaw.split(/\s+/).filter(Boolean),
|
|
65
|
+
});
|
|
66
|
+
process.stdout.write(`verdict: ALLOW\nexitCode: ${result.exitCode}\nstdout: ${result.stdout}\n`);
|
|
67
|
+
return result.exitCode;
|
|
68
|
+
}
|
|
69
|
+
if (sub === "kill") {
|
|
70
|
+
const sandboxId = assertSandboxId(flagString(parsed.flags, "sandbox-id", "sandboxId"));
|
|
71
|
+
await killSandbox({ root, driver, sandboxId });
|
|
72
|
+
process.stdout.write(`killed: ${sandboxId}\n`);
|
|
73
|
+
return 0;
|
|
74
|
+
}
|
|
75
|
+
if (sub === "status") {
|
|
76
|
+
const rows = loadSandboxState(root);
|
|
77
|
+
process.stdout.write(JSON.stringify(rows, null, 2) + "\n");
|
|
78
|
+
return 0;
|
|
79
|
+
}
|
|
80
|
+
throw new UsageError(`unknown sandbox subcommand: ${sub}`);
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=sandbox.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sandbox.js","sourceRoot":"","sources":["../../src/commands/sandbox.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,OAAO,EAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AACxD,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AACnD,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAC;AACnD,OAAO,EACL,WAAW,EACX,gBAAgB,EAChB,oBAAoB,EACpB,YAAY,GACb,MAAM,uBAAuB,CAAC;AAE/B,SAAS,WAAW,CAAC,OAAe;IAClC,IAAI,OAAO,KAAK,MAAM;QAAE,OAAO,CAAC,CAAC;IACjC,IAAI,OAAO,KAAK,iBAAiB;QAAE,OAAO,CAAC,CAAC;IAC5C,OAAO,CAAC,CAAC;AACX,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAkB;IACxD,MAAM,GAAG,GAAG,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;IAClC,IAAI,CAAC,GAAG,EAAE,CAAC;QACT,MAAM,IAAI,UAAU,CAClB,6DAA6D,CAC9D,CAAC;IACJ,CAAC;IAED,MAAM,WAAW,GAAG,QAAQ,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC;IACtD,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,IAAI,EAAE,CAAC;IAC/C,MAAM,UAAU,GAAG,WAAW,IAAI,CAAC,MAAM,CAAC;IAC1C,MAAM,MAAM,GAAG,aAAa,CAAC;QAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;QACnB,aAAa,EAAE,CAAC,UAAU;QAC1B,kBAAkB,EAAE,UAAU;QAC9B,OAAO,EAAE,UAAU;KACpB,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,IAAI,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC;IACzE,MAAM,MAAM,GAAG,oBAAoB,CACjC,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,SAAS,CAAC,IAAI,OAAO,CAAC,GAAG,CAAC,WAAW,CAC/D,CAAC;IAEF,KAAK,UAAU,QAAQ,CACrB,MAAc,EACd,YAAqB,EACrB,SAAkB;QAElB,MAAM,MAAM,GAAG,MAAM,WAAW,CAAC,MAAM,EAAE;YACvC,MAAM;YACN,YAAY;YACZ,SAAS;YACT,OAAO,EAAE,UAAU;SACpB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAI,GAAG,KAAK,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,0BAA0B,EAAE,IAAI,CAAC,CAAC;QAChE,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,YAAY,MAAM,CAAC,OAAO,iBAAiB,MAAM,CAAC,UAAU,yBAAyB,CACtF,CAAC;YACF,OAAO,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,GAAG,GAAG,MAAM,YAAY,CAAC;YAC7B,IAAI;YACJ,MAAM;YACN,OAAO,EAAE,MAAM,CAAC,OAAO;SACxB,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,CAAC,cAAc,GAAG,CAAC,SAAS,EAAE,EAAE,YAAY,GAAG,CAAC,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAC1E,CAAC;QACF,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,eAAe,CAC/B,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,WAAW,CAAC,CACpD,CAAC;QACF,MAAM,MAAM,GAAG,MAAM,QAAQ,CAC3B,yBAAyB,EACzB,IAAI,EACJ,SAAS,CACV,CAAC;QACF,IAAI,MAAM,CAAC,OAAO,KAAK,OAAO,EAAE,CAAC;YAC/B,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,YAAY,MAAM,CAAC,OAAO,iBAAiB,MAAM,CAAC,UAAU,yBAAyB,CACtF,CAAC;YACF,OAAO,WAAW,CAAC,MAAM,CAAC,OAAO,CAAC,CAAC;QACrC,CAAC;QACD,MAAM,MAAM,GAAG,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC;QACzD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC;YAC/B,SAAS;YACT,OAAO,EAAE,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,MAAM,CAAC,OAAO,CAAC;SAC7C,CAAC,CAAC;QACH,OAAO,CAAC,MAAM,CAAC,KAAK,CAClB,6BAA6B,MAAM,CAAC,QAAQ,aAAa,MAAM,CAAC,MAAM,IAAI,CAC3E,CAAC;QACF,OAAO,MAAM,CAAC,QAAQ,CAAC;IACzB,CAAC;IAED,IAAI,GAAG,KAAK,MAAM,EAAE,CAAC;QACnB,MAAM,SAAS,GAAG,eAAe,CAC/B,UAAU,CAAC,MAAM,CAAC,KAAK,EAAE,YAAY,EAAE,WAAW,CAAC,CACpD,CAAC;QACF,MAAM,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QAC/C,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,SAAS,IAAI,CAAC,CAAC;QAC/C,OAAO,CAAC,CAAC;IACX,CAAC;IAED,IAAI,GAAG,KAAK,QAAQ,EAAE,CAAC;QACrB,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC;QAC3D,OAAO,CAAC,CAAC;IACX,CAAC;IAED,MAAM,IAAI,UAAU,CAAC,+BAA+B,GAAG,EAAE,CAAC,CAAC;AAC7D,CAAC"}
|
package/dist/commands/wrap.d.ts
CHANGED
|
@@ -28,6 +28,7 @@ export declare function wrapInputFromArgs(parsed: ParsedArgs): {
|
|
|
28
28
|
irreversible: boolean;
|
|
29
29
|
sessionRisk?: string;
|
|
30
30
|
approvalStatus?: string;
|
|
31
|
+
sandboxId?: string;
|
|
31
32
|
offline: boolean;
|
|
32
33
|
};
|
|
33
34
|
export declare function formatWrapHuman(result: WrapResult): string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../src/commands/wrap.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,aAAa,EACb,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qGAAqG;AACrG,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKnE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAEvD;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE;IACL,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,EACD,MAAM,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC,UAAU,CAAC,CAmErB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU
|
|
1
|
+
{"version":3,"file":"wrap.d.ts","sourceRoot":"","sources":["../../src/commands/wrap.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,EACL,aAAa,EACb,KAAK,gBAAgB,EACtB,MAAM,cAAc,CAAC;AAEtB,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,kBAAkB,CAAC;AAEnD,OAAO,EAGL,KAAK,cAAc,EACpB,MAAM,gBAAgB,CAAC;AAExB,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;IAC9B,QAAQ,CAAC,UAAU,EAAE,SAAS,CAAC;IAC/B,QAAQ,CAAC,QAAQ,CAAC,EAAE,gBAAgB,CAAC;IACrC,QAAQ,CAAC,UAAU,CAAC,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,IAAI,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,qGAAqG;AACrG,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAKnE;AAED,wBAAgB,YAAY,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAEvD;AAED,wBAAsB,OAAO,CAC3B,MAAM,EAAE,cAAc,EACtB,KAAK,EAAE;IACL,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,YAAY,CAAC,EAAE,OAAO,CAAC;IACvB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,EACD,MAAM,CAAC,EAAE,aAAa,GACrB,OAAO,CAAC,UAAU,CAAC,CAmErB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU;;;;;;;;;EAMnD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAiB1D"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offline-evaluate.d.ts","sourceRoot":"","sources":["../src/offline-evaluate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAoC,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEzF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAoCpD,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EACpD,IAAI,EAAE,WAAW,GAAG,SAAS,GAC5B;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAWhD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,qBAAqB,EAC1B,IAAI,GAAE,IAAY,GACjB,sBAAsB,
|
|
1
|
+
{"version":3,"file":"offline-evaluate.d.ts","sourceRoot":"","sources":["../src/offline-evaluate.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AACxC,OAAO,KAAK,EAAE,qBAAqB,EAAE,sBAAsB,EAAE,MAAM,aAAa,CAAC;AACjF,OAAO,EAAoC,KAAK,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAEzF,MAAM,MAAM,WAAW,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAoCpD,4FAA4F;AAC5F,wBAAgB,gBAAgB,CAC9B,IAAI,EAAE;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,EACpD,IAAI,EAAE,WAAW,GAAG,SAAS,GAC5B;IAAE,OAAO,EAAE,aAAa,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,CAWhD;AAED;;;GAGG;AACH,wBAAgB,eAAe,CAC7B,GAAG,EAAE,qBAAqB,EAC1B,IAAI,GAAE,IAAY,GACjB,sBAAsB,CAiCxB"}
|
package/dist/offline-evaluate.js
CHANGED
|
@@ -49,6 +49,21 @@ export function applySessionRisk(base, risk) {
|
|
|
49
49
|
*/
|
|
50
50
|
export function evaluateOffline(req, host = "ide") {
|
|
51
51
|
const irreversible = req.irreversible ?? false;
|
|
52
|
+
const known = findSampleTool(req.toolId);
|
|
53
|
+
const sandboxId = req.env?.sandboxId?.trim();
|
|
54
|
+
if (known?.requiresSandbox && !sandboxId) {
|
|
55
|
+
return {
|
|
56
|
+
verdict: "DENY",
|
|
57
|
+
reasonCode: "MISSING_SANDBOX_ID",
|
|
58
|
+
toolId: req.toolId,
|
|
59
|
+
argsHash: req.argsHash,
|
|
60
|
+
localVerdict: "DENY",
|
|
61
|
+
sessionRisk: req.sessionRisk ?? "LOW",
|
|
62
|
+
host: req.env?.host ?? host,
|
|
63
|
+
opaAllow: false,
|
|
64
|
+
opaReason: "OFFLINE_SAMPLE",
|
|
65
|
+
};
|
|
66
|
+
}
|
|
52
67
|
const base = baseTier(req.toolId, irreversible, req.actionClass);
|
|
53
68
|
const risk = req.sessionRisk ?? "LOW";
|
|
54
69
|
const final = applySessionRisk(base, risk);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"offline-evaluate.js","sourceRoot":"","sources":["../src/offline-evaluate.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"offline-evaluate.js","sourceRoot":"","sources":["../src/offline-evaluate.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional ORR producer for OpenSSF Scorecard (CLI `scorecard`).
|
|
3
|
+
* Evidence only — never a PEP. Never --fix, never npx -y.
|
|
4
|
+
*/
|
|
5
|
+
import type { OrrCoverageGap, OrrFinding } from "../commands/orr.js";
|
|
6
|
+
export declare const SCORECARD_PRODUCER_ID = "openssf.scorecard";
|
|
7
|
+
export interface ScorecardSpawnResult {
|
|
8
|
+
readonly status: number | null;
|
|
9
|
+
readonly stdout: string | Buffer;
|
|
10
|
+
readonly stderr: string | Buffer;
|
|
11
|
+
readonly error?: NodeJS.ErrnoException;
|
|
12
|
+
}
|
|
13
|
+
export type ScorecardSpawnFn = (command: string, args: readonly string[], options: {
|
|
14
|
+
encoding: "utf8";
|
|
15
|
+
timeout: number;
|
|
16
|
+
maxBuffer: number;
|
|
17
|
+
windowsHide: boolean;
|
|
18
|
+
}) => ScorecardSpawnResult;
|
|
19
|
+
export declare function buildScorecardArgv(absPath: string): {
|
|
20
|
+
command: string;
|
|
21
|
+
args: readonly string[];
|
|
22
|
+
};
|
|
23
|
+
/** Map Scorecard JSON dump into observational findings. Never maps to ALLOW. */
|
|
24
|
+
export declare function ingestScorecardJson(parsed: unknown, evidencePath: string): OrrFinding[];
|
|
25
|
+
export declare function tryRunScorecardCli(targetPath: string, spawn?: ScorecardSpawnFn): {
|
|
26
|
+
findings: OrrFinding[];
|
|
27
|
+
} | {
|
|
28
|
+
gap: OrrCoverageGap;
|
|
29
|
+
};
|
|
30
|
+
//# sourceMappingURL=scorecard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorecard.d.ts","sourceRoot":"","sources":["../../src/orr/scorecard.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAErE,eAAO,MAAM,qBAAqB,sBAAsB,CAAC;AAEzD,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;IAC/B,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;IACjC,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,cAAc,CAAC;CACxC;AAED,MAAM,MAAM,gBAAgB,GAAG,CAC7B,OAAO,EAAE,MAAM,EACf,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,OAAO,EAAE;IACP,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,OAAO,CAAC;CACtB,KACE,oBAAoB,CAAC;AAE1B,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG;IACnD,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,EAAE,SAAS,MAAM,EAAE,CAAC;CACzB,CAMA;AAED,gFAAgF;AAChF,wBAAgB,mBAAmB,CACjC,MAAM,EAAE,OAAO,EACf,YAAY,EAAE,MAAM,GACnB,UAAU,EAAE,CAmCd;AAED,wBAAgB,kBAAkB,CAChC,UAAU,EAAE,MAAM,EAClB,KAAK,CAAC,EAAE,gBAAgB,GACvB;IAAE,QAAQ,EAAE,UAAU,EAAE,CAAA;CAAE,GAAG;IAAE,GAAG,EAAE,cAAc,CAAA;CAAE,CA8BtD"}
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Optional ORR producer for OpenSSF Scorecard (CLI `scorecard`).
|
|
3
|
+
* Evidence only — never a PEP. Never --fix, never npx -y.
|
|
4
|
+
*/
|
|
5
|
+
import { spawnSync } from "node:child_process";
|
|
6
|
+
export const SCORECARD_PRODUCER_ID = "openssf.scorecard";
|
|
7
|
+
export function buildScorecardArgv(absPath) {
|
|
8
|
+
const fromEnv = process.env.SCORECARD_BIN?.trim();
|
|
9
|
+
return {
|
|
10
|
+
command: fromEnv && fromEnv.length > 0 ? fromEnv : "scorecard",
|
|
11
|
+
args: ["--local", absPath, "--format", "json"],
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
/** Map Scorecard JSON dump into observational findings. Never maps to ALLOW. */
|
|
15
|
+
export function ingestScorecardJson(parsed, evidencePath) {
|
|
16
|
+
const obj = parsed && typeof parsed === "object" ? parsed : {};
|
|
17
|
+
const score = typeof obj.score === "number" ? obj.score : undefined;
|
|
18
|
+
const checks = Array.isArray(obj.checks) ? obj.checks : [];
|
|
19
|
+
const findings = [
|
|
20
|
+
{
|
|
21
|
+
id: "sa.scorecard.ingested",
|
|
22
|
+
category: "enterprise_readiness",
|
|
23
|
+
severity: "info",
|
|
24
|
+
title: "Scorecard ingested as evidence",
|
|
25
|
+
detail: score === undefined
|
|
26
|
+
? "Scorecard dump loaded. Does not ALLOW side effects."
|
|
27
|
+
: `Scorecard score=${score} (evidence only — not a PEP).`,
|
|
28
|
+
evidence: evidencePath,
|
|
29
|
+
source_tool: SCORECARD_PRODUCER_ID,
|
|
30
|
+
},
|
|
31
|
+
];
|
|
32
|
+
for (const raw of checks.slice(0, 24)) {
|
|
33
|
+
if (!raw || typeof raw !== "object")
|
|
34
|
+
continue;
|
|
35
|
+
const check = raw;
|
|
36
|
+
const name = typeof check.name === "string" ? check.name : "check";
|
|
37
|
+
const checkScore = check.score;
|
|
38
|
+
findings.push({
|
|
39
|
+
id: `sa.scorecard.check.${name.toLowerCase().replace(/[^a-z0-9]+/g, "_")}`,
|
|
40
|
+
category: "enterprise_readiness",
|
|
41
|
+
severity: "info",
|
|
42
|
+
title: `Scorecard ${name}`,
|
|
43
|
+
detail: `score=${String(checkScore ?? "n/a")} — evidence only`,
|
|
44
|
+
evidence: evidencePath,
|
|
45
|
+
source_tool: SCORECARD_PRODUCER_ID,
|
|
46
|
+
});
|
|
47
|
+
}
|
|
48
|
+
return findings;
|
|
49
|
+
}
|
|
50
|
+
export function tryRunScorecardCli(targetPath, spawn) {
|
|
51
|
+
const run = spawn ?? defaultScorecardSpawn;
|
|
52
|
+
const { command, args } = buildScorecardArgv(targetPath);
|
|
53
|
+
let result;
|
|
54
|
+
try {
|
|
55
|
+
result = run(command, args, {
|
|
56
|
+
encoding: "utf8",
|
|
57
|
+
timeout: 120_000,
|
|
58
|
+
maxBuffer: 8 * 1024 * 1024,
|
|
59
|
+
windowsHide: true,
|
|
60
|
+
});
|
|
61
|
+
}
|
|
62
|
+
catch (err) {
|
|
63
|
+
const code = err && typeof err === "object" && "code" in err
|
|
64
|
+
? String(err.code)
|
|
65
|
+
: "";
|
|
66
|
+
if (code === "ENOENT") {
|
|
67
|
+
return { gap: { adapter_id: SCORECARD_PRODUCER_ID, reason: "binary_not_found" } };
|
|
68
|
+
}
|
|
69
|
+
return { gap: { adapter_id: SCORECARD_PRODUCER_ID, reason: "error_non_fatal" } };
|
|
70
|
+
}
|
|
71
|
+
if (result.error?.code === "ENOENT") {
|
|
72
|
+
return { gap: { adapter_id: SCORECARD_PRODUCER_ID, reason: "binary_not_found" } };
|
|
73
|
+
}
|
|
74
|
+
const stdout = bufferToString(result.stdout);
|
|
75
|
+
const parsed = tryParseJson(stdout);
|
|
76
|
+
if (parsed === undefined) {
|
|
77
|
+
return { gap: { adapter_id: SCORECARD_PRODUCER_ID, reason: "error_non_fatal" } };
|
|
78
|
+
}
|
|
79
|
+
return { findings: ingestScorecardJson(parsed, `scorecard://local/${targetPath}`) };
|
|
80
|
+
}
|
|
81
|
+
function defaultScorecardSpawn(command, args, options) {
|
|
82
|
+
return spawnSync(command, [...args], {
|
|
83
|
+
encoding: options.encoding,
|
|
84
|
+
timeout: options.timeout,
|
|
85
|
+
maxBuffer: options.maxBuffer,
|
|
86
|
+
windowsHide: options.windowsHide,
|
|
87
|
+
shell: false,
|
|
88
|
+
env: process.env,
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
function bufferToString(value) {
|
|
92
|
+
if (typeof value === "string")
|
|
93
|
+
return value;
|
|
94
|
+
return Buffer.isBuffer(value) ? value.toString("utf8") : "";
|
|
95
|
+
}
|
|
96
|
+
function tryParseJson(text) {
|
|
97
|
+
const trimmed = text.trim();
|
|
98
|
+
if (!trimmed)
|
|
99
|
+
return undefined;
|
|
100
|
+
try {
|
|
101
|
+
return JSON.parse(trimmed);
|
|
102
|
+
}
|
|
103
|
+
catch {
|
|
104
|
+
return undefined;
|
|
105
|
+
}
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=scorecard.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"scorecard.js","sourceRoot":"","sources":["../../src/orr/scorecard.ts"],"names":[],"mappings":"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"}
|
package/dist/sample-tools.d.ts
CHANGED
|
@@ -13,6 +13,8 @@ export interface SampleToolDescriptor {
|
|
|
13
13
|
readonly irreversible: boolean;
|
|
14
14
|
readonly dataClass: DataClass;
|
|
15
15
|
readonly metadata: Readonly<Record<string, unknown>>;
|
|
16
|
+
/** When true, evaluate DENY MISSING_SANDBOX_ID unless env.sandboxId is set. */
|
|
17
|
+
readonly requiresSandbox?: boolean;
|
|
16
18
|
}
|
|
17
19
|
export declare const SAMPLE_TOOLS: readonly SampleToolDescriptor[];
|
|
18
20
|
export declare function findSampleTool(toolId: string): SampleToolDescriptor | undefined;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sample-tools.d.ts","sourceRoot":"","sources":["../src/sample-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,sBAAsB,GAAG,QAAQ,CAAC;AAC/E,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,iBAAiB,CAAC;AACjE,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,GAAG,YAAY,CAAC;AAE9E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"sample-tools.d.ts","sourceRoot":"","sources":["../src/sample-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,MAAM,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,sBAAsB,GAAG,QAAQ,CAAC;AAC/E,MAAM,MAAM,aAAa,GAAG,OAAO,GAAG,MAAM,GAAG,iBAAiB,CAAC;AACjE,MAAM,MAAM,SAAS,GAAG,QAAQ,GAAG,UAAU,GAAG,cAAc,GAAG,YAAY,CAAC;AAE9E,MAAM,WAAW,oBAAoB;IACnC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,WAAW,EAAE,WAAW,CAAC;IAClC,QAAQ,CAAC,UAAU,EAAE,aAAa,CAAC;IACnC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;IAC9B,QAAQ,CAAC,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,CAAC;IACrD,+EAA+E;IAC/E,QAAQ,CAAC,eAAe,CAAC,EAAE,OAAO,CAAC;CACpC;AAED,eAAO,MAAM,YAAY,EAAE,SAAS,oBAAoB,EA2E9C,CAAC;AAEX,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAI/E"}
|
package/dist/sample-tools.js
CHANGED
|
@@ -39,6 +39,44 @@ export const SAMPLE_TOOLS = [
|
|
|
39
39
|
dataClass: "CONFIDENTIAL",
|
|
40
40
|
metadata: { version: "1.0.0", owner: "kya" },
|
|
41
41
|
},
|
|
42
|
+
{
|
|
43
|
+
toolId: "org.sample.sandbox.spawn",
|
|
44
|
+
displayName: "Sandbox spawn",
|
|
45
|
+
actionClass: "WRITE",
|
|
46
|
+
policyTier: "REQUIRE_APPROVE",
|
|
47
|
+
irreversible: true,
|
|
48
|
+
dataClass: "INTERNAL",
|
|
49
|
+
metadata: { version: "1.0.0", owner: "sample" },
|
|
50
|
+
},
|
|
51
|
+
{
|
|
52
|
+
toolId: "org.sample.sandbox.exec",
|
|
53
|
+
displayName: "Sandbox exec",
|
|
54
|
+
actionClass: "EXTERNAL_SIDE_EFFECT",
|
|
55
|
+
policyTier: "REQUIRE_APPROVE",
|
|
56
|
+
irreversible: true,
|
|
57
|
+
dataClass: "RESTRICTED",
|
|
58
|
+
requiresSandbox: true,
|
|
59
|
+
metadata: { version: "1.0.0", owner: "sample", requiresSandbox: true },
|
|
60
|
+
},
|
|
61
|
+
{
|
|
62
|
+
toolId: "org.sample.sandbox.net_open",
|
|
63
|
+
displayName: "Sandbox net open",
|
|
64
|
+
actionClass: "EXTERNAL_SIDE_EFFECT",
|
|
65
|
+
policyTier: "REQUIRE_APPROVE",
|
|
66
|
+
irreversible: true,
|
|
67
|
+
dataClass: "INTERNAL",
|
|
68
|
+
requiresSandbox: true,
|
|
69
|
+
metadata: { version: "1.0.0", owner: "sample", requiresSandbox: true },
|
|
70
|
+
},
|
|
71
|
+
{
|
|
72
|
+
toolId: "org.sample.sandbox.kill",
|
|
73
|
+
displayName: "Sandbox kill",
|
|
74
|
+
actionClass: "WRITE",
|
|
75
|
+
policyTier: "ALLOW",
|
|
76
|
+
irreversible: false,
|
|
77
|
+
dataClass: "INTERNAL",
|
|
78
|
+
metadata: { version: "1.0.0", owner: "sample" },
|
|
79
|
+
},
|
|
42
80
|
];
|
|
43
81
|
export function findSampleTool(toolId) {
|
|
44
82
|
const id = toolId.trim().toLowerCase();
|
package/dist/sample-tools.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"sample-tools.js","sourceRoot":"","sources":["../src/sample-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;
|
|
1
|
+
{"version":3,"file":"sample-tools.js","sourceRoot":"","sources":["../src/sample-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAkBH,MAAM,CAAC,MAAM,YAAY,GAAoC;IAC3D;QACE,MAAM,EAAE,sBAAsB;QAC9B,WAAW,EAAE,WAAW;QACxB,WAAW,EAAE,MAAM;QACnB,UAAU,EAAE,OAAO;QACnB,YAAY,EAAE,KAAK;QACnB,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE;KAChD;IACD;QACE,MAAM,EAAE,uBAAuB;QAC/B,WAAW,EAAE,YAAY;QACzB,WAAW,EAAE,OAAO;QACpB,UAAU,EAAE,iBAAiB;QAC7B,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,cAAc;QACzB,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE;KAChD;IACD;QACE,MAAM,EAAE,wBAAwB;QAChC,WAAW,EAAE,aAAa;QAC1B,WAAW,EAAE,sBAAsB;QACnC,UAAU,EAAE,MAAM;QAClB,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,YAAY;QACvB,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE;KAChD;IACD;QACE,MAAM,EAAE,oBAAoB;QAC5B,WAAW,EAAE,gBAAgB;QAC7B,WAAW,EAAE,OAAO;QACpB,UAAU,EAAE,iBAAiB;QAC7B,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,cAAc;QACzB,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE;KAC7C;IACD;QACE,MAAM,EAAE,0BAA0B;QAClC,WAAW,EAAE,eAAe;QAC5B,WAAW,EAAE,OAAO;QACpB,UAAU,EAAE,iBAAiB;QAC7B,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE;KAChD;IACD;QACE,MAAM,EAAE,yBAAyB;QACjC,WAAW,EAAE,cAAc;QAC3B,WAAW,EAAE,sBAAsB;QACnC,UAAU,EAAE,iBAAiB;QAC7B,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,YAAY;QACvB,eAAe,EAAE,IAAI;QACrB,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE;KACvE;IACD;QACE,MAAM,EAAE,6BAA6B;QACrC,WAAW,EAAE,kBAAkB;QAC/B,WAAW,EAAE,sBAAsB;QACnC,UAAU,EAAE,iBAAiB;QAC7B,YAAY,EAAE,IAAI;QAClB,SAAS,EAAE,UAAU;QACrB,eAAe,EAAE,IAAI;QACrB,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,eAAe,EAAE,IAAI,EAAE;KACvE;IACD;QACE,MAAM,EAAE,yBAAyB;QACjC,WAAW,EAAE,cAAc;QAC3B,WAAW,EAAE,OAAO;QACpB,UAAU,EAAE,OAAO;QACnB,YAAY,EAAE,KAAK;QACnB,SAAS,EAAE,UAAU;QACrB,QAAQ,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE;KAChD;CACO,CAAC;AAEX,MAAM,UAAU,cAAc,CAAC,MAAc;IAC3C,MAAM,EAAE,GAAG,MAAM,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACvC,IAAI,CAAC,EAAE;QAAE,OAAO,SAAS,CAAC;IAC1B,OAAO,YAAY,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,EAAE,CAAC,CAAC;AACjE,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { SandboxDriver } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Real Firecracker/jailer driver. Binaries and kernel/rootfs must be operator-supplied.
|
|
4
|
+
*/
|
|
5
|
+
export declare function createFirecrackerDriver(): SandboxDriver;
|
|
6
|
+
export declare function firecrackerTrackedPid(sandboxId: string): number | undefined;
|
|
7
|
+
//# sourceMappingURL=firecracker-driver.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firecracker-driver.d.ts","sourceRoot":"","sources":["../../src/sandbox/firecracker-driver.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAiChD;;GAEG;AACH,wBAAgB,uBAAuB,IAAI,aAAa,CAgEvD;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAE3E"}
|
|
@@ -0,0 +1,99 @@
|
|
|
1
|
+
import { accessSync, constants, unlinkSync } from "node:fs";
|
|
2
|
+
import { basename } from "node:path";
|
|
3
|
+
import { spawn } from "node:child_process";
|
|
4
|
+
import { UsageError } from "../errors.js";
|
|
5
|
+
import { assertSandboxId } from "./id.js";
|
|
6
|
+
const pids = new Map();
|
|
7
|
+
const socks = new Map();
|
|
8
|
+
function resolveBin(name, envName) {
|
|
9
|
+
const fromEnv = process.env[envName]?.trim();
|
|
10
|
+
if (fromEnv) {
|
|
11
|
+
if (!fromEnv.startsWith("/") || basename(fromEnv) !== name) {
|
|
12
|
+
throw new UsageError(`${envName} must be an absolute path whose basename is ${name}`);
|
|
13
|
+
}
|
|
14
|
+
accessSync(fromEnv, constants.X_OK);
|
|
15
|
+
return fromEnv;
|
|
16
|
+
}
|
|
17
|
+
const path = process.env.PATH ?? "";
|
|
18
|
+
for (const dir of path.split(":")) {
|
|
19
|
+
if (!dir || dir === "." || dir.startsWith("."))
|
|
20
|
+
continue;
|
|
21
|
+
const candidate = `${dir.replace(/\/+$/, "")}/${name}`;
|
|
22
|
+
if (!candidate.startsWith("/"))
|
|
23
|
+
continue;
|
|
24
|
+
try {
|
|
25
|
+
accessSync(candidate, constants.X_OK);
|
|
26
|
+
return candidate;
|
|
27
|
+
}
|
|
28
|
+
catch {
|
|
29
|
+
/* continue */
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
throw new UsageError(`${name} not found: set ${envName} to an absolute path or install on PATH (not shipped in npm)`);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Real Firecracker/jailer driver. Binaries and kernel/rootfs must be operator-supplied.
|
|
36
|
+
*/
|
|
37
|
+
export function createFirecrackerDriver() {
|
|
38
|
+
const firecracker = resolveBin("firecracker", "KYA_SANDBOX_FIRECRACKER");
|
|
39
|
+
const jailer = resolveBin("jailer", "KYA_SANDBOX_JAILER");
|
|
40
|
+
return {
|
|
41
|
+
backend: "firecracker",
|
|
42
|
+
async spawn(input) {
|
|
43
|
+
const id = assertSandboxId(input.sandboxId);
|
|
44
|
+
if (!input.kernelPath?.startsWith("/") || !input.rootfsPath?.startsWith("/")) {
|
|
45
|
+
throw new UsageError("KYA_SANDBOX_KERNEL and KYA_SANDBOX_ROOTFS must be absolute paths (not shipped)");
|
|
46
|
+
}
|
|
47
|
+
const sock = `/run/kya-fc-${id}.sock`;
|
|
48
|
+
const child = spawn(jailer, [
|
|
49
|
+
"--id",
|
|
50
|
+
id,
|
|
51
|
+
"--exec-file",
|
|
52
|
+
firecracker,
|
|
53
|
+
"--",
|
|
54
|
+
"--api-sock",
|
|
55
|
+
sock,
|
|
56
|
+
"--config-file",
|
|
57
|
+
"/dev/null",
|
|
58
|
+
], { stdio: "ignore", detached: false });
|
|
59
|
+
if (child.pid == null) {
|
|
60
|
+
throw new UsageError("jailer did not start");
|
|
61
|
+
}
|
|
62
|
+
pids.set(id, child.pid);
|
|
63
|
+
socks.set(id, sock);
|
|
64
|
+
child.on("exit", () => {
|
|
65
|
+
pids.delete(id);
|
|
66
|
+
});
|
|
67
|
+
},
|
|
68
|
+
async exec() {
|
|
69
|
+
throw new UsageError("firecracker exec requires vsock wiring for this host; use KYA_SANDBOX=mock in tests");
|
|
70
|
+
},
|
|
71
|
+
async kill(sandboxId) {
|
|
72
|
+
const id = assertSandboxId(sandboxId);
|
|
73
|
+
const pid = pids.get(id);
|
|
74
|
+
if (pid != null) {
|
|
75
|
+
try {
|
|
76
|
+
process.kill(pid, "SIGTERM");
|
|
77
|
+
}
|
|
78
|
+
catch {
|
|
79
|
+
/* already gone */
|
|
80
|
+
}
|
|
81
|
+
pids.delete(id);
|
|
82
|
+
}
|
|
83
|
+
const sock = socks.get(id);
|
|
84
|
+
if (sock) {
|
|
85
|
+
try {
|
|
86
|
+
unlinkSync(sock);
|
|
87
|
+
}
|
|
88
|
+
catch {
|
|
89
|
+
/* missing */
|
|
90
|
+
}
|
|
91
|
+
socks.delete(id);
|
|
92
|
+
}
|
|
93
|
+
},
|
|
94
|
+
};
|
|
95
|
+
}
|
|
96
|
+
export function firecrackerTrackedPid(sandboxId) {
|
|
97
|
+
return pids.get(sandboxId);
|
|
98
|
+
}
|
|
99
|
+
//# sourceMappingURL=firecracker-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firecracker-driver.js","sourceRoot":"","sources":["../../src/sandbox/firecracker-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.d.ts","sourceRoot":"","sources":["../../src/sandbox/id.ts"],"names":[],"mappings":"AAEA,sFAAsF;AACtF,eAAO,MAAM,aAAa,QAAwE,CAAC;AAEnG,wBAAgB,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,GAAG,MAAM,CAQ/D"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { UsageError } from "../errors.js";
|
|
2
|
+
/** Spawned ids are `sbx-` + uuid. Kill/exec flags must match; never a pkill regex. */
|
|
3
|
+
export const SANDBOX_ID_RE = /^sbx-[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}$/i;
|
|
4
|
+
export function assertSandboxId(raw) {
|
|
5
|
+
const id = raw?.trim() ?? "";
|
|
6
|
+
if (!SANDBOX_ID_RE.test(id)) {
|
|
7
|
+
throw new UsageError("sandbox-id must be sbx-<uuid> (from `kya sandbox spawn`); refusing regex/path values");
|
|
8
|
+
}
|
|
9
|
+
return id;
|
|
10
|
+
}
|
|
11
|
+
//# sourceMappingURL=id.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"id.js","sourceRoot":"","sources":["../../src/sandbox/id.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,sFAAsF;AACtF,MAAM,CAAC,MAAM,aAAa,GAAG,qEAAqE,CAAC;AAEnG,MAAM,UAAU,eAAe,CAAC,GAAuB;IACrD,MAAM,EAAE,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;IAC7B,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAClB,sFAAsF,CACvF,CAAC;IACJ,CAAC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-driver.d.ts","sourceRoot":"","sources":["../../src/sandbox/mock-driver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAEhD,mEAAmE;AACnE,wBAAgB,gBAAgB,IAAI,aAAa,GAAG;IAClD,QAAQ,CAAC,IAAI,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;CAC5B,CAsBA"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
/** In-memory driver for unit tests — never talks to a real VMM. */
|
|
2
|
+
export function createMockDriver() {
|
|
3
|
+
const live = new Set();
|
|
4
|
+
return {
|
|
5
|
+
backend: "firecracker",
|
|
6
|
+
live,
|
|
7
|
+
async spawn(input) {
|
|
8
|
+
live.add(input.sandboxId);
|
|
9
|
+
},
|
|
10
|
+
async exec(input) {
|
|
11
|
+
if (!live.has(input.sandboxId)) {
|
|
12
|
+
throw new Error(`sandbox not running: ${input.sandboxId}`);
|
|
13
|
+
}
|
|
14
|
+
return {
|
|
15
|
+
exitCode: 0,
|
|
16
|
+
stdout: `mock-exec ${input.command.join(" ")}`,
|
|
17
|
+
stderr: "",
|
|
18
|
+
};
|
|
19
|
+
},
|
|
20
|
+
async kill(sandboxId) {
|
|
21
|
+
live.delete(sandboxId);
|
|
22
|
+
},
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
//# sourceMappingURL=mock-driver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"mock-driver.js","sourceRoot":"","sources":["../../src/sandbox/mock-driver.ts"],"names":[],"mappings":"AAEA,mEAAmE;AACnE,MAAM,UAAU,gBAAgB;IAG9B,MAAM,IAAI,GAAG,IAAI,GAAG,EAAU,CAAC;IAC/B,OAAO;QACL,OAAO,EAAE,aAAa;QACtB,IAAI;QACJ,KAAK,CAAC,KAAK,CAAC,KAAK;YACf,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC;QAC5B,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,KAAK;YACd,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,CAAC;gBAC/B,MAAM,IAAI,KAAK,CAAC,wBAAwB,KAAK,CAAC,SAAS,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,OAAO;gBACL,QAAQ,EAAE,CAAC;gBACX,MAAM,EAAE,aAAa,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE;gBAC9C,MAAM,EAAE,EAAE;aACX,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,IAAI,CAAC,SAAS;YAClB,IAAI,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QACzB,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-jail.d.ts","sourceRoot":"","sources":["../../src/sandbox/path-jail.ts"],"names":[],"mappings":"AAIA,wBAAgB,QAAQ,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAM5C;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,OAAO,CAG9D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,MAAM,CAMlF"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { existsSync, lstatSync, realpathSync } from "node:fs";
|
|
2
|
+
import { isAbsolute, relative, resolve, sep } from "node:path";
|
|
3
|
+
import { UsageError } from "../errors.js";
|
|
4
|
+
export function jailRoot(raw) {
|
|
5
|
+
const abs = resolve(raw);
|
|
6
|
+
if (!existsSync(abs) || !lstatSync(abs).isDirectory()) {
|
|
7
|
+
throw new UsageError(`--path must be an existing directory: ${raw}`);
|
|
8
|
+
}
|
|
9
|
+
return realpathSync(abs);
|
|
10
|
+
}
|
|
11
|
+
export function insideRoot(file, root) {
|
|
12
|
+
const rel = relative(root, file);
|
|
13
|
+
return rel === "" || (!rel.startsWith(`..${sep}`) && rel !== ".." && !isAbsolute(rel));
|
|
14
|
+
}
|
|
15
|
+
export function assertInsideRoot(file, root, label) {
|
|
16
|
+
const abs = resolve(file);
|
|
17
|
+
if (!insideRoot(abs, root)) {
|
|
18
|
+
throw new UsageError(`${label} must sit inside --path`);
|
|
19
|
+
}
|
|
20
|
+
return abs;
|
|
21
|
+
}
|
|
22
|
+
//# sourceMappingURL=path-jail.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-jail.js","sourceRoot":"","sources":["../../src/sandbox/path-jail.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC9D,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,OAAO,EAAE,GAAG,EAAE,MAAM,WAAW,CAAC;AAC/D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,MAAM,UAAU,QAAQ,CAAC,GAAW;IAClC,MAAM,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;IACzB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,WAAW,EAAE,EAAE,CAAC;QACtD,MAAM,IAAI,UAAU,CAAC,yCAAyC,GAAG,EAAE,CAAC,CAAC;IACvE,CAAC;IACD,OAAO,YAAY,CAAC,GAAG,CAAC,CAAC;AAC3B,CAAC;AAED,MAAM,UAAU,UAAU,CAAC,IAAY,EAAE,IAAY;IACnD,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;IACjC,OAAO,GAAG,KAAK,EAAE,IAAI,CAAC,CAAC,GAAG,CAAC,UAAU,CAAC,KAAK,GAAG,EAAE,CAAC,IAAI,GAAG,KAAK,IAAI,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;AACzF,CAAC;AAED,MAAM,UAAU,gBAAgB,CAAC,IAAY,EAAE,IAAY,EAAE,KAAa;IACxE,MAAM,GAAG,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1B,IAAI,CAAC,UAAU,CAAC,GAAG,EAAE,IAAI,CAAC,EAAE,CAAC;QAC3B,MAAM,IAAI,UAAU,CAAC,GAAG,KAAK,yBAAyB,CAAC,CAAC;IAC1D,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { SandboxDriver, SandboxRecord } from "./types.js";
|
|
2
|
+
export declare function resolveSandboxDriver(backend: string | undefined): SandboxDriver;
|
|
3
|
+
export declare function sandboxStatePath(root: string): string;
|
|
4
|
+
export declare function loadSandboxState(root: string): SandboxRecord[];
|
|
5
|
+
export declare function saveSandboxState(root: string, rows: SandboxRecord[]): void;
|
|
6
|
+
export declare function spawnSandbox(input: {
|
|
7
|
+
root: string;
|
|
8
|
+
driver: SandboxDriver;
|
|
9
|
+
agentId?: string;
|
|
10
|
+
kernelPath?: string;
|
|
11
|
+
rootfsPath?: string;
|
|
12
|
+
}): Promise<SandboxRecord>;
|
|
13
|
+
export declare function killSandbox(input: {
|
|
14
|
+
root: string;
|
|
15
|
+
driver: SandboxDriver;
|
|
16
|
+
sandboxId: string;
|
|
17
|
+
}): Promise<void>;
|
|
18
|
+
//# sourceMappingURL=runtime.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../../src/sandbox/runtime.ts"],"names":[],"mappings":"AAQA,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AAE/D,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,MAAM,GAAG,SAAS,GAC1B,aAAa,CAUf;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,EAAE,CAW9D;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,aAAa,EAAE,GAAG,IAAI,CAO1E;AAED,wBAAsB,YAAY,CAAC,KAAK,EAAE;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAAC,aAAa,CAAC,CAmBzB;AAED,wBAAsB,WAAW,CAAC,KAAK,EAAE;IACvC,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,aAAa,CAAC;IACtB,SAAS,EAAE,MAAM,CAAC;CACnB,GAAG,OAAO,CAAC,IAAI,CAAC,CAOhB"}
|