@dsh-enhanced/assistant-policy 0.1.3

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 (56) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +136 -0
  3. package/cordis.patch.yml +13 -0
  4. package/lib/approval-reviewer.d.ts +39 -0
  5. package/lib/approval-reviewer.d.ts.map +1 -0
  6. package/lib/approval-reviewer.js +119 -0
  7. package/lib/approval-reviewer.js.map +1 -0
  8. package/lib/auto-review.d.ts +22 -0
  9. package/lib/auto-review.d.ts.map +1 -0
  10. package/lib/auto-review.js +442 -0
  11. package/lib/auto-review.js.map +1 -0
  12. package/lib/evaluator.d.ts +4 -0
  13. package/lib/evaluator.d.ts.map +1 -0
  14. package/lib/evaluator.js +127 -0
  15. package/lib/evaluator.js.map +1 -0
  16. package/lib/index.d.ts +20 -0
  17. package/lib/index.d.ts.map +1 -0
  18. package/lib/index.js +16 -0
  19. package/lib/index.js.map +1 -0
  20. package/lib/ledger.d.ts +253 -0
  21. package/lib/ledger.d.ts.map +1 -0
  22. package/lib/ledger.js +891 -0
  23. package/lib/ledger.js.map +1 -0
  24. package/lib/redaction.d.ts +2 -0
  25. package/lib/redaction.d.ts.map +1 -0
  26. package/lib/redaction.js +21 -0
  27. package/lib/redaction.js.map +1 -0
  28. package/lib/service.d.ts +124 -0
  29. package/lib/service.d.ts.map +1 -0
  30. package/lib/service.js +773 -0
  31. package/lib/service.js.map +1 -0
  32. package/lib/session-event-registration.d.ts +23 -0
  33. package/lib/session-event-registration.d.ts.map +1 -0
  34. package/lib/session-event-registration.js +384 -0
  35. package/lib/session-event-registration.js.map +1 -0
  36. package/lib/settlement.d.ts +30 -0
  37. package/lib/settlement.d.ts.map +1 -0
  38. package/lib/settlement.js +54 -0
  39. package/lib/settlement.js.map +1 -0
  40. package/lib/sqlite.d.ts +9 -0
  41. package/lib/sqlite.d.ts.map +1 -0
  42. package/lib/sqlite.js +276 -0
  43. package/lib/sqlite.js.map +1 -0
  44. package/lib/tool-risk.d.ts +10 -0
  45. package/lib/tool-risk.d.ts.map +1 -0
  46. package/lib/tool-risk.js +321 -0
  47. package/lib/tool-risk.js.map +1 -0
  48. package/lib/types.d.ts +73 -0
  49. package/lib/types.d.ts.map +1 -0
  50. package/lib/types.js +2 -0
  51. package/lib/types.js.map +1 -0
  52. package/lib/version.d.ts +2 -0
  53. package/lib/version.d.ts.map +1 -0
  54. package/lib/version.js +2 -0
  55. package/lib/version.js.map +1 -0
  56. package/package.json +98 -0
