@enricai/barnacle 1.12.78 → 1.12.80
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/api/helpers/reply.d.ts.map +1 -1
- package/dist/api/helpers/reply.js +5 -2
- package/dist/api/helpers/reply.js.map +1 -1
- package/dist/config.d.ts +10 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +2 -0
- package/dist/config.js.map +1 -1
- package/dist/lib/llm/judge.d.ts.map +1 -1
- package/dist/lib/llm/judge.js +6 -1
- package/dist/lib/llm/judge.js.map +1 -1
- package/dist/lib/llm/judges/verify-step-advanced.d.ts +30 -0
- package/dist/lib/llm/judges/verify-step-advanced.d.ts.map +1 -0
- package/dist/lib/llm/judges/verify-step-advanced.js +62 -0
- package/dist/lib/llm/judges/verify-step-advanced.js.map +1 -0
- package/dist/lib/llm/judges/verify-submit.d.ts +7 -1
- package/dist/lib/llm/judges/verify-submit.d.ts.map +1 -1
- package/dist/lib/llm/judges/verify-submit.js +29 -8
- package/dist/lib/llm/judges/verify-submit.js.map +1 -1
- package/dist/lib/llm/schemas.d.ts +8 -0
- package/dist/lib/llm/schemas.d.ts.map +1 -1
- package/dist/lib/llm/schemas.js +21 -13
- package/dist/lib/llm/schemas.js.map +1 -1
- package/dist/lib/logging.d.ts +7 -0
- package/dist/lib/logging.d.ts.map +1 -1
- package/dist/lib/logging.js +19 -1
- package/dist/lib/logging.js.map +1 -1
- package/dist/lib/pii-redaction.d.ts +104 -0
- package/dist/lib/pii-redaction.d.ts.map +1 -0
- package/dist/lib/pii-redaction.js +397 -0
- package/dist/lib/pii-redaction.js.map +1 -0
- package/dist/lib/random.d.ts +3 -1
- package/dist/lib/random.d.ts.map +1 -1
- package/dist/lib/random.js +7 -2
- package/dist/lib/random.js.map +1 -1
- package/dist/lib/telemetry/beacon-capture.d.ts.map +1 -1
- package/dist/lib/telemetry/beacon-capture.js +2 -0
- package/dist/lib/telemetry/beacon-capture.js.map +1 -1
- package/dist/lib/telemetry/call-capture.d.ts.map +1 -1
- package/dist/lib/telemetry/call-capture.js +4 -1
- package/dist/lib/telemetry/call-capture.js.map +1 -1
- package/dist/lib/telemetry/submission-capture.d.ts +11 -1
- package/dist/lib/telemetry/submission-capture.d.ts.map +1 -1
- package/dist/lib/telemetry/submission-capture.js +32 -3
- package/dist/lib/telemetry/submission-capture.js.map +1 -1
- package/dist/plugins/config-plugin.d.ts +8 -0
- package/dist/plugins/config-plugin.d.ts.map +1 -1
- package/dist/plugins/config-plugin.js +6 -1
- package/dist/plugins/config-plugin.js.map +1 -1
- package/dist/plugins/discover.d.ts.map +1 -1
- package/dist/plugins/discover.js +2 -0
- package/dist/plugins/discover.js.map +1 -1
- package/dist/plugins/loader.d.ts.map +1 -1
- package/dist/plugins/loader.js +23 -6
- package/dist/plugins/loader.js.map +1 -1
- package/dist/scraper/actionable-visibility-expr.d.ts +12 -0
- package/dist/scraper/actionable-visibility-expr.d.ts.map +1 -0
- package/dist/scraper/actionable-visibility-expr.js +22 -0
- package/dist/scraper/actionable-visibility-expr.js.map +1 -0
- package/dist/scraper/active-page.d.ts +18 -0
- package/dist/scraper/active-page.d.ts.map +1 -0
- package/dist/scraper/active-page.js +53 -0
- package/dist/scraper/active-page.js.map +1 -0
- package/dist/scraper/browser-click-expr.d.ts +1 -1
- package/dist/scraper/browser-click-expr.d.ts.map +1 -1
- package/dist/scraper/browser-click-expr.js +2 -6
- package/dist/scraper/browser-click-expr.js.map +1 -1
- package/dist/scraper/click-settle.d.ts +19 -0
- package/dist/scraper/click-settle.d.ts.map +1 -0
- package/dist/scraper/click-settle.js +65 -0
- package/dist/scraper/click-settle.js.map +1 -0
- package/dist/scraper/deep-locator-candidates.d.ts +20 -1
- package/dist/scraper/deep-locator-candidates.d.ts.map +1 -1
- package/dist/scraper/deep-locator-candidates.js +110 -22
- package/dist/scraper/deep-locator-candidates.js.map +1 -1
- package/dist/scraper/deep-locator-scan.d.ts +12 -0
- package/dist/scraper/deep-locator-scan.d.ts.map +1 -1
- package/dist/scraper/deep-locator-scan.js +42 -13
- package/dist/scraper/deep-locator-scan.js.map +1 -1
- package/dist/scraper/errors.d.ts +10 -0
- package/dist/scraper/errors.d.ts.map +1 -1
- package/dist/scraper/errors.js +19 -1
- package/dist/scraper/errors.js.map +1 -1
- package/dist/scraper/flow-runner.d.ts +355 -6
- package/dist/scraper/flow-runner.d.ts.map +1 -1
- package/dist/scraper/flow-runner.js +2255 -350
- package/dist/scraper/flow-runner.js.map +1 -1
- package/dist/scraper/navigate.d.ts +3 -3
- package/dist/scraper/navigate.js +4 -4
- package/dist/scraper/navigate.js.map +1 -1
- package/dist/scraper/phantom-click.d.ts +34 -2
- package/dist/scraper/phantom-click.d.ts.map +1 -1
- package/dist/scraper/phantom-click.js +80 -6
- package/dist/scraper/phantom-click.js.map +1 -1
- package/dist/scraper/pool.d.ts.map +1 -1
- package/dist/scraper/pool.js +8 -1
- package/dist/scraper/pool.js.map +1 -1
- package/dist/scraper/quoted-spans.d.ts +35 -0
- package/dist/scraper/quoted-spans.d.ts.map +1 -0
- package/dist/scraper/quoted-spans.js +83 -0
- package/dist/scraper/quoted-spans.js.map +1 -0
- package/dist/scraper/retry.d.ts +1 -1
- package/dist/scraper/retry.d.ts.map +1 -1
- package/dist/scraper/retry.js +5 -1
- package/dist/scraper/retry.js.map +1 -1
- package/dist/scraper/session-browserbase.d.ts +4 -2
- package/dist/scraper/session-browserbase.d.ts.map +1 -1
- package/dist/scraper/session-browserbase.js +63 -20
- package/dist/scraper/session-browserbase.js.map +1 -1
- package/dist/scraper/session-shared.d.ts +5 -0
- package/dist/scraper/session-shared.d.ts.map +1 -1
- package/dist/scraper/session-shared.js.map +1 -1
- package/dist/scraper/session-steel.d.ts.map +1 -1
- package/dist/scraper/session-steel.js +16 -2
- package/dist/scraper/session-steel.js.map +1 -1
- package/dist/scraper/session-teardown.d.ts +31 -1
- package/dist/scraper/session-teardown.d.ts.map +1 -1
- package/dist/scraper/session-teardown.js +60 -4
- package/dist/scraper/session-teardown.js.map +1 -1
- package/dist/scraper/spa-readiness.d.ts +13 -1
- package/dist/scraper/spa-readiness.d.ts.map +1 -1
- package/dist/scraper/spa-readiness.js +31 -1
- package/dist/scraper/spa-readiness.js.map +1 -1
- package/dist/scraper/stagehand-guard.d.ts +8 -3
- package/dist/scraper/stagehand-guard.d.ts.map +1 -1
- package/dist/scraper/stagehand-guard.js +181 -13
- package/dist/scraper/stagehand-guard.js.map +1 -1
- package/dist/scraper/submit-control.d.ts +2 -2
- package/dist/scraper/submit-control.d.ts.map +1 -1
- package/dist/scraper/submit-control.js +5 -21
- package/dist/scraper/submit-control.js.map +1 -1
- package/dist/scraper/target-resolution-diagnostic.d.ts.map +1 -1
- package/dist/scraper/target-resolution-diagnostic.js +6 -11
- package/dist/scraper/target-resolution-diagnostic.js.map +1 -1
- package/dist/scraper/transient-provider-error.d.ts +19 -0
- package/dist/scraper/transient-provider-error.d.ts.map +1 -0
- package/dist/scraper/transient-provider-error.js +59 -0
- package/dist/scraper/transient-provider-error.js.map +1 -0
- package/dist/scraper/trusted-click.d.ts +122 -0
- package/dist/scraper/trusted-click.d.ts.map +1 -0
- package/dist/scraper/trusted-click.js +201 -0
- package/dist/scraper/trusted-click.js.map +1 -0
- package/dist/scraper/upload-affordance-expr.d.ts +33 -0
- package/dist/scraper/upload-affordance-expr.d.ts.map +1 -0
- package/dist/scraper/upload-affordance-expr.js +91 -0
- package/dist/scraper/upload-affordance-expr.js.map +1 -0
- package/dist/scripts/recon-browser.d.ts +30 -2
- package/dist/scripts/recon-browser.d.ts.map +1 -1
- package/dist/scripts/recon-browser.js +133 -27
- package/dist/scripts/recon-browser.js.map +1 -1
- package/dist/scripts/recon-capture-rebind.d.ts +11 -0
- package/dist/scripts/recon-capture-rebind.d.ts.map +1 -0
- package/dist/scripts/recon-capture-rebind.js +26 -0
- package/dist/scripts/recon-capture-rebind.js.map +1 -0
- package/dist/scripts/recon-generate.d.ts +159 -8
- package/dist/scripts/recon-generate.d.ts.map +1 -1
- package/dist/scripts/recon-generate.js +998 -182
- package/dist/scripts/recon-generate.js.map +1 -1
- package/dist/scripts/recon-shared.d.ts +7 -0
- package/dist/scripts/recon-shared.d.ts.map +1 -1
- package/dist/scripts/recon-shared.js +19 -0
- package/dist/scripts/recon-shared.js.map +1 -1
- package/dist/site-plugin.d.ts +8 -0
- package/dist/site-plugin.d.ts.map +1 -1
- package/dist/types/pii-redaction.d.ts +39 -0
- package/dist/types/pii-redaction.d.ts.map +1 -0
- package/dist/types/pii-redaction.js +3 -0
- package/dist/types/pii-redaction.js.map +1 -0
- package/package.json +14 -1
package/dist/lib/logging.js
CHANGED
|
@@ -3,6 +3,7 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
|
3
3
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
4
|
};
|
|
5
5
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.PII_REDACTING_LOG_HOOKS = void 0;
|
|
6
7
|
exports.splitLargeMessage = splitLargeMessage;
|
|
7
8
|
exports.extendLogger = extendLogger;
|
|
8
9
|
exports.getScriptLogger = getScriptLogger;
|
|
@@ -11,6 +12,7 @@ const date_fns_1 = require("date-fns");
|
|
|
11
12
|
const pino_1 = __importDefault(require("pino"));
|
|
12
13
|
const datadog_1 = require("./datadog");
|
|
13
14
|
const env_1 = require("./env");
|
|
15
|
+
const pii_redaction_1 = require("./pii-redaction");
|
|
14
16
|
const nodeEnv = (0, env_1.getNodeEnv)();
|
|
15
17
|
const isDevelopment = nodeEnv === "development";
|
|
16
18
|
const isTest = nodeEnv === "test";
|
|
@@ -60,6 +62,17 @@ const formatters = {
|
|
|
60
62
|
return { level: label };
|
|
61
63
|
},
|
|
62
64
|
};
|
|
65
|
+
/**
|
|
66
|
+
* Scrubs registered request values from every argument before pino formats
|
|
67
|
+
* the line. `redact` only matches object keys; log messages are interpolated
|
|
68
|
+
* strings, so values have to be matched by content. Child loggers (e.g.
|
|
69
|
+
* Fastify's `request.log`) inherit pino hooks. Exported for direct testing.
|
|
70
|
+
*/
|
|
71
|
+
exports.PII_REDACTING_LOG_HOOKS = {
|
|
72
|
+
logMethod(args, method) {
|
|
73
|
+
method.apply(this, args.map((arg) => (0, pii_redaction_1.redactPiiDeep)(arg)));
|
|
74
|
+
},
|
|
75
|
+
};
|
|
63
76
|
/**
|
|
64
77
|
* Splits a message that exceeds CloudWatch's 256KB per-event cap. Prefers
|
|
65
78
|
* newline / space boundaries so chunks stay readable; falls back to a
|
|
@@ -117,7 +130,10 @@ function getChunkPrefix(index, totalChunks) {
|
|
|
117
130
|
}
|
|
118
131
|
function logWithSplitting(originalLogFn, obj, ...args) {
|
|
119
132
|
if (typeof obj === "string") {
|
|
120
|
-
|
|
133
|
+
// The redaction hook sees one chunk at a time, so a value cut in half by
|
|
134
|
+
// the split would match in neither; scrub the whole message first.
|
|
135
|
+
const whole = splitLargeMessage(obj);
|
|
136
|
+
const chunks = whole.length > 1 ? splitLargeMessage((0, pii_redaction_1.redactPii)(obj)) : whole;
|
|
121
137
|
chunks.forEach((chunk, index) => {
|
|
122
138
|
const prefix = getChunkPrefix(index, chunks.length);
|
|
123
139
|
originalLogFn(`${prefix}${chunk}`, ...args);
|
|
@@ -174,6 +190,7 @@ function getScriptLogger(name) {
|
|
|
174
190
|
return extendLogger((0, pino_1.default)({
|
|
175
191
|
name: getLogName(name, defaultAppName),
|
|
176
192
|
level: process.env.LOG_LEVEL ?? "info",
|
|
193
|
+
hooks: exports.PII_REDACTING_LOG_HOOKS,
|
|
177
194
|
transport,
|
|
178
195
|
}));
|
|
179
196
|
}
|
|
@@ -200,6 +217,7 @@ function getLogger({ name, level }) {
|
|
|
200
217
|
},
|
|
201
218
|
timestamp: getTimestamp,
|
|
202
219
|
formatters,
|
|
220
|
+
hooks: exports.PII_REDACTING_LOG_HOOKS,
|
|
203
221
|
mixin: ddEnabled ? ddMixin : undefined,
|
|
204
222
|
redact: {
|
|
205
223
|
paths: redactPaths,
|
package/dist/lib/logging.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/lib/logging.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"logging.js","sourceRoot":"","sources":["../../src/lib/logging.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,104 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Value-aware redaction of request data from every string barnacle writes out
|
|
3
|
+
* (logs, telemetry NDJSON/S3, error envelopes).
|
|
4
|
+
*
|
|
5
|
+
* Flow instructions, log lines and error messages carry request values as free
|
|
6
|
+
* text ("Fill in the Email field with 'x@y.com'"), so key-based redaction (pino
|
|
7
|
+
* `redact`) never sees them. Instead, each dispatch registers its request
|
|
8
|
+
* body's values here and every sink scrubs occurrences of them. How each field
|
|
9
|
+
* is matched comes from the plugin's {@link RedactionPolicy}; the engine itself
|
|
10
|
+
* knows no field names.
|
|
11
|
+
*
|
|
12
|
+
* The registry is process-global rather than request-scoped: pooled browser
|
|
13
|
+
* sessions and Stagehand callbacks log outside the request's async context,
|
|
14
|
+
* and scrubbing one run's values from another concurrent run's output is a
|
|
15
|
+
* harmless over-redaction.
|
|
16
|
+
*/
|
|
17
|
+
import { z } from "zod/v4";
|
|
18
|
+
import type { RedactionPolicy, SensitiveVariables, TokenizedText } from "../types/pii-redaction";
|
|
19
|
+
/**
|
|
20
|
+
* Runtime mirror of {@link RedactionPolicy} for plugins the type system cannot
|
|
21
|
+
* check (plain-JS modules, JSON manifests). Strict, because a mistyped field
|
|
22
|
+
* would silently leave values unprotected, and a string where an array belongs
|
|
23
|
+
* would be substring-matched by `includes`.
|
|
24
|
+
*/
|
|
25
|
+
export declare const REDACTION_POLICY_SCHEMA: z.ZodObject<{
|
|
26
|
+
persistKeys: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
27
|
+
publicKeys: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
28
|
+
skipKeys: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
29
|
+
wordKeys: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
30
|
+
digitKeys: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
31
|
+
tokenizeKeys: z.ZodOptional<z.ZodArray<z.ZodString>>;
|
|
32
|
+
}, z.core.$strict>;
|
|
33
|
+
/**
|
|
34
|
+
* Records a plugin's redaction policy so sinks that only see a `siteId`
|
|
35
|
+
* (submission telemetry) can apply it. Called once per plugin at route
|
|
36
|
+
* registration.
|
|
37
|
+
*/
|
|
38
|
+
export declare function registerRedactionPolicy(siteId: string, policy: RedactionPolicy | undefined): void;
|
|
39
|
+
/** The policy a plugin declared, or `undefined` (fail-closed defaults). */
|
|
40
|
+
export declare function redactionPolicyFor(siteId: string): RedactionPolicy | undefined;
|
|
41
|
+
/**
|
|
42
|
+
* Registers a request body so its values are scrubbed from all output until
|
|
43
|
+
* {@link releaseSensitiveValues} plus a grace period. The body is the one
|
|
44
|
+
* place the engine sees the caller's data; the plugin's policy says how each
|
|
45
|
+
* field should be matched, and unlisted fields are matched as literals.
|
|
46
|
+
*/
|
|
47
|
+
export declare function registerSensitiveValues(runId: string, payload: unknown, policy?: RedactionPolicy): void;
|
|
48
|
+
/**
|
|
49
|
+
* Schedules a run's values for removal. The grace period keeps late output
|
|
50
|
+
* (teardown logs, deferred telemetry, pooled-session callbacks) scrubbed.
|
|
51
|
+
*/
|
|
52
|
+
export declare function releaseSensitiveValues(runId: string, graceMs?: number): void;
|
|
53
|
+
/**
|
|
54
|
+
* Registers a value minted inside the engine (e.g. a throwaway account
|
|
55
|
+
* password) that never appears in the inbound payload but must never be
|
|
56
|
+
* written out either.
|
|
57
|
+
*/
|
|
58
|
+
export declare function registerSecretValue(value: string, ttlMs?: number): void;
|
|
59
|
+
/**
|
|
60
|
+
* Replaces only the registered secrets (see {@link registerSecretValue}) in
|
|
61
|
+
* `text` with `<Secret>`. For prompts that must keep the applicant's ordinary
|
|
62
|
+
* values — an LLM judge deciding whether "Ann" landed in First Name needs
|
|
63
|
+
* "Ann" — but must never carry a credential.
|
|
64
|
+
*/
|
|
65
|
+
export declare function redactSecrets(text: string): string;
|
|
66
|
+
/**
|
|
67
|
+
* Replaces every registered sensitive value in `text` with `<FieldName>`.
|
|
68
|
+
* Cheap no-op when nothing is registered, so it is safe on every log line.
|
|
69
|
+
*/
|
|
70
|
+
export declare function redactPii(text: string): string;
|
|
71
|
+
/**
|
|
72
|
+
* Structural variant of {@link redactPii} for log/telemetry objects. Errors
|
|
73
|
+
* become plain `{ type, message, stack }` objects (the shape pino's err
|
|
74
|
+
* serializer emits) so their messages can be scrubbed too. Other class
|
|
75
|
+
* instances (Fastify's request/reply, Buffers, URLs) are returned untouched:
|
|
76
|
+
* their pino serializers read prototype getters a plain copy would drop.
|
|
77
|
+
*/
|
|
78
|
+
export declare function redactPiiDeep(value: unknown, depth?: number): unknown;
|
|
79
|
+
/**
|
|
80
|
+
* Reduces a typed/selected value to its shape (`Aaaa`, `99/99/9999`) for
|
|
81
|
+
* diagnostics: format mismatches stay debuggable (and usable as rephrase
|
|
82
|
+
* evidence) without the value itself — including short answers like "Yes"
|
|
83
|
+
* that are too common to register for redaction.
|
|
84
|
+
*/
|
|
85
|
+
export declare function maskValueShape(text: string, maxLength?: number): string;
|
|
86
|
+
/**
|
|
87
|
+
* Swaps registered request values (and engine-minted secrets) in a Stagehand
|
|
88
|
+
* instruction for `%Name%` tokens, returning the `variables` map Stagehand
|
|
89
|
+
* substitutes back only when it performs the action — so the values never
|
|
90
|
+
* reach the LLM prompt, Browserbase's instruction cache or the call telemetry.
|
|
91
|
+
* Each token maps to the exact text it replaced, so the typed value is
|
|
92
|
+
* byte-identical to the untokenized instruction's.
|
|
93
|
+
*/
|
|
94
|
+
export declare function tokenizeSensitiveValues(text: string): TokenizedText;
|
|
95
|
+
/** Replaces `%Name%` tokens with their values (names matched case-insensitively — LLMs re-case them). */
|
|
96
|
+
export declare function detokenize(text: string, variables: SensitiveVariables): string;
|
|
97
|
+
/**
|
|
98
|
+
* Tokens left in `text` that `variables` cannot resolve — an LLM-invented
|
|
99
|
+
* `%Name%` would otherwise be typed into the form verbatim.
|
|
100
|
+
*/
|
|
101
|
+
export declare function unresolvedTokens(text: string, variables: SensitiveVariables): string[];
|
|
102
|
+
/** Test-only: clears the registry between cases. */
|
|
103
|
+
export declare function resetSensitiveValuesForTests(): void;
|
|
104
|
+
//# sourceMappingURL=pii-redaction.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pii-redaction.d.ts","sourceRoot":"","sources":["../../src/lib/pii-redaction.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;GAeG;AAIH,OAAO,EAAE,CAAC,EAAE,MAAM,QAAQ,CAAC;AAE3B,OAAO,KAAK,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AA0ChG;;;;;GAKG;AACH,eAAO,MAAM,uBAAuB;;;;;;;kBASzB,CAAC;AAIZ;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,eAAe,GAAG,SAAS,GAAG,IAAI,CAGjG;AAED,2EAA2E;AAC3E,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,GAAG,eAAe,GAAG,SAAS,CAE9E;AAmHD;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,OAAO,EAChB,MAAM,CAAC,EAAE,eAAe,GACvB,IAAI,CAUN;AAED;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,KAAK,EAAE,MAAM,EACb,OAAO,GAAE,MAAiC,GACzC,IAAI,CAQN;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,GAAE,MAAgC,GAAG,IAAI,CAQhG;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAWlD;AAED;;;GAGG;AACH,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAQ9C;AAOD;;;;;;GAMG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,SAAI,GAAG,OAAO,CAqBhE;AAED;;;;;GAKG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,SAAK,GAAG,MAAM,CAMnE;AAkDD;;;;;;;GAOG;AACH,wBAAgB,uBAAuB,CAAC,IAAI,EAAE,MAAM,GAAG,aAAa,CAiBnE;AAED,yGAAyG;AACzG,wBAAgB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,GAAG,MAAM,CAO9E;AAED;;;GAGG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,SAAS,EAAE,kBAAkB,GAAG,MAAM,EAAE,CAKtF;AAED,oDAAoD;AACpD,wBAAgB,4BAA4B,IAAI,IAAI,CAInD"}
|
|
@@ -0,0 +1,397 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Value-aware redaction of request data from every string barnacle writes out
|
|
4
|
+
* (logs, telemetry NDJSON/S3, error envelopes).
|
|
5
|
+
*
|
|
6
|
+
* Flow instructions, log lines and error messages carry request values as free
|
|
7
|
+
* text ("Fill in the Email field with 'x@y.com'"), so key-based redaction (pino
|
|
8
|
+
* `redact`) never sees them. Instead, each dispatch registers its request
|
|
9
|
+
* body's values here and every sink scrubs occurrences of them. How each field
|
|
10
|
+
* is matched comes from the plugin's {@link RedactionPolicy}; the engine itself
|
|
11
|
+
* knows no field names.
|
|
12
|
+
*
|
|
13
|
+
* The registry is process-global rather than request-scoped: pooled browser
|
|
14
|
+
* sessions and Stagehand callbacks log outside the request's async context,
|
|
15
|
+
* and scrubbing one run's values from another concurrent run's output is a
|
|
16
|
+
* harmless over-redaction.
|
|
17
|
+
*/
|
|
18
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
19
|
+
exports.REDACTION_POLICY_SCHEMA = void 0;
|
|
20
|
+
exports.registerRedactionPolicy = registerRedactionPolicy;
|
|
21
|
+
exports.redactionPolicyFor = redactionPolicyFor;
|
|
22
|
+
exports.registerSensitiveValues = registerSensitiveValues;
|
|
23
|
+
exports.releaseSensitiveValues = releaseSensitiveValues;
|
|
24
|
+
exports.registerSecretValue = registerSecretValue;
|
|
25
|
+
exports.redactSecrets = redactSecrets;
|
|
26
|
+
exports.redactPii = redactPii;
|
|
27
|
+
exports.redactPiiDeep = redactPiiDeep;
|
|
28
|
+
exports.maskValueShape = maskValueShape;
|
|
29
|
+
exports.tokenizeSensitiveValues = tokenizeSensitiveValues;
|
|
30
|
+
exports.detokenize = detokenize;
|
|
31
|
+
exports.unresolvedTokens = unresolvedTokens;
|
|
32
|
+
exports.resetSensitiveValuesForTests = resetSensitiveValuesForTests;
|
|
33
|
+
const min_1 = require("libphonenumber-js/min");
|
|
34
|
+
const lru_cache_1 = require("lru-cache");
|
|
35
|
+
const v4_1 = require("zod/v4");
|
|
36
|
+
const MIN_WORD_LENGTH = 2;
|
|
37
|
+
const MIN_LITERAL_LENGTH = 4;
|
|
38
|
+
/** Registry key prefix for {@link registerSecretValue} entries. */
|
|
39
|
+
const SECRET_KEY_PREFIX = "secret:";
|
|
40
|
+
const MIN_DIGITS = 4;
|
|
41
|
+
const DEFAULT_RELEASE_GRACE_MS = 10 * 60 * 1000;
|
|
42
|
+
/** Upper bound on any registration — far beyond a run's task timeout, so a run that never releases (crash) still ages out. */
|
|
43
|
+
const MAX_REGISTRATION_TTL_MS = 2 * 60 * 60 * 1000;
|
|
44
|
+
/** Far above concurrent runs + their grace windows + minted secrets; only bounds memory. */
|
|
45
|
+
const MAX_REGISTRY_ENTRIES = 10_000;
|
|
46
|
+
const MAX_DEEP_REDACT_DEPTH = 6;
|
|
47
|
+
let compiled = null;
|
|
48
|
+
const registry = new lru_cache_1.LRUCache({
|
|
49
|
+
max: MAX_REGISTRY_ENTRIES,
|
|
50
|
+
ttlAutopurge: true,
|
|
51
|
+
dispose: () => {
|
|
52
|
+
compiled = null;
|
|
53
|
+
},
|
|
54
|
+
});
|
|
55
|
+
/**
|
|
56
|
+
* Runtime mirror of {@link RedactionPolicy} for plugins the type system cannot
|
|
57
|
+
* check (plain-JS modules, JSON manifests). Strict, because a mistyped field
|
|
58
|
+
* would silently leave values unprotected, and a string where an array belongs
|
|
59
|
+
* would be substring-matched by `includes`.
|
|
60
|
+
*/
|
|
61
|
+
exports.REDACTION_POLICY_SCHEMA = v4_1.z
|
|
62
|
+
.object({
|
|
63
|
+
persistKeys: v4_1.z.array(v4_1.z.string()).optional(),
|
|
64
|
+
publicKeys: v4_1.z.array(v4_1.z.string()).optional(),
|
|
65
|
+
skipKeys: v4_1.z.array(v4_1.z.string()).optional(),
|
|
66
|
+
wordKeys: v4_1.z.array(v4_1.z.string()).optional(),
|
|
67
|
+
digitKeys: v4_1.z.array(v4_1.z.string()).optional(),
|
|
68
|
+
tokenizeKeys: v4_1.z.array(v4_1.z.string()).optional(),
|
|
69
|
+
})
|
|
70
|
+
.strict();
|
|
71
|
+
const policies = new Map();
|
|
72
|
+
/**
|
|
73
|
+
* Records a plugin's redaction policy so sinks that only see a `siteId`
|
|
74
|
+
* (submission telemetry) can apply it. Called once per plugin at route
|
|
75
|
+
* registration.
|
|
76
|
+
*/
|
|
77
|
+
function registerRedactionPolicy(siteId, policy) {
|
|
78
|
+
if (policy)
|
|
79
|
+
policies.set(siteId, policy);
|
|
80
|
+
else
|
|
81
|
+
policies.delete(siteId);
|
|
82
|
+
}
|
|
83
|
+
/** The policy a plugin declared, or `undefined` (fail-closed defaults). */
|
|
84
|
+
function redactionPolicyFor(siteId) {
|
|
85
|
+
return policies.get(siteId);
|
|
86
|
+
}
|
|
87
|
+
function escapeRegExp(value) {
|
|
88
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
|
|
89
|
+
}
|
|
90
|
+
function wordMatcher(value, label) {
|
|
91
|
+
return {
|
|
92
|
+
pattern: new RegExp(`(?<![\\p{L}\\p{N}])${escapeRegExp(value)}(?![\\p{L}\\p{N}])`, "giu"),
|
|
93
|
+
label,
|
|
94
|
+
valueLength: value.length,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
97
|
+
const DIGIT_SEPARATOR = "[\\s().\\-]*";
|
|
98
|
+
function digitRun(digits) {
|
|
99
|
+
return digits.split("").join(DIGIT_SEPARATOR);
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* Matches a value by its digits however they are formatted. An international
|
|
103
|
+
* (`+…`) value also matches its national number with or without the country
|
|
104
|
+
* code, and its national format (e.g. a UK trunk `0`), since country codes
|
|
105
|
+
* vary in length and only a numbering-plan library can split them.
|
|
106
|
+
*/
|
|
107
|
+
function digitMatcher(value, label) {
|
|
108
|
+
const digits = value.replace(/\D/g, "");
|
|
109
|
+
if (digits.length < MIN_DIGITS)
|
|
110
|
+
return null;
|
|
111
|
+
const alternatives = new Set([digitRun(digits)]);
|
|
112
|
+
const phone = value.trim().startsWith("+") ? (0, min_1.parsePhoneNumberFromString)(value) : undefined;
|
|
113
|
+
if (phone) {
|
|
114
|
+
alternatives.add(`(?:\\+?${phone.countryCallingCode}${DIGIT_SEPARATOR})?(?:\\(0\\)${DIGIT_SEPARATOR})?${digitRun(phone.nationalNumber)}`);
|
|
115
|
+
alternatives.add(digitRun(phone.formatNational().replace(/\D/g, "")));
|
|
116
|
+
}
|
|
117
|
+
return {
|
|
118
|
+
// The optional leading "+(" is consumed so "(555) 123-4567" is replaced whole.
|
|
119
|
+
pattern: new RegExp(`(?<!\\d)\\+?\\(?(?:${[...alternatives].join("|")})(?!\\d)`, "g"),
|
|
120
|
+
label,
|
|
121
|
+
valueLength: value.length,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
function literalMatcher(value, label) {
|
|
125
|
+
return { pattern: new RegExp(escapeRegExp(value), "g"), label, valueLength: value.length };
|
|
126
|
+
}
|
|
127
|
+
function baseMatcherFor(kind, value, label) {
|
|
128
|
+
if (kind === "digit")
|
|
129
|
+
return digitMatcher(value, label) ?? literalMatcher(value, label);
|
|
130
|
+
if (kind === "word")
|
|
131
|
+
return value.length >= MIN_WORD_LENGTH ? wordMatcher(value, label) : null;
|
|
132
|
+
return value.length >= MIN_LITERAL_LENGTH ? literalMatcher(value, label) : null;
|
|
133
|
+
}
|
|
134
|
+
function tokenScopeFor(kind, value, tokenize) {
|
|
135
|
+
if (!tokenize)
|
|
136
|
+
return "never";
|
|
137
|
+
return kind === "digit" || /[\d@\s]/.test(value) ? "anywhere" : "value-span";
|
|
138
|
+
}
|
|
139
|
+
function matcherFor(kind, value, label, tokenize) {
|
|
140
|
+
const base = baseMatcherFor(kind, value, label);
|
|
141
|
+
return base ? { ...base, tokenScope: tokenScopeFor(kind, value, tokenize) } : null;
|
|
142
|
+
}
|
|
143
|
+
function collectMatchers(value, kind, label, tokenize, out) {
|
|
144
|
+
if (typeof value === "string") {
|
|
145
|
+
const matcher = matcherFor(kind, value.trim(), label, tokenize);
|
|
146
|
+
if (matcher)
|
|
147
|
+
out.push(matcher);
|
|
148
|
+
return;
|
|
149
|
+
}
|
|
150
|
+
if (Array.isArray(value)) {
|
|
151
|
+
for (const item of value)
|
|
152
|
+
collectMatchers(item, kind, label, tokenize, out);
|
|
153
|
+
return;
|
|
154
|
+
}
|
|
155
|
+
if (value !== null && typeof value === "object" && !Buffer.isBuffer(value)) {
|
|
156
|
+
for (const nested of Object.values(value)) {
|
|
157
|
+
collectMatchers(nested, kind, label, tokenize, out);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
function matchKindFor(key, policy) {
|
|
162
|
+
if (policy?.persistKeys?.includes(key) ||
|
|
163
|
+
policy?.publicKeys?.includes(key) ||
|
|
164
|
+
policy?.skipKeys?.includes(key)) {
|
|
165
|
+
return null;
|
|
166
|
+
}
|
|
167
|
+
if (policy?.digitKeys?.includes(key))
|
|
168
|
+
return "digit";
|
|
169
|
+
if (policy?.wordKeys?.includes(key))
|
|
170
|
+
return "word";
|
|
171
|
+
return "literal";
|
|
172
|
+
}
|
|
173
|
+
function activeMatchers() {
|
|
174
|
+
if (compiled)
|
|
175
|
+
return compiled;
|
|
176
|
+
// Longest literals first so "Mary Ann" is replaced before "Mary".
|
|
177
|
+
compiled = [...registry.values()].flat().sort((a, b) => b.valueLength - a.valueLength);
|
|
178
|
+
return compiled;
|
|
179
|
+
}
|
|
180
|
+
/**
|
|
181
|
+
* Registers a request body so its values are scrubbed from all output until
|
|
182
|
+
* {@link releaseSensitiveValues} plus a grace period. The body is the one
|
|
183
|
+
* place the engine sees the caller's data; the plugin's policy says how each
|
|
184
|
+
* field should be matched, and unlisted fields are matched as literals.
|
|
185
|
+
*/
|
|
186
|
+
function registerSensitiveValues(runId, payload, policy) {
|
|
187
|
+
if (payload === null || typeof payload !== "object")
|
|
188
|
+
return;
|
|
189
|
+
const matchers = [];
|
|
190
|
+
for (const [key, value] of Object.entries(payload)) {
|
|
191
|
+
const kind = matchKindFor(key, policy);
|
|
192
|
+
const tokenize = policy?.tokenizeKeys?.includes(key) ?? false;
|
|
193
|
+
if (kind)
|
|
194
|
+
collectMatchers(value, kind, key, tokenize, matchers);
|
|
195
|
+
}
|
|
196
|
+
registry.set(runId, matchers, { ttl: MAX_REGISTRATION_TTL_MS });
|
|
197
|
+
compiled = null;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Schedules a run's values for removal. The grace period keeps late output
|
|
201
|
+
* (teardown logs, deferred telemetry, pooled-session callbacks) scrubbed.
|
|
202
|
+
*/
|
|
203
|
+
function releaseSensitiveValues(runId, graceMs = DEFAULT_RELEASE_GRACE_MS) {
|
|
204
|
+
const matchers = registry.get(runId);
|
|
205
|
+
if (!matchers)
|
|
206
|
+
return;
|
|
207
|
+
if (graceMs <= 0) {
|
|
208
|
+
registry.delete(runId);
|
|
209
|
+
return;
|
|
210
|
+
}
|
|
211
|
+
registry.set(runId, matchers, { ttl: graceMs });
|
|
212
|
+
}
|
|
213
|
+
/**
|
|
214
|
+
* Registers a value minted inside the engine (e.g. a throwaway account
|
|
215
|
+
* password) that never appears in the inbound payload but must never be
|
|
216
|
+
* written out either.
|
|
217
|
+
*/
|
|
218
|
+
function registerSecretValue(value, ttlMs = MAX_REGISTRATION_TTL_MS) {
|
|
219
|
+
if (value.length < MIN_LITERAL_LENGTH)
|
|
220
|
+
return;
|
|
221
|
+
registry.set(`${SECRET_KEY_PREFIX}${value}`, [{ ...literalMatcher(value, "Secret"), tokenScope: "anywhere" }], { ttl: ttlMs });
|
|
222
|
+
compiled = null;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Replaces only the registered secrets (see {@link registerSecretValue}) in
|
|
226
|
+
* `text` with `<Secret>`. For prompts that must keep the applicant's ordinary
|
|
227
|
+
* values — an LLM judge deciding whether "Ann" landed in First Name needs
|
|
228
|
+
* "Ann" — but must never carry a credential.
|
|
229
|
+
*/
|
|
230
|
+
function redactSecrets(text) {
|
|
231
|
+
if (registry.size === 0 || text.length === 0)
|
|
232
|
+
return text;
|
|
233
|
+
let out = text;
|
|
234
|
+
for (const [key, matchers] of registry.entries()) {
|
|
235
|
+
if (!key.startsWith(SECRET_KEY_PREFIX))
|
|
236
|
+
continue;
|
|
237
|
+
for (const { pattern, label } of matchers) {
|
|
238
|
+
pattern.lastIndex = 0;
|
|
239
|
+
out = out.replace(pattern, `<${label}>`);
|
|
240
|
+
}
|
|
241
|
+
}
|
|
242
|
+
return out;
|
|
243
|
+
}
|
|
244
|
+
/**
|
|
245
|
+
* Replaces every registered sensitive value in `text` with `<FieldName>`.
|
|
246
|
+
* Cheap no-op when nothing is registered, so it is safe on every log line.
|
|
247
|
+
*/
|
|
248
|
+
function redactPii(text) {
|
|
249
|
+
if (registry.size === 0 || text.length === 0)
|
|
250
|
+
return text;
|
|
251
|
+
let out = text;
|
|
252
|
+
for (const { pattern, label } of activeMatchers()) {
|
|
253
|
+
pattern.lastIndex = 0;
|
|
254
|
+
out = out.replace(pattern, `<${label}>`);
|
|
255
|
+
}
|
|
256
|
+
return out;
|
|
257
|
+
}
|
|
258
|
+
function isPlainObject(value) {
|
|
259
|
+
const proto = Object.getPrototypeOf(value);
|
|
260
|
+
return proto === Object.prototype || proto === null;
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Structural variant of {@link redactPii} for log/telemetry objects. Errors
|
|
264
|
+
* become plain `{ type, message, stack }` objects (the shape pino's err
|
|
265
|
+
* serializer emits) so their messages can be scrubbed too. Other class
|
|
266
|
+
* instances (Fastify's request/reply, Buffers, URLs) are returned untouched:
|
|
267
|
+
* their pino serializers read prototype getters a plain copy would drop.
|
|
268
|
+
*/
|
|
269
|
+
function redactPiiDeep(value, depth = 0) {
|
|
270
|
+
if (registry.size === 0)
|
|
271
|
+
return value;
|
|
272
|
+
if (typeof value === "string")
|
|
273
|
+
return redactPii(value);
|
|
274
|
+
if (depth >= MAX_DEEP_REDACT_DEPTH || value === null || typeof value !== "object")
|
|
275
|
+
return value;
|
|
276
|
+
if (value instanceof Error) {
|
|
277
|
+
return {
|
|
278
|
+
type: value.name,
|
|
279
|
+
message: redactPii(value.message),
|
|
280
|
+
stack: value.stack ? redactPii(value.stack) : undefined,
|
|
281
|
+
...(value.cause === undefined ? {} : { cause: redactPiiDeep(value.cause, depth + 1) }),
|
|
282
|
+
...redactPiiDeep({ ...value }, depth + 1),
|
|
283
|
+
};
|
|
284
|
+
}
|
|
285
|
+
if (Array.isArray(value))
|
|
286
|
+
return value.map((item) => redactPiiDeep(item, depth + 1));
|
|
287
|
+
if (!isPlainObject(value))
|
|
288
|
+
return value;
|
|
289
|
+
return Object.fromEntries(Object.entries(value).map(([key, nested]) => [
|
|
290
|
+
key,
|
|
291
|
+
redactPiiDeep(nested, depth + 1),
|
|
292
|
+
]));
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* Reduces a typed/selected value to its shape (`Aaaa`, `99/99/9999`) for
|
|
296
|
+
* diagnostics: format mismatches stay debuggable (and usable as rephrase
|
|
297
|
+
* evidence) without the value itself — including short answers like "Yes"
|
|
298
|
+
* that are too common to register for redaction.
|
|
299
|
+
*/
|
|
300
|
+
function maskValueShape(text, maxLength = 40) {
|
|
301
|
+
return text
|
|
302
|
+
.slice(0, maxLength)
|
|
303
|
+
.replace(/\p{Lu}/gu, "A")
|
|
304
|
+
.replace(/\p{Ll}/gu, "a")
|
|
305
|
+
.replace(/\p{N}/gu, "9");
|
|
306
|
+
}
|
|
307
|
+
/**
|
|
308
|
+
* Value positions in an instruction: a quoted or bare value introduced by
|
|
309
|
+
* with/type/enter, e.g. "fill it with 'Ann'", "Fill in Last Name with Smith".
|
|
310
|
+
*/
|
|
311
|
+
const VALUE_SPAN = /\b(?:with|type|enter)\s+(?:'[^']*'|"[^"]*"|[^\s'",;.][^'",;]*?(?=\s*(?:$|[,;]|\.(?:\s|$)|\s(?:in|into|if|then|and|on)\b)))/giu;
|
|
312
|
+
const TOKEN_REFERENCE = /%([A-Za-z][A-Za-z0-9_]*)%/g;
|
|
313
|
+
/** `%E2%`-style percent-encoded bytes look like tokens but are URL text. */
|
|
314
|
+
const PERCENT_ENCODED_BYTE = /^[0-9A-Fa-f]{2}$/;
|
|
315
|
+
function valueSpans(text) {
|
|
316
|
+
return [...text.matchAll(VALUE_SPAN)].map((m) => [m.index, m.index + m[0].length]);
|
|
317
|
+
}
|
|
318
|
+
/** Non-overlapping value occurrences in `text`, longest registered value first. */
|
|
319
|
+
function claimTokenRanges(text) {
|
|
320
|
+
const spans = valueSpans(text);
|
|
321
|
+
const claims = [];
|
|
322
|
+
for (const matcher of activeMatchers()) {
|
|
323
|
+
if (matcher.tokenScope === "never")
|
|
324
|
+
continue;
|
|
325
|
+
for (const m of text.matchAll(matcher.pattern)) {
|
|
326
|
+
const start = m.index;
|
|
327
|
+
const end = start + m[0].length;
|
|
328
|
+
const inSpan = spans.some(([s, e]) => start >= s && end <= e);
|
|
329
|
+
if (matcher.tokenScope === "value-span" && !inSpan)
|
|
330
|
+
continue;
|
|
331
|
+
if (claims.some((c) => start < c.end && end > c.start))
|
|
332
|
+
continue;
|
|
333
|
+
claims.push({ start, end, label: matcher.label });
|
|
334
|
+
}
|
|
335
|
+
}
|
|
336
|
+
return claims.sort((a, b) => a.start - b.start);
|
|
337
|
+
}
|
|
338
|
+
/** `Email`, then `Email_2`, `Email_3`… for further distinct texts under one label. */
|
|
339
|
+
function nextVariableName(label, taken) {
|
|
340
|
+
const base = label.replace(/[^A-Za-z0-9_]/g, "") || "Value";
|
|
341
|
+
if (!(base in taken))
|
|
342
|
+
return base;
|
|
343
|
+
const siblings = Object.keys(taken).filter((n) => n === base || n.startsWith(`${base}_`));
|
|
344
|
+
return `${base}_${siblings.length + 1}`;
|
|
345
|
+
}
|
|
346
|
+
/**
|
|
347
|
+
* Swaps registered request values (and engine-minted secrets) in a Stagehand
|
|
348
|
+
* instruction for `%Name%` tokens, returning the `variables` map Stagehand
|
|
349
|
+
* substitutes back only when it performs the action — so the values never
|
|
350
|
+
* reach the LLM prompt, Browserbase's instruction cache or the call telemetry.
|
|
351
|
+
* Each token maps to the exact text it replaced, so the typed value is
|
|
352
|
+
* byte-identical to the untokenized instruction's.
|
|
353
|
+
*/
|
|
354
|
+
function tokenizeSensitiveValues(text) {
|
|
355
|
+
if (registry.size === 0 || text.length === 0)
|
|
356
|
+
return { text, variables: {} };
|
|
357
|
+
const claims = claimTokenRanges(text);
|
|
358
|
+
if (claims.length === 0)
|
|
359
|
+
return { text, variables: {} };
|
|
360
|
+
const variables = {};
|
|
361
|
+
const nameByText = new Map();
|
|
362
|
+
let out = "";
|
|
363
|
+
let cursor = 0;
|
|
364
|
+
for (const { start, end, label } of claims) {
|
|
365
|
+
const matched = text.slice(start, end);
|
|
366
|
+
const name = nameByText.get(matched) ?? nextVariableName(label, variables);
|
|
367
|
+
nameByText.set(matched, name);
|
|
368
|
+
variables[name] = matched;
|
|
369
|
+
out += `${text.slice(cursor, start)}%${name}%`;
|
|
370
|
+
cursor = end;
|
|
371
|
+
}
|
|
372
|
+
return { text: out + text.slice(cursor), variables };
|
|
373
|
+
}
|
|
374
|
+
/** Replaces `%Name%` tokens with their values (names matched case-insensitively — LLMs re-case them). */
|
|
375
|
+
function detokenize(text, variables) {
|
|
376
|
+
if (Object.keys(variables).length === 0)
|
|
377
|
+
return text;
|
|
378
|
+
const byLowerName = new Map(Object.entries(variables).map(([k, v]) => [k.toLowerCase(), v]));
|
|
379
|
+
return text.replace(TOKEN_REFERENCE, (m, name) => byLowerName.get(name.toLowerCase()) ?? m);
|
|
380
|
+
}
|
|
381
|
+
/**
|
|
382
|
+
* Tokens left in `text` that `variables` cannot resolve — an LLM-invented
|
|
383
|
+
* `%Name%` would otherwise be typed into the form verbatim.
|
|
384
|
+
*/
|
|
385
|
+
function unresolvedTokens(text, variables) {
|
|
386
|
+
const known = new Set(Object.keys(variables).map((k) => k.toLowerCase()));
|
|
387
|
+
return [...text.matchAll(TOKEN_REFERENCE)]
|
|
388
|
+
.map((m) => m[1] ?? "")
|
|
389
|
+
.filter((name) => !PERCENT_ENCODED_BYTE.test(name) && !known.has(name.toLowerCase()));
|
|
390
|
+
}
|
|
391
|
+
/** Test-only: clears the registry between cases. */
|
|
392
|
+
function resetSensitiveValuesForTests() {
|
|
393
|
+
registry.clear();
|
|
394
|
+
policies.clear();
|
|
395
|
+
compiled = null;
|
|
396
|
+
}
|
|
397
|
+
//# sourceMappingURL=pii-redaction.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pii-redaction.js","sourceRoot":"","sources":["../../src/lib/pii-redaction.ts"],"names":[],"mappings":"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"}
|
package/dist/lib/random.d.ts
CHANGED
|
@@ -24,7 +24,9 @@ export declare function pickRandom<T>(arr: readonly T[]): T;
|
|
|
24
24
|
* password field but has no caller-supplied secret to splice — recon-captured
|
|
25
25
|
* credentials must never leak into a generated flow, and a fixed literal would
|
|
26
26
|
* be a shared secret across every run. `node:crypto`'s CSPRNG (not `Math.random`,
|
|
27
|
-
* which backs the jitter helpers above) keeps the value unguessable.
|
|
27
|
+
* which backs the jitter helpers above) keeps the value unguessable. The value
|
|
28
|
+
* is registered for redaction because flows embed it in step instructions that
|
|
29
|
+
* reach logs and telemetry.
|
|
28
30
|
*/
|
|
29
31
|
export declare function generateThrowawayPassword(): string;
|
|
30
32
|
//# sourceMappingURL=random.d.ts.map
|
package/dist/lib/random.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"random.d.ts","sourceRoot":"","sources":["../../src/lib/random.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;
|
|
1
|
+
{"version":3,"file":"random.d.ts","sourceRoot":"","sources":["../../src/lib/random.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAMH;;;;GAIG;AACH,wBAAgB,kBAAkB,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAGnE;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,CAAC,EAAE,GAAG,EAAE,SAAS,CAAC,EAAE,GAAG,CAAC,CAGlD;AAED;;;;;;;;GAQG;AACH,wBAAgB,yBAAyB,IAAI,MAAM,CAIlD"}
|