pi-codex-auto-review 0.1.3 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (128) hide show
  1. package/NOTICE +4 -2
  2. package/README.ko.md +85 -0
  3. package/README.md +51 -52
  4. package/dist/approval-commands.d.ts +3 -3
  5. package/dist/approval-commands.js +161 -34
  6. package/dist/approval-commands.js.map +1 -1
  7. package/dist/approval-settings.d.ts +1 -1
  8. package/dist/approval-settings.js +17 -10
  9. package/dist/approval-settings.js.map +1 -1
  10. package/dist/approvals.d.ts +10 -9
  11. package/dist/approvals.js +196 -75
  12. package/dist/approvals.js.map +1 -1
  13. package/dist/audit.d.ts +1 -1
  14. package/dist/audit.js +37 -13
  15. package/dist/audit.js.map +1 -1
  16. package/dist/cli.js +63 -34
  17. package/dist/cli.js.map +1 -1
  18. package/dist/context-files.d.ts +2 -2
  19. package/dist/context-files.js +40 -19
  20. package/dist/context-files.js.map +1 -1
  21. package/dist/contracts.d.ts +39 -39
  22. package/dist/contracts.js +117 -51
  23. package/dist/contracts.js.map +1 -1
  24. package/dist/index.d.ts +9 -9
  25. package/dist/index.js +147 -43
  26. package/dist/index.js.map +1 -1
  27. package/dist/pi-host.js +3 -3
  28. package/dist/pi-host.js.map +1 -1
  29. package/dist/policy/domains.js +17 -7
  30. package/dist/policy/domains.js.map +1 -1
  31. package/dist/policy/index.d.ts +7 -7
  32. package/dist/policy/index.js +382 -139
  33. package/dist/policy/index.js.map +1 -1
  34. package/dist/policy/paths.js +31 -18
  35. package/dist/policy/paths.js.map +1 -1
  36. package/dist/policy/rule-engine.d.ts +2 -0
  37. package/dist/policy/rule-engine.js +283 -0
  38. package/dist/policy/rule-engine.js.map +1 -0
  39. package/dist/policy/rule-types.d.ts +30 -0
  40. package/dist/policy/rule-types.js +2 -0
  41. package/dist/policy/rule-types.js.map +1 -0
  42. package/dist/policy/rules-sync.d.ts +1 -0
  43. package/dist/policy/rules-sync.js +14 -0
  44. package/dist/policy/rules-sync.js.map +1 -0
  45. package/dist/policy/rules-worker.d.ts +1 -0
  46. package/dist/policy/rules-worker.js +14 -0
  47. package/dist/policy/rules-worker.js.map +1 -0
  48. package/dist/policy/rules.d.ts +4 -31
  49. package/dist/policy/rules.js +126 -38
  50. package/dist/policy/rules.js.map +1 -1
  51. package/dist/policy/shell.js +70 -41
  52. package/dist/policy/shell.js.map +1 -1
  53. package/dist/policy/starlark/builtins.d.ts +6 -0
  54. package/dist/policy/starlark/builtins.js +764 -0
  55. package/dist/policy/starlark/builtins.js.map +1 -0
  56. package/dist/policy/starlark/evaluator.d.ts +18 -0
  57. package/dist/policy/starlark/evaluator.js +518 -0
  58. package/dist/policy/starlark/evaluator.js.map +1 -0
  59. package/dist/policy/starlark/lexer.d.ts +14 -0
  60. package/dist/policy/starlark/lexer.js +189 -0
  61. package/dist/policy/starlark/lexer.js.map +1 -0
  62. package/dist/policy/starlark/parser.d.ts +140 -0
  63. package/dist/policy/starlark/parser.js +508 -0
  64. package/dist/policy/starlark/parser.js.map +1 -0
  65. package/dist/policy/starlark/validation.d.ts +4 -0
  66. package/dist/policy/starlark/validation.js +183 -0
  67. package/dist/policy/starlark/validation.js.map +1 -0
  68. package/dist/policy/starlark/values.d.ts +46 -0
  69. package/dist/policy/starlark/values.js +363 -0
  70. package/dist/policy/starlark/values.js.map +1 -0
  71. package/dist/reports.d.ts +1 -1
  72. package/dist/reports.js +66 -30
  73. package/dist/reports.js.map +1 -1
  74. package/dist/review/context.d.ts +16 -3
  75. package/dist/review/context.js +254 -48
  76. package/dist/review/context.js.map +1 -1
  77. package/dist/review/investigation.d.ts +2 -2
  78. package/dist/review/investigation.js +57 -16
  79. package/dist/review/investigation.js.map +1 -1
  80. package/dist/review/lifecycle.d.ts +1 -1
  81. package/dist/review/lifecycle.js +72 -29
  82. package/dist/review/lifecycle.js.map +1 -1
  83. package/dist/review/policy.js +27 -5
  84. package/dist/review/policy.js.map +1 -1
  85. package/dist/review/upstream-policy.js +1 -1
  86. package/dist/review/upstream-policy.js.map +1 -1
  87. package/dist/review/user-input.d.ts +5 -0
  88. package/dist/review/user-input.js +54 -0
  89. package/dist/review/user-input.js.map +1 -0
  90. package/dist/reviewer.d.ts +16 -6
  91. package/dist/reviewer.js +258 -70
  92. package/dist/reviewer.js.map +1 -1
  93. package/dist/signals.js +24 -9
  94. package/dist/signals.js.map +1 -1
  95. package/dist/startup.d.ts +4 -4
  96. package/dist/startup.js +139 -41
  97. package/dist/startup.js.map +1 -1
  98. package/dist/tools/controller.d.ts +19 -13
  99. package/dist/tools/controller.js +460 -118
  100. package/dist/tools/controller.js.map +1 -1
  101. package/dist/tools/environment.d.ts +1 -0
  102. package/dist/tools/environment.js +5 -0
  103. package/dist/tools/environment.js.map +1 -1
  104. package/dist/tools/executor.d.ts +1 -1
  105. package/dist/tools/executor.js +45 -28
  106. package/dist/tools/executor.js.map +1 -1
  107. package/dist/tools/external.d.ts +9 -8
  108. package/dist/tools/external.js +22 -11
  109. package/dist/tools/external.js.map +1 -1
  110. package/dist/tools/mcp.d.ts +6 -6
  111. package/dist/tools/mcp.js +208 -79
  112. package/dist/tools/mcp.js.map +1 -1
  113. package/dist/tools/mutation-queue.js.map +1 -1
  114. package/docs/publishing.ko.md +114 -0
  115. package/docs/publishing.md +49 -47
  116. package/docs/security/dependencies.ko.md +54 -0
  117. package/docs/security/dependencies.md +27 -26
  118. package/docs/testing/auto-review-protection.ko.md +158 -0
  119. package/docs/testing/auto-review-protection.md +105 -97
  120. package/docs/usage.ko.md +242 -0
  121. package/docs/usage.md +127 -111
  122. package/package.json +106 -95
  123. package/dist/native/darwin-arm64/artifact.json +0 -5
  124. package/dist/native/darwin-arm64/pi-guard-execpolicy +0 -0
  125. package/dist/native/linux-x64/artifact.json +0 -5
  126. package/dist/native/linux-x64/pi-guard-execpolicy +0 -0
  127. package/native/execpolicy/LICENSE +0 -201
  128. package/native/execpolicy/NOTICE +0 -6
