@buyong/pi-codex-auto-review 0.0.0-stage → 0.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/NOTICE +12 -0
- package/README.ko.md +85 -0
- package/README.md +84 -2
- package/dist/approval-commands.d.ts +4 -0
- package/dist/approval-commands.js +230 -0
- package/dist/approval-commands.js.map +1 -0
- package/dist/approval-settings.d.ts +9 -0
- package/dist/approval-settings.js +47 -0
- package/dist/approval-settings.js.map +1 -0
- package/dist/approvals.d.ts +73 -0
- package/dist/approvals.js +288 -0
- package/dist/approvals.js.map +1 -0
- package/dist/audit.d.ts +28 -0
- package/dist/audit.js +64 -0
- package/dist/audit.js.map +1 -0
- package/dist/cli.d.ts +2 -0
- package/dist/cli.js +99 -0
- package/dist/cli.js.map +1 -0
- package/dist/context-files.d.ts +14 -0
- package/dist/context-files.js +134 -0
- package/dist/context-files.js.map +1 -0
- package/dist/contracts.d.ts +260 -0
- package/dist/contracts.js +168 -0
- package/dist/contracts.js.map +1 -0
- package/dist/index.d.ts +28 -0
- package/dist/index.js +191 -0
- package/dist/index.js.map +1 -0
- package/dist/pi-host.d.ts +2 -0
- package/dist/pi-host.js +7 -0
- package/dist/pi-host.js.map +1 -0
- package/dist/policy/domains.d.ts +5 -0
- package/dist/policy/domains.js +28 -0
- package/dist/policy/domains.js.map +1 -0
- package/dist/policy/index.d.ts +55 -0
- package/dist/policy/index.js +521 -0
- package/dist/policy/index.js.map +1 -0
- package/dist/policy/paths.d.ts +5 -0
- package/dist/policy/paths.js +67 -0
- package/dist/policy/paths.js.map +1 -0
- package/dist/policy/rule-engine.d.ts +2 -0
- package/dist/policy/rule-engine.js +283 -0
- package/dist/policy/rule-engine.js.map +1 -0
- package/dist/policy/rule-types.d.ts +30 -0
- package/dist/policy/rule-types.js +2 -0
- package/dist/policy/rule-types.js.map +1 -0
- package/dist/policy/rules-sync.d.ts +1 -0
- package/dist/policy/rules-sync.js +14 -0
- package/dist/policy/rules-sync.js.map +1 -0
- package/dist/policy/rules-worker.d.ts +1 -0
- package/dist/policy/rules-worker.js +14 -0
- package/dist/policy/rules-worker.js.map +1 -0
- package/dist/policy/rules.d.ts +9 -0
- package/dist/policy/rules.js +149 -0
- package/dist/policy/rules.js.map +1 -0
- package/dist/policy/shell.d.ts +14 -0
- package/dist/policy/shell.js +151 -0
- package/dist/policy/shell.js.map +1 -0
- package/dist/policy/starlark/builtins.d.ts +6 -0
- package/dist/policy/starlark/builtins.js +764 -0
- package/dist/policy/starlark/builtins.js.map +1 -0
- package/dist/policy/starlark/evaluator.d.ts +18 -0
- package/dist/policy/starlark/evaluator.js +518 -0
- package/dist/policy/starlark/evaluator.js.map +1 -0
- package/dist/policy/starlark/lexer.d.ts +14 -0
- package/dist/policy/starlark/lexer.js +189 -0
- package/dist/policy/starlark/lexer.js.map +1 -0
- package/dist/policy/starlark/parser.d.ts +140 -0
- package/dist/policy/starlark/parser.js +508 -0
- package/dist/policy/starlark/parser.js.map +1 -0
- package/dist/policy/starlark/validation.d.ts +4 -0
- package/dist/policy/starlark/validation.js +183 -0
- package/dist/policy/starlark/validation.js.map +1 -0
- package/dist/policy/starlark/values.d.ts +46 -0
- package/dist/policy/starlark/values.js +363 -0
- package/dist/policy/starlark/values.js.map +1 -0
- package/dist/reports.d.ts +21 -0
- package/dist/reports.js +78 -0
- package/dist/reports.js.map +1 -0
- package/dist/review/context.d.ts +38 -0
- package/dist/review/context.js +314 -0
- package/dist/review/context.js.map +1 -0
- package/dist/review/investigation.d.ts +39 -0
- package/dist/review/investigation.js +77 -0
- package/dist/review/investigation.js.map +1 -0
- package/dist/review/lifecycle.d.ts +29 -0
- package/dist/review/lifecycle.js +114 -0
- package/dist/review/lifecycle.js.map +1 -0
- package/dist/review/policy.d.ts +4 -0
- package/dist/review/policy.js +37 -0
- package/dist/review/policy.js.map +1 -0
- package/dist/review/upstream-policy.d.ts +2 -0
- package/dist/review/upstream-policy.js +210 -0
- package/dist/review/upstream-policy.js.map +1 -0
- package/dist/review/user-input.d.ts +5 -0
- package/dist/review/user-input.js +54 -0
- package/dist/review/user-input.js.map +1 -0
- package/dist/reviewer.d.ts +55 -0
- package/dist/reviewer.js +336 -0
- package/dist/reviewer.js.map +1 -0
- package/dist/signals.d.ts +10 -0
- package/dist/signals.js +36 -0
- package/dist/signals.js.map +1 -0
- package/dist/startup.d.ts +22 -0
- package/dist/startup.js +198 -0
- package/dist/startup.js.map +1 -0
- package/dist/tools/controller.d.ts +72 -0
- package/dist/tools/controller.js +644 -0
- package/dist/tools/controller.js.map +1 -0
- package/dist/tools/environment.d.ts +2 -0
- package/dist/tools/environment.js +11 -0
- package/dist/tools/environment.js.map +1 -0
- package/dist/tools/executor.d.ts +14 -0
- package/dist/tools/executor.js +92 -0
- package/dist/tools/executor.js.map +1 -0
- package/dist/tools/external.d.ts +31 -0
- package/dist/tools/external.js +35 -0
- package/dist/tools/external.js.map +1 -0
- package/dist/tools/mcp.d.ts +17 -0
- package/dist/tools/mcp.js +317 -0
- package/dist/tools/mcp.js.map +1 -0
- package/dist/tools/mutation-queue.d.ts +1 -0
- package/dist/tools/mutation-queue.js +16 -0
- package/dist/tools/mutation-queue.js.map +1 -0
- package/docs/publishing.ko.md +127 -0
- package/docs/publishing.md +127 -0
- package/docs/security/dependencies.ko.md +54 -0
- package/docs/security/dependencies.md +54 -0
- package/docs/testing/auto-review-protection.ko.md +158 -0
- package/docs/testing/auto-review-protection.md +158 -0
- package/docs/usage.ko.md +242 -0
- package/docs/usage.md +242 -0
- package/package.json +76 -5
package/dist/index.js
ADDED
|
@@ -0,0 +1,191 @@
|
|
|
1
|
+
import { homedir } from "node:os";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
3
|
+
import { createBashToolDefinition, createEditToolDefinition, createFindToolDefinition, createGrepToolDefinition, createLsToolDefinition, createReadToolDefinition, createWriteToolDefinition, } from "@earendil-works/pi-coding-agent";
|
|
4
|
+
import { registerApprovalCommands } from "./approval-commands.js";
|
|
5
|
+
import { ApprovalSettingsStore } from "./approval-settings.js";
|
|
6
|
+
import { ApprovalManager, FileGrantPersistence } from "./approvals.js";
|
|
7
|
+
import { AuditLog } from "./audit.js";
|
|
8
|
+
import { createProfile } from "./contracts.js";
|
|
9
|
+
import { defaultProfile } from "./policy/index.js";
|
|
10
|
+
import { AUTHORIZATION_ENTRY, REVIEW_CONTEXT_ENTRY, safeEvidence, } from "./review/context.js";
|
|
11
|
+
import { GuardController } from "./tools/controller.js";
|
|
12
|
+
import { PiExecutor } from "./tools/executor.js";
|
|
13
|
+
import { createGuardedMcpExtension, } from "./tools/mcp.js";
|
|
14
|
+
export function createGuardExtension(options = {}) {
|
|
15
|
+
let controller;
|
|
16
|
+
const factory = async (pi) => {
|
|
17
|
+
const previous = controller;
|
|
18
|
+
controller = undefined;
|
|
19
|
+
await previous?.close();
|
|
20
|
+
const cwd = options.cwd ?? process.cwd();
|
|
21
|
+
const agentDir = options.agentDir ??
|
|
22
|
+
process.env.PI_CODING_AGENT_DIR ??
|
|
23
|
+
join(homedir(), ".pi", "agent");
|
|
24
|
+
const controlDir = join(agentDir, "guard");
|
|
25
|
+
const settingsPath = options.settingsPath
|
|
26
|
+
? resolve(options.settingsPath)
|
|
27
|
+
: join(controlDir, "settings.json");
|
|
28
|
+
const settingsStore = new ApprovalSettingsStore(settingsPath, options.settings, Boolean(options.settingsPath));
|
|
29
|
+
const settings = await settingsStore.load();
|
|
30
|
+
const baseline = await defaultProfile(cwd, settings, [agentDir, settingsPath], options.trustedExtensionPaths);
|
|
31
|
+
const profile = options.profile
|
|
32
|
+
? createProfile({
|
|
33
|
+
...options.profile,
|
|
34
|
+
denyRead: [
|
|
35
|
+
...new Set([
|
|
36
|
+
...options.profile.denyRead,
|
|
37
|
+
...baseline.denyRead,
|
|
38
|
+
]),
|
|
39
|
+
],
|
|
40
|
+
denyWrite: [
|
|
41
|
+
...new Set([
|
|
42
|
+
...options.profile.denyWrite,
|
|
43
|
+
...baseline.denyWrite,
|
|
44
|
+
]),
|
|
45
|
+
],
|
|
46
|
+
})
|
|
47
|
+
: baseline;
|
|
48
|
+
const audit = new AuditLog(join(controlDir, "audit.jsonl"));
|
|
49
|
+
const approvals = new ApprovalManager({
|
|
50
|
+
reviewTimeoutMs: settings.reviewTimeoutMs,
|
|
51
|
+
approvalTimeoutMs: settings.approvalTimeoutMs,
|
|
52
|
+
approvalPolicy: settings.approvalPolicy,
|
|
53
|
+
approvalsReviewer: settings.approvalsReviewer,
|
|
54
|
+
audit,
|
|
55
|
+
persistence: new FileGrantPersistence(join(controlDir, "grants.json")),
|
|
56
|
+
});
|
|
57
|
+
controller = new GuardController({
|
|
58
|
+
profile,
|
|
59
|
+
settings,
|
|
60
|
+
executor: options.executor ?? new PiExecutor(),
|
|
61
|
+
approvals,
|
|
62
|
+
audit,
|
|
63
|
+
provider: options.provider,
|
|
64
|
+
shellPath: options.bashOptions?.shellPath,
|
|
65
|
+
persistContext: (item) => pi.appendEntry(REVIEW_CONTEXT_ENTRY, item),
|
|
66
|
+
});
|
|
67
|
+
try {
|
|
68
|
+
await controller.initialize(cwd);
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
await controller.close();
|
|
72
|
+
controller = undefined;
|
|
73
|
+
throw error;
|
|
74
|
+
}
|
|
75
|
+
const guard = controller;
|
|
76
|
+
pi.registerTool(guard.wrapTool(createBashToolDefinition(cwd, options.bashOptions), options.bashOptions));
|
|
77
|
+
pi.registerTool(guard.wrapTool(createReadToolDefinition(cwd, options.readOptions), options.readOptions));
|
|
78
|
+
pi.registerTool(guard.wrapTool(createEditToolDefinition(cwd)));
|
|
79
|
+
pi.registerTool(guard.wrapTool(createWriteToolDefinition(cwd)));
|
|
80
|
+
pi.registerTool(guard.wrapTool(createGrepToolDefinition(cwd)));
|
|
81
|
+
pi.registerTool(guard.wrapTool(createFindToolDefinition(cwd)));
|
|
82
|
+
pi.registerTool(guard.wrapTool(createLsToolDefinition(cwd)));
|
|
83
|
+
pi.on("session_start", (_event, context) => {
|
|
84
|
+
guard.assertReady();
|
|
85
|
+
guard.reset(context.sessionManager.getSessionId(), context.sessionManager);
|
|
86
|
+
});
|
|
87
|
+
pi.on("session_tree", (_event, context) => {
|
|
88
|
+
guard.reset(context.sessionManager.getSessionId(), context.sessionManager);
|
|
89
|
+
});
|
|
90
|
+
pi.on("session_compact", (event) => {
|
|
91
|
+
guard.reviewContext.summary(event.compactionEntry.summary, event.compactionEntry.id);
|
|
92
|
+
});
|
|
93
|
+
pi.on("input", (event) => {
|
|
94
|
+
if (event.source === "interactive" || event.source === "rpc") {
|
|
95
|
+
guard.authorizeUser(event.text);
|
|
96
|
+
pi.appendEntry(AUTHORIZATION_ENTRY, {
|
|
97
|
+
text: safeEvidence(event.text),
|
|
98
|
+
source: event.source,
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
});
|
|
102
|
+
pi.on("before_agent_start", (event) => {
|
|
103
|
+
guard.reviewContext.instructions(event);
|
|
104
|
+
});
|
|
105
|
+
pi.on("agent_start", (_event, context) => {
|
|
106
|
+
guard.startTurn(context);
|
|
107
|
+
});
|
|
108
|
+
pi.on("message_end", (event) => {
|
|
109
|
+
guard.reviewContext.message(event.message);
|
|
110
|
+
});
|
|
111
|
+
pi.on("tool_call", (event) => {
|
|
112
|
+
guard.assertReady();
|
|
113
|
+
guard.noteCall(event);
|
|
114
|
+
if (![
|
|
115
|
+
"bash",
|
|
116
|
+
"read",
|
|
117
|
+
"edit",
|
|
118
|
+
"write",
|
|
119
|
+
"grep",
|
|
120
|
+
"find",
|
|
121
|
+
"ls",
|
|
122
|
+
"codemode",
|
|
123
|
+
...guard.options.settings.trustedTools,
|
|
124
|
+
].includes(event.toolName) &&
|
|
125
|
+
!guard.isExternalTool(event.toolName))
|
|
126
|
+
return {
|
|
127
|
+
block: true,
|
|
128
|
+
reason: "Unknown tool needs an explicit trusted adapter",
|
|
129
|
+
};
|
|
130
|
+
});
|
|
131
|
+
pi.on("tool_execution_end", (event) => {
|
|
132
|
+
const result = event.result ?? {}, callIdentity = guard.reviewContext.callIdentity(event.toolCallId);
|
|
133
|
+
guard.reviewContext.toolResult({
|
|
134
|
+
tool: event.toolName,
|
|
135
|
+
toolCallId: event.toolCallId,
|
|
136
|
+
callIdentity,
|
|
137
|
+
isError: event.isError,
|
|
138
|
+
content: (result.content ?? [])
|
|
139
|
+
.filter((item) => item.type === "text")
|
|
140
|
+
.map((item) => ({
|
|
141
|
+
type: "text",
|
|
142
|
+
text: item.text,
|
|
143
|
+
})),
|
|
144
|
+
...(result.structuredContent !== undefined
|
|
145
|
+
? {
|
|
146
|
+
structuredContent: JSON.parse(JSON.stringify(result.structuredContent)),
|
|
147
|
+
}
|
|
148
|
+
: {}),
|
|
149
|
+
...(event.parentToolCallId
|
|
150
|
+
? {
|
|
151
|
+
parentToolCallId: event.parentToolCallId,
|
|
152
|
+
parentCallIdentity: guard.reviewContext.callIdentity(event.parentToolCallId),
|
|
153
|
+
}
|
|
154
|
+
: {}),
|
|
155
|
+
}, callIdentity);
|
|
156
|
+
guard.completeCall(event.toolCallId);
|
|
157
|
+
});
|
|
158
|
+
pi.on("user_bash", (event, context) => {
|
|
159
|
+
guard.assertReady();
|
|
160
|
+
return {
|
|
161
|
+
operations: guard.userBashOperations(context, event.command),
|
|
162
|
+
};
|
|
163
|
+
});
|
|
164
|
+
pi.on("session_shutdown", async () => {
|
|
165
|
+
await guard.close();
|
|
166
|
+
});
|
|
167
|
+
registerApprovalCommands(pi, guard, settingsStore);
|
|
168
|
+
if (options.mcp !== false) {
|
|
169
|
+
try {
|
|
170
|
+
const mcp = await createGuardedMcpExtension(agentDir, () => guard, options.mcp, options.mcpToolPolicies);
|
|
171
|
+
await (typeof mcp === "function" ? mcp : mcp.factory)(pi);
|
|
172
|
+
}
|
|
173
|
+
catch (error) {
|
|
174
|
+
await guard.close();
|
|
175
|
+
controller = undefined;
|
|
176
|
+
throw error;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
};
|
|
180
|
+
return {
|
|
181
|
+
factory,
|
|
182
|
+
assertReady() {
|
|
183
|
+
if (!controller)
|
|
184
|
+
throw new Error("pi-codex-auto-review extension failed to load");
|
|
185
|
+
controller.assertReady();
|
|
186
|
+
return controller;
|
|
187
|
+
},
|
|
188
|
+
};
|
|
189
|
+
}
|
|
190
|
+
export default createGuardExtension().factory;
|
|
191
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/pi-host.js
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import { resolve } from "node:path";
|
|
2
|
+
import { getPackageDir } from "@earendil-works/pi-coding-agent";
|
|
3
|
+
/** Resolve the SDK supplied by Pi's extension loader, including global installs. */
|
|
4
|
+
export function getPiSDKEntryPath() {
|
|
5
|
+
return resolve(getPackageDir(), "dist/index.js");
|
|
6
|
+
}
|
|
7
|
+
//# sourceMappingURL=pi-host.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pi-host.js","sourceRoot":"","sources":["../src/pi-host.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AACpC,OAAO,EAAE,aAAa,EAAE,MAAM,iCAAiC,CAAC;AAEhE,oFAAoF;AACpF,MAAM,UAAU,iBAAiB;IAC7B,OAAO,OAAO,CAAC,aAAa,EAAE,EAAE,eAAe,CAAC,CAAC;AACrD,CAAC"}
|
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export declare function normalizeHost(host: string): string;
|
|
2
|
+
export declare function isNetworkHost(host: unknown): boolean;
|
|
3
|
+
export declare function isDomainPattern(pattern: unknown): pattern is string;
|
|
4
|
+
/** Shared with the native configuration so policy and transport agree on subdomains. */
|
|
5
|
+
export declare function matchesDomain(host: string, pattern: string): boolean;
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { isIP } from "node:net";
|
|
2
|
+
export function normalizeHost(host) {
|
|
3
|
+
const value = host.toLowerCase().replace(/\.+$/, "");
|
|
4
|
+
const literal = value.startsWith("[") && value.endsWith("]")
|
|
5
|
+
? value.slice(1, -1)
|
|
6
|
+
: value;
|
|
7
|
+
return isIP(literal) === 6
|
|
8
|
+
? new URL(`http://[${literal}]/`).hostname.slice(1, -1)
|
|
9
|
+
: value;
|
|
10
|
+
}
|
|
11
|
+
export function isNetworkHost(host) {
|
|
12
|
+
return (typeof host === "string" &&
|
|
13
|
+
(isIP(normalizeHost(host)) === 6 || /^[a-z0-9][a-z0-9.-]*$/i.test(host)));
|
|
14
|
+
}
|
|
15
|
+
export function isDomainPattern(pattern) {
|
|
16
|
+
return (typeof pattern === "string" &&
|
|
17
|
+
(isNetworkHost(pattern) ||
|
|
18
|
+
(pattern.startsWith("*.") &&
|
|
19
|
+
/^[a-z0-9][a-z0-9.-]*$/i.test(pattern.slice(2)))));
|
|
20
|
+
}
|
|
21
|
+
/** Shared with the native configuration so policy and transport agree on subdomains. */
|
|
22
|
+
export function matchesDomain(host, pattern) {
|
|
23
|
+
const value = normalizeHost(host), rule = normalizeHost(pattern);
|
|
24
|
+
return rule.startsWith("*.")
|
|
25
|
+
? value.endsWith(rule.slice(1)) && value !== rule.slice(2)
|
|
26
|
+
: value === rule;
|
|
27
|
+
}
|
|
28
|
+
//# sourceMappingURL=domains.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"domains.js","sourceRoot":"","sources":["../../src/policy/domains.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,UAAU,CAAC;AAChC,MAAM,UAAU,aAAa,CAAC,IAAY;IACtC,MAAM,KAAK,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC,OAAO,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;IACrD,MAAM,OAAO,GACT,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,KAAK,CAAC,QAAQ,CAAC,GAAG,CAAC;QACxC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACpB,CAAC,CAAC,KAAK,CAAC;IAChB,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC;QACtB,CAAC,CAAC,IAAI,GAAG,CAAC,WAAW,OAAO,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;QACvD,CAAC,CAAC,KAAK,CAAC;AAChB,CAAC;AACD,MAAM,UAAU,aAAa,CAAC,IAAa;IACvC,OAAO,CACH,OAAO,IAAI,KAAK,QAAQ;QACxB,CAAC,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC,KAAK,CAAC,IAAI,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAC3E,CAAC;AACN,CAAC;AACD,MAAM,UAAU,eAAe,CAAC,OAAgB;IAC5C,OAAO,CACH,OAAO,OAAO,KAAK,QAAQ;QAC3B,CAAC,aAAa,CAAC,OAAO,CAAC;YACnB,CAAC,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC;gBACrB,wBAAwB,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAC5D,CAAC;AACN,CAAC;AACD,wFAAwF;AACxF,MAAM,UAAU,aAAa,CAAC,IAAY,EAAE,OAAe;IACvD,MAAM,KAAK,GAAG,aAAa,CAAC,IAAI,CAAC,EAC7B,IAAI,GAAG,aAAa,CAAC,OAAO,CAAC,CAAC;IAClC,OAAO,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC;QACxB,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,KAAK,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1D,CAAC,CAAC,KAAK,KAAK,IAAI,CAAC;AACzB,CAAC"}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { type ApprovalPolicy, type GuardAction, type PermissionProfile, type PolicyDecision } from "../contracts.js";
|
|
2
|
+
import { canonicalPath, isWithin, resolveToolPath } from "./paths.js";
|
|
3
|
+
import { analyzeShell, matchesPrefix } from "./shell.js";
|
|
4
|
+
export { analyzeShell, canonicalPath, isWithin, matchesPrefix, resolveToolPath, };
|
|
5
|
+
export interface CommandRule {
|
|
6
|
+
readonly prefix: readonly string[];
|
|
7
|
+
readonly decision: "allow" | "ask" | "deny";
|
|
8
|
+
}
|
|
9
|
+
export interface GuardSettings {
|
|
10
|
+
readonly mode: "read-only" | "workspace-write";
|
|
11
|
+
readonly commandRules: readonly CommandRule[];
|
|
12
|
+
readonly allowedDomains: readonly string[];
|
|
13
|
+
readonly reviewTimeoutMs: number;
|
|
14
|
+
readonly approvalTimeoutMs: number;
|
|
15
|
+
readonly executionTimeoutSeconds: number;
|
|
16
|
+
readonly trustedTools: readonly string[];
|
|
17
|
+
readonly approvalPolicy: ApprovalPolicy;
|
|
18
|
+
readonly approvalsReviewer: "auto_review" | "user";
|
|
19
|
+
readonly reviewModel: {
|
|
20
|
+
readonly provider: string;
|
|
21
|
+
readonly id: string;
|
|
22
|
+
} | null;
|
|
23
|
+
/** Replaces only the tenant policy; intrinsic risk, trust and outcome rules remain enforced. */
|
|
24
|
+
readonly reviewPolicy: string | null;
|
|
25
|
+
readonly reviewMaxRounds: number;
|
|
26
|
+
readonly reviewMaxOutputTokens: number;
|
|
27
|
+
readonly reviewContextChars: number;
|
|
28
|
+
readonly ruleFiles: readonly string[];
|
|
29
|
+
readonly writableRoots: readonly string[];
|
|
30
|
+
readonly excludeSlashTmp: boolean;
|
|
31
|
+
readonly excludeTmpdir: boolean;
|
|
32
|
+
readonly projectDocMaxBytes: number;
|
|
33
|
+
readonly projectDocFallbackFilenames: readonly string[];
|
|
34
|
+
readonly projectRootMarkers: readonly string[] | null;
|
|
35
|
+
}
|
|
36
|
+
export declare const DEFAULT_SETTINGS: GuardSettings;
|
|
37
|
+
export declare function validateSettings(value: unknown): GuardSettings;
|
|
38
|
+
export declare function loadSettings(path: string): Promise<GuardSettings>;
|
|
39
|
+
export declare function defaultProfile(cwd: string, settings: GuardSettings, controlPaths?: readonly string[], trustedExtensionPaths?: readonly string[]): Promise<PermissionProfile>;
|
|
40
|
+
export declare class PolicyEngine {
|
|
41
|
+
readonly settings: GuardSettings;
|
|
42
|
+
private rules;
|
|
43
|
+
private isInitialized;
|
|
44
|
+
private ruleSources;
|
|
45
|
+
private compiledRules?;
|
|
46
|
+
private readonly matchCache;
|
|
47
|
+
private effectiveProfile;
|
|
48
|
+
get profile(): PermissionProfile;
|
|
49
|
+
get revision(): string;
|
|
50
|
+
constructor(settings: GuardSettings, profile: PermissionProfile);
|
|
51
|
+
initialize(cwd?: string): Promise<void>;
|
|
52
|
+
evaluate(action: GuardAction, signal?: AbortSignal): Promise<PolicyDecision>;
|
|
53
|
+
private shellDecision;
|
|
54
|
+
private resolvedProfile;
|
|
55
|
+
}
|