dsh-permission-rules 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 (49) hide show
  1. package/CHANGELOG.md +50 -0
  2. package/LICENSE +201 -0
  3. package/README.es.md +182 -0
  4. package/README.hi.md +182 -0
  5. package/README.md +182 -0
  6. package/README.pt.md +182 -0
  7. package/README.zh.md +182 -0
  8. package/cordis.patch.yml +16 -0
  9. package/docs/rules-format.en.md +105 -0
  10. package/docs/rules-format.md +103 -0
  11. package/docs/rules-format.schema.json +117 -0
  12. package/lib/index.js +1606 -0
  13. package/lib/types/config.d.ts +83 -0
  14. package/lib/types/config.d.ts.map +1 -0
  15. package/lib/types/config.js +72 -0
  16. package/lib/types/config.js.map +1 -0
  17. package/lib/types/events.d.ts +68 -0
  18. package/lib/types/events.d.ts.map +1 -0
  19. package/lib/types/events.js +21 -0
  20. package/lib/types/events.js.map +1 -0
  21. package/lib/types/glob.d.ts +55 -0
  22. package/lib/types/glob.d.ts.map +1 -0
  23. package/lib/types/glob.js +307 -0
  24. package/lib/types/glob.js.map +1 -0
  25. package/lib/types/index.d.ts +25 -0
  26. package/lib/types/index.d.ts.map +1 -0
  27. package/lib/types/index.js +25 -0
  28. package/lib/types/index.js.map +1 -0
  29. package/lib/types/prose.d.ts +66 -0
  30. package/lib/types/prose.d.ts.map +1 -0
  31. package/lib/types/prose.js +143 -0
  32. package/lib/types/prose.js.map +1 -0
  33. package/lib/types/rules.d.ts +226 -0
  34. package/lib/types/rules.d.ts.map +1 -0
  35. package/lib/types/rules.js +581 -0
  36. package/lib/types/rules.js.map +1 -0
  37. package/lib/types/runtime.d.ts +175 -0
  38. package/lib/types/runtime.d.ts.map +1 -0
  39. package/lib/types/runtime.js +497 -0
  40. package/lib/types/runtime.js.map +1 -0
  41. package/package.json +103 -0
  42. package/scripts/repair-session-logs.mjs +327 -0
  43. package/src/config.ts +141 -0
  44. package/src/events.ts +75 -0
  45. package/src/glob.ts +303 -0
  46. package/src/index.ts +27 -0
  47. package/src/prose.ts +206 -0
  48. package/src/rules.ts +695 -0
  49. package/src/runtime.ts +504 -0