@@ -1,35 +1,8 @@
1
- export interface PrefixRule {
2
- readonly pattern: readonly (string | readonly string[])[];
3
- readonly decision: 'allow' | 'prompt' | 'forbidden';
4
- readonly justification?: string;
5
- }
1
+ import type { CompiledRules, PrefixRule, RuleSource } from "./rule-types.js";
2
+ export type { CompiledRules, PrefixRule, RuleMatch, RuleSource, } from "./rule-types.js";
3
+ export { CODEX_EXECPOLICY_REVISION } from "./rule-types.js";
6
4
  export declare function matchesRule(argv: readonly string[], rule: PrefixRule): boolean;
7
- export declare const CODEX_EXECPOLICY_REVISION = "a956835d020762cb2b570053af06f643a11c0ecc";
8
- export interface RuleSource {
9
- readonly name: string;
10
- readonly source: string;
11
- }
12
- export interface RuleMatch {
13
- readonly decision: PrefixRule['decision'];
14
- readonly justification?: string | null;
15
- readonly matchedPrefix: readonly string[];
16
- readonly resolvedProgram?: string | null;
17
- }
18
- export interface CompiledRules {
19
- readonly revision: string;
20
- readonly rules: readonly PrefixRule[];
21
- readonly matches: readonly (readonly RuleMatch[])[];
22
- readonly allowedDomains: readonly string[];
23
- readonly deniedDomains: readonly string[];
24
- readonly networkRules: readonly {
25
- host: string;
26
- protocol: string;
27
- decision: PrefixRule['decision'];
28
- justification?: string | null;
29
- }[];
30
- readonly hostExecutables: Readonly<Record<string, readonly string[]>>;
31
- }
32
- /** Compatibility reader; parsing and example validation run in Codex's actual Starlark engine. */
5
+ /** Preserve the synchronous API and its deadline without running rules on the host event loop. */
33
6
  export declare function parseRules(source: string): readonly PrefixRule[];
34
7
  export declare function evaluateRules(sources: readonly RuleSource[], commands?: readonly (readonly string[])[], signal?: AbortSignal): Promise<CompiledRules>;
35
8
  /** Advanced scripts are matched as the real outer shell invocation, never as a safe inner prefix. */
@@ -1,59 +1,147 @@
1
- import { basename } from 'node:path';
2
- import { fileURLToPath } from 'node:url';
3
- import { execFile, spawnSync } from 'node:child_process';
4
- import { promisify } from 'node:util';
5
- import { GuardError, immutable } from '../contracts.js';
6
- import { analyzeShell } from './shell.js';
1
+ import { spawnSync } from "node:child_process";
2
+ import { basename } from "node:path";
3
+ import { fileURLToPath } from "node:url";
4
+ import { Worker } from "node:worker_threads";
5
+ import { GuardError, immutable } from "../contracts.js";
6
+ import { evaluateRuleSources } from "./rule-engine.js";
7
+ import { analyzeShell } from "./shell.js";
8
+ export { CODEX_EXECPOLICY_REVISION } from "./rule-types.js";
7
9
  export function matchesRule(argv, rule) {
8
- return rule.pattern.length <= argv.length && rule.pattern.every((part, index) => typeof part === 'string' ? part === argv[index] : part.includes(argv[index]));
10
+ return (rule.pattern.length <= argv.length &&
11
+ rule.pattern.every((part, index) => {
12
+ const argument = argv[index];
13
+ return typeof part === "string"
14
+ ? part === argument
15
+ : argument !== undefined && part.includes(argument);
16
+ }));
9
17
  }
10
- export const CODEX_EXECPOLICY_REVISION = 'a956835d020762cb2b570053af06f643a11c0ecc';
11
18
  const MAX_BYTES = 8 * 1024 * 1024;
