@optimuslabs/runtime 0.3.4 → 0.3.12
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/index.js +36 -70
- package/dist/index.js.map +1 -1
- 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/login.d.ts +15 -0
- package/dist/lib/login.d.ts.map +1 -0
- package/dist/lib/login.js +109 -0
- package/dist/lib/login.js.map +1 -0
- 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 +73 -6
- package/dist/lib/telemetry/build-event.js.map +1 -1
- package/dist/lib/telemetry/canonical.d.ts +1 -1
- package/dist/lib/telemetry/canonical.d.ts.map +1 -1
- package/dist/lib/telemetry/canonical.js +23 -14
- package/dist/lib/telemetry/canonical.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 +18 -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 +51 -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/lib/transcript.d.ts +33 -0
- package/dist/lib/transcript.d.ts.map +1 -0
- package/dist/lib/transcript.js +217 -0
- package/dist/lib/transcript.js.map +1 -0
- package/dist/test/canonical.test.js +40 -0
- package/dist/test/canonical.test.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/login.test.d.ts +2 -0
- package/dist/test/login.test.d.ts.map +1 -0
- package/dist/test/login.test.js +60 -0
- package/dist/test/login.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 +62 -0
- package/dist/test/telemetry.test.js.map +1 -1
- package/dist/test/transcript.test.d.ts +2 -0
- package/dist/test/transcript.test.d.ts.map +1 -0
- package/dist/test/transcript.test.js +162 -0
- package/dist/test/transcript.test.js.map +1 -0
- 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 +110 -0
- package/dist/test/wire-metadata.test.js.map +1 -0
- package/package.json +3 -2
package/dist/lib/startup-sync.js
CHANGED
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
import { buildStartupEndpointUrl, createSignature, loadEndpointBase, persistAuthKey, readStoredAuthKey, } from "./tofu.js";
|
|
13
13
|
import { OPTIMUS_AUTH_KEY_RELATIVE_PATH, resetToolCallAuthCache } from "./machine-auth.js";
|
|
14
14
|
import { persistCollectPromptsFromResponse } from "./prompt-collection-policy.js";
|
|
15
|
+
import { SCRUBBER_VERSION, scrubText } from "./pii-scrub.js";
|
|
15
16
|
import { resolveUserProfile } from "./user-profile.js";
|
|
16
17
|
import fs from "node:fs";
|
|
17
18
|
import os from "node:os";
|
|
@@ -65,52 +66,59 @@ function readOrganizationUuid() {
|
|
|
65
66
|
return "";
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
|
-
|
|
69
|
-
if (process.env.OPTIMUS_SKIP_STARTUP_SYNC === "1")
|
|
70
|
-
return;
|
|
69
|
+
function startupSyncIntervalMs() {
|
|
71
70
|
const rawInterval = process.env.OPTIMUS_STARTUP_SYNC_INTERVAL_MS;
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
const now = Date.now();
|
|
79
|
-
if (shouldSkipStartupSyncDueToCooldown(now, intervalMs)) {
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
const timestamp = new Date().toISOString();
|
|
83
|
-
const payloadSummary = {
|
|
84
|
-
timestamp,
|
|
85
|
-
directory: process.cwd(),
|
|
86
|
-
hardware_uuid: hardwareUuid,
|
|
87
|
-
};
|
|
88
|
-
let user_profile;
|
|
71
|
+
if (rawInterval === undefined || rawInterval === "")
|
|
72
|
+
return DEFAULT_STARTUP_SYNC_INTERVAL_MS;
|
|
73
|
+
const parsed = parseInt(rawInterval, 10);
|
|
74
|
+
return Number.isNaN(parsed) || parsed < 0 ? DEFAULT_STARTUP_SYNC_INTERVAL_MS : parsed;
|
|
75
|
+
}
|
|
76
|
+
function startupUserProfile() {
|
|
89
77
|
try {
|
|
90
|
-
|
|
78
|
+
return { ...resolveUserProfile() };
|
|
91
79
|
}
|
|
92
80
|
catch (err) {
|
|
93
81
|
console.error(`[optimus-tool-call] resolveUserProfile failed; continuing startup sync with empty profile: ${err instanceof Error ? err.message : String(err)}`);
|
|
94
|
-
|
|
82
|
+
return emptyUserProfile();
|
|
95
83
|
}
|
|
96
|
-
|
|
84
|
+
}
|
|
85
|
+
function githubUsername(profile) {
|
|
86
|
+
return ((typeof profile.github_username === "string" && profile.github_username.trim()) ||
|
|
97
87
|
process.env.GITHUB_USER ||
|
|
98
88
|
process.env.GH_USER ||
|
|
99
|
-
"";
|
|
100
|
-
|
|
101
|
-
|
|
89
|
+
"");
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* The machine's metadata for the startup request. The git remote in `repo_identifier` can embed a
|
|
93
|
+
* token (`https://user:token@host/owner/repo`), so it is scrubbed, and the scrubber's version is
|
|
94
|
+
* sent; `metadata` is not part of the signed summary.
|
|
95
|
+
*/
|
|
96
|
+
function startupMetadata() {
|
|
97
|
+
const user_profile = startupUserProfile();
|
|
98
|
+
return {
|
|
99
|
+
github_username: githubUsername(user_profile),
|
|
102
100
|
org_identifier: process.env.GITHUB_ORG || "",
|
|
103
101
|
organization_uuid: readOrganizationUuid(),
|
|
104
|
-
repo_identifier: process.env.GITHUB_REPOSITORY || "",
|
|
102
|
+
repo_identifier: scrubText(process.env.GITHUB_REPOSITORY || ""),
|
|
105
103
|
branch: process.env.GITHUB_REF_NAME || process.env.BRANCH_NAME || "",
|
|
106
104
|
commit_sha: process.env.GITHUB_SHA || "",
|
|
107
105
|
agent_name: process.env.OPTIMUS_AGENT || "",
|
|
108
106
|
user_profile,
|
|
107
|
+
scrubber_version: SCRUBBER_VERSION,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
/** The startup request: the summary, signed with this machine's key when it has one, and the metadata. */
|
|
111
|
+
function buildStartupBody(hardwareUuid) {
|
|
112
|
+
const timestamp = new Date().toISOString();
|
|
113
|
+
const payloadSummary = {
|
|
114
|
+
timestamp,
|
|
115
|
+
directory: process.cwd(),
|
|
116
|
+
hardware_uuid: hardwareUuid,
|
|
109
117
|
};
|
|
110
118
|
const body = {
|
|
111
119
|
hardware_uuid: hardwareUuid,
|
|
112
120
|
payload: payloadSummary,
|
|
113
|
-
metadata,
|
|
121
|
+
metadata: startupMetadata(),
|
|
114
122
|
scan_timestamp: timestamp,
|
|
115
123
|
};
|
|
116
124
|
const storedKey = readStoredAuthKey({
|
|
@@ -121,42 +129,56 @@ export async function ensureStartupMetadataSynced(hardwareUuid) {
|
|
|
121
129
|
if (storedKey.key_id)
|
|
122
130
|
body.key_id = storedKey.key_id;
|
|
123
131
|
}
|
|
132
|
+
return body;
|
|
133
|
+
}
|
|
134
|
+
async function postStartupBody(url, body) {
|
|
135
|
+
const controller = new AbortController();
|
|
136
|
+
const timeoutId = setTimeout(() => controller.abort(), 5000);
|
|
137
|
+
try {
|
|
138
|
+
return await fetch(url, {
|
|
139
|
+
method: "POST",
|
|
140
|
+
headers: { "Content-Type": "application/json" },
|
|
141
|
+
body: JSON.stringify(body),
|
|
142
|
+
signal: controller.signal,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
finally {
|
|
146
|
+
clearTimeout(timeoutId);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
/** Store what a successful startup response carries (a new key, the org's options); true when it parsed. */
|
|
150
|
+
function applyStartupResponse(text, hardwareUuid) {
|
|
151
|
+
let parsed;
|
|
152
|
+
try {
|
|
153
|
+
parsed = JSON.parse(text);
|
|
154
|
+
}
|
|
155
|
+
catch {
|
|
156
|
+
return false;
|
|
157
|
+
}
|
|
158
|
+
if (parsed.status === "key_issued" && typeof parsed.key === "string") {
|
|
159
|
+
persistAuthKey(parsed.key, typeof parsed.key_id === "string" ? parsed.key_id : null, hardwareUuid, { authRelativePath: OPTIMUS_AUTH_KEY_RELATIVE_PATH });
|
|
160
|
+
resetToolCallAuthCache();
|
|
161
|
+
}
|
|
162
|
+
persistCollectPromptsFromResponse(parsed);
|
|
163
|
+
return true;
|
|
164
|
+
}
|
|
165
|
+
export async function ensureStartupMetadataSynced(hardwareUuid) {
|
|
166
|
+
if (process.env.OPTIMUS_SKIP_STARTUP_SYNC === "1")
|
|
167
|
+
return;
|
|
168
|
+
if (shouldSkipStartupSyncDueToCooldown(Date.now(), startupSyncIntervalMs())) {
|
|
169
|
+
return;
|
|
170
|
+
}
|
|
171
|
+
const body = buildStartupBody(hardwareUuid);
|
|
124
172
|
const url = buildStartupEndpointUrl(loadEndpointBase());
|
|
125
173
|
try {
|
|
126
|
-
const
|
|
127
|
-
const timeoutId = setTimeout(() => controller.abort(), 5000);
|
|
128
|
-
let res;
|
|
129
|
-
try {
|
|
130
|
-
res = await fetch(url, {
|
|
131
|
-
method: "POST",
|
|
132
|
-
headers: { "Content-Type": "application/json" },
|
|
133
|
-
body: JSON.stringify(body),
|
|
134
|
-
signal: controller.signal,
|
|
135
|
-
});
|
|
136
|
-
}
|
|
137
|
-
finally {
|
|
138
|
-
clearTimeout(timeoutId);
|
|
139
|
-
}
|
|
174
|
+
const res = await postStartupBody(url, body);
|
|
140
175
|
const text = await res.text();
|
|
141
176
|
if (!res.ok) {
|
|
142
177
|
console.error(`[optimus-tool-call] startup metadata sync failed ${res.status}: ${text ? text.slice(0, 240) : res.statusText}`);
|
|
143
178
|
recordStartupSyncAttemptEnd(false);
|
|
144
179
|
return;
|
|
145
180
|
}
|
|
146
|
-
|
|
147
|
-
try {
|
|
148
|
-
parsed = JSON.parse(text);
|
|
149
|
-
}
|
|
150
|
-
catch {
|
|
151
|
-
recordStartupSyncAttemptEnd(false);
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
if (parsed.status === "key_issued" && typeof parsed.key === "string") {
|
|
155
|
-
persistAuthKey(parsed.key, typeof parsed.key_id === "string" ? parsed.key_id : null, hardwareUuid, { authRelativePath: OPTIMUS_AUTH_KEY_RELATIVE_PATH });
|
|
156
|
-
resetToolCallAuthCache();
|
|
157
|
-
}
|
|
158
|
-
persistCollectPromptsFromResponse(parsed);
|
|
159
|
-
recordStartupSyncAttemptEnd(true);
|
|
181
|
+
recordStartupSyncAttemptEnd(applyStartupResponse(text, hardwareUuid));
|
|
160
182
|
}
|
|
161
183
|
catch (err) {
|
|
162
184
|
console.error(`[optimus-tool-call] startup metadata sync error: ${err instanceof Error ? err.message : String(err)}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"startup-sync.js","sourceRoot":"","sources":["../../src/lib/startup-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,uBAAuB,EACvB,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,iBAAiB,GAClB,MAAM,WAAW,CAAC;AAEnB,OAAO,EAAE,8BAA8B,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,iCAAiC,EAAE,MAAM,+BAA+B,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAoB,MAAM,mBAAmB,CAAC;AACzE,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,EAAE,MAAM,SAAS,CAAC;AACzB,OAAO,IAAI,MAAM,WAAW,CAAC;AAE7B,MAAM,gBAAgB,GAAG,GAAgB,EAAE,CAAC,CAAC;IAC3C,aAAa,EAAE,EAAE;IACjB,WAAW,EAAE,EAAE;IACf,YAAY,EAAE,EAAE;IAChB,YAAY,EAAE,EAAE;IAChB,eAAe,EAAE,EAAE;IACnB,YAAY,EAAE,EAAE;IAChB,YAAY,EAAE,EAAE;CACjB,CAAC,CAAC;AAEH,MAAM,gCAAgC,GAAG,OAAS,CAAC;AACnD,MAAM,oCAAoC,GAAG,IAAK,CAAC;AACnD,MAAM,mCAAmC,GAAG,MAAO,CAAC;AAEpD,IAAI,yBAAyB,GAAG,CAAC,CAAC;AAClC,8EAA8E;AAC9E,IAAI,oBAAoB,GAAG,IAAI,CAAC;AAChC,IAAI,wBAAwB,GAAG,CAAC,CAAC;AAEjC,SAAS,2BAA2B,CAAC,EAAW;IAC9C,yBAAyB,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC;IACvC,oBAAoB,GAAG,EAAE,CAAC;IAC1B,IAAI,EAAE,EAAE,CAAC;QACP,wBAAwB,GAAG,CAAC,CAAC;IAC/B,CAAC;SAAM,CAAC;QACN,wBAAwB,IAAI,CAAC,CAAC;IAChC,CAAC;AACH,CAAC;AAED,SAAS,kCAAkC,CAAC,GAAW,EAAE,UAAkB;IACzE,IAAI,yBAAyB,IAAI,CAAC;QAAE,OAAO,KAAK,CAAC;IACjD,MAAM,gBAAgB,GAAG,CAAC,oBAAoB;QAC5C,CAAC,CAAC,IAAI,CAAC,GAAG,CACN,mCAAmC,EACnC,oCAAoC;YAClC,CAAC,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,wBAAwB,GAAG,CAAC,CAAC,EAAE,CAAC,CAAC,CAC9D;QACH,CAAC,CAAC,CAAC,CAAC;IACN,MAAM,iBAAiB,GAAG,oBAAoB,IAAI,UAAU,GAAG,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,CAAC;IAClF,MAAM,UAAU,GAAG,IAAI,CAAC,GAAG,CAAC,gBAAgB,EAAE,iBAAiB,CAAC,CAAC;IACjE,OAAO,UAAU,GAAG,CAAC,IAAI,GAAG,GAAG,yBAAyB,GAAG,UAAU,CAAC;AACxE,CAAC;AAED,SAAS,oBAAoB;IAC3B,MAAM,QAAQ,GAAG,CAAC,OAAO,CAAC,GAAG,CAAC,yBAAyB,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACtE,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,IAAI,CAAC;QACH,MAAM,WAAW,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,cAAc,EAAE,YAAY,EAAE,KAAK,EAAE,uBAAuB,CAAC,CAAC;QAC1G,OAAO,EAAE,CAAC,YAAY,CAAC,WAAW,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IACrD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,CAAC;IACZ,CAAC;AACH,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"startup-sync.js","sourceRoot":"","sources":["../../src/lib/startup-sync.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-event.d.ts","sourceRoot":"","sources":["../../../src/lib/telemetry/build-event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;
|
|
1
|
+
{"version":3,"file":"build-event.d.ts","sourceRoot":"","sources":["../../../src/lib/telemetry/build-event.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AA2EjE;;;;;;GAMG;AACH,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,cAAc,GAAG,IAAI,GAAG,SAAS,EACtC,aAAa,GAAE,MAAkB,EACjC,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,GACxB,cAAc,GAAG,IAAI,CA6BvB"}
|
|
@@ -1,5 +1,75 @@
|
|
|
1
|
-
import { readCollectPrompts } from "../prompt-collection-policy.js";
|
|
1
|
+
import { readCollectPrompts, readFingerprintKey } from "../prompt-collection-policy.js";
|
|
2
2
|
import { applyPromptCollectionToMetadata } from "./prompt-privacy.js";
|
|
3
|
+
import os from "node:os";
|
|
4
|
+
import { readLogin } from "../login.js";
|
|
5
|
+
import { readAgentProduct, readCopilotProduct } from "../transcript.js";
|
|
6
|
+
/**
|
|
7
|
+
* Every Optimus hook's hash for this agent, from the tool-call hook (OPTIMUS_HOOK_MANIFEST,
|
|
8
|
+
* `{"<agent>/<hook>": "<sha256>"}`), or null when absent or malformed. It travels inside the signed
|
|
9
|
+
* events, so the server can record a tampered or restored hook at this tool call.
|
|
10
|
+
*/
|
|
11
|
+
function hookManifest() {
|
|
12
|
+
const raw = (process.env.OPTIMUS_HOOK_MANIFEST || "").trim();
|
|
13
|
+
if (!raw)
|
|
14
|
+
return null;
|
|
15
|
+
try {
|
|
16
|
+
const parsed = JSON.parse(raw);
|
|
17
|
+
if (!parsed || typeof parsed !== "object" || Array.isArray(parsed))
|
|
18
|
+
return null;
|
|
19
|
+
const entries = Object.entries(parsed).filter((entry) => typeof entry[1] === "string" && entry[1] !== "");
|
|
20
|
+
return entries.length ? Object.fromEntries(entries) : null;
|
|
21
|
+
}
|
|
22
|
+
catch {
|
|
23
|
+
return null;
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
/**
|
|
27
|
+
* The macOS account running the agent, read on every event: after a handover, or from a second
|
|
28
|
+
* account on the same Mac, the event carries who ran it rather than whoever last synced the
|
|
29
|
+
* machine's profile. Left out if the account cannot be looked up.
|
|
30
|
+
*/
|
|
31
|
+
function osUser() {
|
|
32
|
+
try {
|
|
33
|
+
const { uid, username } = os.userInfo();
|
|
34
|
+
return username ? { uid, username } : null;
|
|
35
|
+
}
|
|
36
|
+
catch {
|
|
37
|
+
return null;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Which product of the agent's family ran the tool (OPT-1488). Codex's CLI, desktop app, ChatGPT
|
|
42
|
+
* Work and VS Code send identical hook fields, so it is read from the session file Codex names in
|
|
43
|
+
* `transcript_path`; Copilot's from its session folder or VS Code's transcript.
|
|
44
|
+
*/
|
|
45
|
+
function agentProduct(inv, agentIdentity) {
|
|
46
|
+
const transcriptPath = inv.raw_event?.transcript_path;
|
|
47
|
+
let product = null;
|
|
48
|
+
if (agentIdentity === "codex" && typeof transcriptPath === "string") {
|
|
49
|
+
product = readAgentProduct(transcriptPath);
|
|
50
|
+
}
|
|
51
|
+
else if (agentIdentity === "copilot") {
|
|
52
|
+
product = readCopilotProduct(inv.session_id, typeof transcriptPath === "string" ? transcriptPath : null);
|
|
53
|
+
}
|
|
54
|
+
return product ? { agent_product: product } : {};
|
|
55
|
+
}
|
|
56
|
+
/** The metadata fields an invocation only sometimes has, each left out when empty. */
|
|
57
|
+
function optionalMetadata(inv, agentIdentity) {
|
|
58
|
+
const hookHash = (process.env.OPTIMUS_HOOK_HASH || "").trim() || null;
|
|
59
|
+
const manifest = hookManifest();
|
|
60
|
+
// Tenant and email the agent is signed in with, read on every call; absent when unreadable.
|
|
61
|
+
const login = readLogin(agentIdentity);
|
|
62
|
+
const account = osUser();
|
|
63
|
+
return {
|
|
64
|
+
...(inv.user_prompt ? { user_prompt: inv.user_prompt } : {}),
|
|
65
|
+
...(inv.raw_event ? { raw_event: inv.raw_event } : {}),
|
|
66
|
+
...agentProduct(inv, agentIdentity),
|
|
67
|
+
...(hookHash ? { hook_hash: hookHash } : {}),
|
|
68
|
+
...(manifest ? { hook_manifest: manifest } : {}),
|
|
69
|
+
...(login ? { login } : {}),
|
|
70
|
+
...(account ? { os_user: account } : {}),
|
|
71
|
+
};
|
|
72
|
+
}
|
|
3
73
|
/**
|
|
4
74
|
* Build a telemetry event from a tool invocation.
|
|
5
75
|
*
|
|
@@ -14,14 +84,11 @@ export function buildTelemetryEvent(inv, agentIdentity = "unknown", sessionId) {
|
|
|
14
84
|
const toolName = inv.tool_name;
|
|
15
85
|
const toolNameNorm = typeof toolName === "string" ? toolName.trim() : "";
|
|
16
86
|
const normalizedToolInput = inv.tool_input || {};
|
|
17
|
-
const hookHash = (process.env.OPTIMUS_HOOK_HASH || "").trim() || null;
|
|
18
87
|
const meta = applyPromptCollectionToMetadata({
|
|
19
88
|
tool_name: toolNameNorm || toolName,
|
|
20
89
|
tool_input: normalizedToolInput,
|
|
21
|
-
...(inv
|
|
22
|
-
|
|
23
|
-
...(hookHash ? { hook_hash: hookHash } : {}),
|
|
24
|
-
}, !readCollectPrompts());
|
|
90
|
+
...optionalMetadata(inv, agentIdentity),
|
|
91
|
+
}, !readCollectPrompts(), readFingerprintKey());
|
|
25
92
|
return {
|
|
26
93
|
timestamp: new Date().toISOString(),
|
|
27
94
|
agent_identity: agentIdentity,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"build-event.js","sourceRoot":"","sources":["../../../src/lib/telemetry/build-event.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,kBAAkB,EAAE,MAAM,gCAAgC,CAAC;
|
|
1
|
+
{"version":3,"file":"build-event.js","sourceRoot":"","sources":["../../../src/lib/telemetry/build-event.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
* - user_prompt extraction (requires reading local files the backend cannot access)
|
|
12
12
|
*/
|
|
13
13
|
export interface CanonicalHookInput {
|
|
14
|
-
agent: "claude" | "cursor" | "unknown";
|
|
14
|
+
agent: "claude" | "cursor" | "codex" | "copilot" | "unknown";
|
|
15
15
|
hook_event_name: string;
|
|
16
16
|
tool_name: string;
|
|
17
17
|
tool_input: Record<string, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../../src/lib/telemetry/canonical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"canonical.d.ts","sourceRoot":"","sources":["../../../src/lib/telemetry/canonical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAMH,MAAM,WAAW,kBAAkB;IACjC,KAAK,EAAE,QAAQ,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,GAAG,SAAS,CAAC;IAC7D,eAAe,EAAE,MAAM,CAAC;IACxB,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,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACpC;AAED,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,kBAAkB,CAuBrF"}
|
|
@@ -36,30 +36,39 @@ export function normalizeToCanonical(raw) {
|
|
|
36
36
|
raw_event: rawEvent,
|
|
37
37
|
};
|
|
38
38
|
}
|
|
39
|
-
|
|
39
|
+
/** Claude hook names are PascalCase; Cursor uses camelCase. */
|
|
40
|
+
const CLAUDE_HOOK_EVENTS = new Set([
|
|
41
|
+
"PreToolUse", "SessionStart", "SessionEnd", "PostToolUse", "PostToolUseFailure", "PermissionRequest",
|
|
42
|
+
]);
|
|
43
|
+
const CURSOR_HOOK_EVENTS = new Set(["preToolUse", "beforeShellExecution", "beforePromptSubmit"]);
|
|
44
|
+
/** The agent the hook's environment names, or null when it names none. */
|
|
45
|
+
function agentFromEnv() {
|
|
46
|
+
// Codex's and Copilot's hooks say so: their payloads are shaped like Claude's, so nothing else
|
|
47
|
+
// can tell them apart. Checked first because either started from a Claude Code terminal
|
|
48
|
+
// inherits CLAUDE_CODE_SESSION_ID.
|
|
49
|
+
const named = (process.env.OPTIMUS_AGENT || "").trim().toLowerCase();
|
|
50
|
+
if (named === "codex" || named === "copilot")
|
|
51
|
+
return named;
|
|
40
52
|
// Environment variable is the most reliable signal
|
|
41
53
|
if (process.env.CLAUDE_CODE_SESSION_ID)
|
|
42
54
|
return "claude";
|
|
43
55
|
if (process.env.CURSOR_SESSION_ID || process.env.CURSOR)
|
|
44
56
|
return "cursor";
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
57
|
+
return null;
|
|
58
|
+
}
|
|
59
|
+
function detectAgent(raw) {
|
|
60
|
+
const fromEnv = agentFromEnv();
|
|
61
|
+
if (fromEnv)
|
|
62
|
+
return fromEnv;
|
|
63
|
+
const hookEventName = extractValue(raw, ["hook_event_name", "hookEventName", "hook_event"]) ?? "";
|
|
64
|
+
if (CLAUDE_HOOK_EVENTS.has(hookEventName))
|
|
50
65
|
return "claude";
|
|
51
|
-
|
|
52
|
-
if (hookEventName === "preToolUse" || hookEventName === "beforeShellExecution" ||
|
|
53
|
-
hookEventName === "beforePromptSubmit") {
|
|
66
|
+
if (CURSOR_HOOK_EVENTS.has(hookEventName))
|
|
54
67
|
return "cursor";
|
|
55
|
-
|
|
56
|
-
// Field naming convention fallback
|
|
68
|
+
// Field naming convention fallback: camelCase is Cursor; anything else (snake_case or none) is Claude.
|
|
57
69
|
if (raw.toolUse || raw.toolName || (raw.sessionId && typeof raw.sessionId === "string")) {
|
|
58
70
|
return "cursor";
|
|
59
71
|
}
|
|
60
|
-
if (raw.tool_use_id || raw.session_id || raw.hook_event_name) {
|
|
61
|
-
return "claude";
|
|
62
|
-
}
|
|
63
72
|
return "claude";
|
|
64
73
|
}
|
|
65
74
|
function extractHookEventName(raw, agent) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../../src/lib/telemetry/canonical.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,IAAI,MAAM,MAAM,CAAC;AAexB,MAAM,UAAU,oBAAoB,CAAC,GAA4B;IAC/D,MAAM,KAAK,GAAG,WAAW,CAAC,GAAG,CAAC,CAAC;IAC/B,MAAM,aAAa,GAAG,oBAAoB,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;IACvD,MAAM,QAAQ,GAAG,eAAe,CAAC,GAAG,EAAE,aAAa,CAAC,CAAC;IACrD,MAAM,SAAS,GAAG,gBAAgB,CAAC,GAAG,CAAC,CAAC;IACxC,MAAM,UAAU,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC1C,MAAM,QAAQ,GAAG,EAAE,GAAG,GAAG,EAAE,CAAC;IAC5B,OAAO,QAAQ,CAAC,WAAW,CAAC;IAC5B,OAAO,QAAQ,CAAC,UAAU,CAAC;IAC3B,OAAO,QAAQ,CAAC,MAAM,CAAC;IAEvB,OAAO;QACL,KAAK;QACL,eAAe,EAAE,aAAa;QAC9B,SAAS,EAAE,QAAQ,CAAC,SAAS;QAC7B,UAAU,EAAE,QAAQ,CAAC,UAAU;QAC/B,WAAW,EAAE,YAAY,CAAS,GAAG,EAAE,CAAC,aAAa,EAAE,WAAW,CAAC,CAAC,IAAI,IAAI;QAC5E,UAAU,EAAE,SAAS;QACrB,GAAG,EAAE,YAAY,CAAS,GAAG,EAAE,CAAC,KAAK,EAAE,kBAAkB,CAAC,CAAC,IAAI,IAAI;QACnE,KAAK,EAAE,YAAY,CAAS,GAAG,EAAE,CAAC,OAAO,CAAC,CAAC,IAAI,IAAI;QACnD,WAAW,EAAE,UAAU;QACvB,SAAS,EAAE,QAAQ;KACpB,CAAC;AACJ,CAAC;AAED,
|
|
1
|
+
{"version":3,"file":"canonical.js","sourceRoot":"","sources":["../../../src/lib/telemetry/canonical.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,5 +5,5 @@ export * from "./types.js";
|
|
|
5
5
|
export * from "./canonical.js";
|
|
6
6
|
export { eventToDict } from "./serialize.js";
|
|
7
7
|
export { buildTelemetryEvent } from "./build-event.js";
|
|
8
|
-
export { cloneToolCallMetadataForWire,
|
|
8
|
+
export { cloneToolCallMetadataForWire, WIRE_RAW_EVENT_KEYS, WIRE_TOOL_CALL_METADATA_KEYS, } from "./wire-metadata.js";
|
|
9
9
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/telemetry/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,4BAA4B,EAC5B,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/telemetry/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,oBAAoB,CAAC"}
|
|
@@ -5,5 +5,5 @@ export * from "./types.js";
|
|
|
5
5
|
export * from "./canonical.js";
|
|
6
6
|
export { eventToDict } from "./serialize.js";
|
|
7
7
|
export { buildTelemetryEvent } from "./build-event.js";
|
|
8
|
-
export { cloneToolCallMetadataForWire,
|
|
8
|
+
export { cloneToolCallMetadataForWire, WIRE_RAW_EVENT_KEYS, WIRE_TOOL_CALL_METADATA_KEYS, } from "./wire-metadata.js";
|
|
9
9
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/telemetry/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,4BAA4B,EAC5B,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/telemetry/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,cAAc,YAAY,CAAC;AAC3B,cAAc,gBAAgB,CAAC;AAC/B,OAAO,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EACL,4BAA4B,EAC5B,mBAAmB,EACnB,4BAA4B,GAC7B,MAAM,oBAAoB,CAAC"}
|
|
@@ -1,5 +1,11 @@
|
|
|
1
1
|
export declare const RAW_EVENT_PROMPT_KEYS: readonly ["user_prompt", "userPrompt", "prompt"];
|
|
2
2
|
export declare function sha256UserPrompt(text: string): string;
|
|
3
|
+
/**
|
|
4
|
+
* The prompt's grouping hash: HMAC-SHA256 under the org key once it has arrived, so a short prompt
|
|
5
|
+
* cannot be recovered by hashing guesses; plain SHA-256 before then (the first run after the
|
|
6
|
+
* upgrade), as before. Either is 64 hex characters, which the backend stores as sent.
|
|
7
|
+
*/
|
|
8
|
+
export declare function hashUserPrompt(text: string, orgKey?: string): string;
|
|
3
9
|
export declare function stripRawEventPromptFields(rawEvent: Record<string, unknown> | undefined | null): Record<string, unknown> | undefined;
|
|
4
|
-
export declare function applyPromptCollectionToMetadata(meta: Record<string, unknown>, hashPrompts: boolean): Record<string, unknown>;
|
|
10
|
+
export declare function applyPromptCollectionToMetadata(meta: Record<string, unknown>, hashPrompts: boolean, orgKey?: string): Record<string, unknown>;
|
|
5
11
|
//# sourceMappingURL=prompt-privacy.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"prompt-privacy.d.ts","sourceRoot":"","sources":["../../../src/lib/telemetry/prompt-privacy.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB,kDAAmD,CAAC;AAEtF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,GACnD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CASrC;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,WAAW,EAAE,OAAO,
|
|
1
|
+
{"version":3,"file":"prompt-privacy.d.ts","sourceRoot":"","sources":["../../../src/lib/telemetry/prompt-privacy.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,qBAAqB,kDAAmD,CAAC;AAEtF,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAErD;AAED;;;;GAIG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAGpE;AAED,wBAAgB,yBAAyB,CACvC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,GACnD,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,CASrC;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,EAC7B,WAAW,EAAE,OAAO,EACpB,MAAM,CAAC,EAAE,MAAM,GACd,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAkBzB"}
|
|
@@ -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"}
|
|
@@ -31,6 +31,24 @@ export interface TelemetryEvent {
|
|
|
31
31
|
user_prompt_hash?: string | null;
|
|
32
32
|
raw_event?: Record<string, unknown>;
|
|
33
33
|
hook_hash?: string | null;
|
|
34
|
+
/** Every Optimus hook's hash for this agent, `{"<agent>/<hook>": "<sha256>"}`. */
|
|
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
|
+
};
|
|
47
|
+
/** Which Codex product ran the tool, from its session file (OPT-1488). */
|
|
48
|
+
agent_product?: {
|
|
49
|
+
originator: string;
|
|
50
|
+
version?: string;
|
|
51
|
+
};
|
|
34
52
|
};
|
|
35
53
|
}
|
|
36
54
|
//# sourceMappingURL=types.d.ts.map
|
|
@@ -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;
|
|
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", "agent_product"];
|
|
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,yJAW/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"}
|