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
package/dist/cli.js CHANGED
@@ -1,70 +1,99 @@
1
1
  #!/usr/bin/env node
2
- import { homedir } from 'node:os';
3
- import { join, resolve } from 'node:path';
4
- import { pathToFileURL } from 'node:url';
5
- import { InteractiveMode, runPrintMode, runRpcMode } from '@earendil-works/pi-coding-agent';
6
- import { createGuardedRuntime } from './startup.js';
2
+ import { homedir } from "node:os";
3
+ import { join, resolve } from "node:path";
4
+ import { pathToFileURL } from "node:url";
5
+ import { InteractiveMode, runPrintMode, runRpcMode, } from "@earendil-works/pi-coding-agent";
6
+ import { createGuardedRuntime } from "./startup.js";
7
7
  export async function main(argv) {
8
- let mode = 'tui', cwd = process.cwd(), agentDir = process.env.PI_CODING_AGENT_DIR ?? join(homedir(), '.pi', 'agent'), settingsPath, isProjectTrusted;
8
+ let mode = "tui", cwd = process.cwd(), agentDir = process.env.PI_CODING_AGENT_DIR ?? join(homedir(), ".pi", "agent"), settingsPath, isProjectTrusted;
9
9
  let provider, modelId;
10
10
  const prompts = [], trustedExtensionPaths = [];
11
11
  for (let i = 0; i < argv.length; i++) {
12
12
  const item = argv[i];
13
- if (item === '--help' || item === '-h') {
14
- console.log('사용법: pi-codex-auto-review [--cwd 경로] [--agent-dir 경로] [--policy 파일] [--trust-project] [--extension 경로 ...] [--provider 공급자 --model 모델] [--mode tui|print|json|rpc] [프롬프트]\n--extension(-e)은 반복할 수 있으며, 해당 코드 디렉터리를 신뢰하고 모델 쓰기에서 보호합니다. 경로는 명령을 실행한 디렉터리를 기준으로 해석합니다.');
13
+ if (item === undefined)
14
+ continue;
15
+ if (item === "--help" || item === "-h") {
16
+ console.log("Usage: pi-codex-auto-review [--cwd path] [--agent-dir path] [--policy file] [--trust-project] [--extension path ...] [--provider provider --model model] [--mode tui|print|json|rpc] [prompt]\n--extension (-e) can be repeated. It trusts each code directory and rejects direct model tool writes to it. Paths are resolved from the invocation directory.");
15
17
  return;
16
18
  }
17
- if (item === '--') {
19
+ if (item === "--") {
18
20
  prompts.push(...argv.slice(i + 1));
19
21
  break;
20
22
  }
21
- if (item === '--trust-project') {
23
+ if (item === "--trust-project") {
22
24
  isProjectTrusted = true;
23
25
  continue;
24
26
  }
25
- if (['--mode', '--cwd', '--agent-dir', '--policy', '--extension', '-e', '--provider', '--model'].includes(item)) {
27
+ if ([
28
+ "--mode",
29
+ "--cwd",
30
+ "--agent-dir",
31
+ "--policy",
32
+ "--extension",
33
+ "-e",
34
+ "--provider",
35
+ "--model",
36
+ ].includes(item)) {
26
37
  const value = argv[++i];
27
- if (!value || value.startsWith('--'))
28
- throw new Error(`${item}: 값이 필요합니다`);
29
- if (item === '--mode')
38
+ if (!value || value.startsWith("--"))
39
+ throw new Error(`${item}: a value is required`);
40
+ if (item === "--mode")
30
41
  mode = value;
31
- if (item === '--cwd')
42
+ if (item === "--cwd")
32
43
  cwd = value;
33
- if (item === '--agent-dir')
44
+ if (item === "--agent-dir")
34
45
  agentDir = value;
35
- if (item === '--policy')
46
+ if (item === "--policy")
36
47
  settingsPath = value;
37
- if (item === '--extension' || item === '-e')
48
+ if (item === "--extension" || item === "-e")
38
49
  trustedExtensionPaths.push(resolve(value));
39
- if (item === '--provider')
50
+ if (item === "--provider")
40
51
  provider = value;
41
- if (item === '--model')
52
+ if (item === "--model")
42
53
  modelId = value;
43
54
  }
44
- else if (item === '-p')
45
- mode = 'print';
46
- else if (item.startsWith('-'))
47
- throw new Error(`지원하지 않는 옵션: ${item}`);
55
+ else if (item === "-p")
56
+ mode = "print";
57
+ else if (item.startsWith("-"))
58
+ throw new Error(`Unsupported option: ${item}`);
48
59
  else
49
60
  prompts.push(item);
50
61
  }
51
- if (!['tui', 'print', 'json', 'rpc'].includes(mode))
52
- throw new Error(`지원하지 않는 실행 모드: ${mode}`);
62
+ if (!["tui", "print", "json", "rpc"].includes(mode))
63
+ throw new Error(`Unsupported mode: ${mode}`);
53
64
  if (Boolean(provider) !== Boolean(modelId))
54
- throw new Error('--provider와 --model을 함께 지정해야 합니다');
55
- const runtime = await createGuardedRuntime({ cwd: resolve(cwd), agentDir: resolve(agentDir), settingsPath: settingsPath ? resolve(settingsPath) : undefined, isProjectTrusted, trustedExtensionPaths, ...(provider && modelId ? { modelSelection: { provider, id: modelId } } : {}) });
65
+ throw new Error("--provider and --model must be specified together");
66
+ const runtime = await createGuardedRuntime({
67
+ cwd: resolve(cwd),
68
+ agentDir: resolve(agentDir),
69
+ settingsPath: settingsPath ? resolve(settingsPath) : undefined,
70
+ isProjectTrusted,
71
+ trustedExtensionPaths,
72
+ ...(provider && modelId
73
+ ? { modelSelection: { provider, id: modelId } }
74
+ : {}),
75
+ });
56
76
  try {
57
- if (mode === 'rpc')
77
+ if (mode === "rpc")
58
78
  await runRpcMode(runtime);
59
- else if (mode === 'tui')
60
- await new InteractiveMode(runtime, { initialMessage: prompts.join(' ') || undefined }).run();
79
+ else if (mode === "tui")
80
+ await new InteractiveMode(runtime, {
81
+ initialMessage: prompts.join(" ") || undefined,
82
+ }).run();
61
83
  else
62
- process.exitCode = await runPrintMode(runtime, { mode: mode === 'json' ? 'json' : 'text', initialMessage: prompts.join(' ') || undefined });
84
+ process.exitCode = await runPrintMode(runtime, {
85
+ mode: mode === "json" ? "json" : "text",
86
+ initialMessage: prompts.join(" ") || undefined,
87
+ });
63
88
  }
64
89
  finally {
65
90
  await runtime.dispose();
66
91
  }
67
92
  }
68
- if (process.argv[1] && import.meta.url === pathToFileURL(resolve(process.argv[1])).href)
69
- main(process.argv.slice(2)).catch(error => { console.error(`pi-codex-auto-review: ${error.message}`); process.exitCode = 1; });
93
+ if (process.argv[1] &&
94
+ import.meta.url === pathToFileURL(resolve(process.argv[1])).href)
95
+ main(process.argv.slice(2)).catch((error) => {
96
+ console.error(`pi-codex-auto-review: ${error.message}`);
97
+ process.exitCode = 1;
98
+ });
70
99
  //# sourceMappingURL=cli.js.map
package/dist/cli.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
- import { type PermissionProfile } from './contracts.js';
2
- import type { GuardSettings } from './policy/index.js';
1
+ import { type PermissionProfile } from "./contracts.js";
2
+ import type { GuardSettings } from "./policy/index.js";
3
3
  export interface ContextFile {
4
4
  readonly path: string;
5
5
  readonly content: string;
@@ -1,11 +1,17 @@
1
- import { constants, openSync, closeSync, fstatSync, readSync, realpathSync, statSync } from 'node:fs';
2
- import { dirname, join, resolve, basename } from 'node:path';
3
- import { GuardError } from './contracts.js';
4
- import { isWithin } from './policy/paths.js';
5
- const NAMES = ['AGENTS.override.md', 'AGENTS.md'];
6
- function isMissing(error) { return ['ENOENT', 'ENOTDIR'].includes(error.code ?? ''); }
1
+ import { closeSync, constants, fstatSync, openSync, readSync, realpathSync, statSync, } from "node:fs";
2
+ import { basename, dirname, join, resolve } from "node:path";
3
+ import { GuardError } from "./contracts.js";
4
+ import { isWithin } from "./policy/paths.js";
5
+ const NAMES = ["AGENTS.override.md", "AGENTS.md"];
6
+ function isMissing(error) {
7
+ return ["ENOENT", "ENOTDIR"].includes(error.code ?? "");
8
+ }
7
9
  function isFilename(name) {
8
- return !!name && !['.', '..'].includes(name) && !name.includes('\0') && basename(name) === name && (process.platform !== 'win32' || !/[\\:]/.test(name));
10
+ return (!!name &&
11
+ ![".", ".."].includes(name) &&
12
+ !name.includes("\0") &&
13
+ basename(name) === name &&
14
+ (process.platform !== "win32" || !/[\\:]/.test(name)));
9
15
  }
10
16
  function exists(path) {
11
17
  try {
@@ -34,18 +40,26 @@ function choose(directory, names) {
34
40
  function boundedRead(path, maxBytes, profile, isGlobal, agentDir) {
35
41
  const target = realpathSync(path);
36
42
  // Only the specifically selected global instruction file is an internal controller read.
37
- const isGlobalInstruction = isGlobal && target === join(realpathSync(agentDir), basename(path)) && NAMES.includes(basename(path));
38
- if (!isGlobalInstruction && (profile.denyRead.some(root => isWithin(target, root)) || !profile.readRoots.some(root => isWithin(target, root)))) {
39
- throw new GuardError('CONTEXT_FILE_DENIED', `Instruction file crosses a protected read boundary: ${path}`);
43
+ const isGlobalInstruction = isGlobal &&
44
+ target === join(realpathSync(agentDir), basename(path)) &&
45
+ NAMES.includes(basename(path));
46
+ if (!isGlobalInstruction &&
47
+ (profile.denyRead.some((root) => isWithin(target, root)) ||
48
+ !profile.readRoots.some((root) => isWithin(target, root)))) {
49
+ throw new GuardError("CONTEXT_FILE_DENIED", `Instruction file crosses a protected read boundary: ${path}`);
40
50
  }
41
51
  const expected = statSync(target);
42
52
  if (!expected.isFile() || expected.nlink > 1)
43
- throw new GuardError('CONTEXT_FILE_DENIED', 'Instruction file must be a regular file without hard-link aliases');
53
+ throw new GuardError("CONTEXT_FILE_DENIED", "Instruction file must be a regular file without hard-link aliases");
44
54
  const fd = openSync(target, constants.O_RDONLY | (constants.O_NOFOLLOW ?? 0));
45
55
  try {
46
56
  const actual = fstatSync(fd);
47
- if (!actual.isFile() || actual.dev !== expected.dev || actual.ino !== expected.ino || actual.nlink > 1 || realpathSync(path) !== target)
48
- throw new GuardError('CONTEXT_FILE_CHANGED', 'Instruction file changed during loading');
57
+ if (!actual.isFile() ||
58
+ actual.dev !== expected.dev ||
59
+ actual.ino !== expected.ino ||
60
+ actual.nlink > 1 ||
61
+ realpathSync(path) !== target)
62
+ throw new GuardError("CONTEXT_FILE_CHANGED", "Instruction file changed during loading");
49
63
  const data = Buffer.alloc(Math.min(actual.size, maxBytes));
50
64
  let count = 0;
51
65
  while (count < data.length) {
@@ -54,8 +68,10 @@ function boundedRead(path, maxBytes, profile, isGlobal, agentDir) {
54
68
  break;
55
69
  count += read;
56
70
  }
57
- const content = data.subarray(0, count).toString('utf8');
58
- return content.trim() ? { file: { path, content }, bytesRead: count } : undefined;
71
+ const content = data.subarray(0, count).toString("utf8");
72
+ return content.trim()
73
+ ? { file: { path, content }, bytesRead: count }
74
+ : undefined;
59
75
  }
60
76
  finally {
61
77
  closeSync(fd);
@@ -78,10 +94,10 @@ export function loadContextFiles(options) {
78
94
  }
79
95
  if (!options.isProjectTrusted || settings.projectDocMaxBytes === 0)
80
96
  return result;
81
- const cwd = resolve(options.cwd), markers = (settings.projectRootMarkers ?? ['.git']).filter(isFilename);
97
+ const cwd = resolve(options.cwd), markers = (settings.projectRootMarkers ?? [".git"]).filter(isFilename);
82
98
  let root;
83
99
  for (let dir = cwd; markers.length; dir = dirname(dir)) {
84
- if (markers.some(name => exists(join(dir, name)))) {
100
+ if (markers.some((name) => exists(join(dir, name)))) {
85
101
  root = dir;
86
102
  break;
87
103
  }
@@ -94,13 +110,18 @@ export function loadContextFiles(options) {
94
110
  dir = dirname(dir);
95
111
  directories.unshift(dir);
96
112
  }
97
- const names = [...new Set([...NAMES, ...settings.projectDocFallbackFilenames.filter(isFilename)])];
113
+ const names = [
114
+ ...new Set([
115
+ ...NAMES,
116
+ ...settings.projectDocFallbackFilenames.filter(isFilename),
117
+ ]),
118
+ ];
98
119
  let remaining = settings.projectDocMaxBytes;
99
120
  for (const directory of directories) {
100
121
  if (!remaining)
101
122
  break;
102
123
  const path = choose(directory, names);
103
- if (!path || result.some(file => file.path === path))
124
+ if (!path || result.some((file) => file.path === path))
104
125
  continue;
105
126
  const file = boundedRead(path, remaining, profile, false, options.agentDir);
106
127
  if (file) {
@@ -1 +1 @@
1
- {"version":3,"file":"context-files.js","sourceRoot":"","sources":["../src/context-files.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AACtG,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAC7D,OAAO,EAAE,UAAU,EAA0B,MAAM,gBAAgB,CAAC;AACpE,OAAO,EAAE,QAAQ,EAAE,MAAM,mBAAmB,CAAC;AAI7C,MAAM,KAAK,GAAG,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAAC;AAClD,SAAS,SAAS,CAAC,KAAc,IAAa,OAAO,CAAC,QAAQ,EAAC,SAAS,CAAC,CAAC,QAAQ,CAAE,KAA+B,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,CAAC,CAAC;AAClI,SAAS,UAAU,CAAC,IAAY;IAC9B,OAAO,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,GAAG,EAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,QAAQ,KAAK,OAAO,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;AAC1J,CAAC;AACD,SAAS,MAAM,CAAC,IAAY;IAC1B,IAAI,CAAC;QAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;QAAC,OAAO,IAAI,CAAC;IAAC,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QAAC,IAAI,SAAS,CAAC,KAAK,CAAC;YAAE,OAAO,KAAK,CAAC;QAAC,MAAM,KAAK,CAAC;IAAC,CAAC;AACzG,CAAC;AACD,SAAS,MAAM,CAAC,SAAiB,EAAE,KAAwB;IACzD,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,IAAI,GAAG,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC;QACnC,IAAI,CAAC;YAAC,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE;gBAAE,OAAO,IAAI,CAAC;QAAC,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC;gBAAE,MAAM,KAAK,CAAC;QAAC,CAAC;IACzG,CAAC;AACH,CAAC;AACD,SAAS,WAAW,CAAC,IAAY,EAAE,QAAgB,EAAE,OAA0B,EAAE,QAAiB,EAAE,QAAgB;IAClH,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IAClC,yFAAyF;IACzF,MAAM,mBAAmB,GAAG,QAAQ,IAAI,MAAM,KAAK,IAAI,CAAC,YAAY,CAAC,QAAQ,CAAC,EAAE,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC;IAClI,IAAI,CAAC,mBAAmB,IAAI,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAC/I,MAAM,IAAI,UAAU,CAAC,qBAAqB,EAAE,uDAAuD,IAAI,EAAE,CAAC,CAAC;IAC7G,CAAC;IACD,MAAM,QAAQ,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAClC,IAAI,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,QAAQ,CAAC,KAAK,GAAG,CAAC;QAAE,MAAM,IAAI,UAAU,CAAC,qBAAqB,EAAE,mEAAmE,CAAC,CAAC;IAC/J,MAAM,EAAE,GAAG,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC,QAAQ,GAAG,CAAC,SAAS,CAAC,UAAU,IAAI,CAAC,CAAC,CAAC,CAAC;IAC9E,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,SAAS,CAAC,EAAE,CAAC,CAAC;QAC7B,IAAI,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,IAAI,MAAM,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,IAAI,MAAM,CAAC,KAAK,GAAG,CAAC,IAAI,YAAY,CAAC,IAAI,CAAC,KAAK,MAAM;YAAE,MAAM,IAAI,UAAU,CAAC,sBAAsB,EAAE,yCAAyC,CAAC,CAAC;QACjO,MAAM,IAAI,GAAG,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC;QAC3D,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;YAC3B,MAAM,IAAI,GAAG,QAAQ,CAAC,EAAE,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,CAAC,MAAM,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;YACnE,IAAI,CAAC,IAAI;gBAAE,MAAM;YACjB,KAAK,IAAI,IAAI,CAAC;QAChB,CAAC;QACD,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,EAAE,KAAK,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;QACzD,OAAO,OAAO,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAC,IAAI,EAAE,EAAC,IAAI,EAAE,OAAO,EAAC,EAAE,SAAS,EAAE,KAAK,EAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAChF,CAAC;YAAS,CAAC;QAAC,SAAS,CAAC,EAAE,CAAC,CAAC;IAAC,CAAC;AAC9B,CAAC;AAED,4FAA4F;AAC5F,MAAM,UAAU,gBAAgB,CAAC,OAAwH;IACvJ,MAAM,EAAC,QAAQ,EAAE,OAAO,EAAC,GAAG,OAAO,CAAC;IACpC,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,+EAA+E;IAC/E,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC;QAChD,IAAI,CAAC,MAAM;YAAE,SAAS;QACtB,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QACzE,IAAI,IAAI,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YAAC,MAAM;QAAC,CAAC;IAC9C,CAAC;IACD,IAAI,CAAC,OAAO,CAAC,gBAAgB,IAAI,QAAQ,CAAC,kBAAkB,KAAK,CAAC;QAAE,OAAO,MAAM,CAAC;IAClF,MAAM,GAAG,GAAG,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,OAAO,GAAG,CAAC,QAAQ,CAAC,kBAAkB,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC;IACzG,IAAI,IAAwB,CAAC;IAC7B,KAAK,IAAI,GAAG,GAAG,GAAG,EAAE,OAAO,CAAC,MAAM,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QACvD,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;YAAC,IAAI,GAAG,GAAG,CAAC;YAAC,MAAM;QAAC,CAAC;QACzE,IAAI,OAAO,CAAC,GAAG,CAAC,KAAK,GAAG;YAAE,MAAM;IAClC,CAAC;IACD,MAAM,WAAW,GAAG,CAAC,GAAG,CAAC,CAAC;IAC1B,IAAI,IAAI;QAAE,KAAK,IAAI,GAAG,GAAG,GAAG,EAAE,GAAG,KAAK,IAAI,GAAG,CAAC;YAAC,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;YAAC,WAAW,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAAC,CAAC;IAC9F,MAAM,KAAK,GAAG,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,KAAK,EAAE,GAAG,QAAQ,CAAC,2BAA2B,CAAC,MAAM,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IACnG,IAAI,SAAS,GAAG,QAAQ,CAAC,kBAAkB,CAAC;IAC5C,KAAK,MAAM,SAAS,IAAI,WAAW,EAAE,CAAC;QACpC,IAAI,CAAC,SAAS;YAAE,MAAM;QACtB,MAAM,IAAI,GAAG,MAAM,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QACtC,IAAI,CAAC,IAAI,IAAI,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,CAAC;YAAE,SAAS;QAC/D,MAAM,IAAI,GAAG,WAAW,CAAC,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,KAAK,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;QAC5E,IAAI,IAAI,EAAE,CAAC;YACT,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACvB,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC"}
1
+ {"version":3,"file":"context-files.js","sourceRoot":"","sources":["../src/context-files.ts"],"names":[],"mappings":"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"}
@@ -1,14 +1,14 @@
1
- import type { ReadToolOptions } from '@earendil-works/pi-coding-agent';
1
+ import type { ReadToolOptions } from "@earendil-works/pi-coding-agent";
2
2
  export type Json = null | boolean | number | string | Json[] | {
3
3
  [key: string]: Json;
4
4
  };
5
- export type DecisionKind = 'allow' | 'ask' | 'deny';
6
- export type ActionSource = 'model' | 'nested' | 'user-bash' | 'extension';
7
- export type EvidenceStatus = 'pass' | 'fail' | 'environment-blocked' | 'not-run';
8
- export type ToolName = 'bash' | 'read' | 'edit' | 'write' | 'grep' | 'find' | 'ls';
5
+ export type DecisionKind = "allow" | "ask" | "deny";
6
+ export type ActionSource = "model" | "nested" | "user-bash" | "extension";
7
+ export type EvidenceStatus = "pass" | "fail" | "environment-blocked" | "not-run";
8
+ export type ToolName = "bash" | "read" | "edit" | "write" | "grep" | "find" | "ls";
9
9
  export declare const TOOL_NAMES: readonly ToolName[];
10
10
  export interface PermissionProfile {
11
- readonly mode: 'read-only' | 'workspace-write';
11
+ readonly mode: "read-only" | "workspace-write";
12
12
  readonly readRoots: readonly string[];
13
13
  readonly writeRoots: readonly string[];
14
14
  readonly denyRead: readonly string[];
@@ -42,30 +42,30 @@ export interface PolicyDecision {
42
42
  readonly actionDigest: string;
43
43
  readonly delta: PermissionDelta;
44
44
  readonly isHardDeny: boolean;
45
- readonly approvalCategory?: 'sandbox' | 'rules' | 'mcp_elicitations';
45
+ readonly approvalCategory?: "sandbox" | "rules" | "mcp_elicitations";
46
46
  readonly requiresFreshReview?: boolean;
47
47
  readonly requiresUserInput?: boolean;
48
48
  readonly authority?: ExecutionAuthority;
49
49
  }
50
- export type ApprovalPolicy = 'on-request' | 'never' | {
50
+ export type ApprovalPolicy = "on-request" | "never" | {
51
51
  readonly sandbox: boolean;
52
52
  readonly rules: boolean;
53
53
  readonly mcp_elicitations?: boolean;
54
54
  };
55
- export type RiskLevel = 'low' | 'medium' | 'high' | 'critical';
56
- export type UserAuthorization = 'unknown' | 'low' | 'medium' | 'high';
55
+ export type RiskLevel = "low" | "medium" | "high" | "critical";
56
+ export type UserAuthorization = "unknown" | "low" | "medium" | "high";
57
57
  /** Field names intentionally match the pinned Codex assessment wire format. */
58
58
  export interface ReviewAssessment {
59
59
  readonly risk_level: RiskLevel;
60
60
  readonly user_authorization: UserAuthorization;
61
- readonly outcome: 'allow' | 'deny';
61
+ readonly outcome: "allow" | "deny";
62
62
  readonly rationale: string;
63
63
  }
64
- export type ReviewTerminalState = 'approved' | 'denied' | 'timed-out' | 'aborted' | 'failed';
64
+ export type ReviewTerminalState = "approved" | "denied" | "timed-out" | "aborted" | "failed";
65
65
  export interface ReviewContextItem {
66
66
  readonly id: string;
67
- readonly source: 'user' | 'developer' | 'agents' | 'user-confirmation' | 'assistant' | 'tool-call' | 'tool-result';
68
- readonly trust: 'authorization' | 'evidence';
67
+ readonly source: "user" | "developer" | "agents" | "user-confirmation" | "assistant" | "tool-call" | "tool-result";
68
+ readonly trust: "authorization" | "evidence";
69
69
  readonly content: Json;
70
70
  readonly isTruncated?: boolean;
71
71
  }
@@ -82,22 +82,22 @@ export interface ReviewBinding {
82
82
  readonly policyDigest: string;
83
83
  }
84
84
  export type ReviewResult = ReviewBinding & ({
85
- readonly status: 'approved' | 'denied';
85
+ readonly status: "approved" | "denied";
86
86
  readonly assessment: ReviewAssessment;
87
87
  } | {
88
- readonly status: 'timed-out' | 'aborted' | 'failed';
89
- readonly failure: 'timeout' | 'cancelled' | 'provider' | 'invalid-output' | 'investigation' | 'context';
88
+ readonly status: "timed-out" | "aborted" | "failed";
89
+ readonly failure: "timeout" | "cancelled" | "provider" | "invalid-output" | "investigation" | "context";
90
90
  readonly reason: string;
91
91
  });
92
92
  export type ExecutionAuthority = {
93
- readonly kind: 'sandbox' | 'scoped-permissions';
93
+ readonly kind: "sandbox" | "scoped-permissions";
94
94
  readonly actionDigest: string;
95
95
  } | {
96
- readonly kind: 'command-rule';
96
+ readonly kind: "command-rule";
97
97
  readonly actionDigest: string;
98
98
  readonly ruleDigest: string;
99
99
  } | {
100
- readonly kind: 'reviewed-command';
100
+ readonly kind: "reviewed-command";
101
101
  readonly actionDigest: string;
102
102
  };
103
103
  export interface RetryAuthorization {
@@ -115,7 +115,7 @@ export interface RecentDenial {
115
115
  }
116
116
  export interface Grant {
117
117
  readonly id: string;
118
- readonly scope: 'once' | 'session' | 'persistent';
118
+ readonly scope: "once" | "session" | "persistent";
119
119
  readonly actionDigest: string;
120
120
  readonly ruleDigest: string;
121
121
  readonly sessionId: string;
@@ -125,10 +125,10 @@ export interface Grant {
125
125
  }
126
126
  export interface ToolResult {
127
127
  content: ({
128
- type: 'text';
128
+ type: "text";
129
129
  text: string;
130
130
  } | {
131
- type: 'image';
131
+ type: "image";
132
132
  data: string;
133
133
  mimeType: string;
134
134
  })[];
@@ -153,54 +153,54 @@ export interface NetworkApprovalRequest {
153
153
  readonly port?: number;
154
154
  }
155
155
  export type WorkerJob = {
156
- kind: 'shell';
156
+ kind: "shell";
157
157
  command: string;
158
158
  cwd: string;
159
159
  shellPath?: string;
160
160
  timeoutSeconds?: number;
161
161
  env?: NodeJS.ProcessEnv;
162
162
  } | {
163
- kind: 'tool';
163
+ kind: "tool";
164
164
  tool: ToolName;
165
165
  args: Record<string, Json>;
166
166
  cwd: string;
167
167
  toolCallId: string;
168
- options?: Omit<ReadToolOptions, 'operations'>;
168
+ options?: Omit<ReadToolOptions, "operations">;
169
169
  } | {
170
- kind: 'file';
171
- operation: 'read' | 'write' | 'mkdir' | 'access' | 'stat' | 'list';
170
+ kind: "file";
171
+ operation: "read" | "write" | "mkdir" | "access" | "stat" | "list";
172
172
  path: string;
173
173
  content?: string;
174
174
  cwd: string;
175
175
  };
176
176
  export type WorkerFrame = {
177
177
  schemaVersion: 1;
178
- type: 'data';
178
+ type: "data";
179
179
  data: string;
180
180
  } | {
181
181
  schemaVersion: 1;
182
- type: 'update';
182
+ type: "update";
183
183
  result: ToolResult;
184
184
  } | {
185
185
  schemaVersion: 1;
186
- type: 'result';
186
+ type: "result";
187
187
  result: Json;
188
188
  } | {
189
189
  schemaVersion: 1;
190
- type: 'error';
190
+ type: "error";
191
191
  code: string;
192
192
  message: string;
193
193
  };
194
194
  /** Only the unsandboxed broker's private IPC channel can send this control frame. */
195
195
  export interface BrokerControlFrame {
196
196
  readonly schemaVersion: 1;
197
- readonly type: 'workload-started';
197
+ readonly type: "workload-started";
198
198
  readonly processGroupId: number;
199
199
  }
200
200
  /** Private controller/broker IPC only. Workload stdout must still reject these frame types. */
201
201
  export interface BrokerNetworkRequest {
202
202
  readonly schemaVersion: 1;
203
- readonly type: 'network-request';
203
+ readonly type: "network-request";
204
204
  readonly requestId: string;
205
205
  readonly destination: NetworkApprovalRequest;
206
206
  }
@@ -208,7 +208,7 @@ export interface TestEvidence {
208
208
  readonly schemaVersion?: 1 | 2;
209
209
  readonly runId?: string;
210
210
  readonly artifactPath?: string;
211
- readonly provenance?: 'executed' | 'preserved-legacy' | 'synthetic';
211
+ readonly provenance?: "executed" | "preserved-legacy" | "synthetic";
212
212
  readonly startedAt?: string;
213
213
  readonly recordedAt?: string;
214
214
  readonly provider?: {
@@ -233,9 +233,9 @@ export interface TestEvidence {
233
233
  readonly sourceDigest: string;
234
234
  readonly contractDigest: string;
235
235
  readonly runtimeVersions: Readonly<Record<string, string>>;
236
- readonly evidenceKind: 'unit-doubles' | 'simulated-provider-ui' | 'native-os' | 'workflow';
236
+ readonly evidenceKind: "unit-doubles" | "simulated-provider-ui" | "native-os" | "workflow";
237
237
  readonly nativeControls?: readonly {
238
- kind: 'allow' | 'deny';
238
+ kind: "allow" | "deny";
239
239
  effect: string;
240
240
  isObserved: boolean;
241
241
  platform: string;
@@ -250,11 +250,11 @@ export declare function canonicalJson(value: unknown): string;
250
250
  export declare function digest(value: unknown): string;
251
251
  export declare function immutable<T>(value: T): T;
252
252
  export declare function createProfile(input: PermissionProfile): PermissionProfile;
253
- export declare function createAction(input: Omit<GuardAction, 'schemaVersion' | 'digest' | 'permissionDigest'>, profile: PermissionProfile): GuardAction;
253
+ export declare function createAction(input: Omit<GuardAction, "schemaVersion" | "digest" | "permissionDigest">, profile: PermissionProfile): GuardAction;
254
254
  /** Reusable grants still bind exact inputs/cwd/source/profile, but not a previous logical call id. */
255
255
  export declare function ruleDigest(action: GuardAction): string;
256
256
  /** A retry gets a new invocation ID, but cannot change session, semantics or context. */
257
257
  export declare function retryIdentity(action: GuardAction, contextId: string): string;
258
- export declare function approvalEligible(policy: ApprovalPolicy, category: 'sandbox' | 'rules' | 'mcp_elicitations'): boolean;
258
+ export declare function approvalEligible(policy: ApprovalPolicy, category: "sandbox" | "rules" | "mcp_elicitations"): boolean;
259
259
  export declare function decision(action: GuardAction, kind: DecisionKind, reason: string, delta?: PermissionDelta, isHardDeny?: boolean): PolicyDecision;
260
260
  export declare function validateWorkerFrame(value: unknown): WorkerFrame;