12
- const helper = fileURLToPath(new URL(`../native/${process.platform}-${process.arch}/pi-guard-execpolicy${process.platform === 'win32' ? '.exe' : ''}`, import.meta.url));
13
- const helperEnvironment = process.platform === 'win32' ? { SystemRoot: process.env.SystemRoot } : {};
14
- const execute = promisify(execFile);
19
+ function isScalarString(value) {
20
+ if (typeof value !== "string")
21
+ return false;
22
+ for (const char of value) {
23
+ const point = char.codePointAt(0) ?? 0;
24
+ if (point >= 0xd800 && point <= 0xdfff)
25
+ return false;
26
+ }
27
+ return true;
28
+ }
15
29
  function request(sources, commands) {
16
30
  const input = JSON.stringify({ sources, commands });
17
31
  if (Buffer.byteLength(input) > MAX_BYTES)
18
- throw new GuardError('INVALID_RULES', 'Rule request exceeds the supported size');
32
+ throw new GuardError("INVALID_RULES", "Rule request exceeds the supported size");
33
+ const data = JSON.parse(input);
34
+ if (!Array.isArray(data.sources) ||
35
+ !Array.isArray(data.commands) ||
36
+ data.sources.some((source) => source === null ||
37
+ typeof source !== "object" ||
38
+ !isScalarString(source.name) ||
39
+ !isScalarString(source.source) ||
40
+ Object.keys(source).some((key) => key !== "name" && key !== "source")) ||
41
+ data.commands.some((command) => !Array.isArray(command) ||
42
+ command.some((argument) => !isScalarString(argument)))) {
43
+ throw new GuardError("INVALID_RULES", "Invalid rule request schema");
44
+ }
19
45
  return input;
20
46
  }
21
- function decode(stdout) {
22
- const result = JSON.parse(stdout);
23
- if (result.revision !== CODEX_EXECPOLICY_REVISION || !Array.isArray(result.rules) || !Array.isArray(result.matches) || !Array.isArray(result.allowedDomains) || !Array.isArray(result.deniedDomains))
24
- throw new GuardError('INVALID_RULES', 'Unexpected Codex rule engine response');
25
- return immutable(result);
26
- }
27
- /** Compatibility reader; parsing and example validation run in Codex's actual Starlark engine. */
47
+ /** Preserve the synchronous API and its deadline without running rules on the host event loop. */
28
48
  export function parseRules(source) {
29
- const result = spawnSync(helper, [], { input: request([{ name: 'inline.rules', source }], []), encoding: 'utf8', timeout: 10000, killSignal: 'SIGKILL', maxBuffer: MAX_BYTES, env: helperEnvironment });
30
- if (result.error || result.status !== 0)
31
- throw new GuardError('INVALID_RULES', `Codex rule engine failed: ${result.stderr?.slice(0, 4000) || result.error?.message || result.signal}`, { cause: result.error });
32
- return decode(result.stdout).rules;
49
+ const sources = [{ name: "inline.rules", source }];
50
+ const input = request(sources, []);
51
+ try {
52
+ const result = spawnSync(process.execPath, [
53
+ "--max-old-space-size=64",
54
+ fileURLToPath(new URL("./rules-sync.js", import.meta.url)),
55
+ ], {
56
+ input,
57
+ encoding: "utf8",
58
+ timeout: 10000,
59
+ killSignal: "SIGKILL",
60
+ maxBuffer: MAX_BYTES,
61
+ env: process.platform === "win32"
62
+ ? { SystemRoot: process.env.SystemRoot }
63
+ : {},
64
+ });
65
+ if (result.error || result.status !== 0)
66
+ throw (result.error ??
67
+ new Error(result.stderr.slice(0, 4000) ||
68
+ "Rule process exited without a result"));
69
+ return immutable(JSON.parse(result.stdout).rules);
70
+ }
71
+ catch (error) {
72
+ throw new GuardError("INVALID_RULES", `Codex-compatible rule engine failed: ${error instanceof Error ? error.message : String(error)}`, { cause: error });
73
+ }
33
74
  }
34
75
  export async function evaluateRules(sources, commands = [], signal) {
35
- const input = request(sources, commands);
76
+ const data = JSON.parse(request(sources, commands));
36
77
  try {
37
- const running = execute(helper, [], { encoding: 'utf8', timeout: 10000, killSignal: 'SIGKILL', maxBuffer: MAX_BYTES, env: helperEnvironment, signal });
38
- running.child.stdin?.end(input);
39
- // A failed spawn can close stdin before its queued input has been delivered.
40
- running.child.stdin?.on('error', () => { });
41
- return decode((await running).stdout);
78
+ signal?.throwIfAborted();
79
+ if (!data.sources.length)
80
+ return immutable(evaluateRuleSources([], data.commands));
81
+ const result = await new Promise((resolve, reject) => {
82
+ const worker = new Worker(new URL("./rules-worker.js", import.meta.url), {
83
+ workerData: data,
84
+ execArgv: [],
85
+ env: process.platform === "win32"
86
+ ? { SystemRoot: process.env.SystemRoot }
87
+ : {},
88
+ resourceLimits: {
89
+ maxOldGenerationSizeMb: 64,
90
+ stackSizeMb: 4,
91
+ },
92
+ });
93
+ let isSettled = false;
94
+ const finish = (error, value) => {
95
+ if (isSettled)
96
+ return;
97
+ isSettled = true;
98
+ clearTimeout(timer);
99
+ signal?.removeEventListener("abort", abort);
100
+ worker.removeAllListeners();
101
+ void worker.terminate();
102
+ if (error)
103
+ reject(error);
104
+ else if (value)
105
+ resolve(value);
106
+ else
107
+ reject(new Error("Rule worker produced no result"));
108
+ };
109
+ const abort = () => finish(new Error("Rule evaluation cancelled", {
110
+ cause: signal?.reason,
111
+ }));
112
+ const timer = setTimeout(() => finish(new Error("Rule evaluation timed out")), 10000);
113
+ worker.once("message", (message) => finish(message.error ? new Error(message.error) : undefined, message.result));
114
+ worker.once("error", (error) => finish(error));
115
+ worker.once("exit", (code) => finish(new Error(`Rule worker exited without a result (${code})`)));
116
+ signal?.addEventListener("abort", abort, { once: true });
117
+ if (signal?.aborted)
118
+ abort();
119
+ });
120
+ return immutable(result);
42
121
  }
43
122
  catch (error) {
44
- throw new GuardError('INVALID_RULES', 'Codex rule engine could not evaluate the trusted rules', { cause: error });
123
+ throw new GuardError("INVALID_RULES", "Codex-compatible rule engine could not evaluate the trusted rules", { cause: error });
45
124
  }
46
125
  }
