@agent-beam/beam 0.2.37 → 0.2.39

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 (112) hide show
  1. package/README.md +7 -13
  2. package/dist/access-risk.d.ts +10 -0
  3. package/dist/access-risk.js +43 -0
  4. package/dist/access-risk.js.map +1 -0
  5. package/dist/action-context.d.ts +30 -0
  6. package/dist/action-context.js +203 -0
  7. package/dist/action-context.js.map +1 -0
  8. package/dist/activity.d.ts +22 -0
  9. package/dist/activity.js +132 -0
  10. package/dist/activity.js.map +1 -0
  11. package/dist/agent-hook-install.d.ts +8 -0
  12. package/dist/agent-hook-install.js +278 -0
  13. package/dist/agent-hook-install.js.map +1 -0
  14. package/dist/agent-installers.js +16 -3
  15. package/dist/agent-installers.js.map +1 -1
  16. package/dist/agent-plugins.d.ts +3 -0
  17. package/dist/agent-plugins.js +66 -0
  18. package/dist/agent-plugins.js.map +1 -0
  19. package/dist/agents.d.ts +1 -0
  20. package/dist/agents.js +30 -184
  21. package/dist/agents.js.map +1 -1
  22. package/dist/behavioral-anomaly.d.ts +16 -0
  23. package/dist/behavioral-anomaly.js +66 -0
  24. package/dist/behavioral-anomaly.js.map +1 -0
  25. package/dist/cli.js +28 -10
  26. package/dist/cli.js.map +1 -1
  27. package/dist/client.d.ts +1 -1
  28. package/dist/client.js +203 -100
  29. package/dist/client.js.map +1 -1
  30. package/dist/connect.d.ts +7 -0
  31. package/dist/connect.js +12 -0
  32. package/dist/connect.js.map +1 -1
  33. package/dist/core.d.ts +50 -2
  34. package/dist/core.js +73 -24
  35. package/dist/core.js.map +1 -1
  36. package/dist/credential-egress.d.ts +17 -0
  37. package/dist/credential-egress.js +325 -0
  38. package/dist/credential-egress.js.map +1 -0
  39. package/dist/custom-rules.js +2 -1
  40. package/dist/custom-rules.js.map +1 -1
  41. package/dist/data-detectors.js +60 -4
  42. package/dist/data-detectors.js.map +1 -1
  43. package/dist/destructive-risk.d.ts +1 -0
  44. package/dist/destructive-risk.js +70 -0
  45. package/dist/destructive-risk.js.map +1 -0
  46. package/dist/edit-stats.js +5 -5
  47. package/dist/edit-stats.js.map +1 -1
  48. package/dist/entity-redaction.d.ts +11 -0
  49. package/dist/entity-redaction.js +88 -0
  50. package/dist/entity-redaction.js.map +1 -0
  51. package/dist/file-lock.d.ts +1 -0
  52. package/dist/file-lock.js +54 -0
  53. package/dist/file-lock.js.map +1 -0
  54. package/dist/forward.d.ts +13 -6
  55. package/dist/forward.js +120 -42
  56. package/dist/forward.js.map +1 -1
  57. package/dist/hook-adapters.d.ts +2 -2
  58. package/dist/hook-adapters.js +59 -60
  59. package/dist/hook-adapters.js.map +1 -1
  60. package/dist/hook-catalog.d.ts +12 -0
  61. package/dist/hook-catalog.js +469 -0
  62. package/dist/hook-catalog.js.map +1 -0
  63. package/dist/hook-config.d.ts +8 -0
  64. package/dist/hook-config.js +80 -0
  65. package/dist/hook-config.js.map +1 -0
  66. package/dist/hook-spool.d.ts +3 -0
  67. package/dist/hook-spool.js +56 -0
  68. package/dist/hook-spool.js.map +1 -0
  69. package/dist/install.d.ts +5 -5
  70. package/dist/install.js +48 -199
  71. package/dist/install.js.map +1 -1
  72. package/dist/inventory.js +1 -1
  73. package/dist/inventory.js.map +1 -1
  74. package/dist/jev.js +2 -1
  75. package/dist/jev.js.map +1 -1
  76. package/dist/judge.js +2 -1
  77. package/dist/judge.js.map +1 -1
  78. package/dist/mitigation-pattern.d.ts +1 -0
  79. package/dist/mitigation-pattern.js +140 -0
  80. package/dist/mitigation-pattern.js.map +1 -0
  81. package/dist/package-risk-rules.js +2 -2
  82. package/dist/package-risk-rules.js.map +1 -1
  83. package/dist/policy-paths.d.ts +20 -0
  84. package/dist/policy-paths.js +145 -0
  85. package/dist/policy-paths.js.map +1 -0
  86. package/dist/policy.d.ts +5 -0
  87. package/dist/policy.js +78 -10
  88. package/dist/policy.js.map +1 -1
  89. package/dist/rule-catalog.d.ts +3 -1
  90. package/dist/rule-catalog.js +124 -24
  91. package/dist/rule-catalog.js.map +1 -1
  92. package/dist/rule-matches.d.ts +13 -0
  93. package/dist/rule-matches.js +42 -0
  94. package/dist/rule-matches.js.map +1 -0
  95. package/dist/serve.js +55 -5
  96. package/dist/serve.js.map +1 -1
  97. package/dist/server.js +7 -6
  98. package/dist/server.js.map +1 -1
  99. package/dist/setup.js +26 -13
  100. package/dist/setup.js.map +1 -1
  101. package/dist/skill-risk-rules.js +2 -2
  102. package/dist/skill-risk-rules.js.map +1 -1
  103. package/dist/skill-setup.js +4 -5
  104. package/dist/skill-setup.js.map +1 -1
  105. package/dist/skill-sync.d.ts +5 -1
  106. package/dist/skill-sync.js +115 -14
  107. package/dist/skill-sync.js.map +1 -1
  108. package/dist/store.js +6 -9
  109. package/dist/store.js.map +1 -1
  110. package/dist/studio.js +2 -2
  111. package/package.json +6 -3
  112. package/stress-report.json +48 -48