@@ -0,0 +1,581 @@
1
+ /**
2
+ * The pure rule vocabulary: parsing a `.dsh/rules.yaml` document into a
3
+ * validated {@link RulesFileDoc}, compiling patterns, and first-match
4
+ * evaluation. Every function here is pure — no filesystem, clock, or
5
+ * process state — so the parser, the matcher, and the failure modes are all
6
+ * unit-testable and replayable.
7
+ * @module dsh-permission-rules/rules
8
+ */
9
+ import { parse } from 'yaml';
10
+ import { compileGlob, compilePatternRegex } from "./glob.js";
11
+ /** Closed action list for runtime normalization of untrusted values. */
12
+ export const RULE_ACTIONS = ['allow', 'deny', 'ask'];
13
+ /** Platform names a `when.platform` entry may name (Node `process.platform` values). */
14
+ export const PLATFORMS = ['aix', 'android', 'darwin', 'freebsd', 'linux', 'openbsd', 'sunos', 'win32'];
15
+ /** Recursion bound for nested argument walks (path candidates and scalar leaves). */
16
+ const MAX_ARGUMENT_DEPTH = 8;
17
+ /** Display-truncation length for reasons/descriptions in `/rules` output. */
18
+ const DISPLAY_TRUNCATE = 120;
19
+ /**
20
+ * Raised when a rule document cannot be parsed or compiled. The message
21
+ * names the failing rule and field; loading code maps it onto the
22
+ * `badFilePolicy`.
23
+ */
24
+ export class RuleError extends Error {
25
+ constructor(message) {
26
+ super(message);
27
+ this.name = 'RuleError';
28
+ }
29
+ }
30
+ /**
31
+ * Parse one rules file body. Unknown document/rule/match fields, invalid
32
+ * actions, missing reasons, and wrong-shaped collections all throw
33
+ * {@link RuleError} — a malformed file fails loudly at load, never silently.
34
+ * @param text - the raw YAML text.
35
+ * @returns the validated document.
36
+ */
37
+ export function parseRulesDocument(text) {
38
+ const parsed = parseYaml(text);
39
+ // An empty (or comment-only) file is a valid empty rule set.
40
+ if (parsed === null || parsed === undefined)
41
+ return { rules: [] };
42
+ const root = asRecord(parsed, 'rules document root');
43
+ const unknownRoot = Object.keys(root).filter(key => key !== 'rules');
44
+ if (unknownRoot.length > 0) {
45
+ throw new RuleError(`unknown top-level field${unknownRoot.length > 1 ? 's' : ''} ${unknownRoot.map(k => JSON.stringify(k)).join(', ')} (only "rules" is allowed)`);
46
+ }
47
+ const rawRules = root['rules'];
48
+ if (rawRules === undefined)
49
+ return { rules: [] };
50
+ if (!Array.isArray(rawRules))
51
+ throw new RuleError('"rules" must be a list');
52
+ return { rules: rawRules.map((raw, index) => parseRuleEntry(raw, index)) };
53
+ }
54
+ /**
55
+ * Compile a parsed document for the hot path: pattern strings become
56
+ * RegExps (invalid globs/regexes throw here, at load), and the rule count
57
+ * is capped by `maxRules`.
58
+ * @param doc - the parsed document.
59
+ * @param options - pattern mode, caps, and case handling.
60
+ * @returns the compiled ruleset (every rule attributed to source 0).
61
+ */
62
+ export function compileRules(doc, options) {
63
+ if (doc.rules.length > options.maxRules) {
64
+ throw new RuleError(`rule count ${doc.rules.length} exceeds maxRules ${options.maxRules}`);
65
+ }
66
+ return {
67
+ rules: doc.rules.map((entry, index) => compileRule(entry, index, 0, options)),
68
+ caseInsensitivePaths: options.caseInsensitivePaths,
69
+ };
70
+ }
71
+ /**
72
+ * Parse and compile an ordered source chain (nearest file first). Rules
73
+ * keep per-file order and are evaluated in chain order, so a nearer file
74
+ * can override a farther one on first-match semantics; `sourceIndex`
75
+ * attributes every rule to its file. The TOTAL rule count is capped by
76
+ * `maxRules`.
77
+ * @param entries - the rule-file texts, nearest file first.
78
+ * @param options - compile options.
79
+ * @returns the merged ruleset and the source paths it references.
80
+ */
81
+ export function compileRulesChain(entries, options) {
82
+ const sources = entries.map(entry => entry.path);
83
+ const merged = [];
84
+ for (const entry of entries) {
85
+ const doc = parseRulesDocument(entry.text);
86
+ for (const rule of doc.rules) {
87
+ merged.push(compileRule(rule, merged.length, sources.indexOf(entry.path), options));
88
+ }
89
+ }
90
+ if (merged.length > options.maxRules) {
91
+ throw new RuleError(`rule count ${merged.length} exceeds maxRules ${options.maxRules}`);
92
+ }
93
+ return { ruleset: { rules: merged, caseInsensitivePaths: options.caseInsensitivePaths }, sources };
94
+ }
95
+ /** Compile one parsed rule into its hot-path form. */
96
+ function compileRule(entry, index, sourceIndex, options) {
97
+ const tools = entry.match.tools.map(pattern => compileToolPattern(pattern, options.maxGlobStars));
98
+ const params = new Map();
99
+ for (const [key, patterns] of Object.entries(entry.match.params)) {
100
+ params.set(key, compileParamPatterns(key, patterns, options));
101
+ }
102
+ const paths = entry.match.paths.map(pattern => compilePathPattern(pattern, options));
103
+ const env = new Map();
104
+ for (const [key, patterns] of Object.entries(entry.match.when.env)) {
105
+ env.set(key, patterns.map(pattern => compileValuePattern(pattern, options.patternMode, options.maxGlobStars)));
106
+ }
107
+ return {
108
+ index,
109
+ sourceIndex,
110
+ action: entry.action,
111
+ reason: entry.reason,
112
+ enabled: entry.enabled,
113
+ ...(entry.description !== undefined ? { description: entry.description } : {}),
114
+ tags: entry.tags,
115
+ tools,
116
+ params,
117
+ paths,
118
+ absent: entry.match.absent,
119
+ ...(env.size === 0 && entry.match.when.platform.length === 0 ? {} : { when: { env, platform: entry.match.when.platform } }),
120
+ source: entry,
121
+ };
122
+ }
123
+ /**
124
+ * Evaluate rules in order against one pending tool call. First match wins;
125
+ * no match returns `undefined` (passthrough). Pure and synchronous — this
126
+ * is the `tools/pre-execute` hot path, so it runs no I/O.
127
+ * @param ruleset - compiled rules.
128
+ * @param toolName - the tool being called.
129
+ * @param args - the parsed (JSON) tool arguments; non-object values satisfy
130
+ * only tools/when/absent rules.
131
+ * @param cwd - the session's absolute workspace root, for path normalization.
132
+ * @param context - host facts for `when` evaluation; defaults resolve at match time.
133
+ * @returns the first hit, or undefined when every rule passed.
134
+ */
135
+ export function matchRules(ruleset, toolName, args, cwd, context = {}) {
136
+ const argRecord = isRecord(args) ? args : undefined;
137
+ for (const rule of ruleset.rules) {
138
+ if (!rule.enabled)
139
+ continue;
140
+ if (!matchTools(rule, toolName))
141
+ continue;
142
+ if (!matchWhen(rule, context))
143
+ continue;
144
+ if (rule.params.size > 0 && (argRecord === undefined || !matchParams(rule, argRecord)))
145
+ continue;
146
+ if (rule.absent.length > 0 && !matchAbsent(rule, argRecord))
147
+ continue;
148
+ if (rule.paths.length > 0 && (argRecord === undefined || !matchPaths(rule, argRecord, cwd, ruleset.caseInsensitivePaths)))
149
+ continue;
150
+ return { ruleIndex: rule.index, rule };
151
+ }
152
+ return undefined;
153
+ }
154
+ /**
155
+ * Indices of rules that can never fire: every ENABLED rule after the first
156
+ * enabled rule whose every dimension is empty (an unconditional catch-all).
157
+ * Disabled rules are excluded from both roles. Conservative on purpose —
158
+ * pattern-set inclusion across globs is not analyzed.
159
+ * @param ruleset - the compiled rules.
160
+ * @returns 0-based indices of unreachable rules.
161
+ */
162
+ export function findUnreachableRules(ruleset) {
163
+ const unreachable = [];
164
+ let catchAllSeen = false;
165
+ for (const rule of ruleset.rules) {
166
+ if (!rule.enabled)
167
+ continue;
168
+ if (catchAllSeen) {
169
+ unreachable.push(rule.index);
170
+ continue;
171
+ }
172
+ if (isCatchAll(rule))
173
+ catchAllSeen = true;
174
+ }
175
+ return unreachable;
176
+ }
177
+ /** Whether every match dimension of one rule is empty. */
178
+ function isCatchAll(rule) {
179
+ return rule.tools.length === 0 && rule.params.size === 0 && rule.paths.length === 0 && rule.absent.length === 0 && rule.when === undefined;
180
+ }
181
+ /**
182
+ * One-line human summary of a compiled rule, for `/rules` output. The
183
+ * 1-based number, action, match dimensions, and reason render first; a
184
+ * disabled marker, tags, and a truncated description follow.
185
+ * @param rule - the compiled rule.
186
+ * @param tokens - dimension-prefix vocabulary for the configured language.
187
+ * @returns a single display line.
188
+ */
189
+ export function describeRule(rule, tokens) {
190
+ const parts = [];
191
+ if (rule.source.match.tools.length > 0)
192
+ parts.push(`${tokens.tools}:${rule.source.match.tools.join(',')}`);
193
+ const params = Object.entries(rule.source.match.params)
194
+ .map(([key, patterns]) => `${key}=${patterns.join('|')}`)
195
+ .join(' ');
196
+ if (params.length > 0)
197
+ parts.push(`${tokens.params}:${params}`);
198
+ if (rule.source.match.paths.length > 0)
199
+ parts.push(`${tokens.paths}:${rule.source.match.paths.join(',')}`);
200
+ if (rule.source.match.absent.length > 0)
201
+ parts.push(`${tokens.absent}:${rule.source.match.absent.join(',')}`);
202
+ const whenParts = Object.entries(rule.source.match.when.env)
203
+ .map(([key, patterns]) => `${key}=${patterns.join('|')}`)
204
+ .join(' ');
205
+ const platformPart = rule.source.match.when.platform.length > 0 ? `${tokens.platform}:${rule.source.match.when.platform.join(',')}` : '';
206
+ if (whenParts.length > 0 || platformPart.length > 0)
207
+ parts.push(`${tokens.when}:${whenParts}${whenParts.length > 0 && platformPart.length > 0 ? ' ' : ''}${platformPart}`);
208
+ const match = parts.length > 0 ? `[${parts.join(' ')}]` : `[${tokens.allTools}]`;
209
+ const disabled = rule.enabled ? '' : ` (${tokens.disabled})`;
210
+ const description = rule.description !== undefined ? ` (${truncate(rule.description, DISPLAY_TRUNCATE)})` : '';
211
+ const tags = rule.tags.length > 0 ? ` [${tokens.tags}:${rule.tags.join(',')}]` : '';
212
+ return `${rule.index + 1}. ${rule.action}${disabled} ${match}: ${truncate(rule.reason, DISPLAY_TRUNCATE)}${description}${tags}`;
213
+ }
214
+ /** Cut a display string at `limit` characters, marking truncation with `…`. */
215
+ function truncate(text, limit) {
216
+ return text.length > limit ? `${text.slice(0, limit)}…` : text;
217
+ }
218
+ /** Whether a rule's tools dimension selects the tool. */
219
+ function matchTools(rule, toolName) {
220
+ if (rule.tools.length === 0)
221
+ return true;
222
+ return rule.tools.some(regex => regex.test(toolName));
223
+ }
224
+ /** Whether a rule's params dimension holds: EVERY key present and matching. */
225
+ function matchParams(rule, args) {
226
+ for (const [key, { positive, negative }] of rule.params) {
227
+ const value = args[key];
228
+ if (value === undefined)
229
+ return false;
230
+ const candidates = scalarCandidates(value, 0);
231
+ if (candidates.length === 0)
232
+ return false;
233
+ if (positive.length > 0 && !candidates.some(candidate => positive.some(regex => regex.test(candidate))))
234
+ return false;
235
+ if (negative.length > 0 && candidates.some(candidate => negative.some(regex => regex.test(candidate))))
236
+ return false;
237
+ }
238
+ return true;
239
+ }
240
+ /** Whether a rule's absent dimension holds: EVERY listed key missing. */
241
+ function matchAbsent(rule, argRecord) {
242
+ for (const key of rule.absent) {
243
+ if (argRecord !== undefined && argRecord[key] !== undefined)
244
+ return false;
245
+ }
246
+ return true;
247
+ }
248
+ /** Whether a rule's when dimension holds for the host facts. */
249
+ function matchWhen(rule, context) {
250
+ const when = rule.when;
251
+ if (when === undefined)
252
+ return true;
253
+ if (when.platform.length > 0 && !when.platform.includes(context.platform ?? process.platform))
254
+ return false;
255
+ const env = context.env ?? process.env;
256
+ for (const [key, patterns] of when.env) {
257
+ const value = env[key];
258
+ if (value === undefined)
259
+ return false;
260
+ if (!patterns.some(regex => regex.test(value)))
261
+ return false;
262
+ }
263
+ return true;
264
+ }
265
+ /** Whether a rule's paths dimension holds: at least one candidate matches one pattern. */
266
+ function matchPaths(rule, args, cwd, caseInsensitive) {
267
+ const candidates = extractPathCandidates(args)
268
+ .map(candidate => normalizeWorkspacePath(cwd, candidate, caseInsensitive))
269
+ .filter((candidate) => candidate.length > 0);
270
+ if (candidates.length === 0)
271
+ return false;
272
+ return candidates.some(candidate => rule.paths.some(regex => regex.test(candidate)));
273
+ }
274
+ /** Tool-name patterns are always globs (a tool name is not a path). */
275
+ function compileToolPattern(pattern, maxGlobStars) {
276
+ return compileGlob(pattern, { segments: false, maxStars: maxGlobStars });
277
+ }
278
+ /** Param-value patterns follow the configured mode; `/` is an ordinary character. */
279
+ function compileValuePattern(pattern, mode, maxGlobStars) {
280
+ return mode === 'regex' ? compilePatternRegex(pattern) : compileGlob(pattern, { segments: false, maxStars: maxGlobStars });
281
+ }
282
+ /** Path patterns follow the configured mode with path-segment glob semantics. */
283
+ function compilePathPattern(pattern, options) {
284
+ return options.patternMode === 'regex'
285
+ ? compilePatternRegex(pattern)
286
+ : compileGlob(pattern, { segments: true, maxStars: options.maxGlobStars, caseInsensitive: options.caseInsensitivePaths });
287
+ }
288
+ /**
289
+ * Split one param key's patterns into positive and negative lists. A
290
+ * leading `!` negates: the value must NOT match any negated pattern; a bare
291
+ * `!` is a load-time error.
292
+ */
293
+ function compileParamPatterns(key, patterns, options) {
294
+ const positive = [];
295
+ const negative = [];
296
+ for (const pattern of patterns) {
297
+ if (pattern.startsWith('!')) {
298
+ const body = pattern.slice(1);
299
+ if (body.length === 0)
300
+ throw new RuleError(`param key "${key}" has an empty negated pattern`);
301
+ negative.push(compileValuePattern(body, options.patternMode, options.maxGlobStars));
302
+ }
303
+ else {
304
+ positive.push(compileValuePattern(pattern, options.patternMode, options.maxGlobStars));
305
+ }
306
+ }
307
+ return { positive, negative };
308
+ }
309
+ // --- YAML/shape validation -------------------------------------------------
310
+ /** Parse YAML through the `yaml` dependency, mapping parse failures onto {@link RuleError}. */
311
+ function parseYaml(text) {
312
+ try {
313
+ return parse(text);
314
+ }
315
+ catch (error) {
316
+ throw new RuleError(`invalid YAML: ${String(error)}`);
317
+ }
318
+ }
319
+ /** Validate one raw rule entry from the YAML document. */
320
+ function parseRuleEntry(raw, index) {
321
+ const at = `rule ${index + 1}`;
322
+ const record = asRecord(raw, at);
323
+ const unknownFields = Object.keys(record).filter(key => key !== 'match' && key !== 'action' && key !== 'reason' && key !== 'enabled' && key !== 'description' && key !== 'tags');
324
+ if (unknownFields.length > 0) {
325
+ throw new RuleError(`${at}: unknown field${unknownFields.length > 1 ? 's' : ''} ${unknownFields.map(k => JSON.stringify(k)).join(', ')} (allowed: match, action, reason, enabled, description, tags)`);
326
+ }
327
+ const action = record['action'];
328
+ if (typeof action !== 'string' || !RULE_ACTIONS.includes(action)) {
329
+ throw new RuleError(`${at}: action must be one of ${RULE_ACTIONS.map(a => JSON.stringify(a)).join(' | ')}, got ${JSON.stringify(action)}`);
330
+ }
331
+ const reason = record['reason'];
332
+ if (typeof reason !== 'string' || reason.trim().length === 0) {
333
+ throw new RuleError(`${at}: reason must be a non-empty string`);
334
+ }
335
+ const enabled = record['enabled'];
336
+ if (enabled !== undefined && typeof enabled !== 'boolean') {
337
+ throw new RuleError(`${at}: enabled must be a boolean, got ${typeof enabled}`);
338
+ }
339
+ const description = record['description'];
340
+ if (description !== undefined && (typeof description !== 'string' || description.trim().length === 0)) {
341
+ throw new RuleError(`${at}: description must be a non-empty string`);
342
+ }
343
+ const match = parseMatch(record['match'], at);
344
+ return { match, action: action, reason, enabled: enabled !== false, ...(description !== undefined ? { description } : {}), tags: parseStringList(record['tags'], `${at}.tags`) };
345
+ }
346
+ /** Validate the `match` block of one rule. */
347
+ function parseMatch(raw, at) {
348
+ if (raw === undefined)
349
+ return { tools: [], params: {}, paths: [], absent: [], when: { env: {}, platform: [] } };
350
+ const record = asRecord(raw, `${at}.match`);
351
+ const unknownFields = Object.keys(record).filter(key => key !== 'tools' && key !== 'params' && key !== 'paths' && key !== 'absent' && key !== 'when');
352
+ if (unknownFields.length > 0) {
353
+ throw new RuleError(`${at}.match: unknown field${unknownFields.length > 1 ? 's' : ''} ${unknownFields.map(k => JSON.stringify(k)).join(', ')} (allowed: tools, params, paths, absent, when)`);
354
+ }
355
+ return {
356
+ tools: parseStringList(record['tools'], `${at}.match.tools`),
357
+ params: parseParams(record['params'], `${at}.match.params`),
358
+ paths: parseStringList(record['paths'], `${at}.match.paths`),
359
+ absent: parseStringList(record['absent'], `${at}.match.absent`),
360
+ when: parseWhen(record['when'], `${at}.match.when`),
361
+ };
362
+ }
363
+ /** Validate the params map: non-empty string keys → one pattern or a pattern list. */
364
+ function parseParams(raw, at) {
365
+ if (raw === undefined)
366
+ return {};
367
+ const record = asRecord(raw, at);
368
+ const out = {};
369
+ for (const [key, value] of Object.entries(record)) {
370
+ if (key.length === 0)
371
+ throw new RuleError(`${at}: param keys must be non-empty strings`);
372
+ const patterns = parsePatternValues(value, `${at}.${key}`);
373
+ if (patterns.length === 0)
374
+ throw new RuleError(`${at}.${key}: param patterns must be non-empty`);
375
+ out[key] = patterns;
376
+ }
377
+ return out;
378
+ }
379
+ /** Validate the `when` block: env patterns and a closed platform vocabulary. */
380
+ function parseWhen(raw, at) {
381
+ if (raw === undefined)
382
+ return { env: {}, platform: [] };
383
+ const record = asRecord(raw, at);
384
+ const unknownFields = Object.keys(record).filter(key => key !== 'env' && key !== 'platform');
385
+ if (unknownFields.length > 0) {
386
+ throw new RuleError(`${at}: unknown field${unknownFields.length > 1 ? 's' : ''} ${unknownFields.map(k => JSON.stringify(k)).join(', ')} (allowed: env, platform)`);
387
+ }
388
+ const env = {};
389
+ const rawEnv = record['env'];
390
+ if (rawEnv !== undefined) {
391
+ const envRecord = asRecord(rawEnv, `${at}.env`);
392
+ for (const [key, value] of Object.entries(envRecord)) {
393
+ if (key.length === 0)
394
+ throw new RuleError(`${at}.env: env var names must be non-empty strings`);
395
+ const patterns = parsePatternValues(value, `${at}.env.${key}`);
396
+ if (patterns.length === 0)
397
+ throw new RuleError(`${at}.env.${key}: env patterns must be non-empty`);
398
+ env[key] = patterns;
399
+ }
400
+ }
401
+ const platform = parseStringList(record['platform'], `${at}.platform`);
402
+ for (const name of platform) {
403
+ if (!PLATFORMS.includes(name)) {
404
+ throw new RuleError(`${at}.platform: unknown platform ${JSON.stringify(name)} (allowed: ${PLATFORMS.map(p => JSON.stringify(p)).join(', ')})`);
405
+ }
406
+ }
407
+ return { env, platform };
408
+ }
409
+ /**
410
+ * Validate one pattern or a pattern list; scalar strings/numbers/booleans
411
+ * are single patterns (matching the runtime scalar-stringify semantics).
412
+ */
413
+ function parsePatternValues(raw, at) {
414
+ if (typeof raw === 'string')
415
+ return [raw];
416
+ if (typeof raw === 'number' || typeof raw === 'boolean')
417
+ return [String(raw)];
418
+ if (raw === undefined)
419
+ return [];
420
+ if (Array.isArray(raw)) {
421
+ return raw.map((value, index) => {
422
+ if (typeof value !== 'string' && typeof value !== 'number' && typeof value !== 'boolean') {
423
+ throw new RuleError(`${at}[${index}] must be a string, number, or boolean`);
424
+ }
425
+ const pattern = String(value);
426
+ if (pattern.length === 0)
427
+ throw new RuleError(`${at}[${index}] must be non-empty`);
428
+ return pattern;
429
+ });
430
+ }
431
+ throw new RuleError(`${at} must be a string, number, boolean, or a list of them`);
432
+ }
433
+ /** Validate a string or string list, absent = empty list. */
434
+ function parseStringList(raw, at) {
435
+ if (raw === undefined)
436
+ return [];
437
+ const values = typeof raw === 'string' ? [raw] : raw;
438
+ if (!Array.isArray(values))
439
+ throw new RuleError(`${at} must be a string or a list of strings`);
440
+ return values.map((value, index) => {
441
+ if (typeof value !== 'string' || value.length === 0) {
442
+ throw new RuleError(`${at}[${index}] must be a non-empty string`);
443
+ }
444
+ return value;
445
+ });
446
+ }
447
+ /** Narrow an unknown value to a plain record, throwing a {@link RuleError}. */
448
+ function asRecord(value, at) {
449
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
450
+ throw new RuleError(`${at} must be a mapping, got ${Array.isArray(value) ? 'a list' : typeof value}`);
451
+ }
452
+ return value;
453
+ }
454
+ /** Narrow an unknown value to a plain string-keyed record (tool arguments). */
455
+ function isRecord(value) {
456
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
457
+ }
458
+ // --- Candidate extraction --------------------------------------------------
459
+ /** Top-level argument keys whose string values are path candidates. */
460
+ export const PATH_CANDIDATE_KEYS = [
461
+ 'path',
462
+ 'paths',
463
+ 'file',
464
+ 'files',
465
+ 'file_path',
466
+ 'dir',
467
+ 'directory',
468
+ 'directories',
469
+ 'cwd',
470
+ 'workspace',
471
+ 'root',
472
+ 'target',
473
+ 'targets',
474
+ 'output',
475
+ ];
476
+ /**
477
+ * Collect path-candidate strings from tool arguments at ANY nesting depth
478
+ * (capped at {@link MAX_ARGUMENT_DEPTH}): scalar strings under the
479
+ * documented {@link PATH_CANDIDATE_KEYS}, plus string elements of arrays
480
+ * under those keys. Nested objects are walked so MCP-style
481
+ * `{ arguments: { path } }` shapes still feed path matching. Iterates the
482
+ * argument object's own key order, so extraction order is deterministic.
483
+ * @param args - the parsed tool arguments.
484
+ * @returns candidate strings in argument key order (duplicates kept).
485
+ */
486
+ export function extractPathCandidates(args) {
487
+ const candidates = [];
488
+ const walk = (node, depth) => {
489
+ if (depth > MAX_ARGUMENT_DEPTH)
490
+ return;
491
+ if (Array.isArray(node)) {
492
+ for (const element of node)
493
+ walk(element, depth + 1);
494
+ return;
495
+ }
496
+ if (typeof node !== 'object' || node === null)
497
+ return;
498
+ for (const [key, value] of Object.entries(node)) {
499
+ if (PATH_CANDIDATE_KEYS.includes(key)) {
500
+ if (typeof value === 'string')
501
+ candidates.push(value);
502
+ else if (Array.isArray(value)) {
503
+ for (const element of value) {
504
+ if (typeof element === 'string')
505
+ candidates.push(element);
506
+ }
507
+ }
508
+ }
509
+ walk(value, depth + 1);
510
+ }
511
+ };
512
+ walk(args, 0);
513
+ return candidates;
514
+ }
515
+ /**
516
+ * Normalize one candidate path against the workspace root: separators
517
+ * become `/`, `./` prefixes drop, and in-root paths become workspace
518
+ * relative. Candidates OUTSIDE the root (absolute or drive-prefixed
519
+ * elsewhere) yield `''` — path patterns address workspace-relative paths
520
+ * only; a still-relative `../…` input is kept so explicit out-of-root
521
+ * globs like `../shared/**` can address it. When `caseInsensitive` is set
522
+ * (Windows default), the drive and root-prefix comparisons ignore ASCII
523
+ * case, matching the case-insensitive filesystem.
524
+ * @param cwd - the session's absolute workspace root (any separator).
525
+ * @param candidate - the raw candidate path.
526
+ * @param caseInsensitive - compare root prefixes without ASCII case.
527
+ * @returns the workspace-relative posix path, or `''` to drop the candidate.
528
+ */
529
+ export function normalizeWorkspacePath(cwd, candidate, caseInsensitive = false) {
530
+ const root = toPosix(cwd).replace(/\/+$/, '');
531
+ const raw = toPosix(candidate);
532
+ if (raw.length === 0)
533
+ return '';
534
+ let path = raw;
535
+ while (path.startsWith('./'))
536
+ path = path.slice(2);
537
+ if (/^[A-Za-z]:\//.test(path)) {
538
+ // Windows drive path: relative only when on the root's own drive.
539
+ if (!/^[A-Za-z]:\//.test(root))
540
+ return '';
541
+ if (path.slice(0, 2).toLowerCase() !== root.slice(0, 2).toLowerCase())
542
+ return '';
543
+ return relFromRoot(root, path, path.slice(2), root.slice(2), caseInsensitive);
544
+ }
545
+ if (path.startsWith('/')) {
546
+ // Absolute posix path: relative when inside the root, dropped otherwise.
547
+ return relFromRoot(root, path, path, root, caseInsensitive);
548
+ }
549
+ return path;
550
+ }
551
+ /** Strip a common root prefix from one absolute path, else drop the path. */
552
+ function relFromRoot(root, path, rest, rootRest, caseInsensitive) {
553
+ const restLower = caseInsensitive ? rest.toLowerCase() : rest;
554
+ const rootRestLower = caseInsensitive ? rootRest.toLowerCase() : rootRest;
555
+ if (rootRestLower.length === 0)
556
+ return rest.slice(1);
557
+ if (path.toLowerCase() === root.toLowerCase())
558
+ return '';
559
+ return restLower.startsWith(`${rootRestLower}/`) ? rest.slice(rootRest.length + 1) : '';
560
+ }
561
+ /** Convert a path to posix separators. */
562
+ function toPosix(path) {
563
+ return path.replaceAll('\\', '/');
564
+ }
565
+ /** Collect scalar candidate strings from one param value, recursing into arrays and objects. */
566
+ function scalarCandidates(value, depth) {
567
+ if (depth > MAX_ARGUMENT_DEPTH)
568
+ return [];
569
+ if (typeof value === 'string')
570
+ return [value];
571
+ if (typeof value === 'number' || typeof value === 'boolean')
572
+ return [String(value)];
573
+ if (Array.isArray(value)) {
574
+ return value.flatMap(element => scalarCandidates(element, depth + 1));
575
+ }
576
+ if (typeof value === 'object' && value !== null) {
577
+ return Object.values(value).flatMap(child => scalarCandidates(child, depth + 1));
578
+ }
579
+ return [];
580
+ }
581
+ //# sourceMappingURL=rules.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rules.js","sourceRoot":"","sources":["../../src/rules.ts"],"names":[],"mappings":"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"}