package/lib/sqlite.js ADDED
@@ -0,0 +1,276 @@
1
+ import { chmodSync, mkdirSync } from 'node:fs';
2
+ import { dirname, isAbsolute } from 'node:path';
3
+ import { DatabaseSync } from 'node:sqlite';
4
+ export const policySchemaVersion = 5;
5
+ export const legacyApprovalIntentHash = 'legacy-v4-unbound';
6
+ export class PolicyDatabaseError extends Error {
7
+ code;
8
+ constructor(code, message) {
9
+ super(message);
10
+ this.code = code;
11
+ this.name = 'PolicyDatabaseError';
12
+ }
13
+ }
14
+ function migrate(database) {
15
+ const sampled = database.prepare('PRAGMA user_version').get();
16
+ if (sampled.user_version > policySchemaVersion) {
17
+ throw new PolicyDatabaseError('schema-too-new', `policy database schema ${sampled.user_version} is newer than supported schema ${policySchemaVersion}`);
18
+ }
19
+ if (sampled.user_version === policySchemaVersion)
20
+ return;
21
+ let transactionOpen = false;
22
+ try {
23
+ database.exec('BEGIN IMMEDIATE');
24
+ transactionOpen = true;
25
+ // Every migration decision is based on the version observed after the write
26
+ // lock. Concurrent openers may have completed several steps while we waited.
27
+ const locked = database.prepare('PRAGMA user_version').get();
28
+ if (locked.user_version > policySchemaVersion) {
29
+ throw new PolicyDatabaseError('schema-too-new', `policy database schema ${locked.user_version} is newer than supported schema ${policySchemaVersion}`);
30
+ }
31
+ let version = locked.user_version;
32
+ if (version === 0) {
33
+ database.exec(`
34
+ CREATE TABLE schema_meta (
35
+ key TEXT PRIMARY KEY,
36
+ value TEXT NOT NULL
37
+ ) STRICT;
38
+
39
+ CREATE TABLE budget_periods (
40
+ scope TEXT NOT NULL,
41
+ metric TEXT NOT NULL,
42
+ period_start INTEGER NOT NULL,
43
+ period_ms INTEGER NOT NULL,
44
+ limit_amount REAL NOT NULL CHECK (limit_amount > 0),
45
+ reserved_amount REAL NOT NULL DEFAULT 0 CHECK (reserved_amount >= 0),
46
+ spent_amount REAL NOT NULL DEFAULT 0 CHECK (spent_amount >= 0),
47
+ version INTEGER NOT NULL DEFAULT 1,
48
+ PRIMARY KEY (scope, metric, period_start, period_ms)
49
+ ) STRICT;
50
+
51
+ CREATE TABLE budget_reservations (
52
+ id TEXT PRIMARY KEY,
53
+ idempotency_key TEXT NOT NULL UNIQUE,
54
+ scope TEXT NOT NULL,
55
+ metric TEXT NOT NULL,
56
+ period_start INTEGER NOT NULL,
57
+ period_ms INTEGER NOT NULL,
58
+ amount REAL NOT NULL CHECK (amount > 0),
59
+ actual_amount REAL,
60
+ status TEXT NOT NULL CHECK (status IN ('reserved', 'finalized', 'released')),
61
+ created_at INTEGER NOT NULL,
62
+ updated_at INTEGER NOT NULL,
63
+ version INTEGER NOT NULL DEFAULT 1,
64
+ FOREIGN KEY (scope, metric, period_start, period_ms)
65
+ REFERENCES budget_periods(scope, metric, period_start, period_ms)
66
+ ) STRICT;
67
+
68
+ CREATE TABLE emergency_state (
69
+ singleton INTEGER PRIMARY KEY CHECK (singleton = 1),
70
+ enabled INTEGER NOT NULL CHECK (enabled IN (0, 1)),
71
+ reason TEXT NOT NULL,
72
+ actor TEXT NOT NULL,
73
+ updated_at INTEGER NOT NULL,
74
+ version INTEGER NOT NULL
75
+ ) STRICT;
76
+
77
+ CREATE TABLE approval_proposals (
78
+ id TEXT PRIMARY KEY,
79
+ idempotency_key TEXT NOT NULL UNIQUE,
80
+ requester TEXT NOT NULL,
81
+ principal TEXT NOT NULL,
82
+ action TEXT NOT NULL,
83
+ resource_kind TEXT NOT NULL,
84
+ resource_id TEXT NOT NULL,
85
+ diff_hash TEXT NOT NULL,
86
+ diff_text TEXT,
87
+ summary TEXT NOT NULL,
88
+ status TEXT NOT NULL CHECK (status IN ('pending', 'approved', 'rejected', 'expired')),
89
+ created_at INTEGER NOT NULL,
90
+ expires_at INTEGER NOT NULL,
91
+ decided_at INTEGER,
92
+ decided_by TEXT,
93
+ decision_reason TEXT,
94
+ version INTEGER NOT NULL DEFAULT 1
95
+ ) STRICT;
96
+
97
+ CREATE TABLE approval_dispatches (
98
+ proposal_id TEXT PRIMARY KEY,
99
+ source_id TEXT NOT NULL,
100
+ binding_id TEXT NOT NULL,
101
+ workspace TEXT NOT NULL,
102
+ principal TEXT NOT NULL,
103
+ state TEXT NOT NULL CHECK (state IN ('pending', 'enqueued')),
104
+ payload_hash TEXT NOT NULL,
105
+ created_at INTEGER NOT NULL,
106
+ enqueued_at INTEGER,
107
+ version INTEGER NOT NULL DEFAULT 1,
108
+ proposal_version INTEGER NOT NULL,
109
+ FOREIGN KEY (proposal_id) REFERENCES approval_proposals(id) ON DELETE CASCADE
110
+ ) STRICT;
111
+
112
+ CREATE INDEX approval_dispatches_pending_idx
113
+ ON approval_dispatches(state, created_at, proposal_id);
114
+
115
+ CREATE TABLE approval_idempotency_tombstones (
116
+ idempotency_key TEXT PRIMARY KEY,
117
+ not_after INTEGER NOT NULL,
118
+ abandoned_at INTEGER NOT NULL,
119
+ intent_hash TEXT NOT NULL CHECK (
120
+ length(intent_hash) = 64 AND intent_hash NOT GLOB '*[^0-9a-f]*'
121
+ )
122
+ ) STRICT;
123
+
124
+ CREATE TABLE audit_events (
125
+ sequence INTEGER PRIMARY KEY AUTOINCREMENT,
126
+ event_id TEXT NOT NULL UNIQUE,
127
+ occurred_at INTEGER NOT NULL,
128
+ actor TEXT NOT NULL,
129
+ action TEXT NOT NULL,
130
+ resource_kind TEXT NOT NULL,
131
+ resource_hash TEXT NOT NULL,
132
+ outcome TEXT NOT NULL,
133
+ reason_code TEXT NOT NULL,
134
+ details_json TEXT NOT NULL
135
+ ) STRICT;
136
+
137
+ INSERT INTO schema_meta(key, value) VALUES ('schema-version', '5');
138
+ `);
139
+ version = 5;
140
+ }
141
+ if (version === 1) {
142
+ database.exec(`
143
+ ALTER TABLE approval_proposals ADD COLUMN diff_text TEXT;
144
+ CREATE TABLE approval_dispatches (
145
+ proposal_id TEXT PRIMARY KEY,
146
+ source_id TEXT NOT NULL,
147
+ binding_id TEXT NOT NULL,
148
+ workspace TEXT NOT NULL,
149
+ principal TEXT NOT NULL,
150
+ state TEXT NOT NULL CHECK (state IN ('pending', 'enqueued')),
151
+ payload_hash TEXT NOT NULL,
152
+ created_at INTEGER NOT NULL,
153
+ enqueued_at INTEGER,
154
+ version INTEGER NOT NULL DEFAULT 1,
155
+ proposal_version INTEGER NOT NULL,
156
+ FOREIGN KEY (proposal_id) REFERENCES approval_proposals(id) ON DELETE CASCADE
157
+ ) STRICT;
158
+ CREATE INDEX approval_dispatches_pending_idx
159
+ ON approval_dispatches(state, created_at, proposal_id);
160
+ `);
161
+ version = 3;
162
+ }
163
+ if (version === 2) {
164
+ database.exec(`
165
+ ALTER TABLE approval_dispatches
166
+ ADD COLUMN proposal_version INTEGER NOT NULL DEFAULT 1;
167
+ UPDATE approval_proposals
168
+ SET diff_text = NULL
169
+ WHERE status <> 'pending'
170
+ OR NOT EXISTS (
171
+ SELECT 1 FROM approval_dispatches
172
+ WHERE approval_dispatches.proposal_id = approval_proposals.id
173
+ AND approval_dispatches.state = 'pending'
174
+ );
175
+ `);
176
+ version = 3;
177
+ }
178
+ if (version === 3) {
179
+ database.exec(`
180
+ CREATE TABLE approval_idempotency_tombstones (
181
+ idempotency_key TEXT PRIMARY KEY,
182
+ not_after INTEGER NOT NULL,
183
+ abandoned_at INTEGER NOT NULL
184
+ ) STRICT;
185
+ `);
186
+ version = 4;
187
+ }
188
+ if (version === 4) {
189
+ // Rebuild instead of ADD COLUMN ... DEFAULT so future inserts cannot
190
+ // accidentally create an unverifiable legacy sentinel.
191
+ database.exec(`
192
+ ALTER TABLE approval_idempotency_tombstones
193
+ RENAME TO approval_idempotency_tombstones_v4;
194
+ CREATE TABLE approval_idempotency_tombstones (
195
+ idempotency_key TEXT PRIMARY KEY,
196
+ not_after INTEGER NOT NULL,
197
+ abandoned_at INTEGER NOT NULL,
198
+ intent_hash TEXT NOT NULL CHECK (
199
+ intent_hash = '${legacyApprovalIntentHash}'
200
+ OR (length(intent_hash) = 64 AND intent_hash NOT GLOB '*[^0-9a-f]*')
201
+ )
202
+ ) STRICT;
203
+ INSERT INTO approval_idempotency_tombstones(
204
+ idempotency_key, not_after, abandoned_at, intent_hash
205
+ )
206
+ SELECT idempotency_key, not_after, abandoned_at, '${legacyApprovalIntentHash}'
207
+ FROM approval_idempotency_tombstones_v4;
208
+ DROP TABLE approval_idempotency_tombstones_v4;
209
+ `);
210
+ version = 5;
211
+ }
212
+ if (version !== policySchemaVersion) {
213
+ throw new Error(`unsupported policy database schema ${version}`);
214
+ }
215
+ database.prepare(`UPDATE schema_meta SET value = ? WHERE key = 'schema-version'`)
216
+ .run(String(policySchemaVersion));
217
+ database.exec(`PRAGMA user_version = ${policySchemaVersion}; COMMIT`);
218
+ transactionOpen = false;
219
+ }
220
+ catch (error) {
221
+ if (transactionOpen) {
222
+ try {
223
+ database.exec('ROLLBACK');
224
+ }
225
+ catch {
226
+ // SQLite may already have rolled back a failed schema transaction.
227
+ }
228
+ }
229
+ throw error;
230
+ }
231
+ }
232
+ const walRetryWait = new Int32Array(new SharedArrayBuffer(Int32Array.BYTES_PER_ELEMENT));
233
+ function enableWal(database) {
234
+ const deadline = Date.now() + 5_000;
235
+ while (true) {
236
+ try {
237
+ const row = database.prepare('PRAGMA journal_mode = WAL').get();
238
+ if (row.journal_mode.toLowerCase() !== 'wal') {
239
+ throw new Error(`policy database refused WAL mode: ${row.journal_mode}`);
240
+ }
241
+ return;
242
+ }
243
+ catch (error) {
244
+ const retryable = error instanceof Error && /database is (?:busy|locked)/i.test(error.message);
245
+ if (!retryable || Date.now() >= deadline)
246
+ throw error;
247
+ Atomics.wait(walRetryWait, 0, 0, 10);
248
+ }
249
+ }
250
+ }
251
+ export function openPolicyDatabase(path) {
252
+ if (path !== ':memory:' && !isAbsolute(path)) {
253
+ throw new PolicyDatabaseError('invalid-path', 'policy database path must be absolute');
254
+ }
255
+ if (path !== ':memory:') {
256
+ const parent = dirname(path);
257
+ mkdirSync(parent, { recursive: true, mode: 0o700 });
258
+ }
259
+ const database = new DatabaseSync(path);
260
+ try {
261
+ database.exec('PRAGMA foreign_keys = ON');
262
+ database.exec('PRAGMA busy_timeout = 5000');
263
+ database.exec('PRAGMA synchronous = FULL');
264
+ migrate(database);
265
+ if (path !== ':memory:')
266
+ enableWal(database);
267
+ if (path !== ':memory:')
268
+ chmodSync(path, 0o600);
269
+ return database;
270
+ }
271
+ catch (error) {
272
+ database.close();
273
+ throw error;
274
+ }
275
+ }
276
+ //# sourceMappingURL=sqlite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sqlite.js","sourceRoot":"","sources":["../src/sqlite.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type ToolRiskClassification = 'allow' | 'ask-review' | 'ask-human' | 'defer-native-approval';
2
+ export declare const AUTO_REVIEW_APPROVAL_REASON = "assistant-policy: ask-review (unclassified or potentially low-risk tool action)";
3
+ export declare const HUMAN_APPROVAL_REASON = "assistant-policy: ask-human (locally detected sensitive tool action)";
4
+ export interface ToolRiskInput {
5
+ readonly name: string;
6
+ readonly arguments: unknown;
7
+ readonly workspace: string;
8
+ }
9
+ export declare function classifyToolRisk(input: Readonly<ToolRiskInput>): ToolRiskClassification;
10
+ //# sourceMappingURL=tool-risk.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-risk.d.ts","sourceRoot":"","sources":["../src/tool-risk.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,sBAAsB,GAC9B,OAAO,GACP,YAAY,GACZ,WAAW,GACX,uBAAuB,CAAA;AAE3B,eAAO,MAAM,2BAA2B,oFAC2C,CAAA;AACnF,eAAO,MAAM,qBAAqB,yEACsC,CAAA;AAExE,MAAM,WAAW,aAAa;IAC5B,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;IACrB,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAA;IAC3B,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAA;CAC3B;AA2RD,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,CAAC,aAAa,CAAC,GAAG,sBAAsB,CA2BvF"}
@@ -0,0 +1,321 @@
1
+ import { basename, isAbsolute, relative, resolve, sep } from 'node:path';
2
+ export const AUTO_REVIEW_APPROVAL_REASON = 'assistant-policy: ask-review (unclassified or potentially low-risk tool action)';
3
+ export const HUMAN_APPROVAL_REASON = 'assistant-policy: ask-human (locally detected sensitive tool action)';
4
+ const WRITE_TOOLS = new Set(['write', 'edit']);
5
+ const NETWORK_TOOLS = new Set(['web_fetch', 'web_search']);
6
+ const NATIVE_ESCALATION_TOOLS = new Set(['bash', 'pwsh', 'write', 'edit']);
7
+ const NATIVE_ESCALATION_TARGETS = new Set(['workspace-write', 'danger-full-access']);
8
+ const BASH_ARGUMENT_KEYS = new Set([
9
+ 'command',
10
+ 'description',
11
+ 'justification',
12
+ 'run_in_background',
13
+ 'sandbox_permissions',
14
+ 'timeoutMs',
15
+ 'workdir',
16
+ ]);
17
+ // These are argv shapes, not shell-string prefixes. Extending this list should
18
+ // be a deliberate policy change because an unrecognised form falls back to ask.
19
+ const SAFE_EXACT_COMMANDS = [
20
+ ['pwd'],
21
+ ['git', 'status', '--short'],
22
+ ['git', 'branch', '--show-current'],
23
+ ['git', 'rev-parse', '--show-toplevel'],
24
+ ['git', 'diff', '--no-ext-diff', '--stat'],
25
+ ];
26
+ const SAFE_LS_OPTIONS = new Set(['-1', '-a', '-al', '-l', '-la']);
27
+ const MKFS_COMMANDS = new Set([
28
+ 'mkfs',
29
+ 'mkfs.btrfs',
30
+ 'mkfs.ext2',
31
+ 'mkfs.ext3',
32
+ 'mkfs.ext4',
33
+ 'mkfs.xfs',
34
+ ]);
35
+ const NETWORK_COMMANDS = new Set([
36
+ 'curl',
37
+ 'ftp',
38
+ 'nc',
39
+ 'ncat',
40
+ 'rsync',
41
+ 'scp',
42
+ 'sftp',
43
+ 'ssh',
44
+ 'telnet',
45
+ 'wget',
46
+ ]);
47
+ const GIT_NETWORK_SUBCOMMANDS = new Set(['clone', 'fetch', 'ls-remote', 'pull', 'push']);
48
+ const PRIVILEGE_COMMANDS = new Set(['doas', 'pkexec', 'su', 'sudo']);
49
+ const BACKGROUND_COMMANDS = new Set(['disown', 'nohup', 'setsid']);
50
+ const SHELL_WRAPPER_COMMANDS = new Set(['command', 'eval', 'exec', 'ionice', 'nice', 'time', 'timeout', 'xargs']);
51
+ const SHELL_INTERPRETERS = new Set(['bash', 'dash', 'fish', 'sh', 'zsh']);
52
+ const CREDENTIAL_COMMANDS = new Set(['env', 'keychain', 'op', 'pass', 'printenv', 'security']);
53
+ const DESTRUCTIVE_COMMANDS = new Set(['dd', 'rm', 'shred']);
54
+ const PACKAGE_MANAGER_COMMANDS = new Set(['bun', 'npm', 'pnpm', 'yarn']);
55
+ const PACKAGE_NETWORK_SUBCOMMANDS = new Set(['add', 'install', 'update', 'upgrade']);
56
+ const PACKAGE_EXEC_COMMANDS = new Set(['bunx', 'npx']);
57
+ const PYTHON_PACKAGE_COMMANDS = new Set(['pip', 'pip3']);
58
+ const CREDENTIAL_MARKER = /(?:^|[^a-z0-9])(?:api[-_]?key|authorization|cookie|credential|password|private[-_]?key|secret|token)(?:[^a-z0-9]|$)/iu;
59
+ const CREDENTIAL_PATH = /(?:^|[/\\])(?:\.aws[/\\](?:config|credentials)|\.codex[/\\]auth\.json|\.docker[/\\]config\.json|\.env(?:\.[^/\\\s]+)?|\.gnupg|\.kube[/\\]config|\.netrc|\.npmrc|\.ssh|auth\.json|credentials\.json|id_(?:ed25519|rsa))(?:$|[\s/\\])/iu;
60
+ const EMBEDDED_SECRET = /(?:bearer\s+[a-z0-9._~-]+|(?:^|[^a-z0-9])(?:ghp|github_pat|sk|xox[baprs])[-_][a-z0-9_-]+)/iu;
61
+ const URI_USER_INFO = /\b[a-z][a-z0-9+.-]*:\/\/[^\s/@:]+:[^\s/@]+@/iu;
62
+ const PEM_PRIVATE_KEY = /-----BEGIN (?:EC |OPENSSH |PGP |RSA )?PRIVATE KEY-----/iu;
63
+ const JWT_TOKEN = /\beyJ[A-Za-z0-9_-]{5,}\.[A-Za-z0-9_-]{5,}\.[A-Za-z0-9_-]{5,}\b/u;
64
+ const AWS_ACCESS_KEY = /\b(?:AKIA|ASIA)[A-Z0-9]{16}\b/u;
65
+ const READ_ARGUMENT_KEYS = {
66
+ read: new Set(['file_path', 'limit', 'offset', 'path']),
67
+ read_image: new Set(['detail', 'file_path', 'path']),
68
+ glob: new Set(['path', 'pattern']),
69
+ grep: new Set(['include', 'path', 'pattern']),
70
+ };
71
+ function asRecord(value) {
72
+ if (value === null || typeof value !== 'object' || Array.isArray(value))
73
+ return undefined;
74
+ return value;
75
+ }
76
+ function nativeEscalation(argumentsRecord) {
77
+ if (argumentsRecord === undefined)
78
+ return 'none';
79
+ if (!Object.hasOwn(argumentsRecord, 'sandbox_permissions')) {
80
+ return Object.hasOwn(argumentsRecord, 'justification') ? 'invalid' : 'none';
81
+ }
82
+ if (typeof argumentsRecord.sandbox_permissions !== 'string'
83
+ || !NATIVE_ESCALATION_TARGETS.has(argumentsRecord.sandbox_permissions))
84
+ return 'invalid';
85
+ return typeof argumentsRecord.justification === 'string' && argumentsRecord.justification.trim() !== ''
86
+ ? 'valid'
87
+ : 'invalid';
88
+ }
89
+ function isWorkspacePath(target, workspace) {
90
+ if (target.trim() === '' || target.includes('\0')
91
+ || workspace.trim() === '' || !isAbsolute(workspace))
92
+ return false;
93
+ const workspacePath = resolve(workspace);
94
+ const targetPath = resolve(workspacePath, target);
95
+ const fromWorkspace = relative(workspacePath, targetPath);
96
+ const firstSegment = fromWorkspace.split(sep, 1)[0];
97
+ return fromWorkspace === '' || (!isAbsolute(fromWorkspace) && firstSegment !== '..');
98
+ }
99
+ function isCredentialSensitivePath(target, workspace) {
100
+ return CREDENTIAL_PATH.test(target) || CREDENTIAL_PATH.test(resolve(workspace, target));
101
+ }
102
+ function isWorkspaceReadTarget(target, workspace) {
103
+ return isWorkspacePath(target, workspace) && !isCredentialSensitivePath(target, workspace);
104
+ }
105
+ function hasOnlyKeys(value, allowed) {
106
+ return Object.keys(value).every(key => allowed.has(key));
107
+ }
108
+ function onePathArgument(value) {
109
+ const keys = ['path', 'file_path'].filter(key => Object.hasOwn(value, key));
110
+ if (keys.length !== 1)
111
+ return undefined;
112
+ const path = value[keys[0]];
113
+ return typeof path === 'string' ? path : undefined;
114
+ }
115
+ function validReadBounds(value) {
116
+ return ['offset', 'limit'].every(key => !Object.hasOwn(value, key)
117
+ || (Number.isSafeInteger(value[key]) && value[key] >= 0));
118
+ }
119
+ function classifyReadTool(name, argumentsRecord, workspace) {
120
+ const allowed = READ_ARGUMENT_KEYS[name];
121
+ if (argumentsRecord === undefined || allowed === undefined || !hasOnlyKeys(argumentsRecord, allowed)) {
122
+ return 'ask-human';
123
+ }
124
+ if (name === 'read' || name === 'read_image') {
125
+ const target = onePathArgument(argumentsRecord);
126
+ if (target === undefined || !isWorkspaceReadTarget(target, workspace))
127
+ return 'ask-human';
128
+ if (name === 'read' && !validReadBounds(argumentsRecord))
129
+ return 'ask-human';
130
+ if (name === 'read_image' && Object.hasOwn(argumentsRecord, 'detail')
131
+ && !['auto', 'high', 'low', 'original'].includes(String(argumentsRecord.detail)))
132
+ return 'ask-human';
133
+ return 'allow';
134
+ }
135
+ if (typeof argumentsRecord.pattern !== 'string' || argumentsRecord.pattern.trim() === '')
136
+ return 'ask-human';
137
+ const root = argumentsRecord.path ?? workspace;
138
+ if (typeof root !== 'string' || !isWorkspaceReadTarget(root, workspace))
139
+ return 'ask-human';
140
+ const resolvedRoot = resolve(workspace, root);
141
+ if (name === 'glob') {
142
+ return isWorkspaceReadTarget(resolve(resolvedRoot, argumentsRecord.pattern), workspace) ? 'allow' : 'ask-human';
143
+ }
144
+ if (Object.hasOwn(argumentsRecord, 'include')) {
145
+ if (typeof argumentsRecord.include !== 'string' || argumentsRecord.include.trim() === ''
146
+ || !isWorkspaceReadTarget(resolve(resolvedRoot, argumentsRecord.include), workspace))
147
+ return 'ask-human';
148
+ }
149
+ return 'allow';
150
+ }
151
+ function hasWorkspaceContainedTarget(argumentsRecord, workspace) {
152
+ if (argumentsRecord === undefined)
153
+ return false;
154
+ const targets = [argumentsRecord.path, argumentsRecord.file_path]
155
+ .filter((value) => typeof value === 'string');
156
+ return targets.length > 0 && targets.every(target => isWorkspacePath(target, workspace));
157
+ }
158
+ /**
159
+ * Tokenises only a deliberately small shell-free subset. It is not a shell
160
+ * parser: quoting, expansion, control operators, globbing, comments and line
161
+ * breaks all make the command ineligible for automatic approval.
162
+ */
163
+ function simpleArgv(command) {
164
+ const normalized = command.trim();
165
+ if (normalized === '')
166
+ return undefined;
167
+ if (!/^[A-Za-z0-9_@%+=:,./\- \t]+$/u.test(normalized))
168
+ return undefined;
169
+ return normalized.split(/[ \t]+/u);
170
+ }
171
+ function argvEquals(argv, expected) {
172
+ return argv.length === expected.length && argv.every((token, index) => token === expected[index]);
173
+ }
174
+ function classifyLs(argv, workdir, workspace) {
175
+ if (argv[0] !== 'ls')
176
+ return undefined;
177
+ let unsupportedOption = false;
178
+ for (const token of argv.slice(1)) {
179
+ if (token[0] === '-') {
180
+ if (!SAFE_LS_OPTIONS.has(token))
181
+ unsupportedOption = true;
182
+ continue;
183
+ }
184
+ if (!isWorkspaceReadTarget(resolve(workdir, token), workspace))
185
+ return 'ask-human';
186
+ }
187
+ return unsupportedOption ? 'ask-review' : 'allow';
188
+ }
189
+ function commandName(argv) {
190
+ return basename(argv[0] ?? '');
191
+ }
192
+ function isDeterministicallySensitive(argv, raw) {
193
+ const command = commandName(argv);
194
+ if (CREDENTIAL_MARKER.test(raw) || CREDENTIAL_PATH.test(raw) || EMBEDDED_SECRET.test(raw)
195
+ || URI_USER_INFO.test(raw) || PEM_PRIVATE_KEY.test(raw)
196
+ || JWT_TOKEN.test(raw) || AWS_ACCESS_KEY.test(raw))
197
+ return true;
198
+ if (/^[A-Za-z_][A-Za-z0-9_]*=/u.test(argv[0] ?? ''))
199
+ return true;
200
+ if (NETWORK_COMMANDS.has(command) || PRIVILEGE_COMMANDS.has(command)
201
+ || BACKGROUND_COMMANDS.has(command) || CREDENTIAL_COMMANDS.has(command)
202
+ || DESTRUCTIVE_COMMANDS.has(command) || MKFS_COMMANDS.has(command)
203
+ || SHELL_WRAPPER_COMMANDS.has(command))
204
+ return true;
205
+ if (SHELL_INTERPRETERS.has(command) && argv.includes('-c'))
206
+ return true;
207
+ if ((command === 'busybox' || command === 'toybox')
208
+ && argv.slice(1).some(token => NETWORK_COMMANDS.has(token)
209
+ || DESTRUCTIVE_COMMANDS.has(token) || MKFS_COMMANDS.has(token)))
210
+ return true;
211
+ if (command === 'git') {
212
+ if (argv.slice(1).some(token => GIT_NETWORK_SUBCOMMANDS.has(token)))
213
+ return true;
214
+ if (argv.includes('clean'))
215
+ return true;
216
+ if (argv.includes('reset') && argv.includes('--hard'))
217
+ return true;
218
+ const submodule = argv.indexOf('submodule', 1);
219
+ if (submodule >= 0 && argv.slice(submodule + 1).includes('update'))
220
+ return true;
221
+ }
222
+ const argumentsAfterCommand = argv.slice(1);
223
+ if (PACKAGE_MANAGER_COMMANDS.has(command)
224
+ && argumentsAfterCommand.some(token => PACKAGE_NETWORK_SUBCOMMANDS.has(token)))
225
+ return true;
226
+ if (PACKAGE_EXEC_COMMANDS.has(command))
227
+ return true;
228
+ if (command === 'npm' && argumentsAfterCommand.some(token => token === 'exec' || token === 'x'))
229
+ return true;
230
+ if ((command === 'pnpm' || command === 'yarn') && argumentsAfterCommand.includes('dlx'))
231
+ return true;
232
+ if (PYTHON_PACKAGE_COMMANDS.has(command) && argumentsAfterCommand.includes('install'))
233
+ return true;
234
+ if ((command === 'python' || command === 'python3')
235
+ && argumentsAfterCommand.some((token, index) => token === '-m'
236
+ && PYTHON_PACKAGE_COMMANDS.has(argumentsAfterCommand[index + 1] ?? '')
237
+ && argumentsAfterCommand.slice(index + 2).includes('install')))
238
+ return true;
239
+ if (command === 'uv' && argumentsAfterCommand[0] === 'pip'
240
+ && argumentsAfterCommand.includes('install'))
241
+ return true;
242
+ if ((command === 'cargo' || command === 'gem' || command === 'brew')
243
+ && argumentsAfterCommand.includes('install'))
244
+ return true;
245
+ if (command === 'go' && argumentsAfterCommand[0] === 'get')
246
+ return true;
247
+ if (command === 'composer'
248
+ && argumentsAfterCommand.some(token => token === 'install' || token === 'require' || token === 'update'))
249
+ return true;
250
+ if (command === 'docker'
251
+ && argumentsAfterCommand.some(token => token === 'pull' || token === 'push' || token === 'login'))
252
+ return true;
253
+ return command === 'gh' || command === 'glab';
254
+ }
255
+ function classifyBash(argumentsRecord, workspace) {
256
+ if (argumentsRecord === undefined || typeof argumentsRecord.command !== 'string'
257
+ || !hasOnlyKeys(argumentsRecord, BASH_ARGUMENT_KEYS))
258
+ return 'ask-human';
259
+ if (Object.hasOwn(argumentsRecord, 'description')
260
+ && (typeof argumentsRecord.description !== 'string' || argumentsRecord.description.trim() === '')) {
261
+ return 'ask-human';
262
+ }
263
+ if (Object.hasOwn(argumentsRecord, 'timeoutMs')
264
+ && (typeof argumentsRecord.timeoutMs !== 'number'
265
+ || !Number.isFinite(argumentsRecord.timeoutMs) || argumentsRecord.timeoutMs <= 0)) {
266
+ return 'ask-human';
267
+ }
268
+ const workdir = argumentsRecord.workdir ?? workspace;
269
+ if (typeof workdir !== 'string' || !isWorkspaceReadTarget(workdir, workspace))
270
+ return 'ask-human';
271
+ const command = argumentsRecord.command;
272
+ const argv = simpleArgv(command);
273
+ // Anything that needs real shell parsing is deliberately ineligible for
274
+ // automatic review: operators, expansion, quoting, redirection and globbing
275
+ // may materially change the command that actually runs.
276
+ if (argv === undefined)
277
+ return 'ask-human';
278
+ if (isDeterministicallySensitive(argv, command))
279
+ return 'ask-human';
280
+ const lsRisk = classifyLs(argv, resolve(workspace, workdir), workspace);
281
+ if (lsRisk !== undefined)
282
+ return lsRisk;
283
+ if (SAFE_EXACT_COMMANDS.some(expected => argvEquals(argv, expected)))
284
+ return 'allow';
285
+ return 'ask-review';
286
+ }
287
+ export function classifyToolRisk(input) {
288
+ const argumentsRecord = asRecord(input.arguments);
289
+ if (input.name === 'bash' && argumentsRecord !== undefined
290
+ && Object.hasOwn(argumentsRecord, 'run_in_background')
291
+ && argumentsRecord.run_in_background !== false)
292
+ return 'ask-human';
293
+ const escalation = nativeEscalation(argumentsRecord);
294
+ if (escalation === 'valid') {
295
+ return NATIVE_ESCALATION_TOOLS.has(input.name) ? 'defer-native-approval' : 'ask-human';
296
+ }
297
+ if (escalation === 'invalid')
298
+ return 'ask-human';
299
+ if (NETWORK_TOOLS.has(input.name))
300
+ return 'ask-human';
301
+ // `run_code` executes arbitrary worker code and is not an OS sandbox. Its
302
+ // source cannot be reduced to the narrow argv grammar below, so auto review
303
+ // must never grant it without a human decision.
304
+ if (input.name === 'run_code')
305
+ return 'ask-human';
306
+ if (input.name === 'bash')
307
+ return classifyBash(argumentsRecord, input.workspace);
308
+ // PowerShell has materially different quoting, invocation and background
309
+ // semantics. Until it has its own strict parser, never send it to the LLM
310
+ // reviewer; native sandbox escalation above remains owned by the tool.
311
+ if (input.name === 'pwsh')
312
+ return 'ask-human';
313
+ if (Object.hasOwn(READ_ARGUMENT_KEYS, input.name)) {
314
+ return classifyReadTool(input.name, argumentsRecord, input.workspace);
315
+ }
316
+ if (WRITE_TOOLS.has(input.name)) {
317
+ return hasWorkspaceContainedTarget(argumentsRecord, input.workspace) ? 'allow' : 'ask-human';
318
+ }
319
+ return 'ask-review';
320
+ }
321
+ //# sourceMappingURL=tool-risk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tool-risk.js","sourceRoot":"","sources":["../src/tool-risk.ts"],"names":[],"mappings":"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"}