@@ -0,0 +1,325 @@
1
+ // A bounded, dependency-free shell heuristic, shared by the CLI and edge SDK.
2
+ // Unlike a whole-text keyword conjunction, only transfer arguments / connected
3
+ // stdin are sinks. This is not a general shell or JavaScript taint analyzer.
4
+ const SENSITIVE = /(?:\.env(?:\b|[./])|\.ssh[\\/]|id_(?:rsa|ed25519)|\.aws[\\/]credentials|\.pgpass\b|\.docker[\\/]config\.json|credentials\.json|\b(?:printenv|process\.env|os\.environ)\b|(?:api[_-]?key|access[_-]?token|password|secret)\b|\$\{?[\w]*(?:TOKEN|SECRET|PASSWORD|API_KEY|CREDENTIAL)[\w]*\}?)/i;
5
+ // Preserve quoted arguments as one token. Separators inside quotes cannot join
6
+ // unrelated fixtures into a command. Keep raw quotes for recursive shell -c.
7
+ function commands(text) {
8
+ const out = [];
9
+ let tokens = [];
10
+ let value = "", raw = "", quote = "", tokenStart = 0;
11
+ const word = () => { if (raw)
12
+ tokens.push({ value, raw, start: tokenStart, end: tokenStart + raw.length }); value = raw = ""; };
13
+ const end = (pipe) => { word(); if (tokens.length)
14
+ out.push({ tokens, pipe, start: tokens[0].start, end: tokens[tokens.length - 1].end }); tokens = []; };
15
+ for (let i = 0; i < text.length; i++) {
16
+ const c = text[i];
17
+ if (!raw && !/\s/.test(c))
18
+ tokenStart = i;
19
+ if (!quote && c === "$" && text[i + 1] === "(") {
20
+ let level = 1;
21
+ const start = i;
22
+ i++;
23
+ while (++i < text.length && level) {
24
+ if (text[i] === "(")
25
+ level++;
26
+ else if (text[i] === ")")
27
+ level--;
28
+ }
29
+ const substitution = text.slice(start, i);
30
+ raw += substitution;
31
+ value += substitution;
32
+ i--;
33
+ }
34
+ else if (c === "\\" && quote !== "'") {
35
+ raw += c;
36
+ if (i + 1 < text.length) {
37
+ raw += text[++i];
38
+ if (text[i] !== "\n")
39
+ value += text[i];
40
+ }
41
+ }
42
+ else if (quote) {
43
+ raw += c;
44
+ if (c === quote)
45
+ quote = "";
46
+ else
47
+ value += c;
48
+ }
49
+ else if (c === "'" || c === '"') {
50
+ quote = c;
51
+ raw += c;
52
+ }
53
+ else if (c === "#" && !raw) {
54
+ while (i < text.length && text[i] !== "\n")
55
+ i++;
56
+ end(false);
57
+ }
58
+ else if (c === ";" || c === "\n" || c === "|" || c === "&") {
59
+ const pipe = c === "|" && text[i + 1] !== "|";
60
+ end(pipe);
61
+ if (text[i + 1] === c && (c === "|" || c === "&"))
62
+ i++;
63
+ }
64
+ else if (/\s/.test(c))
65
+ word();
66
+ else {
67
+ raw += c;
68
+ value += c;
69
+ }
70
+ }
71
+ end(false);
72
+ return out;
73
+ }
74
+ function executable(tokens) {
75
+ let i = 0;
76
+ while (i < tokens.length && (/^[\w]+=[\s\S]*/.test(tokens[i].value) || /^(?:sudo|command|exec)$/.test(tokens[i].value) || tokens[i].value === "env" && i + 1 < tokens.length))
77
+ i++;
78
+ return i;
79
+ }
80
+ function name(token) { return token?.value.split(/[\\/]/).pop()?.toLowerCase() ?? ""; }
81
+ // Shell substitutions execute even inside double quotes (but not single quotes).
82
+ function expansionExposure(text, depth) {
83
+ let quote = "";
84
+ for (let i = 0; i < text.length; i++) {
85
+ const c = text[i];
86
+ if (c === "\\" && quote !== "'") {
87
+ i++;
88
+ continue;
89
+ }
90
+ if (c === "'" && quote !== '"') {
91
+ quote = quote ? "" : "'";
92
+ continue;
93
+ }
94
+ if (quote === "'")
95
+ continue;
96
+ if (c === '"') {
97
+ quote = quote ? "" : '"';
98
+ continue;
99
+ }
100
+ if (c === "$" && text[i + 1] === "(") {
101
+ const start = i + 2;
102
+ let level = 1;
103
+ i++;
104
+ while (++i < text.length && level) {
105
+ if (text[i] === "(")
106
+ level++;
107
+ else if (text[i] === ")")
108
+ level--;
109
+ }
110
+ if (shellExposure(text.slice(start, level ? i : i - 1), depth + 1))
111
+ return true;
112
+ i--;
113
+ }
114
+ else if (c === "`") {
115
+ const start = ++i;
116
+ while (i < text.length && text[i] !== "`") {
117
+ if (text[i] === "\\")
118
+ i++;
119
+ i++;
120
+ }
121
+ if (shellExposure(text.slice(start, i), depth + 1))
122
+ return true;
123
+ }
124
+ }
125
+ return false;
126
+ }
127
+ function shellExposure(text, depth) {
128
+ if (depth > 4)
129
+ return false;
130
+ // Here-doc bodies are data to their recipient. Examine shell recipients as
131
+ // code; for files, examine the body only if that path is subsequently run.
132
+ const lines = text.split("\n");
133
+ const visible = [];
134
+ for (let i = 0; i < lines.length; i++) {
135
+ const line = lines[i];
136
+ const doc = /<<(-)?\s*(?:'([^']+)'|"([^"]+)"|([\w]+))/.exec(line);
137
+ if (!doc) {
138
+ visible.push(line);
139
+ continue;
140
+ }
141
+ // Ignore heredoc-looking text inside quoted fixture strings and comments.
142
+ let quote = "";
143
+ for (let j = 0; j < doc.index; j++) {
144
+ const c = line[j];
145
+ if (c === "\\" && quote !== "'") {
146
+ j++;
147
+ continue;
148
+ }
149
+ if (quote) {
150
+ if (c === quote)
151
+ quote = "";
152
+ }
153
+ else if (c === "'" || c === '"')
154
+ quote = c;
155
+ else if (c === "#") {
156
+ quote = "#";
157
+ break;
158
+ }
159
+ }
160
+ if (quote) {
161
+ visible.push(line);
162
+ continue;
163
+ }
164
+ const delimiter = doc[2] ?? doc[3] ?? doc[4];
165
+ const body = [];
166
+ while (++i < lines.length && (doc[1] ? lines[i].replace(/^\t+/, "") : lines[i]) !== delimiter)
167
+ body.push(lines[i]);
168
+ const head = commands(line)[0]?.tokens ?? [];
169
+ const recipient = name(head[executable(head)]);
170
+ const file = />\s*([^\s<>]+)/.exec(line)?.[1];
171
+ const later = lines.slice(i + 1).join("\n");
172
+ const runsFile = file && commands(later).some(c => {
173
+ const at = executable(c.tokens);
174
+ const cmd = name(c.tokens[at]);
175
+ return c.tokens[at]?.value === file || /^(?:bun|node|tsx|python[23]?|sh|bash|zsh)$/.test(cmd) && c.tokens.slice(at + 1).some(t => t.value === file);
176
+ });
177
+ if ((/^(?:sh|bash|zsh)$/.test(recipient) || /\|\s*(?:sh|bash|zsh)\b/.test(line) || runsFile) && shellExposure(body.join("\n"), depth + 1))
178
+ return true;
179
+ // A here-doc sent to curl is itself an outbound payload.
180
+ if (/^(?:nc|ncat|socat)$/.test(recipient) && SENSITIVE.test(body.join("\n")))
181
+ return true;
182
+ if (/^(?:curl|wget)$/.test(recipient) && /(?:@-|--post-file[= ]-)/.test(line) && SENSITIVE.test(body.join("\n")))
183
+ return true;
184
+ if (doc[4] && expansionExposure(body.join("\n"), depth))
185
+ return true;
186
+ visible.push(line.replace(doc[0], ""));
187
+ }
188
+ let sensitiveStdin = false;
189
+ const sensitiveVariables = new Set();
190
+ const sensitive = (value) => SENSITIVE.test(value) || [...value.matchAll(/\$\{?([A-Za-z_]\w*)/g)].some(m => sensitiveVariables.has(m[1]));
191
+ for (const command of commands(visible.join("\n"))) {
192
+ const { tokens, pipe } = command;
193
+ const at = executable(tokens);
194
+ const cmd = name(tokens[at]);
195
+ for (const token of tokens) {
196
+ const assignment = /^([A-Za-z_]\w*)=([\s\S]*)$/.exec(token.value);
197
+ if (!assignment)
198
+ break;
199
+ if (sensitive(assignment[2]))
200
+ sensitiveVariables.add(assignment[1]);
201
+ else
202
+ sensitiveVariables.delete(assignment[1]);
203
+ }
204
+ if (/^(?:echo|printf|cat|curl|wget|scp|rsync|nc|ncat|socat|env|sh|bash|zsh)$/.test(cmd) || tokens.some(t => /^[A-Za-z_]\w*=/.test(t.value))) {
205
+ if (expansionExposure(tokens.map(t => t.raw).join(" "), depth))
206
+ return true;
207
+ }
208
+ const args = tokens.slice(at + 1).map(t => t.value);
209
+ const joined = args.join(" ");
210
+ // Inspect explicitly executed shell strings, never arbitrary string args to
211
+ // echo, grep, console.log, detect, etc.
212
+ if (/^(?:sh|bash|zsh)$/.test(cmd)) {
213
+ const flag = args.findIndex(a => /^-[a-z]*c[a-z]*$/.test(a));
214
+ if (flag >= 0 && shellExposure(args[flag + 1] ?? "", depth + 1))
215
+ return true;
216
+ }
217
+ const transfer = /^(?:curl|wget|scp|rsync|nc|ncat|socat)$/.test(cmd);
218
+ if (transfer) {
219
+ if (sensitiveStdin && /^(?:nc|ncat|socat)$/.test(cmd))
220
+ return true;
221
+ if (/^(?:scp|rsync)$/.test(cmd) && /^[^/\s]+:[\s\S]+/.test(args[args.length - 1] ?? "") && args.slice(0, -1).some(a => sensitive(a)))
222
+ return true;
223
+ for (let i = 0; i < args.length; i++) {
224
+ const arg = args[i];
225
+ // A URL path mentioning 'secret' is not a secret payload. Query values
226
+ // and userinfo can carry credentials; payload/header/file options can too.
227
+ if (/^https?:\/\//i.test(arg) && ((/[?&](?:api[_-]?key|token|password|secret)=/i.test(arg)) || /^https?:\/\/[^/@\s]+:[^/@\s]+@/i.test(arg) || /[?&][^=]+=\$/.test(arg) && sensitive(arg)))
228
+ return true;
229
+ const compact = /^-(?:d|F|H|u|T)(.+)$/.exec(arg);
230
+ if (compact && sensitive(compact[1]))
231
+ return true;
232
+ if (/^(?:-d|-F|-H|-u|-T|--json|--data(?:-raw|-binary|-urlencode)?|--form|--header|--user|--upload-file|--post-data|--post-file)(?:=|$)/.test(arg)) {
233
+ const payload = arg.includes("=") ? arg.slice(arg.indexOf("=") + 1) : args[++i] ?? "";
234
+ if (sensitive(payload))
235
+ return true;
236
+ if (sensitiveStdin && /(?:@-|\/dev\/stdin|\/proc\/self\/fd\/0)/.test(payload))
237
+ return true;
238
+ }
239
+ if (/^<(?:\s*)/.test(arg) && sensitive(arg + (args[i + 1] ?? "")))
240
+ return true;
241
+ }
242
+ }
243
+ const readsSensitive = /^(?:cat|printenv|env|echo|printf|head|tail|sed|awk|base64)$/.test(cmd) && (sensitive(joined) || /^(?:printenv|env)$/.test(cmd));
244
+ const propagates = /^(?:cat|base64|gzip|tee|sed|awk|tr|head|tail)$/.test(cmd);
245
+ sensitiveStdin = pipe && (readsSensitive || sensitiveStdin && propagates);
246
+ }
247
+ return false;
248
+ }
249
+ export function possibleCredentialExposure(text) {
250
+ if (shellExposure(text, 0))
251
+ return true;
252
+ // Skills are natural-language instructions, not just shell programs. Require
253
+ // an explicit sensitive read followed by a referring delivery instruction.
254
+ // Do not correlate arbitrary prose, URLs, code strings or separate fixtures.
255
+ return /(?:^|\n)\s*(?:read|collect|extract)\b[^\n]{0,200}(?:\.env\b|\bAPI_KEY\b|\bcredentials?\b)[^\n]*\n\s*(?:send|upload|exfiltrate)\s+(?:it|them|the\s+(?:credentials?|contents?|secrets?))\b[^\n]{0,200}https?:\/\//i.test(text);
256
+ }
257
+ /** Locate only original executable command/pipeline ranges independently
258
+ * accepted by the detector. Do not scan inert heredoc bodies as commands. */
259
+ function heredocDataRanges(text) {
260
+ const hidden = [];
261
+ const lines = text.split("\n");
262
+ let offset = 0;
263
+ for (let i = 0; i < lines.length; i++) {
264
+ const line = lines[i];
265
+ const doc = /<<(-)?\s*(?:'([^']+)'|"([^"]+)"|([\w]+))/.exec(line);
266
+ let quote = "";
267
+ if (doc)
268
+ for (let j = 0; j < doc.index; j++) {
269
+ const c = line[j];
270
+ if (c === "\\" && quote !== "'") {
271
+ j++;
272
+ continue;
273
+ }
274
+ if (quote) {
275
+ if (c === quote)
276
+ quote = "";
277
+ }
278
+ else if (c === "'" || c === '"')
279
+ quote = c;
280
+ else if (c === "#") {
281
+ quote = "#";
282
+ break;
283
+ }
284
+ }
285
+ offset += line.length + 1;
286
+ if (!doc || quote)
287
+ continue;
288
+ const start = offset;
289
+ const delimiter = doc[2] ?? doc[3] ?? doc[4];
290
+ while (++i < lines.length) {
291
+ offset += lines[i].length + 1;
292
+ if ((doc[1] ? lines[i].replace(/^\t+/, "") : lines[i]) === delimiter)
293
+ break;
294
+ }
295
+ hidden.push({ start, end: offset });
296
+ }
297
+ return hidden;
298
+ }
299
+ export function shellActionCommands(text) {
300
+ const hidden = heredocDataRanges(text);
301
+ return commands(text).filter(command => !hidden.some(range => command.start < range.end && command.end > range.start));
302
+ }
303
+ export function credentialExposureSpans(text) {
304
+ const hidden = heredocDataRanges(text);
305
+ const spans = [];
306
+ let groupStart;
307
+ for (const command of commands(text)) {
308
+ if (hidden.some(range => command.start < range.end && command.end > range.start)) {
309
+ groupStart = undefined;
310
+ continue;
311
+ }
312
+ groupStart ??= command.start;
313
+ const candidate = text.slice(groupStart, command.end);
314
+ if (possibleCredentialExposure(candidate)) {
315
+ spans.push({ start: groupStart, end: command.end, label: "Sensitive outbound transfer" });
316
+ if (spans.length === 8)
317
+ break;
318
+ }
319
+ const assignment = /^[A-Za-z_]\w*=/.test(command.tokens[0]?.value ?? "");
320
+ if (!command.pipe && !assignment)
321
+ groupStart = undefined;
322
+ }
323
+ return spans;
324
+ }
325
+ //# sourceMappingURL=credential-egress.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"credential-egress.js","sourceRoot":"","sources":["../src/credential-egress.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,4 @@
1
+ import { patternMatch } from "./rule-matches.js";
1
2
  import { readFile } from "node:fs/promises";
