@optimuslabs/runtime-staging 0.3.10 → 0.3.11
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/lib/client-event.d.ts.map +1 -1
- package/dist/lib/client-event.js +35 -25
- package/dist/lib/client-event.js.map +1 -1
- package/dist/lib/pii-scrub.d.ts +9 -0
- package/dist/lib/pii-scrub.d.ts.map +1 -0
- package/dist/lib/pii-scrub.js +17 -0
- package/dist/lib/pii-scrub.js.map +1 -0
- package/dist/lib/prompt-collection-policy.d.ts +10 -0
- package/dist/lib/prompt-collection-policy.d.ts.map +1 -1
- package/dist/lib/prompt-collection-policy.js +42 -6
- package/dist/lib/prompt-collection-policy.js.map +1 -1
- package/dist/lib/startup-sync.d.ts.map +1 -1
- package/dist/lib/startup-sync.js +78 -56
- package/dist/lib/startup-sync.js.map +1 -1
- package/dist/lib/telemetry/build-event.d.ts.map +1 -1
- package/dist/lib/telemetry/build-event.js +19 -2
- package/dist/lib/telemetry/build-event.js.map +1 -1
- package/dist/lib/telemetry/index.d.ts +1 -1
- package/dist/lib/telemetry/index.d.ts.map +1 -1
- package/dist/lib/telemetry/index.js +1 -1
- package/dist/lib/telemetry/index.js.map +1 -1
- package/dist/lib/telemetry/prompt-privacy.d.ts +7 -1
- package/dist/lib/telemetry/prompt-privacy.d.ts.map +1 -1
- package/dist/lib/telemetry/prompt-privacy.js +13 -3
- package/dist/lib/telemetry/prompt-privacy.js.map +1 -1
- package/dist/lib/telemetry/types.d.ts +11 -0
- package/dist/lib/telemetry/types.d.ts.map +1 -1
- package/dist/lib/telemetry/wire-metadata.d.ts +21 -6
- package/dist/lib/telemetry/wire-metadata.d.ts.map +1 -1
- package/dist/lib/telemetry/wire-metadata.js +50 -19
- package/dist/lib/telemetry/wire-metadata.js.map +1 -1
- package/dist/lib/tofu.d.ts +1 -0
- package/dist/lib/tofu.d.ts.map +1 -1
- package/dist/lib/tofu.js +1 -1
- package/dist/lib/tofu.js.map +1 -1
- package/dist/test/client-event-scrub.test.d.ts +2 -0
- package/dist/test/client-event-scrub.test.d.ts.map +1 -0
- package/dist/test/client-event-scrub.test.js +36 -0
- package/dist/test/client-event-scrub.test.js.map +1 -0
- package/dist/test/org-fingerprint-key.test.d.ts +2 -0
- package/dist/test/org-fingerprint-key.test.d.ts.map +1 -0
- package/dist/test/org-fingerprint-key.test.js +39 -0
- package/dist/test/org-fingerprint-key.test.js.map +1 -0
- package/dist/test/org-scrub-setting.test.d.ts +2 -0
- package/dist/test/org-scrub-setting.test.d.ts.map +1 -0
- package/dist/test/org-scrub-setting.test.js +42 -0
- package/dist/test/org-scrub-setting.test.js.map +1 -0
- package/dist/test/prompt-privacy.test.js +19 -2
- package/dist/test/prompt-privacy.test.js.map +1 -1
- package/dist/test/startup-sync-scrub.test.d.ts +2 -0
- package/dist/test/startup-sync-scrub.test.d.ts.map +1 -0
- package/dist/test/startup-sync-scrub.test.js +36 -0
- package/dist/test/startup-sync-scrub.test.js.map +1 -0
- package/dist/test/telemetry.test.js +6 -1
- package/dist/test/telemetry.test.js.map +1 -1
- package/dist/test/wire-metadata.test.d.ts +2 -0
- package/dist/test/wire-metadata.test.d.ts.map +1 -0
- package/dist/test/wire-metadata.test.js +105 -0
- package/dist/test/wire-metadata.test.js.map +1 -0
- package/package.json +3 -2
|
@@ -1,8 +1,18 @@
|
|
|
1
|
-
import { createHash } from "node:crypto";
|
|
1
|
+
import { createHash, createHmac } from "node:crypto";
|
|
2
2
|
export const RAW_EVENT_PROMPT_KEYS = ["user_prompt", "userPrompt", "prompt"];
|
|
3
3
|
export function sha256UserPrompt(text) {
|
|
4
4
|
return createHash("sha256").update(text.trim(), "utf8").digest("hex");
|
|
5
5
|
}
|
|
6
|
+
/**
|
|
7
|
+
* The prompt's grouping hash: HMAC-SHA256 under the org key once it has arrived, so a short prompt
|
|
8
|
+
* cannot be recovered by hashing guesses; plain SHA-256 before then (the first run after the
|
|
9
|
+
* upgrade), as before. Either is 64 hex characters, which the backend stores as sent.
|
|
10
|
+
*/
|
|
11
|
+
export function hashUserPrompt(text, orgKey) {
|
|
12
|
+
if (!orgKey)
|
|
13
|
+
return sha256UserPrompt(text);
|
|
14
|
+
return createHmac("sha256", Buffer.from(orgKey, "hex")).update(text.trim(), "utf8").digest("hex");
|
|
15
|
+
}
|
|
6
16
|
export function stripRawEventPromptFields(rawEvent) {
|
|
7
17
|
if (!rawEvent || typeof rawEvent !== "object" || Array.isArray(rawEvent)) {
|
|
8
18
|
return rawEvent ?? undefined;
|
|
@@ -13,7 +23,7 @@ export function stripRawEventPromptFields(rawEvent) {
|
|
|
13
23
|
}
|
|
14
24
|
return out;
|
|
15
25
|
}
|
|
16
|
-
export function applyPromptCollectionToMetadata(meta, hashPrompts) {
|
|
26
|
+
export function applyPromptCollectionToMetadata(meta, hashPrompts, orgKey) {
|
|
17
27
|
const out = { ...meta };
|
|
18
28
|
const raw = out.raw_event;
|
|
19
29
|
if (raw && typeof raw === "object" && !Array.isArray(raw)) {
|
|
@@ -29,7 +39,7 @@ export function applyPromptCollectionToMetadata(meta, hashPrompts) {
|
|
|
29
39
|
return out;
|
|
30
40
|
}
|
|
31
41
|
if (plaintext) {
|
|
32
|
-
out.user_prompt_hash =
|
|
42
|
+
out.user_prompt_hash = hashUserPrompt(plaintext, orgKey);
|
|
33
43
|
}
|
|
34
44
|
delete out.user_prompt;
|
|
35
45
|
return out;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-privacy.js","sourceRoot":"","sources":["../../../src/lib/telemetry/prompt-privacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt-privacy.js","sourceRoot":"","sources":["../../../src/lib/telemetry/prompt-privacy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAErD,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,aAAa,EAAE,YAAY,EAAE,QAAQ,CAAU,CAAC;AAEtF,MAAM,UAAU,gBAAgB,CAAC,IAAY;IAC3C,OAAO,UAAU,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACxE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,cAAc,CAAC,IAAY,EAAE,MAAe;IAC1D,IAAI,CAAC,MAAM;QAAE,OAAO,gBAAgB,CAAC,IAAI,CAAC,CAAC;IAC3C,OAAO,UAAU,CAAC,QAAQ,EAAE,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;AACpG,CAAC;AAED,MAAM,UAAU,yBAAyB,CACvC,QAAoD;IAEpD,IAAI,CAAC,QAAQ,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;QACzE,OAAO,QAAQ,IAAI,SAAS,CAAC;IAC/B,CAAC;IACD,MAAM,GAAG,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;IAC5B,KAAK,MAAM,GAAG,IAAI,qBAAqB,EAAE,CAAC;QACxC,OAAO,GAAG,CAAC,GAAG,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED,MAAM,UAAU,+BAA+B,CAC7C,IAA6B,EAC7B,WAAoB,EACpB,MAAe;IAEf,MAAM,GAAG,GAA4B,EAAE,GAAG,IAAI,EAAE,CAAC;IACjD,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC;IAC1B,IAAI,GAAG,IAAI,OAAO,GAAG,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC;QAC1D,GAAG,CAAC,SAAS,GAAG,yBAAyB,CAAC,GAA8B,CAAC,CAAC;IAC5E,CAAC;IACD,MAAM,SAAS,GAAG,OAAO,GAAG,CAAC,WAAW,KAAK,QAAQ,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACpF,IAAI,CAAC,WAAW,EAAE,CAAC;QACjB,IAAI,SAAS;YAAE,GAAG,CAAC,WAAW,GAAG,SAAS,CAAC;;YACtC,OAAO,GAAG,CAAC,WAAW,CAAC;QAC5B,OAAO,GAAG,CAAC,gBAAgB,CAAC;QAC5B,OAAO,GAAG,CAAC;IACb,CAAC;IACD,IAAI,SAAS,EAAE,CAAC;QACd,GAAG,CAAC,gBAAgB,GAAG,cAAc,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAC3D,CAAC;IACD,OAAO,GAAG,CAAC,WAAW,CAAC;IACvB,OAAO,GAAG,CAAC;AACb,CAAC"}
|
|
@@ -33,6 +33,17 @@ export interface TelemetryEvent {
|
|
|
33
33
|
hook_hash?: string | null;
|
|
34
34
|
/** Every Optimus hook's hash for this agent, `{"<agent>/<hook>": "<sha256>"}`. */
|
|
35
35
|
hook_manifest?: Record<string, string>;
|
|
36
|
+
/** The agent's signed-in account (tenant, email), read on every event. */
|
|
37
|
+
login?: {
|
|
38
|
+
tenant_id?: string;
|
|
39
|
+
tenant_name?: string;
|
|
40
|
+
email?: string;
|
|
41
|
+
};
|
|
42
|
+
/** The macOS account running the agent, read on every event. */
|
|
43
|
+
os_user?: {
|
|
44
|
+
uid: number;
|
|
45
|
+
username: string;
|
|
46
|
+
};
|
|
36
47
|
/** Which Codex product ran the tool, from its session file (OPT-1488). */
|
|
37
48
|
agent_product?: {
|
|
38
49
|
originator: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/telemetry/types.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAC5C,eAAO,MAAM,aAAa,SAAS,CAAC;AACpC,eAAO,MAAM,eAAe,WAAW,CAAC;AACxC,eAAO,MAAM,YAAY,QAAQ,CAAC;AAClC,eAAO,MAAM,aAAa,SAAS,CAAC;AAEpC,eAAO,MAAM,cAAc,UAM1B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IAEnB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,kBAAkB,EAAE;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,kFAAkF;QAClF,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,0EAA0E;QAC1E,aAAa,CAAC,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1D,CAAC;CACH"}
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/telemetry/types.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,iBAAiB,aAAa,CAAC;AAC5C,eAAO,MAAM,aAAa,SAAS,CAAC;AACpC,eAAO,MAAM,eAAe,WAAW,CAAC;AACxC,eAAO,MAAM,YAAY,QAAQ,CAAC;AAClC,eAAO,MAAM,aAAa,SAAS,CAAC;AAEpC,eAAO,MAAM,cAAc,UAM1B,CAAC;AAEF,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACpC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,GAAG,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpB,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,aAAa,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC9B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACrC;AAED,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,UAAU,EAAE,MAAM,CAAC;IAEnB,UAAU,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,eAAe,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,iBAAiB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAElC,kBAAkB,EAAE;QAClB,SAAS,EAAE,MAAM,CAAC;QAClB,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACrC,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC5B,gBAAgB,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QACjC,SAAS,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QACpC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;QAC1B,kFAAkF;QAClF,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;QACvC,0EAA0E;QAC1E,KAAK,CAAC,EAAE;YAAE,SAAS,CAAC,EAAE,MAAM,CAAC;YAAC,WAAW,CAAC,EAAE,MAAM,CAAC;YAAC,KAAK,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;QACrE,gEAAgE;QAChE,OAAO,CAAC,EAAE;YAAE,GAAG,EAAE,MAAM,CAAC;YAAC,QAAQ,EAAE,MAAM,CAAA;SAAE,CAAC;QAC5C,0EAA0E;QAC1E,aAAa,CAAC,EAAE;YAAE,UAAU,EAAE,MAAM,CAAC;YAAC,OAAO,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC;KAC1D,CAAC;CACH"}
|
|
@@ -1,10 +1,25 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
2
|
+
* The tool-call metadata fields sent to the backend, and nothing else. An allowlist, so a field
|
|
3
|
+
* added to the event later stays on the Mac until someone decides it should be sent (and adds it
|
|
4
|
+
* here, and to docs/pii-scrubbing/TOOL_CALL_FIELDS.md). Fields the backend works out itself (the
|
|
5
|
+
* classification, the MCP split, the machine's user profile) are not on it, so a Mac cannot set
|
|
6
|
+
* them.
|
|
7
|
+
*/
|
|
8
|
+
export declare const WIRE_TOOL_CALL_METADATA_KEYS: readonly ["tool_name", "tool_input", "user_prompt", "user_prompt_hash", "raw_event", "hook_hash", "hook_manifest", "login", "os_user"];
|
|
9
|
+
/**
|
|
10
|
+
* The fields of the agent's own hook payload (`raw_event`) the backend reads: the hook's name, in
|
|
11
|
+
* each agent's spelling (it tells a Cursor event from a Claude one), the tool name (MCP calls) and
|
|
12
|
+
* the shell command Cursor sends outside `tool_input`. The rest of the payload (the tool's output,
|
|
13
|
+
* the transcript path, the agent's own copy of the input) stays on the Mac.
|
|
14
|
+
*/
|
|
15
|
+
export declare const WIRE_RAW_EVENT_KEYS: readonly ["hook_event_name", "hookEventName", "hook_event", "tool_name", "command"];
|
|
16
|
+
/**
|
|
17
|
+
* Return the metadata the backend receives: only the allowlisted fields, with the content
|
|
18
|
+
* scrubbed. Secrets in `tool_input`, `raw_event` and the prompt are redacted to typed
|
|
19
|
+
* placeholders before the event leaves the machine; emails and paths stay as they are, since the
|
|
20
|
+
* backend matches tool calls to people and to the folders the inventory holds. Each event carries
|
|
21
|
+
* the scrubber's version, so the backend can tell what the sensor already ran. Identity (`login`,
|
|
22
|
+
* `os_user`) is sent as it is.
|
|
6
23
|
*/
|
|
7
|
-
export declare const SERVER_OWNED_TOOL_CALL_METADATA_KEYS: readonly ["user_profile", "hardware_uuid", "action_type", "command_components", "file_path", "pattern", "mcp_server", "mcp_tool"];
|
|
8
|
-
/** Return a shallow copy of metadata with server-owned keys removed. */
|
|
9
24
|
export declare function cloneToolCallMetadataForWire(meta: unknown): Record<string, unknown> | undefined;
|
|
10
25
|
//# sourceMappingURL=wire-metadata.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire-metadata.d.ts","sourceRoot":"","sources":["../../../src/lib/telemetry/wire-metadata.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"wire-metadata.d.ts","sourceRoot":"","sources":["../../../src/lib/telemetry/wire-metadata.ts"],"names":[],"mappings":"AAGA;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,wIAU/B,CAAC;AAEX;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,qFAAsF,CAAC;AAUvH;;;;;;;GAOG;AACH,wBAAgB,4BAA4B,CAAC,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CAY/F"}
|
|
@@ -1,28 +1,59 @@
|
|
|
1
|
+
import { SCRUBBER_VERSION, scrubText, scrubValue } from "../pii-scrub.js";
|
|
2
|
+
import { readFingerprintKey } from "../prompt-collection-policy.js";
|
|
1
3
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
4
|
+
* The tool-call metadata fields sent to the backend, and nothing else. An allowlist, so a field
|
|
5
|
+
* added to the event later stays on the Mac until someone decides it should be sent (and adds it
|
|
6
|
+
* here, and to docs/pii-scrubbing/TOOL_CALL_FIELDS.md). Fields the backend works out itself (the
|
|
7
|
+
* classification, the MCP split, the machine's user profile) are not on it, so a Mac cannot set
|
|
8
|
+
* them.
|
|
6
9
|
*/
|
|
7
|
-
export const
|
|
8
|
-
"
|
|
9
|
-
"
|
|
10
|
-
"
|
|
11
|
-
"
|
|
12
|
-
"
|
|
13
|
-
"
|
|
14
|
-
"
|
|
15
|
-
"
|
|
10
|
+
export const WIRE_TOOL_CALL_METADATA_KEYS = [
|
|
11
|
+
"tool_name",
|
|
12
|
+
"tool_input",
|
|
13
|
+
"user_prompt",
|
|
14
|
+
"user_prompt_hash",
|
|
15
|
+
"raw_event",
|
|
16
|
+
"hook_hash",
|
|
17
|
+
"hook_manifest",
|
|
18
|
+
"login",
|
|
19
|
+
"os_user",
|
|
16
20
|
];
|
|
17
|
-
/**
|
|
21
|
+
/**
|
|
22
|
+
* The fields of the agent's own hook payload (`raw_event`) the backend reads: the hook's name, in
|
|
23
|
+
* each agent's spelling (it tells a Cursor event from a Claude one), the tool name (MCP calls) and
|
|
24
|
+
* the shell command Cursor sends outside `tool_input`. The rest of the payload (the tool's output,
|
|
25
|
+
* the transcript path, the agent's own copy of the input) stays on the Mac.
|
|
26
|
+
*/
|
|
27
|
+
export const WIRE_RAW_EVENT_KEYS = ["hook_event_name", "hookEventName", "hook_event", "tool_name", "command"];
|
|
28
|
+
function pick(source, keys) {
|
|
29
|
+
return Object.fromEntries(keys.filter((k) => source[k] !== undefined).map((k) => [k, source[k]]));
|
|
30
|
+
}
|
|
31
|
+
function isRecord(value) {
|
|
32
|
+
return Boolean(value) && typeof value === "object" && !Array.isArray(value);
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Return the metadata the backend receives: only the allowlisted fields, with the content
|
|
36
|
+
* scrubbed. Secrets in `tool_input`, `raw_event` and the prompt are redacted to typed
|
|
37
|
+
* placeholders before the event leaves the machine; emails and paths stay as they are, since the
|
|
38
|
+
* backend matches tool calls to people and to the folders the inventory holds. Each event carries
|
|
39
|
+
* the scrubber's version, so the backend can tell what the sensor already ran. Identity (`login`,
|
|
40
|
+
* `os_user`) is sent as it is.
|
|
41
|
+
*/
|
|
18
42
|
export function cloneToolCallMetadataForWire(meta) {
|
|
19
|
-
if (!
|
|
43
|
+
if (!isRecord(meta)) {
|
|
20
44
|
return undefined;
|
|
21
45
|
}
|
|
22
|
-
const m =
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
46
|
+
const m = pick(meta, WIRE_TOOL_CALL_METADATA_KEYS);
|
|
47
|
+
const content = { fingerprintKey: readFingerprintKey() };
|
|
48
|
+
if (m.tool_input !== undefined)
|
|
49
|
+
m.tool_input = scrubValue(m.tool_input, content);
|
|
50
|
+
if (isRecord(m.raw_event))
|
|
51
|
+
m.raw_event = scrubValue(pick(m.raw_event, WIRE_RAW_EVENT_KEYS), content);
|
|
52
|
+
else
|
|
53
|
+
delete m.raw_event;
|
|
54
|
+
if (typeof m.user_prompt === "string")
|
|
55
|
+
m.user_prompt = scrubText(m.user_prompt, content);
|
|
56
|
+
m.scrubber_version = SCRUBBER_VERSION;
|
|
26
57
|
return m;
|
|
27
58
|
}
|
|
28
59
|
//# sourceMappingURL=wire-metadata.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"wire-metadata.js","sourceRoot":"","sources":["../../../src/lib/telemetry/wire-metadata.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"wire-metadata.js","sourceRoot":"","sources":["../../../src/lib/telemetry/wire-metadata.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC1E,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;AAEpE;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,4BAA4B,GAAG;IAC1C,WAAW;IACX,YAAY;IACZ,aAAa;IACb,kBAAkB;IAClB,WAAW;IACX,WAAW;IACX,eAAe;IACf,OAAO;IACP,SAAS;CACD,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG,CAAC,iBAAiB,EAAE,eAAe,EAAE,YAAY,EAAE,WAAW,EAAE,SAAS,CAAU,CAAC;AAEvH,SAAS,IAAI,CAAC,MAA+B,EAAE,IAAuB;IACpE,OAAO,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;AACpG,CAAC;AAED,SAAS,QAAQ,CAAC,KAAc;IAC9B,OAAO,OAAO,CAAC,KAAK,CAAC,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC;AAC9E,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,UAAU,4BAA4B,CAAC,IAAa;IACxD,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,EAAE,CAAC;QACpB,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,4BAA4B,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,EAAE,cAAc,EAAE,kBAAkB,EAAE,EAAE,CAAC;IACzD,IAAI,CAAC,CAAC,UAAU,KAAK,SAAS;QAAE,CAAC,CAAC,UAAU,GAAG,UAAU,CAAC,CAAC,CAAC,UAAU,EAAE,OAAO,CAAC,CAAC;IACjF,IAAI,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAC;QAAE,CAAC,CAAC,SAAS,GAAG,UAAU,CAAC,IAAI,CAAC,CAAC,CAAC,SAAS,EAAE,mBAAmB,CAAC,EAAE,OAAO,CAAC,CAAC;;QAChG,OAAO,CAAC,CAAC,SAAS,CAAC;IACxB,IAAI,OAAO,CAAC,CAAC,WAAW,KAAK,QAAQ;QAAE,CAAC,CAAC,WAAW,GAAG,SAAS,CAAC,CAAC,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;IACzF,CAAC,CAAC,gBAAgB,GAAG,gBAAgB,CAAC;IACtC,OAAO,CAAC,CAAC;AACX,CAAC"}
|
package/dist/lib/tofu.d.ts
CHANGED
|
@@ -11,6 +11,7 @@
|
|
|
11
11
|
* "@optimuslabs/tofu-staging", so the conditional lives in exactly one place.
|
|
12
12
|
*/
|
|
13
13
|
import type * as TofuTypes from "@optimuslabs/tofu-staging";
|
|
14
|
+
export declare const isDevelopment: boolean;
|
|
14
15
|
export declare const loadEndpointBase: typeof TofuTypes.loadEndpointBase, buildStartupEndpointUrl: typeof TofuTypes.buildStartupEndpointUrl, createSignature: typeof TofuTypes.createSignature, persistAuthKey: typeof TofuTypes.persistAuthKey, readStoredAuthKey: typeof TofuTypes.readStoredAuthKey, ensureAuthentication: typeof TofuTypes.ensureAuthentication, getEndpointSource: typeof TofuTypes.getEndpointSource, canonicalizePayload: typeof TofuTypes.canonicalizePayload, getAuthKeyPath: typeof TofuTypes.getAuthKeyPath;
|
|
15
16
|
export type { EndpointResponse, StoredAuthKey } from "@optimuslabs/tofu-staging";
|
|
16
17
|
//# sourceMappingURL=tofu.d.ts.map
|
package/dist/lib/tofu.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tofu.d.ts","sourceRoot":"","sources":["../../src/lib/tofu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,KAAK,SAAS,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"tofu.d.ts","sourceRoot":"","sources":["../../src/lib/tofu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,OAAO,KAAK,KAAK,SAAS,MAAM,2BAA2B,CAAC;AAqB5D,eAAO,MAAM,aAAa,SAAsC,CAAC;AAYjE,eAAO,MACL,gBAAgB,qCAChB,uBAAuB,4CACvB,eAAe,oCACf,cAAc,mCACd,iBAAiB,sCACjB,oBAAoB,yCACpB,iBAAiB,sCACjB,mBAAmB,wCACnB,cAAc,iCACR,CAAC;AAET,YAAY,EAAE,gBAAgB,EAAE,aAAa,EAAE,MAAM,2BAA2B,CAAC"}
|
package/dist/lib/tofu.js
CHANGED
|
@@ -33,7 +33,7 @@ function readEnvironment() {
|
|
|
33
33
|
return "staging";
|
|
34
34
|
}
|
|
35
35
|
const __dirname = path.dirname(fileURLToPath(import.meta.url));
|
|
36
|
-
const isDevelopment = readEnvironment() === "development";
|
|
36
|
+
export const isDevelopment = readEnvironment() === "development";
|
|
37
37
|
// In development: resolve local tofu dist relative to this file.
|
|
38
38
|
// dist/lib/tofu.js → ../../.. → optimuslabs/tofu/dist/index.js
|
|
39
39
|
const localTofuPath = path.join(__dirname, "../../../tofu/dist/index.js");
|
package/dist/lib/tofu.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tofu.js","sourceRoot":"","sources":["../../src/lib/tofu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGpC,SAAS,eAAe;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC;IACtF,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,mGAAmG;QACnG,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CACzB,8DAA8D,CAC/D,CAAC;IACF,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtE,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,aAAa,GAAG,eAAe,EAAE,KAAK,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"tofu.js","sourceRoot":"","sources":["../../src/lib/tofu.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,IAAI,CAAC;AAClC,OAAO,EAAE,OAAO,EAAE,MAAM,IAAI,CAAC;AAC7B,OAAO,IAAI,MAAM,MAAM,CAAC;AACxB,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AAGpC,SAAS,eAAe;IACtB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,iBAAiB,CAAC,CAAC;IACtF,IAAI,OAAe,CAAC;IACpB,IAAI,CAAC;QACH,OAAO,GAAG,YAAY,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;IAC1C,CAAC;IAAC,MAAM,CAAC;QACP,mGAAmG;QACnG,OAAO,SAAS,CAAC;IACnB,CAAC;IACD,MAAM,KAAK,GAAG,OAAO,CAAC,KAAK,CACzB,8DAA8D,CAC/D,CAAC;IACF,IAAI,KAAK;QAAE,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IAChD,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;IACtE,IAAI,OAAO;QAAE,OAAO,OAAO,CAAC;IAC5B,OAAO,SAAS,CAAC;AACnB,CAAC;AAED,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;AAC/D,MAAM,CAAC,MAAM,aAAa,GAAG,eAAe,EAAE,KAAK,aAAa,CAAC;AAEjE,iEAAiE;AACjE,+DAA+D;AAC/D,MAAM,aAAa,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,6BAA6B,CAAC,CAAC;AAE1E,MAAM,IAAI,GAAG,CACX,aAAa;IACX,CAAC,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC;IAC7B,CAAC,CAAC,MAAM,MAAM,CAAC,2BAA2B,CAAC,CAC1B,CAAC;AAEtB,MAAM,CAAC,MAAM,EACX,gBAAgB,EAChB,uBAAuB,EACvB,eAAe,EACf,cAAc,EACd,iBAAiB,EACjB,oBAAoB,EACpB,iBAAiB,EACjB,mBAAmB,EACnB,cAAc,GACf,GAAG,IAAI,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-event-scrub.test.d.ts","sourceRoot":"","sources":["../../src/test/client-event-scrub.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { reportToolCallRun } from "../lib/client-event.js";
|
|
7
|
+
test("reportToolCallRun - the run record's command and log are scrubbed, with the scrubber version", async () => {
|
|
8
|
+
const token = `ghp_${"C".repeat(36)}`;
|
|
9
|
+
const saved = { home: process.env.HOME, uuid: process.env.OPTIMUS_HARDWARE_UUID, fetch: globalThis.fetch };
|
|
10
|
+
process.env.HOME = fs.mkdtempSync(path.join(os.tmpdir(), "client-event-"));
|
|
11
|
+
process.env.OPTIMUS_HARDWARE_UUID = "hw-client-event-test";
|
|
12
|
+
let sent;
|
|
13
|
+
globalThis.fetch = (async (_url, init) => {
|
|
14
|
+
sent = JSON.parse(String(init?.body));
|
|
15
|
+
return new Response("{}");
|
|
16
|
+
});
|
|
17
|
+
try {
|
|
18
|
+
await reportToolCallRun({
|
|
19
|
+
outcome: "failed",
|
|
20
|
+
command: `GH_TOKEN=${token} npx optimus-tool-call`,
|
|
21
|
+
message: "npx exited 1",
|
|
22
|
+
detail: `export GITHUB_TOKEN=${token}\nreported to ada@gmail.com`,
|
|
23
|
+
});
|
|
24
|
+
}
|
|
25
|
+
finally {
|
|
26
|
+
process.env.HOME = saved.home;
|
|
27
|
+
process.env.OPTIMUS_HARDWARE_UUID = saved.uuid;
|
|
28
|
+
globalThis.fetch = saved.fetch;
|
|
29
|
+
}
|
|
30
|
+
const event = sent?.events[0] ?? {};
|
|
31
|
+
assert.strictEqual(event.command, "GH_TOKEN=ghp_[OL_REDACTED:GITHUB_TOKEN] npx optimus-tool-call");
|
|
32
|
+
assert.strictEqual(event.detail, "export GITHUB_TOKEN=ghp_[OL_REDACTED:GITHUB_TOKEN]\nreported to ada@gmail.com");
|
|
33
|
+
assert.match(String(event.metadata.scrubber_version), /^\d+\.\d+\.\d+$/);
|
|
34
|
+
assert.ok(!JSON.stringify(sent).includes(token));
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=client-event-scrub.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"client-event-scrub.test.js","sourceRoot":"","sources":["../../src/test/client-event-scrub.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAC;AAE3D,IAAI,CAAC,8FAA8F,EAAE,KAAK,IAAI,EAAE;IAC9G,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,qBAAqB,EAAE,KAAK,EAAE,UAAU,CAAC,KAAK,EAAE,CAAC;IAC3G,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,sBAAsB,CAAC;IAC3D,IAAI,IAAuD,CAAC;IAC5D,UAAU,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,IAAa,EAAE,IAAyB,EAAE,EAAE;QACrE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACtC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,CAAC;IAC5B,CAAC,CAAiB,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,iBAAiB,CAAC;YACtB,OAAO,EAAE,QAAQ;YACjB,OAAO,EAAE,YAAY,KAAK,wBAAwB;YAClD,OAAO,EAAE,cAAc;YACvB,MAAM,EAAE,uBAAuB,KAAK,6BAA6B;SAClE,CAAC,CAAC;IACL,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,qBAAqB,GAAG,KAAK,CAAC,IAAI,CAAC;QAC/C,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IACjC,CAAC;IACD,MAAM,KAAK,GAAG,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IACpC,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,OAAO,EAAE,+DAA+D,CAAC,CAAC;IACnG,MAAM,CAAC,WAAW,CAAC,KAAK,CAAC,MAAM,EAAE,+EAA+E,CAAC,CAAC;IAClH,MAAM,CAAC,KAAK,CAAC,MAAM,CAAE,KAAK,CAAC,QAAmC,CAAC,gBAAgB,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACrG,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org-fingerprint-key.test.d.ts","sourceRoot":"","sources":["../../src/test/org-fingerprint-key.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { orgConfigPath, persistCollectPromptsFromResponse, readCollectPrompts, readFingerprintKey, } from "../lib/prompt-collection-policy.js";
|
|
7
|
+
const ORG_KEY = "cd".repeat(32);
|
|
8
|
+
function withHome(run) {
|
|
9
|
+
const saved = process.env.HOME;
|
|
10
|
+
process.env.HOME = fs.mkdtempSync(path.join(os.tmpdir(), "org-key-"));
|
|
11
|
+
try {
|
|
12
|
+
run();
|
|
13
|
+
}
|
|
14
|
+
finally {
|
|
15
|
+
process.env.HOME = saved;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
test("no org key until a response has carried one", () => {
|
|
19
|
+
withHome(() => assert.strictEqual(readFingerprintKey(), undefined));
|
|
20
|
+
});
|
|
21
|
+
test("the org key a response carries is stored beside the prompt setting, owner-only", () => {
|
|
22
|
+
withHome(() => {
|
|
23
|
+
persistCollectPromptsFromResponse({ collect_prompts: false, fingerprint_key: ORG_KEY });
|
|
24
|
+
assert.strictEqual(readFingerprintKey(), ORG_KEY);
|
|
25
|
+
assert.strictEqual(readCollectPrompts(), false);
|
|
26
|
+
assert.strictEqual(fs.statSync(orgConfigPath()).mode & 0o777, 0o600);
|
|
27
|
+
});
|
|
28
|
+
});
|
|
29
|
+
test("a response without the key keeps the stored one, and a malformed key is ignored", () => {
|
|
30
|
+
withHome(() => {
|
|
31
|
+
persistCollectPromptsFromResponse({ fingerprint_key: ORG_KEY });
|
|
32
|
+
persistCollectPromptsFromResponse({ collect_prompts: true });
|
|
33
|
+
persistCollectPromptsFromResponse({ fingerprint_key: "not-hex" });
|
|
34
|
+
persistCollectPromptsFromResponse({ fingerprint_key: "ab" });
|
|
35
|
+
assert.strictEqual(readFingerprintKey(), ORG_KEY);
|
|
36
|
+
assert.strictEqual(readCollectPrompts(), true);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
39
|
+
//# sourceMappingURL=org-fingerprint-key.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org-fingerprint-key.test.js","sourceRoot":"","sources":["../../src/test/org-fingerprint-key.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,aAAa,EACb,iCAAiC,EACjC,kBAAkB,EAClB,kBAAkB,GACnB,MAAM,oCAAoC,CAAC;AAE5C,MAAM,OAAO,GAAG,IAAI,CAAC,MAAM,CAAC,EAAE,CAAC,CAAC;AAEhC,SAAS,QAAQ,CAAC,GAAe;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/B,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,UAAU,CAAC,CAAC,CAAC;IACtE,IAAI,CAAC;QACH,GAAG,EAAE,CAAC;IACR,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;IAC3B,CAAC;AACH,CAAC;AAED,IAAI,CAAC,6CAA6C,EAAE,GAAG,EAAE;IACvD,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,kBAAkB,EAAE,EAAE,SAAS,CAAC,CAAC,CAAC;AACtE,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,gFAAgF,EAAE,GAAG,EAAE;IAC1F,QAAQ,CAAC,GAAG,EAAE;QACZ,iCAAiC,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC;QACxF,MAAM,CAAC,WAAW,CAAC,kBAAkB,EAAE,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,kBAAkB,EAAE,EAAE,KAAK,CAAC,CAAC;QAChD,MAAM,CAAC,WAAW,CAAC,EAAE,CAAC,QAAQ,CAAC,aAAa,EAAE,CAAC,CAAC,IAAI,GAAG,KAAK,EAAE,KAAK,CAAC,CAAC;IACvE,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,iFAAiF,EAAE,GAAG,EAAE;IAC3F,QAAQ,CAAC,GAAG,EAAE;QACZ,iCAAiC,CAAC,EAAE,eAAe,EAAE,OAAO,EAAE,CAAC,CAAC;QAChE,iCAAiC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,iCAAiC,CAAC,EAAE,eAAe,EAAE,SAAS,EAAE,CAAC,CAAC;QAClE,iCAAiC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,WAAW,CAAC,kBAAkB,EAAE,EAAE,OAAO,CAAC,CAAC;QAClD,MAAM,CAAC,WAAW,CAAC,kBAAkB,EAAE,EAAE,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org-scrub-setting.test.d.ts","sourceRoot":"","sources":["../../src/test/org-scrub-setting.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { orgConfigPath, persistCollectPromptsFromResponse } from "../lib/prompt-collection-policy.js";
|
|
7
|
+
import { scrubText } from "../lib/pii-scrub.js";
|
|
8
|
+
// OPT-942: the organization's scrubbing setting arrives on the startup and inventory responses
|
|
9
|
+
// and reaches the scrubber through the org config file. HOME is a temporary directory.
|
|
10
|
+
const SECRET = `ghp_${"C".repeat(36)}`;
|
|
11
|
+
function withHome(run) {
|
|
12
|
+
const saved = process.env.HOME;
|
|
13
|
+
const home = fs.mkdtempSync(path.join(os.tmpdir(), "org-scrub-"));
|
|
14
|
+
process.env.HOME = home;
|
|
15
|
+
try {
|
|
16
|
+
run();
|
|
17
|
+
}
|
|
18
|
+
finally {
|
|
19
|
+
process.env.HOME = saved;
|
|
20
|
+
fs.rmSync(home, { recursive: true, force: true });
|
|
21
|
+
}
|
|
22
|
+
}
|
|
23
|
+
test("before any response the runtime scrubs", () => {
|
|
24
|
+
withHome(() => assert.strictEqual(scrubText(SECRET), "ghp_[OL_REDACTED:GITHUB_TOKEN]"));
|
|
25
|
+
});
|
|
26
|
+
test("a response switching scrubbing off stops it, and one switching it on restarts it", () => {
|
|
27
|
+
withHome(() => {
|
|
28
|
+
persistCollectPromptsFromResponse({ collect_prompts: false, scrub_pii: false });
|
|
29
|
+
assert.strictEqual(JSON.parse(fs.readFileSync(orgConfigPath(), "utf8")).scrub_pii, false);
|
|
30
|
+
assert.strictEqual(scrubText(SECRET), SECRET);
|
|
31
|
+
persistCollectPromptsFromResponse({ collect_prompts: false, scrub_pii: true });
|
|
32
|
+
assert.strictEqual(scrubText(SECRET), "ghp_[OL_REDACTED:GITHUB_TOKEN]");
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
test("a response without the setting keeps the stored one", () => {
|
|
36
|
+
withHome(() => {
|
|
37
|
+
persistCollectPromptsFromResponse({ scrub_pii: false });
|
|
38
|
+
persistCollectPromptsFromResponse({ collect_prompts: true });
|
|
39
|
+
assert.strictEqual(scrubText(SECRET), SECRET);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
//# sourceMappingURL=org-scrub-setting.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"org-scrub-setting.test.js","sourceRoot":"","sources":["../../src/test/org-scrub-setting.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,aAAa,EAAE,iCAAiC,EAAE,MAAM,oCAAoC,CAAC;AACtG,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAC;AAEhD,+FAA+F;AAC/F,uFAAuF;AACvF,MAAM,MAAM,GAAG,OAAO,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;AAEvC,SAAS,QAAQ,CAAC,GAAe;IAC/B,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC;IAC/B,MAAM,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,YAAY,CAAC,CAAC,CAAC;IAClE,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,IAAI,CAAC;IACxB,IAAI,CAAC;QACH,GAAG,EAAE,CAAC;IACR,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC;QACzB,EAAE,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,CAAC,CAAC;IACpD,CAAC;AACH,CAAC;AAED,IAAI,CAAC,wCAAwC,EAAE,GAAG,EAAE;IAClD,QAAQ,CAAC,GAAG,EAAE,CAAC,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,gCAAgC,CAAC,CAAC,CAAC;AAC1F,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,kFAAkF,EAAE,GAAG,EAAE;IAC5F,QAAQ,CAAC,GAAG,EAAE;QACZ,iCAAiC,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAChF,MAAM,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,aAAa,EAAE,EAAE,MAAM,CAAC,CAAC,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAC1F,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;QAE9C,iCAAiC,CAAC,EAAE,eAAe,EAAE,KAAK,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/E,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,gCAAgC,CAAC,CAAC;IAC1E,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,IAAI,CAAC,qDAAqD,EAAE,GAAG,EAAE;IAC/D,QAAQ,CAAC,GAAG,EAAE;QACZ,iCAAiC,CAAC,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QACxD,iCAAiC,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QAC7D,MAAM,CAAC,WAAW,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { test } from "node:test";
|
|
2
2
|
import assert from "node:assert";
|
|
3
|
-
import { createHash } from "node:crypto";
|
|
4
|
-
import { applyPromptCollectionToMetadata, stripRawEventPromptFields } from "../lib/telemetry/prompt-privacy.js";
|
|
3
|
+
import { createHash, createHmac } from "node:crypto";
|
|
4
|
+
import { applyPromptCollectionToMetadata, hashUserPrompt, stripRawEventPromptFields } from "../lib/telemetry/prompt-privacy.js";
|
|
5
5
|
test("stripRawEventPromptFields removes top-level prompt keys only", () => {
|
|
6
6
|
const stripped = stripRawEventPromptFields({
|
|
7
7
|
user_prompt: "secret",
|
|
@@ -30,4 +30,21 @@ test("applyPromptCollectionToMetadata keeps plaintext when hashing is off", () =
|
|
|
30
30
|
assert.strictEqual(out.user_prompt_hash, undefined);
|
|
31
31
|
assert.strictEqual(out.raw_event.user_prompt, undefined);
|
|
32
32
|
});
|
|
33
|
+
const ORG_KEY = "ab".repeat(32);
|
|
34
|
+
test("applyPromptCollectionToMetadata keys the prompt hash under the org key once it has arrived", () => {
|
|
35
|
+
const keyed = createHmac("sha256", Buffer.from(ORG_KEY, "hex")).update("do a thing", "utf8").digest("hex");
|
|
36
|
+
const out = applyPromptCollectionToMetadata({ user_prompt: " do a thing " }, true, ORG_KEY);
|
|
37
|
+
assert.strictEqual(out.user_prompt_hash, keyed);
|
|
38
|
+
assert.notStrictEqual(out.user_prompt_hash, createHash("sha256").update("do a thing", "utf8").digest("hex"));
|
|
39
|
+
assert.match(String(out.user_prompt_hash), /^[0-9a-f]{64}$/);
|
|
40
|
+
assert.strictEqual(out.user_prompt, undefined);
|
|
41
|
+
});
|
|
42
|
+
test("hashUserPrompt stays plain SHA-256 until the org key has arrived", () => {
|
|
43
|
+
assert.strictEqual(hashUserPrompt("yes"), createHash("sha256").update("yes", "utf8").digest("hex"));
|
|
44
|
+
assert.strictEqual(hashUserPrompt("yes", undefined), hashUserPrompt("yes"));
|
|
45
|
+
});
|
|
46
|
+
test("a short prompt's keyed hash cannot be matched by hashing guesses without the key", () => {
|
|
47
|
+
const guesses = ["yes", "no", "ok", "continue"].map((g) => createHash("sha256").update(g, "utf8").digest("hex"));
|
|
48
|
+
assert.ok(!guesses.includes(hashUserPrompt("yes", ORG_KEY)));
|
|
49
|
+
});
|
|
33
50
|
//# sourceMappingURL=prompt-privacy.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-privacy.test.js","sourceRoot":"","sources":["../../src/test/prompt-privacy.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"prompt-privacy.test.js","sourceRoot":"","sources":["../../src/test/prompt-privacy.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startup-sync-scrub.test.d.ts","sourceRoot":"","sources":["../../src/test/startup-sync-scrub.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
import { test } from "node:test";
|
|
2
|
+
import assert from "node:assert";
|
|
3
|
+
import fs from "node:fs";
|
|
4
|
+
import os from "node:os";
|
|
5
|
+
import path from "node:path";
|
|
6
|
+
import { ensureStartupMetadataSynced } from "../lib/startup-sync.js";
|
|
7
|
+
test("ensureStartupMetadataSynced - a token in the git remote is scrubbed, and the scrubber version is sent", async () => {
|
|
8
|
+
const token = `ghp_${"C".repeat(36)}`;
|
|
9
|
+
const saved = {
|
|
10
|
+
home: process.env.HOME,
|
|
11
|
+
repo: process.env.GITHUB_REPOSITORY,
|
|
12
|
+
interval: process.env.OPTIMUS_STARTUP_SYNC_INTERVAL_MS,
|
|
13
|
+
fetch: globalThis.fetch,
|
|
14
|
+
};
|
|
15
|
+
process.env.HOME = fs.mkdtempSync(path.join(os.tmpdir(), "startup-sync-"));
|
|
16
|
+
process.env.GITHUB_REPOSITORY = `origin\thttps://x-access-token:${token}@github.com/acme/app.git (fetch)`;
|
|
17
|
+
process.env.OPTIMUS_STARTUP_SYNC_INTERVAL_MS = "0";
|
|
18
|
+
let sent;
|
|
19
|
+
globalThis.fetch = (async (_url, init) => {
|
|
20
|
+
sent = JSON.parse(String(init?.body));
|
|
21
|
+
return new Response(JSON.stringify({ status: "ok" }));
|
|
22
|
+
});
|
|
23
|
+
try {
|
|
24
|
+
await ensureStartupMetadataSynced("hw-startup-scrub-test");
|
|
25
|
+
}
|
|
26
|
+
finally {
|
|
27
|
+
process.env.HOME = saved.home;
|
|
28
|
+
process.env.GITHUB_REPOSITORY = saved.repo;
|
|
29
|
+
process.env.OPTIMUS_STARTUP_SYNC_INTERVAL_MS = saved.interval;
|
|
30
|
+
globalThis.fetch = saved.fetch;
|
|
31
|
+
}
|
|
32
|
+
assert.strictEqual(sent?.metadata.repo_identifier, "origin\thttps://x-access-token:[OL_REDACTED:URL_CREDENTIALS]@github.com/acme/app.git (fetch)");
|
|
33
|
+
assert.match(String(sent?.metadata.scrubber_version), /^\d+\.\d+\.\d+$/);
|
|
34
|
+
assert.ok(!JSON.stringify(sent).includes(token));
|
|
35
|
+
});
|
|
36
|
+
//# sourceMappingURL=startup-sync-scrub.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"startup-sync-scrub.test.js","sourceRoot":"","sources":["../../src/test/startup-sync-scrub.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EAAE,2BAA2B,EAAE,MAAM,wBAAwB,CAAC;AAErE,IAAI,CAAC,uGAAuG,EAAE,KAAK,IAAI,EAAE;IACvH,MAAM,KAAK,GAAG,OAAO,GAAG,CAAC,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;IACtC,MAAM,KAAK,GAAG;QACZ,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI;QACtB,IAAI,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;QACnC,QAAQ,EAAE,OAAO,CAAC,GAAG,CAAC,gCAAgC;QACtD,KAAK,EAAE,UAAU,CAAC,KAAK;KACxB,CAAC;IACF,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,EAAE,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,eAAe,CAAC,CAAC,CAAC;IAC3E,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,kCAAkC,KAAK,kCAAkC,CAAC;IAC1G,OAAO,CAAC,GAAG,CAAC,gCAAgC,GAAG,GAAG,CAAC;IACnD,IAAI,IAAuD,CAAC;IAC5D,UAAU,CAAC,KAAK,GAAG,CAAC,KAAK,EAAE,IAAa,EAAE,IAAyB,EAAE,EAAE;QACrE,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,CAAC;QACtC,OAAO,IAAI,QAAQ,CAAC,IAAI,CAAC,SAAS,CAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;IACxD,CAAC,CAAiB,CAAC;IACnB,IAAI,CAAC;QACH,MAAM,2BAA2B,CAAC,uBAAuB,CAAC,CAAC;IAC7D,CAAC;YAAS,CAAC;QACT,OAAO,CAAC,GAAG,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAC9B,OAAO,CAAC,GAAG,CAAC,iBAAiB,GAAG,KAAK,CAAC,IAAI,CAAC;QAC3C,OAAO,CAAC,GAAG,CAAC,gCAAgC,GAAG,KAAK,CAAC,QAAQ,CAAC;QAC9D,UAAU,CAAC,KAAK,GAAG,KAAK,CAAC,KAAK,CAAC;IACjC,CAAC;IACD,MAAM,CAAC,WAAW,CAChB,IAAI,EAAE,QAAQ,CAAC,eAAe,EAC9B,8FAA8F,CAC/F,CAAC;IACF,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EAAE,iBAAiB,CAAC,CAAC;IACzE,MAAM,CAAC,EAAE,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;AACnD,CAAC,CAAC,CAAC"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
import { test } from "node:test";
|
|
2
2
|
import assert from "node:assert";
|
|
3
|
+
import os from "node:os";
|
|
3
4
|
import { buildTelemetryEvent, eventToDict } from "../lib/telemetry.js";
|
|
4
5
|
import fs from "fs";
|
|
5
|
-
import os from "os";
|
|
6
6
|
import path from "path";
|
|
7
7
|
test("buildTelemetryEvent - null input returns null", () => {
|
|
8
8
|
assert.strictEqual(buildTelemetryEvent(null), null);
|
|
@@ -228,6 +228,11 @@ test("buildTelemetryEvent - carries every hook's hash from OPTIMUS_HOOK_MANIFEST
|
|
|
228
228
|
delete process.env.OPTIMUS_HOOK_MANIFEST;
|
|
229
229
|
}
|
|
230
230
|
});
|
|
231
|
+
test("buildTelemetryEvent - every event carries the macOS account running it", () => {
|
|
232
|
+
const event = buildTelemetryEvent({ tool_name: "Read", tool_input: { file_path: "/tmp/x" } });
|
|
233
|
+
const { uid, username } = os.userInfo();
|
|
234
|
+
assert.deepStrictEqual(event?.tool_call_metadata.os_user, { uid, username });
|
|
235
|
+
});
|
|
231
236
|
function codexSession(originator) {
|
|
232
237
|
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "codex-session-"));
|
|
233
238
|
const file = path.join(dir, "rollout.jsonl");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../../src/test/telemetry.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AACjC,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAE,MAAM,qBAAqB,CAAC;AAEvE,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,
|
|
1
|
+
{"version":3,"file":"telemetry.test.js","sourceRoot":"","sources":["../../src/test/telemetry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wire-metadata.test.d.ts","sourceRoot":"","sources":["../../src/test/wire-metadata.test.ts"],"names":[],"mappings":""}
|