47
126
  /** Advanced scripts are matched as the real outer shell invocation, never as a safe inner prefix. */
48
- export function ruleCommands(command, shellPath = '/bin/bash', depth = 0) {
127
+ export function ruleCommands(command, shellPath = "/bin/bash", depth = 0) {
49
128
  const parsed = analyzeShell(command);
50
- if (!parsed.isSupported || parsed.commands.some(item => item.reads.length || item.writes.length) || depth > 4)
51
- return [[shellPath, '-c', command]];
52
- return parsed.commands.flatMap(item => {
53
- if (['bash', 'sh', 'zsh', 'dash'].includes(basename(item.argv[0])) && item.argv.length === 3 && ['-c', '-lc'].includes(item.argv[1])) {
54
- const inner = analyzeShell(item.argv[2]);
55
- if (inner.isSupported && inner.commands.every(part => !part.reads.length && !part.writes.length))
56
- return ruleCommands(item.argv[2], item.argv[0], depth + 1);
129
+ if (!parsed.isSupported ||
130
+ parsed.commands.some((item) => item.reads.length || item.writes.length) ||
131
+ depth > 4)
132
+ return [[shellPath, "-c", command]];
133
+ return parsed.commands.flatMap((item) => {
134
+ const [program, flag, script] = item.argv;
135
+ if (program !== undefined &&
136
+ ["bash", "sh", "zsh", "dash"].includes(basename(program)) &&
137
+ item.argv.length === 3 &&
138
+ flag !== undefined &&
139
+ ["-c", "-lc"].includes(flag) &&
140
+ script !== undefined) {
141
+ const inner = analyzeShell(script);
142
+ if (inner.isSupported &&
143
+ inner.commands.every((part) => !part.reads.length && !part.writes.length))
144
+ return ruleCommands(script, program, depth + 1);
57
145
  }
58
146
  return [item.argv];
59
147
  });
@@ -1 +1 @@
1
- {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/policy/rules.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/policy/rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;AAC/C,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AACrC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AACzC,OAAO,EAAE,MAAM,EAAE,MAAM,qBAAqB,CAAC;AAC7C,OAAO,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AAEvD,OAAO,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAQ1C,OAAO,EAAE,yBAAyB,EAAE,MAAM,iBAAiB,CAAC;AAC5D,MAAM,UAAU,WAAW,CACvB,IAAuB,EACvB,IAAgB;IAEhB,OAAO,CACH,IAAI,CAAC,OAAO,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM;QAClC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;YAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC;YAC7B,OAAO,OAAO,IAAI,KAAK,QAAQ;gBAC3B,CAAC,CAAC,IAAI,KAAK,QAAQ;gBACnB,CAAC,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;QAC5D,CAAC,CAAC,CACL,CAAC;AACN,CAAC;AACD,MAAM,SAAS,GAAG,CAAC,GAAG,IAAI,GAAG,IAAI,CAAC;AAClC,SAAS,cAAc,CAAC,KAAc;IAClC,IAAI,OAAO,KAAK,KAAK,QAAQ;QAAE,OAAO,KAAK,CAAC;IAC5C,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACvB,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;QACvC,IAAI,KAAK,IAAI,MAAM,IAAI,KAAK,IAAI,MAAM;YAAE,OAAO,KAAK,CAAC;IACzD,CAAC;IACD,OAAO,IAAI,CAAC;AAChB,CAAC;AACD,SAAS,OAAO,CACZ,OAA8B,EAC9B,QAAwC;IAExC,MAAM,KAAK,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC;IACpD,IAAI,MAAM,CAAC,UAAU,CAAC,KAAK,CAAC,GAAG,SAAS;QACpC,MAAM,IAAI,UAAU,CAChB,eAAe,EACf,yCAAyC,CAC5C,CAAC;IACN,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAA4C,CAAC;IAC1E,IACI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC;QAC5B,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,QAAQ,CAAC;QAC7B,IAAI,CAAC,OAAO,CAAC,IAAI,CACb,CAAC,MAAM,EAAE,EAAE,CACP,MAAM,KAAK,IAAI;YACf,OAAO,MAAM,KAAK,QAAQ;YAC1B,CAAC,cAAc,CAAC,MAAM,CAAC,IAAI,CAAC;YAC5B,CAAC,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC;YAC9B,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,IAAI,CACpB,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,KAAK,MAAM,IAAI,GAAG,KAAK,QAAQ,CAC9C,CACR;QACD,IAAI,CAAC,QAAQ,CAAC,IAAI,CACd,CAAC,OAAO,EAAE,EAAE,CACR,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC;YACvB,OAAO,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAC5D,EACH,CAAC;QACC,MAAM,IAAI,UAAU,CAAC,eAAe,EAAE,6BAA6B,CAAC,CAAC;IACzE,CAAC;IACD,OAAO,KAAK,CAAC;AACjB,CAAC;AACD,kGAAkG;AAClG,MAAM,UAAU,UAAU,CAAC,MAAc;IACrC,MAAM,OAAO,GAAG,CAAC,EAAE,IAAI,EAAE,cAAc,EAAE,MAAM,EAAE,CAAC,CAAC;IACnD,MAAM,KAAK,GAAG,OAAO,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC;IACnC,IAAI,CAAC;QACD,MAAM,MAAM,GAAG,SAAS,CACpB,OAAO,CAAC,QAAQ,EAChB;YACI,yBAAyB;YACzB,aAAa,CAAC,IAAI,GAAG,CAAC,iBAAiB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;SAC7D,EACD;YACI,KAAK;YACL,QAAQ,EAAE,MAAM;YAChB,OAAO,EAAE,KAAK;YACd,UAAU,EAAE,SAAS;YACrB,SAAS,EAAE,SAAS;YACpB,GAAG,EACC,OAAO,CAAC,QAAQ,KAAK,OAAO;gBACxB,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE;gBACxC,CAAC,CAAC,EAAE;SACf,CACJ,CAAC;QACF,IAAI,MAAM,CAAC,KAAK,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC;YACnC,MAAM,CACF,MAAM,CAAC,KAAK;gBACZ,IAAI,KAAK,CACL,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,IAAI,CAAC;oBACxB,sCAAsC,CAC7C,CACJ,CAAC;QACN,OAAO,SAAS,CAAE,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,CAAmB,CAAC,KAAK,CAAC,CAAC;IACzE,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,UAAU,CAChB,eAAe,EACf,wCAAwC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAChG,EAAE,KAAK,EAAE,KAAK,EAAE,CACnB,CAAC;IACN,CAAC;AACL,CAAC;AACD,MAAM,CAAC,KAAK,UAAU,aAAa,CAC/B,OAA8B,EAC9B,WAA2C,EAAE,EAC7C,MAAoB;IAEpB,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,EAAE,QAAQ,CAAC,CAGjD,CAAC;IACF,IAAI,CAAC;QACD,MAAM,EAAE,cAAc,EAAE,CAAC;QACzB,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM;YACpB,OAAO,SAAS,CAAC,mBAAmB,CAAC,EAAE,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC7D,MAAM,MAAM,GAAG,MAAM,IAAI,OAAO,CAAgB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAChE,MAAM,MAAM,GAAG,IAAI,MAAM,CACrB,IAAI,GAAG,CAAC,mBAAmB,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,EAC7C;gBACI,UAAU,EAAE,IAAI;gBAChB,QAAQ,EAAE,EAAE;gBACZ,GAAG,EACC,OAAO,CAAC,QAAQ,KAAK,OAAO;oBACxB,CAAC,CAAC,EAAE,UAAU,EAAE,OAAO,CAAC,GAAG,CAAC,UAAU,EAAE;oBACxC,CAAC,CAAC,EAAE;gBACZ,cAAc,EAAE;oBACZ,sBAAsB,EAAE,EAAE;oBAC1B,WAAW,EAAE,CAAC;iBACjB;aACJ,CACJ,CAAC;YACF,IAAI,SAAS,GAAG,KAAK,CAAC;YACtB,MAAM,MAAM,GAAG,CAAC,KAAa,EAAE,KAAqB,EAAE,EAAE;gBACpD,IAAI,SAAS;oBAAE,OAAO;gBACtB,SAAS,GAAG,IAAI,CAAC;gBACjB,YAAY,CAAC,KAAK,CAAC,CAAC;gBACpB,MAAM,EAAE,mBAAmB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;gBAC5C,MAAM,CAAC,kBAAkB,EAAE,CAAC;gBAC5B,KAAK,MAAM,CAAC,SAAS,EAAE,CAAC;gBACxB,IAAI,KAAK;oBAAE,MAAM,CAAC,KAAK,CAAC,CAAC;qBACpB,IAAI,KAAK;oBAAE,OAAO,CAAC,KAAK,CAAC,CAAC;;oBAC1B,MAAM,CAAC,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAC,CAAC;YAC7D,CAAC,CAAC;YACF,MAAM,KAAK,GAAG,GAAG,EAAE,CACf,MAAM,CACF,IAAI,KAAK,CAAC,2BAA2B,EAAE;gBACnC,KAAK,EAAE,MAAM,EAAE,MAAM;aACxB,CAAC,CACL,CAAC;YACN,MAAM,KAAK,GAAG,UAAU,CACpB,GAAG,EAAE,CAAC,MAAM,CAAC,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC,EACpD,KAAK,CACR,CAAC;YACF,MAAM,CAAC,IAAI,CACP,SAAS,EACT,CAAC,OAAmD,EAAE,EAAE,CACpD,MAAM,CACF,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,SAAS,EACpD,OAAO,CAAC,MAAM,CACjB,CACR,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,KAAK,EAAE,EAAE,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;YAC/C,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE,CACzB,MAAM,CACF,IAAI,KAAK,CAAC,wCAAwC,IAAI,GAAG,CAAC,CAC7D,CACJ,CAAC;YACF,MAAM,EAAE,gBAAgB,CAAC,OAAO,EAAE,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC;YACzD,IAAI,MAAM,EAAE,OAAO;gBAAE,KAAK,EAAE,CAAC;QACjC,CAAC,CAAC,CAAC;QACH,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC;IAC7B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACb,MAAM,IAAI,UAAU,CAChB,eAAe,EACf,mEAAmE,EACnE,EAAE,KAAK,EAAE,KAAK,EAAE,CACnB,CAAC;IACN,CAAC;AACL,CAAC;AACD,qGAAqG;AACrG,MAAM,UAAU,YAAY,CACxB,OAAe,EACf,SAAS,GAAG,WAAW,EACvB,KAAK,GAAG,CAAC;IAET,MAAM,MAAM,GAAG,YAAY,CAAC,OAAO,CAAC,CAAC;IACrC,IACI,CAAC,MAAM,CAAC,WAAW;QACnB,MAAM,CAAC,QAAQ,CAAC,IAAI,CAChB,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,CAAC,MAAM,CACpD;QACD,KAAK,GAAG,CAAC;QAET,OAAO,CAAC,CAAC,SAAS,EAAE,IAAI,EAAE,OAAO,CAAC,CAAC,CAAC;IACxC,OAAO,MAAM,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE;QACpC,MAAM,CAAC,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,CAAC;QAC1C,IACI,OAAO,KAAK,SAAS;YACrB,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;YACzD,IAAI,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;YACtB,IAAI,KAAK,SAAS;YAClB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;YAC5B,MAAM,KAAK,SAAS,EACtB,CAAC;YACC,MAAM,KAAK,GAAG,YAAY,CAAC,MAAM,CAAC,CAAC;YACnC,IACI,KAAK,CAAC,WAAW;gBACjB,KAAK,CAAC,QAAQ,CAAC,KAAK,CAChB,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,MAAM,CACtD;gBAED,OAAO,YAAY,CAAC,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACvB,CAAC,CAAC,CAAC;AACP,CAAC"}
@@ -1,52 +1,61 @@
1
- import { GuardError } from '../contracts.js';
1
+ import { GuardError } from "../contracts.js";
2
2
  /** A bounded literal grammar. Expansion/interpreters cannot borrow permission from their first word. */
3
3
  export function analyzeShell(command) {
4
- if (typeof command !== 'string' || !command.trim() || command.includes('\0'))
5
- throw new GuardError('INVALID_COMMAND', 'Invalid shell command');
4
+ if (typeof command !== "string" ||
5
+ !command.trim() ||
6
+ command.includes("\0"))
7
+ throw new GuardError("INVALID_COMMAND", "Invalid shell command");
6
8
  if (command.length > 100_000)
7
- return { commands: [], isSupported: false, reason: 'Command too long for literal analysis' };
9
+ return {
10
+ commands: [],
11
+ isSupported: false,
12
+ reason: "Command too long for literal analysis",
13
+ };
8
14
  const commands = [];
9
- let argv = [], writes = [], reads = [], word = '', hasWord = false, quote = '', redirect = '';
15
+ let argv = [], writes = [], reads = [], word = "", hasWord = false, quote = "", redirect = "";
10
16
  let isSupported = true, reason;
11
- const unsupported = (text) => { isSupported = false; reason ??= text; };
17
+ const unsupported = (text) => {
18
+ isSupported = false;
19
+ reason ??= text;
20
+ };
12
21
  const finishWord = () => {
13
22
  if (!hasWord)
14
23
  return;
15
- if (redirect === '>')
24
+ if (redirect === ">")
16
25
  writes.push(word);
17
- else if (redirect === '<')
26
+ else if (redirect === "<")
18
27
  reads.push(word);
19
28
  else
20
29
  argv.push(word);
21
- word = '';
30
+ word = "";
22
31
  hasWord = false;
23
- redirect = '';
32
+ redirect = "";
24
33
  };
25
34
  const finishCommand = () => {
26
35
  finishWord();
27
36
  if (redirect)
28
- unsupported('Missing redirection target');
37
+ unsupported("Missing redirection target");
29
38
  if (argv.length)
30
39
  commands.push({ argv, writes, reads });
31
40
  else if (writes.length || reads.length)
32
- unsupported('Redirection without literal command');
41
+ unsupported("Redirection without literal command");
33
42
  argv = [];
34
43
  writes = [];
35
44
  reads = [];
36
- redirect = '';
45
+ redirect = "";
37
46
  };
38
47
  for (let i = 0; i < command.length; i++) {
39
- const ch = command[i];
48
+ const ch = command.charAt(i);
40
49
  if (quote === "'") {
41
50
  if (ch === "'")
42
- quote = '';
51
+ quote = "";
43
52
  else
44
53
  word += ch;
45
54
  continue;
46
55
  }
47
- if (ch === '\\' && quote !== "'") {
56
+ if (ch === "\\" && quote !== "'") {
48
57
  if (i + 1 >= command.length)
49
- unsupported('Trailing escape');
58
+ unsupported("Trailing escape");
50
59
  else {
51
60
  word += command[++i];
52
61
  hasWord = true;
@@ -54,7 +63,7 @@ export function analyzeShell(command) {
54
63
  continue;
55
64
  }
56
65
  if (ch === '"') {
57
- quote = quote === '"' ? '' : '"';
66
+ quote = quote === '"' ? "" : '"';
58
67
  hasWord = true;
59
68
  continue;
60
69
  }
@@ -63,60 +72,80 @@ export function analyzeShell(command) {
63
72
  hasWord = true;
64
73
  continue;
65
74
  }
66
- if (ch === '$' || ch === '`')
67
- unsupported('Shell expansion requires review');
75
+ if (ch === "$" || ch === "`")
76
+ unsupported("Shell expansion requires review");
68
77
  if (quote) {
69
78
  word += ch;
70
79
  continue;
71
80
  }
72
- if ('(){}*?~'.includes(ch))
73
- unsupported('Non-literal shell syntax requires review');
74
- if (ch === '#' && !hasWord) {
75
- unsupported('Comments require review');
81
+ if ("(){}*?~".includes(ch))
82
+ unsupported("Non-literal shell syntax requires review");
83
+ if (ch === "#" && !hasWord) {
84
+ unsupported("Comments require review");
76
85
  break;
77
86
  }
78
- if (/\s/.test(ch) && ch !== '\n') {
87
+ if (/\s/.test(ch) && ch !== "\n") {
79
88
  finishWord();
80
89
  continue;
81
90
  }
82
- if (ch === ';' || ch === '|' || ch === '&' || ch === '\n') {
91
+ if (ch === ";" || ch === "|" || ch === "&" || ch === "\n") {
83
92
  finishCommand();
84
- if (command[i + 1] === ch && '|&'.includes(ch))
93
+ if (command[i + 1] === ch && "|&".includes(ch))
85
94
  i++;
86
- else if (ch === '&')
87
- unsupported('Background execution requires review');
95
+ else if (ch === "&")
96
+ unsupported("Background execution requires review");
88
97
  continue;
89
98
  }
90
- if (ch === '>' || ch === '<') {
99
+ if (ch === ">" || ch === "<") {
91
100
  if (hasWord && /^\d+$/.test(word)) {
92
- word = '';
101
+ word = "";
93
102
  hasWord = false;
94
103
  }
95
104
  finishWord();
96
105
  redirect = ch;
97
106
  if (command[i + 1] === ch) {
98
107
  i++;
99
- if (ch === '<')
100
- unsupported('Here-documents require review');
108
+ if (ch === "<")
109
+ unsupported("Here-documents require review");
101
110
  }
102
- if (command[i + 1] === '&')
103
- unsupported('Descriptor redirection requires review');
111
+ if (command[i + 1] === "&")
112
+ unsupported("Descriptor redirection requires review");
104
113
  continue;
105
114
  }
106
115
  word += ch;
107
116
  hasWord = true;
108
117
  }
109
118
  if (quote)
110
- unsupported('Unclosed quote');
119
+ unsupported("Unclosed quote");
111
120
  finishCommand();
112
121
  if (!commands.length)
113
- unsupported('No literal command');
114
- if (commands.some(c => c.argv.some(a => /^\w+=/.test(a))))
115
- unsupported('Environment assignments require review');
122
+ unsupported("No literal command");
123
+ if (commands.some((c) => c.argv.some((a) => /^\w+=/.test(a))))
124
+ unsupported("Environment assignments require review");
116
125
  return { commands, isSupported, ...(reason ? { reason } : {}) };
117
126
  }
118
127
  export function matchesPrefix(argv, prefix) {
119
- return prefix.length > 0 && prefix.length <= argv.length && prefix.every((arg, i) => argv[i] === arg);
128
+ return (prefix.length > 0 &&
129
+ prefix.length <= argv.length &&
130
+ prefix.every((arg, i) => argv[i] === arg));
120
131
  }
121
- export const INTERPRETERS = new Set(['bash', 'sh', 'zsh', 'fish', 'dash', 'node', 'python', 'python3', 'perl', 'ruby', 'env', 'eval', 'source', 'exec', 'xargs', 'sudo', 'osascript']);
132
+ export const INTERPRETERS = new Set([
133
+ "bash",
134
+ "sh",
135
+ "zsh",
136
+ "fish",
137
+ "dash",
138
+ "node",
139
+ "python",
140
+ "python3",
141
+ "perl",
142
+ "ruby",
143
+ "env",
144
+ "eval",
145
+ "source",
146
+ "exec",
147
+ "xargs",
148
+ "sudo",
149
+ "osascript",
150
+ ]);
122
151
  //# sourceMappingURL=shell.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/policy/shell.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAI7C,wGAAwG;AACxG,MAAM,UAAU,YAAY,CAAC,OAAe;IAC1C,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,CAAC,OAAO,CAAC,IAAI,EAAE,IAAI,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,iBAAiB,EAAE,uBAAuB,CAAC,CAAC;IAC/I,IAAI,OAAO,CAAC,MAAM,GAAG,OAAO;QAAE,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAAE,uCAAuC,EAAE,CAAC;IAC3H,MAAM,QAAQ,GAAoB,EAAE,CAAC;IACrC,IAAI,IAAI,GAAa,EAAE,EAAE,MAAM,GAAa,EAAE,EAAE,KAAK,GAAa,EAAE,EAAE,IAAI,GAAG,EAAE,EAAE,OAAO,GAAG,KAAK,EAAE,KAAK,GAAG,EAAE,EAAE,QAAQ,GAAG,EAAE,CAAC;IAC5H,IAAI,WAAW,GAAG,IAAI,EAAE,MAA0B,CAAC;IACnD,MAAM,WAAW,GAAG,CAAC,IAAY,EAAE,EAAE,GAAG,WAAW,GAAG,KAAK,CAAC,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,CAAC;IAChF,MAAM,UAAU,GAAG,GAAG,EAAE;QACtB,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,QAAQ,KAAK,GAAG;YAAE,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;aACnC,IAAI,QAAQ,KAAK,GAAG;YAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;;YACvC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACrB,IAAI,GAAG,EAAE,CAAC;QAAC,OAAO,GAAG,KAAK,CAAC;QAAC,QAAQ,GAAG,EAAE,CAAC;IAC5C,CAAC,CAAC;IACF,MAAM,aAAa,GAAG,GAAG,EAAE;QACzB,UAAU,EAAE,CAAC;QACb,IAAI,QAAQ;YAAE,WAAW,CAAC,4BAA4B,CAAC,CAAC;QACxD,IAAI,IAAI,CAAC,MAAM;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,CAAC;aACnD,IAAI,MAAM,CAAC,MAAM,IAAI,KAAK,CAAC,MAAM;YAAE,WAAW,CAAC,qCAAqC,CAAC,CAAC;QAC3F,IAAI,GAAG,EAAE,CAAC;QAAC,MAAM,GAAG,EAAE,CAAC;QAAC,KAAK,GAAG,EAAE,CAAC;QAAC,QAAQ,GAAG,EAAE,CAAC;IACpD,CAAC,CAAC;IACF,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QACxC,MAAM,EAAE,GAAG,OAAO,CAAC,CAAC,CAAE,CAAC;QACvB,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YAAC,IAAI,EAAE,KAAK,GAAG;gBAAE,KAAK,GAAG,EAAE,CAAC;;gBAAM,IAAI,IAAI,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAC7E,IAAI,EAAE,KAAK,IAAI,IAAI,KAAK,KAAK,GAAG,EAAE,CAAC;YACjC,IAAI,CAAC,GAAG,CAAC,IAAI,OAAO,CAAC,MAAM;gBAAE,WAAW,CAAC,iBAAiB,CAAC,CAAC;iBACvD,CAAC;gBAAC,IAAI,IAAI,OAAO,CAAC,EAAE,CAAC,CAAC,CAAC;gBAAC,OAAO,GAAG,IAAI,CAAC;YAAC,CAAC;YAC9C,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAAC,KAAK,GAAG,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC;YAAC,OAAO,GAAG,IAAI,CAAC;YAAC,SAAS;QAAC,CAAC;QAC/E,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,CAAC;YAAC,KAAK,GAAG,GAAG,CAAC;YAAC,OAAO,GAAG,IAAI,CAAC;YAAC,SAAS;QAAC,CAAC;QACpE,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG;YAAE,WAAW,CAAC,iCAAiC,CAAC,CAAC;QAC7E,IAAI,KAAK,EAAE,CAAC;YAAC,IAAI,IAAI,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QACpC,IAAI,SAAS,CAAC,QAAQ,CAAC,EAAE,CAAC;YAAE,WAAW,CAAC,0CAA0C,CAAC,CAAC;QACpF,IAAI,EAAE,KAAK,GAAG,IAAI,CAAC,OAAO,EAAE,CAAC;YAAC,WAAW,CAAC,yBAAyB,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;QAC9E,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAAC,UAAU,EAAE,CAAC;YAAC,SAAS;QAAC,CAAC;QAC7D,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,IAAI,EAAE,CAAC;YAC1D,aAAa,EAAE,CAAC;YAChB,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,IAAI,IAAI,CAAC,QAAQ,CAAC,EAAE,CAAC;gBAAE,CAAC,EAAE,CAAC;iBAC/C,IAAI,EAAE,KAAK,GAAG;gBAAE,WAAW,CAAC,sCAAsC,CAAC,CAAC;YACzE,SAAS;QACX,CAAC;QACD,IAAI,EAAE,KAAK,GAAG,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;YAC7B,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBAAC,IAAI,GAAG,EAAE,CAAC;gBAAC,OAAO,GAAG,KAAK,CAAC;YAAC,CAAC;YAClE,UAAU,EAAE,CAAC;YAAC,QAAQ,GAAG,EAAE,CAAC;YAC5B,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC;gBAAC,CAAC,EAAE,CAAC;gBAAC,IAAI,EAAE,KAAK,GAAG;oBAAE,WAAW,CAAC,+BAA+B,CAAC,CAAC;YAAC,CAAC;YACjG,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,KAAK,GAAG;gBAAE,WAAW,CAAC,wCAAwC,CAAC,CAAC;YAClF,SAAS;QACX,CAAC;QACD,IAAI,IAAI,EAAE,CAAC;QAAC,OAAO,GAAG,IAAI,CAAC;IAC7B,CAAC;IACD,IAAI,KAAK;QAAE,WAAW,CAAC,gBAAgB,CAAC,CAAC;IACzC,aAAa,EAAE,CAAC;IAChB,IAAI,CAAC,QAAQ,CAAC,MAAM;QAAE,WAAW,CAAC,oBAAoB,CAAC,CAAC;IACxD,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,CAAC;QAAE,WAAW,CAAC,wCAAwC,CAAC,CAAC;IACjH,OAAO,EAAE,QAAQ,EAAE,WAAW,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC;AAClE,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,IAAuB,EAAE,MAAyB;IAC9E,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,IAAI,MAAM,CAAC,MAAM,IAAI,IAAI,CAAC,MAAM,IAAI,MAAM,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC;AACxG,CAAC;AACD,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,MAAM,EAAE,IAAI,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,WAAW,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/policy/shell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,6 @@
1
+ import type { Budget } from "./lexer.js";
2
+ import { type Callable, type Value } from "./values.js";
3
+ export declare function bindArguments(name: string, args: Value[], keywords: Map<string, Value>, spec: (string | [string, Value])[]): Value[];
4
+ export declare function standardGlobals(budget: Budget, mutate: (value: Value) => void): Map<string, Value>;
5
+ export declare function attribute(value: Value, name: string, budget: Budget, mutate: (value: Value) => void): Callable;
6
+ export declare function percentFormat(format: string, value: Value, budget: Budget): string;