2
3
  import { join } from "node:path";
3
4
  import { getBeamHome } from "./config.js";
@@ -71,7 +72,7 @@ export async function loadCustomRules(home = getBeamHome()) {
71
72
  severity: e.severity,
72
73
  category: (typeof e.category === "string" && e.category ? e.category : "custom"),
73
74
  explanation: typeof e.explanation === "string" && e.explanation ? e.explanation : "User-defined rule.",
74
- match: (s) => regex.test(s),
75
+ match: patternMatch(regex),
75
76
  });
76
77
  });
77
78
  setCustomRules(rules);
@@ -1 +1 @@
1
- {"version":3,"file":"custom-rules.js","sourceRoot":"","sources":["../src/custom-rules.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAC5C,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,EAAE,WAAW,EAAE,MAAM,aAAa,CAAC;AAC1C,OAAO,EAAE,cAAc,EAA+C,MAAM,WAAW,CAAC;AAIxF,MAAM,gBAAgB,GAAe,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAC;AAE5E,MAAM,UAAU,eAAe,CAAC,IAAI,GAAG,WAAW,EAAE,IAAY,OAAO,IAAI,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC,CAAC,CAAC;AAElG,mFAAmF;AACnF,8FAA8F;AAC9F,iGAAiG;AACjG,mFAAmF;AACnF,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,IAAI,GAAG,WAAW,EAAE;IACxD,MAAM,IAAI,GAAG,eAAe,CAAC,IAAI,CAAC,CAAC;IACnC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,IAAI,GAAW,CAAC;IAChB,IAAI,CAAC;QAAC,GAAG,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAAC,CAAC;IAC3C,OAAO,CAAC,EAAE,CAAC;QACT,IAAK,CAA2B,CAAC,IAAI,KAAK,QAAQ,EAAE,CAAC;YAAC,cAAc,CAAC,EAAE,CAAC,CAAC;YAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC;QAAC,CAAC;QACnH,MAAM,CAAC,CAAC;IACV,CAAC;IAED,IAAI,MAAe,CAAC;IACpB,IAAI,CAAC;QAAC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAAC,CAAC;IACjC,MAAM,CAAC;QAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,2CAA2C,CAAC,EAAE,CAAC;IAAC,CAAC;IAEvH,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAAC,cAAc,CAAC,EAAE,CAAC,CAAC;QAAC,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,GAAG,IAAI,0CAA0C,CAAC,EAAE,CAAC;IAAC,CAAC;IAE5I,MAAM,KAAK,GAAW,EAAE,CAAC;IACzB,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;QAC1B,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,4BAA4B,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAChI,MAAM,CAAC,GAAG,KAAgC,CAAC;QAC3C,IAAI,OAAO,CAAC,CAAC,EAAE,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,EAAE,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,2BAA2B,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC5G,IAAI,OAAO,CAAC,CAAC,OAAO,KAAK,QAAQ,IAAI,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,gCAAgC,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC9H,IAAI,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,gBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAoB,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,gCAAgC,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QAC9M,IAAI,KAAa,CAAC;QAClB,IAAI,CAAC;YAAC,KAAK,GAAG,IAAI,MAAM,CAAC,CAAC,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;QAAC,CAAC;QAC3C,OAAO,GAAG,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,6BAA6B,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,aAAa,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACnJ,IAAI,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,UAAU,CAAC,CAAC,EAAE,EAAE,CAAC,EAAE,CAAC;YAAC,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,EAAE,2BAA2B,CAAC,CAAC;YAAC,OAAO;QAAC,CAAC;QACxH,KAAK,CAAC,IAAI,CAAC;YACT,EAAE,EAAE,UAAU,CAAC,CAAC,EAAE,EAAE;YACpB,KAAK,EAAE,OAAO,CAAC,CAAC,KAAK,KAAK,QAAQ,IAAI,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE;YAC9D,QAAQ,EAAE,CAAC,CAAC,QAAoB;YAChC,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,KAAK,QAAQ,IAAI,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAiB;YAChG,WAAW,EAAE,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ,IAAI,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,oBAAoB;YACtG,KAAK,EAAE,CAAC,CAAS,EAAE,EAAE,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC;SACpC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;IAEH,cAAc,CAAC,KAAK,CAAC,CAAC;IACtB,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC;AAChD,CAAC"}
1
+ {"version":3,"file":"custom-rules.js","sourceRoot":"","sources":["../src/custom-rules.ts"],"names":[],"mappings":"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"}
@@ -1,17 +1,58 @@
1
1
  const detectors = [
2
2
  { kind: "PRIVATE_KEY", pattern: /-----BEGIN [^-]*PRIVATE KEY-----[\s\S]*?(?:-----END [^-]*PRIVATE KEY-----|$)/g, replacement: "[PRIVATE_KEY_REDACTED]" },
3
3
  { kind: "API_KEY", pattern: /\b(?:sk-(?:proj-|ant-)?[A-Za-z0-9_-]{12,}|gh[pousr]_[A-Za-z0-9_]{16,}|github_pat_[A-Za-z0-9_]{16,}|AKIA[A-Z0-9]{16}|xox[baprs]-[\w-]{10,}|beam_app_[\w-]{20,})\b/g, replacement: "[API_KEY_REDACTED]" },
4
- { kind: "SECRET", pattern: /((?:api[_-]?key|access[_-]?token|token|secret|authorization)\s*[:=]\s*["']?)([^\s,"';&}\]]+)/gi, replacement: "$1[SECRET_REDACTED]" },
5
- { kind: "PASSWORD", pattern: /((?:password|passwd|pwd)\s*[:=]\s*["']?)([^\s,"';&}\]]+)/gi, replacement: "$1[PASSWORD_REDACTED]" },
6
4
  { kind: "EMAIL", pattern: /\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,}\b/gi, replacement: "[EMAIL_REDACTED]" },
7
5
  { kind: "PHONE", pattern: /(?<!\w)(?:\+\d{1,3}[\s.-]?)?(?:\d[\s.-]?){8,14}\d(?!\w)/g, replacement: "[PHONE_REDACTED]" },
8
6
  ];
7
+ // SECRET/PASSWORD used to require their keyword sit immediately before "="/":", so
8
+ // AWS_SECRET_ACCESS_KEY (keyword not adjacent -- "_ACCESS_KEY" sits between "SECRET" and "=")
9
+ // went through un-redacted even though it's the standard AWS credential variable name. Fixed by
10
+ // extracting any NAME=value assignment, then checking whether NAME *contains* a credential
11
+ // keyword as a whole underscore/hyphen/camelCase-delimited segment, in any position -- so
12
+ // "secretary_name" (the word "secret" only as a substring, not a segment) still correctly never
13
+ // matches, while "AWS_SECRET_ACCESS_KEY", "appSecretToken", "DB-PASSWORD-HASH" all do.
14
+ const ASSIGNMENT = /\b([A-Za-z][\w.-]*)\s*[:=]\s*["']?([^\s,"';&}\]]+)/g;
15
+ function segments(identifier) {
16
+ return identifier.replace(/([a-z0-9])([A-Z])/g, "$1_$2").toLowerCase().split(/[_.-]+/).filter(Boolean);
17
+ }
18
+ const SECRET_SEGMENTS = new Set(["secret", "token", "authorization"]);
19
+ const PASSWORD_SEGMENTS = new Set(["password", "passwd", "pwd"]);
20
+ // "key" alone is far too common a segment to flag by itself (primary_key, sort_key,
21
+ // partition_key are ordinary DB/infra terms, not secrets) -- only the "api"+"key" pairing counts,
22
+ // and only when adjacent, matching the original api[_-]?key compound.
23
+ function hasApiKeyPair(segs) {
24
+ return segs.some((s, i) => s === "api" && segs[i + 1] === "key");
25
+ }
26
+ // A value pointing at a secret manager instead of holding the secret itself: 1Password
27
+ // (op://vault/item/field), Azure Key Vault app-setting references, HashiCorp Vault paths,
28
+ // Infisical/Doppler references, GitHub Actions' ${{ secrets.X }}, or a generic broker-issued
29
+ // placeholder like __CREDENTIAL_REF_123__. There is nothing to redact -- the real value never
30
+ // left the vault -- so flagging it as an exposed secret would itself be the false positive.
31
+ // `${{ secrets.X }}` is checked by its opening token alone: the SECRET/PASSWORD detectors' own
32
+ // value-capture regex stops at the first whitespace, so it never sees past "${{" either way.
33
+ const CREDENTIAL_REFERENCE = /^(?:op:\/\/|@Microsoft\.KeyVault\(|vault:|infisical:\/\/|doppler:\/\/|\$\{\{|__[A-Z][A-Z0-9_]*_REF_[\w-]+__$)/i;
34
+ const isReference = (value) => CREDENTIAL_REFERENCE.test(value.trim());
9
35
  export function detectSensitive(text, custom = []) {
10
36
  const findings = [];
11
37
  for (const detector of detectors) {
12
38
  detector.pattern.lastIndex = 0;
13
- for (const match of text.matchAll(detector.pattern))
39
+ for (const match of text.matchAll(detector.pattern)) {
14
40
  findings.push({ kind: detector.kind, confidence: 0.9, start: match.index ?? 0, end: (match.index ?? 0) + match[0].length, replacement: detector.replacement });
41
+ }
42
+ }
43
+ // SECRET/PASSWORD: redact only the captured value (group 2), not the "name=" prefix (group 1),
44
+ // so "AWS_SECRET_ACCESS_KEY=xxx" redacts to "AWS_SECRET_ACCESS_KEY=[SECRET_REDACTED]", not the
45
+ // whole assignment. A reference value there (op://, @Microsoft.KeyVault(...), ...) is skipped
46
+ // entirely -- it isn't a real secret.
47
+ ASSIGNMENT.lastIndex = 0;
48
+ for (const match of text.matchAll(ASSIGNMENT)) {
49
+ const [, name, value] = match;
50
+ const segs = segments(name);
51
+ const kind = segs.some(s => SECRET_SEGMENTS.has(s)) || hasApiKeyPair(segs) ? "SECRET" : segs.some(s => PASSWORD_SEGMENTS.has(s)) ? "PASSWORD" : null;
52
+ if (!kind || isReference(value ?? ""))
53
+ continue;
54
+ const start = (match.index ?? 0) + name.length + match[0].slice(name.length).indexOf(value);
55
+ findings.push({ kind, confidence: 0.9, start, end: start + value.length, replacement: kind === "SECRET" ? "[SECRET_REDACTED]" : "[PASSWORD_REDACTED]" });
15
56
  }
16
57
  for (const customDetector of custom) {
17
58
  try {
@@ -21,7 +62,22 @@ export function detectSensitive(text, custom = []) {
21
62
  }
22
63
  catch { /* policy validation reports malformed custom detectors */ }
23
64
  }
24
- return findings.sort((a, b) => b.start - a.start);
65
+ // Different detectors can match overlapping or identical spans on the same value (an API-key-
66
+ // shaped value assigned to a field named "token" trips both the API_KEY and SECRET detectors).
67
+ // Applying two replacements to overlapping ranges corrupts the text (the second splice operates
68
+ // on offsets computed against the pre-replacement string). Kept in detector-priority order
69
+ // (array order above: PRIVATE_KEY/API_KEY's precise format match wins over SECRET/PASSWORD's
70
+ // generic keyword match), via a stable sort by start -- ties keep their original push order --
71
+ // then a left-to-right sweep that drops anything starting before the last kept finding's end.
72
+ const nonOverlapping = [];
73
+ let lastEnd = -1;
74
+ for (const finding of [...findings].sort((a, b) => a.start - b.start)) {
75
+ if (finding.start < lastEnd)
76
+ continue;
77
+ nonOverlapping.push(finding);
78
+ lastEnd = finding.end;
79
+ }
80
+ return nonOverlapping.sort((a, b) => b.start - a.start);
25
81
  }
26
82
  export function redactSensitive(text, custom = []) {
27
83
  const findings = detectSensitive(text, custom);
@@ -1 +1 @@
1
- {"version":3,"file":"data-detectors.js","sourceRoot":"","sources":["../src/data-detectors.ts"],"names":[],"mappings":"AAGA,MAAM,SAAS,GAAwE;IACrF,EAAE,IAAI,EAAE,aAAa,EAAE,OAAO,EAAE,+EAA+E,EAAE,WAAW,EAAE,wBAAwB,EAAE;IACxJ,EAAE,IAAI,EAAE,SAAS,EAAE,OAAO,EAAE,mKAAmK,EAAE,WAAW,EAAE,oBAAoB,EAAE;IACpO,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,gGAAgG,EAAE,WAAW,EAAE,qBAAqB,EAAE;IACjK,EAAE,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,4DAA4D,EAAE,WAAW,EAAE,uBAAuB,EAAE;IACjI,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,6CAA6C,EAAE,WAAW,EAAE,kBAAkB,EAAE;IAC1G,EAAE,IAAI,EAAE,OAAO,EAAE,OAAO,EAAE,0DAA0D,EAAE,WAAW,EAAE,kBAAkB,EAAE;CACxH,CAAC;AAGF,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,SAA2B,EAAE;IACzE,MAAM,QAAQ,GAAkB,EAAE,CAAC;IACnC,KAAK,MAAM,QAAQ,IAAI,SAAS,EAAE,CAAC;QACjC,QAAQ,CAAC,OAAO,CAAC,SAAS,GAAG,CAAC,CAAC;QAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC;YAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAC;IACtN,CAAC;IACD,KAAK,MAAM,cAAc,IAAI,MAAM,EAAE,CAAC;QACpC,IAAI,CAAC;YACH,MAAM,OAAO,GAAG,IAAI,MAAM,CAAC,cAAc,CAAC,OAAO,EAAE,GAAG,CAAC,CAAC;YACxD,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;gBAAE,QAAQ,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,UAAU,EAAE,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC,KAAK,CAAC,KAAK,IAAI,CAAC,CAAC,GAAG,KAAK,CAAC,CAAC,CAAC,CAAC,MAAM,EAAE,WAAW,EAAE,cAAc,CAAC,WAAW,EAAE,CAAC,CAAC;QAC9M,CAAC;QAAC,MAAM,CAAC,CAAC,0DAA0D,CAAC,CAAC;IACxE,CAAC;IACD,OAAO,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;AACpD,CAAC;AAED,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,SAA2B,EAAE;IACzE,MAAM,QAAQ,GAAG,eAAe,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,MAAM,GAAG,IAAI,CAAC;IAClE,KAAK,MAAM,OAAO,IAAI,QAAQ;QAAE,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,EAAE,OAAO,CAAC,KAAK,CAAC,GAAG,OAAO,CAAC,WAAW,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC1H,OAAO,EAAE,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC;AACpC,CAAC"}
1
+ {"version":3,"file":"data-detectors.js","sourceRoot":"","sources":["../src/data-detectors.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1 @@
1
+ export declare function isScopedTemporaryCleanup(text: string, depth?: number): boolean;
@@ -0,0 +1,70 @@
1
+ import { shellActionCommands } from "./credential-egress.js";
2
+ // Deliberately lexical: an explicit, narrow test/scratch path can lower the
3
+ // severity, but does not establish ownership or inspect symlinks on the host.
4
+ export function isScopedTemporaryCleanup(text, depth = 0) {
5
+ if (depth > 4)
6
+ return false;
7
+ const commands = shellActionCommands(text);
8
+ if (commands.length === 1) {
9
+ const tokens = commands[0].tokens;
10
+ if (tokens.length === 3 && /(?:^|\/)(?:bash|sh|zsh)$/.test(tokens[0].value) && /^-[a-z]*c[a-z]*$/.test(tokens[1].value) && /^['"]/.test(tokens[2].raw))
11
+ return isScopedTemporaryCleanup(tokens[2].value, depth + 1);
12
+ }
13
+ let found = false;
14
+ for (const segment of text.split(/[;&|\n]/)) {
15
+ if (!/\brm\b/.test(segment))
16
+ continue;
17
+ // Wrappers, substitutions and unfamiliar syntax keep the default severity.
18
+ const command = /^(?:\/(?:usr\/)?bin\/)?rm\s+(.+)$/.exec(segment.trim());
19
+ if (!command)
20
+ return false;
21
+ const raw = command[1];
22
+ if (/[$`*?{}()[\]<>\\]/.test(raw))
23
+ return false;
24
+ const tokens = raw.match(/"[^"]*"|'[^']*'|\S+/g) ?? [];
25
+ let recursive = false, force = false, options = true;
26
+ const paths = [];
27
+ for (const token of tokens) {
28
+ const value = token.replace(/^(['"])(.*)\1$/, "$2");
29
+ if (options && value === "--") {
30
+ options = false;
31
+ continue;
32
+ }
33
+ if (options && value.startsWith("-")) {
34
+ if (value === "--recursive")
35
+ recursive = true;
36
+ else if (value === "--force")
37
+ force = true;
38
+ else if (/^-[rfv]+$/.test(value)) {
39
+ recursive ||= value.includes("r");
40
+ force ||= value.includes("f");
41
+ }
42
+ else
43
+ return false;
44
+ }
45
+ else
46
+ paths.push(value);
47
+ }
48
+ if (!paths.length || !paths.every(isTemporaryTestPath))
49
+ return false;
50
+ // Ordinary rm in a mixed cleanup must be scoped too, but this rule's trigger
51
+ // is still recursive + force. Never create a finding for a plain file delete.
52
+ found ||= recursive && force;
53
+ }
54
+ return found;
55
+ }
56
+ function isTemporaryTestPath(path) {
57
+ const match = /^\/(?:tmp|private\/tmp|var\/tmp)\/([^/]+)(?:\/([A-Za-z0-9._/-]+))?\/?$/.exec(path);
58
+ if (!match)
59
+ return false;
60
+ const parts = path.split("/");
61
+ if (parts.some(p => p === "." || p === "..") || /\/\//.test(path))
62
+ return false;
63
+ if (!/^[A-Za-z0-9._-]+$/.test(match[1]))
64
+ return false;
65
+ // A name is a confidence signal, not permission: keep an alert at MEDIUM.
66
+ if (!/(?:^|[-_.])(?:test|tests|tmp|temp|scratch|verify)(?:$|[-_.])/i.test(match[1]))
67
+ return false;
68
+ return !/(?:^|[/._-])(?:credentials?|secrets?|backups?|production|prod|\.env)(?:$|[/._-])/i.test(path);
69
+ }
70
+ //# sourceMappingURL=destructive-risk.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"destructive-risk.js","sourceRoot":"","sources":["../src/destructive-risk.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  // How many lines an edit added and removed, worked out on the device from the tool's own input so
2
- // only the two counts -- never the file contents -- leave the machine.
2
+ // line counts accompany the bounded, redacted edit details in activity telemetry.
3
3
  const MAX_LINES = 20_000;
4
4
  function lines(text) {
5
5
  if (!text)
@@ -53,17 +53,17 @@ export function changedLines(toolInput) {
53
53
  const total = { added: 0, removed: 0 };
54
54
  for (const edit of input.edits) {
55
55
  const e = record(edit);
56
- const counts = diffCounts(str(e.old_string) ?? "", str(e.new_string) ?? "");
56
+ const counts = diffCounts(str(e.old_string) ?? str(e.oldText) ?? str(e.old_text) ?? "", str(e.new_string) ?? str(e.newText) ?? str(e.new_text) ?? "");
57
57
  total.added += counts.added;
58
58
  total.removed += counts.removed;
59
59
  }
60
60
  return total;
61
61
  }
62
- const before = str(input.old_string) ?? str(input.old_str);
63
- const after = str(input.new_string) ?? str(input.new_str);
62
+ const before = str(input.old_string) ?? str(input.old_str) ?? str(input.oldText) ?? str(input.old_text) ?? str(input.oldString);
63
+ const after = str(input.new_string) ?? str(input.new_str) ?? str(input.newText) ?? str(input.new_text) ?? str(input.newString);
64
64
  if (before !== undefined || after !== undefined)
65
65
  return diffCounts(before ?? "", after ?? "");
66
- const patch = str(input.patch) ?? str(input.diff) ?? str(input.command);
66
+ const patch = str(input.patch) ?? str(input.patchText) ?? str(input.patch_text) ?? str(input.diff) ?? str(input.command);
67
67
  if (patch && /^(\*\*\* Begin Patch|diff --git|--- |@@ )/m.test(patch))
68
68
  return patchCounts(patch);
69
69
  const content = str(input.content) ?? str(input.contents) ?? str(input.file_text);
@@ -1 +1 @@
1
- {"version":3,"file":"edit-stats.js","sourceRoot":"","sources":["../src/edit-stats.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"edit-stats.js","sourceRoot":"","sources":["../src/edit-stats.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { type CustomDetector, type DataFinding } from "./data-detectors.js";
2
+ /**
3
+ * Same redaction `detectSensitive()`/`redactSensitive()` already do, except each distinct real
4
+ * value gets a stable, numbered placeholder ([SECRET_001], [API_KEY_002], ...) that's consistent
5
+ * for that exact value within `sessionId`, and distinct per different value of the same kind.
6
+ * `home` is the beam data directory (injectable for tests); defaults to the real one.
7
+ */
8
+ export declare function redactWithSessionEntities(text: string, sessionId: string, custom?: CustomDetector[], home?: string): Promise<{
9
+ text: string;
10
+ findings: DataFinding[];
11
+ }>;