@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.
Files changed (67) hide show
  1. package/.mcp.json +1 -1
  2. package/LIMITATIONS.md +1 -0
  3. package/README.md +15 -3
  4. package/claude/claude_desktop_config.example.json +1 -1
  5. package/dist/cli.d.ts.map +1 -1
  6. package/dist/cli.js +6 -0
  7. package/dist/cli.js.map +1 -1
  8. package/dist/client.d.ts +2 -0
  9. package/dist/client.d.ts.map +1 -1
  10. package/dist/client.js +1 -0
  11. package/dist/client.js.map +1 -1
  12. package/dist/commands/eval-tool.d.ts +2 -0
  13. package/dist/commands/eval-tool.d.ts.map +1 -1
  14. package/dist/commands/eval-tool.js +12 -2
  15. package/dist/commands/eval-tool.js.map +1 -1
  16. package/dist/commands/orr.d.ts +3 -0
  17. package/dist/commands/orr.d.ts.map +1 -1
  18. package/dist/commands/orr.js +23 -51
  19. package/dist/commands/orr.js.map +1 -1
  20. package/dist/commands/sandbox.d.ts +3 -0
  21. package/dist/commands/sandbox.d.ts.map +1 -0
  22. package/dist/commands/sandbox.js +82 -0
  23. package/dist/commands/sandbox.js.map +1 -0
  24. package/dist/commands/wrap.d.ts +1 -0
  25. package/dist/commands/wrap.d.ts.map +1 -1
  26. package/dist/offline-evaluate.d.ts.map +1 -1
  27. package/dist/offline-evaluate.js +15 -0
  28. package/dist/offline-evaluate.js.map +1 -1
  29. package/dist/orr/scorecard.d.ts +30 -0
  30. package/dist/orr/scorecard.d.ts.map +1 -0
  31. package/dist/orr/scorecard.js +107 -0
  32. package/dist/orr/scorecard.js.map +1 -0
  33. package/dist/sample-tools.d.ts +2 -0
  34. package/dist/sample-tools.d.ts.map +1 -1
  35. package/dist/sample-tools.js +38 -0
  36. package/dist/sample-tools.js.map +1 -1
  37. package/dist/sandbox/firecracker-driver.d.ts +7 -0
  38. package/dist/sandbox/firecracker-driver.d.ts.map +1 -0
  39. package/dist/sandbox/firecracker-driver.js +99 -0
  40. package/dist/sandbox/firecracker-driver.js.map +1 -0
  41. package/dist/sandbox/id.d.ts +4 -0
  42. package/dist/sandbox/id.d.ts.map +1 -0
  43. package/dist/sandbox/id.js +11 -0
  44. package/dist/sandbox/id.js.map +1 -0
  45. package/dist/sandbox/mock-driver.d.ts +6 -0
  46. package/dist/sandbox/mock-driver.d.ts.map +1 -0
  47. package/dist/sandbox/mock-driver.js +25 -0
  48. package/dist/sandbox/mock-driver.js.map +1 -0
  49. package/dist/sandbox/path-jail.d.ts +4 -0
  50. package/dist/sandbox/path-jail.d.ts.map +1 -0
  51. package/dist/sandbox/path-jail.js +22 -0
  52. package/dist/sandbox/path-jail.js.map +1 -0
  53. package/dist/sandbox/runtime.d.ts +18 -0
  54. package/dist/sandbox/runtime.d.ts.map +1 -0
  55. package/dist/sandbox/runtime.js +71 -0
  56. package/dist/sandbox/runtime.js.map +1 -0
  57. package/dist/sandbox/types.d.ts +26 -0
  58. package/dist/sandbox/types.d.ts.map +1 -0
  59. package/dist/sandbox/types.js +2 -0
  60. package/dist/sandbox/types.js.map +1 -0
  61. package/gemini/settings.example.json +1 -1
  62. package/grok/README.md +1 -1
  63. package/manifest.json +1 -1
  64. package/mcp.json +1 -1
  65. package/openai/codex.config.example.toml +1 -1
  66. package/package.json +1 -1
  67. 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":"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"}
@@ -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;;;;;;;;EAMnD;AAED,wBAAgB,eAAe,CAAC,MAAM,EAAE,UAAU,GAAG,MAAM,CAiB1D"}
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,CAkBxB"}
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"}
@@ -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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"}
@@ -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;CACtD;AAED,eAAO,MAAM,YAAY,EAAE,SAAS,oBAAoB,EAqC9C,CAAC;AAEX,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,oBAAoB,GAAG,SAAS,CAI/E"}
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"}
@@ -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();
@@ -1 +1 @@
1
- {"version":3,"file":"sample-tools.js","sourceRoot":"","sources":["../src/sample-tools.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAgBH,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;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"}
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,4 @@
1
+ /** Spawned ids are `sbx-` + uuid. Kill/exec flags must match; never a pkill regex. */
2
+ export declare const SANDBOX_ID_RE: RegExp;
3
+ export declare function assertSandboxId(raw: string | undefined): string;
4
+ //# sourceMappingURL=id.d.ts.map
@@ -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,6 @@
1
+ import type { SandboxDriver } from "./types.js";
2
+ /** In-memory driver for unit tests — never talks to a real VMM. */
3
+ export declare function createMockDriver(): SandboxDriver & {
4
+ readonly live: Set<string>;
5
+ };
6
+ //# sourceMappingURL=mock-driver.d.ts.map
@@ -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,4 @@
1
+ export declare function jailRoot(raw: string): string;
2
+ export declare function insideRoot(file: string, root: string): boolean;
3
+ export declare function assertInsideRoot(file: string, root: string, label: string): string;
4
+ //# sourceMappingURL=path-jail.d.ts.map
@@ -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"}