@optimuslabs/runtime 0.3.4 → 0.3.10
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/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/telemetry/build-event.d.ts.map +1 -1
- package/dist/lib/telemetry/build-event.js +54 -4
- 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/types.d.ts +7 -0
- package/dist/lib/telemetry/types.d.ts.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/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/telemetry.test.js +57 -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/package.json +1 -1
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
import fs from "fs";
|
|
2
|
+
/** Context Codex injects as "user" messages; never what the person typed. */
|
|
3
|
+
const CODEX_INJECTED_PREFIXES = ["# AGENTS.md instructions", "<environment_context>", "<user_instructions>"];
|
|
4
|
+
/** The `text` of every block of this type, joined by newlines and trimmed. */
|
|
5
|
+
function joinTextBlocks(blocks, type) {
|
|
6
|
+
return (Array.isArray(blocks) ? blocks : [])
|
|
7
|
+
.filter((c) => c.type === type && typeof c.text === "string")
|
|
8
|
+
.map((c) => c.text)
|
|
9
|
+
.join("\n")
|
|
10
|
+
.trim();
|
|
11
|
+
}
|
|
12
|
+
/** A Codex user message's text, or null for Codex's injected context (AGENTS.md, <environment_context>). */
|
|
13
|
+
function codexPrompt(payload) {
|
|
14
|
+
const text = joinTextBlocks(payload.content, "input_text");
|
|
15
|
+
return text && !CODEX_INJECTED_PREFIXES.some((prefix) => text.startsWith(prefix)) ? text : null;
|
|
16
|
+
}
|
|
17
|
+
/** A Claude user message's text, or null for an empty one or a tool_result turn. */
|
|
18
|
+
function claudePrompt(msg) {
|
|
19
|
+
const content = msg.content;
|
|
20
|
+
if (typeof content === "string")
|
|
21
|
+
return content.trim() || null;
|
|
22
|
+
if (!Array.isArray(content))
|
|
23
|
+
return null;
|
|
24
|
+
const blocks = content;
|
|
25
|
+
// Skip tool_result turns — those are API feedback, not user-typed messages
|
|
26
|
+
if (blocks.some((c) => c.type === "tool_result"))
|
|
27
|
+
return null;
|
|
28
|
+
return joinTextBlocks(blocks, "text") || null;
|
|
29
|
+
}
|
|
30
|
+
/** What the person typed in this transcript entry, or null when it is not a typed user message. */
|
|
31
|
+
function promptFromEntry(entry) {
|
|
32
|
+
// Codex rollout: {"type":"response_item","payload":{"type":"message","role":"user",
|
|
33
|
+
// "content":[{"type":"input_text","text":...}]}}.
|
|
34
|
+
const payload = entry.payload;
|
|
35
|
+
if (entry.type === "response_item" && payload?.type === "message" && payload.role === "user") {
|
|
36
|
+
return codexPrompt(payload);
|
|
37
|
+
}
|
|
38
|
+
// Copilot CLI and Copilot app session events: {"type":"user.message","data":{"content":...}}.
|
|
39
|
+
if (entry.type === "user.message") {
|
|
40
|
+
const content = entry.data?.content;
|
|
41
|
+
return typeof content === "string" ? content.trim() || null : null;
|
|
42
|
+
}
|
|
43
|
+
const msg = entry.message;
|
|
44
|
+
if (entry.type !== "user" || !msg || msg.role !== "user")
|
|
45
|
+
return null;
|
|
46
|
+
return claudePrompt(msg);
|
|
47
|
+
}
|
|
48
|
+
function promptFromLine(line) {
|
|
49
|
+
try {
|
|
50
|
+
return promptFromEntry(JSON.parse(line));
|
|
51
|
+
}
|
|
52
|
+
catch {
|
|
53
|
+
// skip malformed lines
|
|
54
|
+
return null;
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
/** Bytes read from the end of a transcript at a time. */
|
|
58
|
+
const TAIL_CHUNK_BYTES = 2 * 1024 * 1024;
|
|
59
|
+
const NEWLINE = 0x0a;
|
|
60
|
+
/** The prompt on this JSONL line, if it is one the person typed. */
|
|
61
|
+
function promptFromBytes(bytes) {
|
|
62
|
+
const line = bytes.toString("utf-8").trim();
|
|
63
|
+
return line ? promptFromLine(line) : null;
|
|
64
|
+
}
|
|
65
|
+
/** Where the last newline before `end` is in `chunk`, or -1. */
|
|
66
|
+
function lastNewline(chunk, end) {
|
|
67
|
+
return end > 0 ? chunk.lastIndexOf(NEWLINE, end - 1) : -1;
|
|
68
|
+
}
|
|
69
|
+
/**
|
|
70
|
+
* The transcript's lines, last first, read backwards a chunk at a time. Lines are split on newline
|
|
71
|
+
* bytes, which never occur inside a multi-byte character, so a character is never cut.
|
|
72
|
+
*/
|
|
73
|
+
function* linesFromEnd(fd) {
|
|
74
|
+
let position = fs.fstatSync(fd).size;
|
|
75
|
+
// The end of the line being read, whose start is further back in the file.
|
|
76
|
+
let tail = [];
|
|
77
|
+
while (position > 0) {
|
|
78
|
+
const length = Math.min(TAIL_CHUNK_BYTES, position);
|
|
79
|
+
position -= length;
|
|
80
|
+
const chunk = Buffer.alloc(length);
|
|
81
|
+
let end = fs.readSync(fd, chunk, 0, length, position);
|
|
82
|
+
for (let newline = lastNewline(chunk, end); newline >= 0; newline = lastNewline(chunk, end)) {
|
|
83
|
+
yield Buffer.concat([chunk.subarray(newline + 1, end), ...tail]);
|
|
84
|
+
tail = [];
|
|
85
|
+
end = newline;
|
|
86
|
+
}
|
|
87
|
+
tail.unshift(chunk.subarray(0, end));
|
|
88
|
+
}
|
|
89
|
+
yield Buffer.concat(tail);
|
|
90
|
+
}
|
|
91
|
+
/** The first line from the end that the person typed. */
|
|
92
|
+
function lastPromptIn(fd) {
|
|
93
|
+
for (const line of linesFromEnd(fd)) {
|
|
94
|
+
const prompt = promptFromBytes(line);
|
|
95
|
+
if (prompt)
|
|
96
|
+
return prompt;
|
|
97
|
+
}
|
|
98
|
+
return null;
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* The last prompt the person typed. Read from the end, because the latest prompt is near it: the
|
|
102
|
+
* cost stays the same however large the transcript grows. Reading the whole file into one string
|
|
103
|
+
* failed outright past Node's string limit (about 512 MB) and took seconds on every tool call well
|
|
104
|
+
* before that.
|
|
105
|
+
*/
|
|
106
|
+
export function readLastUserPrompt(transcriptPath) {
|
|
107
|
+
let fd;
|
|
108
|
+
try {
|
|
109
|
+
fd = fs.openSync(transcriptPath, "r");
|
|
110
|
+
return lastPromptIn(fd);
|
|
111
|
+
}
|
|
112
|
+
catch (error) {
|
|
113
|
+
// A missing or unreadable transcript is non-fatal: the tool call goes out without a prompt.
|
|
114
|
+
if (process.env.OPTIMUS_DEBUG)
|
|
115
|
+
console.error("[optimus-tool-call] Could not read the transcript:", error);
|
|
116
|
+
return null;
|
|
117
|
+
}
|
|
118
|
+
finally {
|
|
119
|
+
if (fd !== undefined)
|
|
120
|
+
fs.closeSync(fd);
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
/** Bytes read from the start of a Codex session file, where its session metadata sits. */
|
|
124
|
+
const SESSION_HEAD_BYTES = 8 * 1024;
|
|
125
|
+
/**
|
|
126
|
+
* The product that wrote this Codex session (OPT-1488), from its `session_meta` line: `originator`
|
|
127
|
+
* is `codex-tui` (CLI), `Codex Desktop`, `codex_work_desktop` (ChatGPT Work) or `codex_vscode`, and
|
|
128
|
+
* `cli_version` is that product's engine. Inventory lists ChatGPT Work from it, since Work has no
|
|
129
|
+
* install of its own. Only the start is read, by pattern: the first line also carries Codex's
|
|
130
|
+
* instructions and runs to tens of KB, so it is not parsed whole. Null for any other transcript.
|
|
131
|
+
*/
|
|
132
|
+
export function readAgentProduct(transcriptPath) {
|
|
133
|
+
let fd;
|
|
134
|
+
try {
|
|
135
|
+
fd = fs.openSync(transcriptPath, "r");
|
|
136
|
+
const head = Buffer.alloc(SESSION_HEAD_BYTES);
|
|
137
|
+
const read = fs.readSync(fd, head, 0, SESSION_HEAD_BYTES, 0);
|
|
138
|
+
const text = head.subarray(0, read).toString("utf8");
|
|
139
|
+
const firstLine = text.split("\n", 1)[0];
|
|
140
|
+
if (!/"type"\s*:\s*"session_meta"/.test(firstLine))
|
|
141
|
+
return null;
|
|
142
|
+
const originator = firstLine.match(/"originator"\s*:\s*"([^"\\]{1,100})"/)?.[1];
|
|
143
|
+
if (!originator)
|
|
144
|
+
return null;
|
|
145
|
+
const version = firstLine.match(/"cli_version"\s*:\s*"([^"\\]{1,100})"/)?.[1];
|
|
146
|
+
return version ? { originator, version } : { originator };
|
|
147
|
+
}
|
|
148
|
+
catch (error) {
|
|
149
|
+
// A missing or unreadable transcript is non-fatal: the tool call goes out without a product.
|
|
150
|
+
if (process.env.OPTIMUS_DEBUG)
|
|
151
|
+
console.error("[optimus-tool-call] Could not read the session head:", error);
|
|
152
|
+
return null;
|
|
153
|
+
}
|
|
154
|
+
finally {
|
|
155
|
+
if (fd !== undefined)
|
|
156
|
+
fs.closeSync(fd);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/** A Copilot product's first event and settings files, read from the start only. */
|
|
160
|
+
const COPILOT_HEAD_BYTES = 8 * 1024;
|
|
161
|
+
function readFileHead(filePath) {
|
|
162
|
+
let fd;
|
|
163
|
+
try {
|
|
164
|
+
fd = fs.openSync(filePath, "r");
|
|
165
|
+
const head = Buffer.alloc(COPILOT_HEAD_BYTES);
|
|
166
|
+
return head.subarray(0, fs.readSync(fd, head, 0, COPILOT_HEAD_BYTES, 0)).toString("utf8");
|
|
167
|
+
}
|
|
168
|
+
catch (error) {
|
|
169
|
+
// A missing or unreadable file is non-fatal: the tool call goes out without a product.
|
|
170
|
+
if (process.env.OPTIMUS_DEBUG)
|
|
171
|
+
console.error("[optimus-tool-call] Could not read the Copilot session:", error);
|
|
172
|
+
return "";
|
|
173
|
+
}
|
|
174
|
+
finally {
|
|
175
|
+
if (fd !== undefined)
|
|
176
|
+
fs.closeSync(fd);
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
/** `copilotVersion` from a Copilot session's first event (`session.start`). */
|
|
180
|
+
function copilotVersion(eventsPath) {
|
|
181
|
+
return readFileHead(eventsPath).match(/"copilotVersion"\s*:\s*"([^"\\]{1,100})"/)?.[1];
|
|
182
|
+
}
|
|
183
|
+
/** `~/.copilot/session-state/<session id>`, shared by the CLI and the Copilot app, or null for an id that is not one. */
|
|
184
|
+
function copilotSessionDir(sessionId, home) {
|
|
185
|
+
if (!sessionId || !/^[A-Za-z0-9-]{8,64}$/.test(sessionId) || !home)
|
|
186
|
+
return null;
|
|
187
|
+
return `${home}/.copilot/session-state/${sessionId}`;
|
|
188
|
+
}
|
|
189
|
+
/**
|
|
190
|
+
* The events file of a Copilot CLI or Copilot app session, where the person's prompts are kept.
|
|
191
|
+
* These products send no `transcript_path`, so this is where their prompt is read from.
|
|
192
|
+
*/
|
|
193
|
+
export function copilotSessionEventsPath(sessionId, home = process.env.HOME || "") {
|
|
194
|
+
const sessionDir = copilotSessionDir(sessionId, home);
|
|
195
|
+
return sessionDir ? `${sessionDir}/events.jsonl` : null;
|
|
196
|
+
}
|
|
197
|
+
/**
|
|
198
|
+
* Which GitHub Copilot product ran the tool (OPT-1488). VS Code's Copilot Chat keeps its sessions
|
|
199
|
+
* in VS Code's own storage and names it in `transcript_path`. The CLI and the GitHub Copilot app
|
|
200
|
+
* share `~/.copilot/session-state/<session id>/`, whose `workspace.yaml` names the client:
|
|
201
|
+
* `github/cli` or `github/autopilot` (the app). Null when neither can be read.
|
|
202
|
+
*/
|
|
203
|
+
export function readCopilotProduct(sessionId, transcriptPath, home = process.env.HOME || "") {
|
|
204
|
+
if (typeof transcriptPath === "string" && transcriptPath.includes("/GitHub.copilot-chat/")) {
|
|
205
|
+
const version = copilotVersion(transcriptPath);
|
|
206
|
+
return version ? { originator: "vscode", version } : { originator: "vscode" };
|
|
207
|
+
}
|
|
208
|
+
const sessionDir = copilotSessionDir(sessionId, home);
|
|
209
|
+
if (!sessionDir)
|
|
210
|
+
return null;
|
|
211
|
+
const originator = readFileHead(`${sessionDir}/workspace.yaml`).match(/^client_name:\s*(\S{1,100})\s*$/m)?.[1];
|
|
212
|
+
if (!originator)
|
|
213
|
+
return null;
|
|
214
|
+
const version = copilotVersion(`${sessionDir}/events.jsonl`);
|
|
215
|
+
return version ? { originator, version } : { originator };
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=transcript.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"transcript.js","sourceRoot":"","sources":["../../src/lib/transcript.ts"],"names":[],"mappings":"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"}
|
|
@@ -9,7 +9,9 @@ beforeEach(() => {
|
|
|
9
9
|
CLAUDE_CODE_SESSION_ID: process.env.CLAUDE_CODE_SESSION_ID,
|
|
10
10
|
CURSOR_SESSION_ID: process.env.CURSOR_SESSION_ID,
|
|
11
11
|
CURSOR: process.env.CURSOR,
|
|
12
|
+
OPTIMUS_AGENT: process.env.OPTIMUS_AGENT,
|
|
12
13
|
};
|
|
14
|
+
delete process.env.OPTIMUS_AGENT;
|
|
13
15
|
delete process.env.CLAUDE_CODE_SESSION_ID;
|
|
14
16
|
delete process.env.CURSOR_SESSION_ID;
|
|
15
17
|
delete process.env.CURSOR;
|
|
@@ -136,4 +138,42 @@ test("normalizeToCanonical - Handles missing fields gracefully", () => {
|
|
|
136
138
|
assert.strictEqual(canonical.session_id, null);
|
|
137
139
|
assert.strictEqual(canonical.user_prompt, null);
|
|
138
140
|
});
|
|
141
|
+
test("normalizeToCanonical - Copilot PreToolUse is Copilot, though shaped like Claude's", () => {
|
|
142
|
+
process.env.OPTIMUS_AGENT = "copilot";
|
|
143
|
+
process.env.CLAUDE_CODE_SESSION_ID = "inherited";
|
|
144
|
+
// As the Copilot CLI sends it under the PreToolUse key (OPT-1488).
|
|
145
|
+
const raw = {
|
|
146
|
+
hook_event_name: "PreToolUse",
|
|
147
|
+
session_id: "a4825a9b-e723-47a9-a07d-8a3cf1bf77f3",
|
|
148
|
+
timestamp: "2026-11-03T17:46:00.131Z",
|
|
149
|
+
cwd: "/repo",
|
|
150
|
+
tool_name: "Bash",
|
|
151
|
+
tool_input: { command: "echo CAPTURE-CLI", description: "Echo CAPTURE-CLI" },
|
|
152
|
+
};
|
|
153
|
+
const canonical = normalizeToCanonical(raw);
|
|
154
|
+
assert.strictEqual(canonical.agent, "copilot");
|
|
155
|
+
assert.strictEqual(canonical.tool_name, "Bash");
|
|
156
|
+
assert.strictEqual(canonical.tool_input.command, "echo CAPTURE-CLI");
|
|
157
|
+
assert.strictEqual(canonical.session_id, "a4825a9b-e723-47a9-a07d-8a3cf1bf77f3");
|
|
158
|
+
});
|
|
159
|
+
test("normalizeToCanonical - Codex PreToolUse is Codex, though shaped like Claude's", () => {
|
|
160
|
+
process.env.OPTIMUS_AGENT = "codex";
|
|
161
|
+
// Codex started from a Claude Code terminal inherits this; it must not win.
|
|
162
|
+
process.env.CLAUDE_CODE_SESSION_ID = "inherited";
|
|
163
|
+
const raw = {
|
|
164
|
+
hook_event_name: "PreToolUse",
|
|
165
|
+
tool_name: "Bash",
|
|
166
|
+
tool_use_id: "call_1",
|
|
167
|
+
turn_id: "turn_1",
|
|
168
|
+
tool_input: { command: "rm -rf build" },
|
|
169
|
+
session_id: "codex-session-1",
|
|
170
|
+
cwd: "/repo",
|
|
171
|
+
};
|
|
172
|
+
const canonical = normalizeToCanonical(raw);
|
|
173
|
+
assert.strictEqual(canonical.agent, "codex");
|
|
174
|
+
assert.strictEqual(canonical.hook_event_name, "PreToolUse");
|
|
175
|
+
assert.strictEqual(canonical.tool_name, "Bash");
|
|
176
|
+
assert.deepStrictEqual(canonical.tool_input, { command: "rm -rf build" });
|
|
177
|
+
assert.strictEqual(canonical.tool_use_id, "call_1");
|
|
178
|
+
});
|
|
139
179
|
//# sourceMappingURL=canonical.test.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"canonical.test.js","sourceRoot":"","sources":["../../src/test/canonical.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,WAAW,CAAC;AACxD,OAAO,MAAM,MAAM,aAAa,CAAC;AACjC,OAAO,EAAE,oBAAoB,EAA2B,MAAM,+BAA+B,CAAC;AAE9F,2EAA2E;AAC3E,+FAA+F;AAC/F,IAAI,cAAc,GAAuC,EAAE,CAAC;AAC5D,UAAU,CAAC,GAAG,EAAE;IACd,cAAc,GAAG;QACf,sBAAsB,EAAE,OAAO,CAAC,GAAG,CAAC,sBAAsB;QAC1D,iBAAiB,EAAE,OAAO,CAAC,GAAG,CAAC,iBAAiB;QAChD,MAAM,EAAE,OAAO,CAAC,GAAG,CAAC,MAAM;
|
|
1
|
+
{"version":3,"file":"canonical.test.js","sourceRoot":"","sources":["../../src/test/canonical.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.test.d.ts","sourceRoot":"","sources":["../../src/test/login.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { test, beforeEach, afterEach } 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 { readLogin } from "../lib/login.js";
|
|
7
|
+
import { buildTelemetryEvent } from "../lib/telemetry/build-event.js";
|
|
8
|
+
let home = "";
|
|
9
|
+
const saved = {};
|
|
10
|
+
beforeEach(() => {
|
|
11
|
+
home = fs.mkdtempSync(path.join(os.tmpdir(), "optimus-login-"));
|
|
12
|
+
saved.HOME = process.env.HOME;
|
|
13
|
+
saved.CLAUDE_CONFIG_DIR = process.env.CLAUDE_CONFIG_DIR;
|
|
14
|
+
process.env.HOME = home;
|
|
15
|
+
delete process.env.CLAUDE_CONFIG_DIR;
|
|
16
|
+
});
|
|
17
|
+
afterEach(() => {
|
|
18
|
+
for (const [k, v] of Object.entries(saved)) {
|
|
19
|
+
if (v === undefined)
|
|
20
|
+
delete process.env[k];
|
|
21
|
+
else
|
|
22
|
+
process.env[k] = v;
|
|
23
|
+
}
|
|
24
|
+
fs.rmSync(home, { recursive: true, force: true });
|
|
25
|
+
});
|
|
26
|
+
const writeClaude = (account) => fs.writeFileSync(path.join(home, ".claude.json"), JSON.stringify({ oauthAccount: account }));
|
|
27
|
+
test("reads Claude's tenant and email", () => {
|
|
28
|
+
writeClaude({ organizationUuid: "org-1", organizationName: "Acme", emailAddress: "ada@acme.com" });
|
|
29
|
+
assert.deepStrictEqual(readLogin("claude"), {
|
|
30
|
+
tenant_id: "org-1",
|
|
31
|
+
tenant_name: "Acme",
|
|
32
|
+
email: "ada@acme.com",
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
test("leaves out what the agent does not say", () => {
|
|
36
|
+
writeClaude({ emailAddress: "ada@acme.com" });
|
|
37
|
+
assert.deepStrictEqual(readLogin("claude"), { email: "ada@acme.com" });
|
|
38
|
+
});
|
|
39
|
+
test("reads Codex's ChatGPT workspace and email from the ID token, never the token itself", () => {
|
|
40
|
+
const claims = { email: "ada@acme.com", "https://api.openai.com/auth": { chatgpt_account_id: "ws-1" } };
|
|
41
|
+
const idToken = `x.${Buffer.from(JSON.stringify(claims)).toString("base64url")}.sig`;
|
|
42
|
+
fs.mkdirSync(path.join(home, ".codex"));
|
|
43
|
+
fs.writeFileSync(path.join(home, ".codex", "auth.json"), JSON.stringify({ tokens: { id_token: idToken } }));
|
|
44
|
+
const login = readLogin("codex");
|
|
45
|
+
assert.deepStrictEqual(login, { tenant_id: "ws-1", email: "ada@acme.com" });
|
|
46
|
+
assert.ok(!JSON.stringify(login).includes("sig"));
|
|
47
|
+
});
|
|
48
|
+
test("is null with no login, or for an agent it cannot read", () => {
|
|
49
|
+
assert.strictEqual(readLogin("claude"), null);
|
|
50
|
+
assert.strictEqual(readLogin("opencode"), null);
|
|
51
|
+
});
|
|
52
|
+
test("every tool-call event carries the login in its metadata", () => {
|
|
53
|
+
writeClaude({ organizationUuid: "org-1", emailAddress: "ada@acme.com" });
|
|
54
|
+
const event = buildTelemetryEvent({ tool_name: "Bash", tool_input: {} }, "claude", "s1");
|
|
55
|
+
assert.deepStrictEqual((event?.tool_call_metadata).login, {
|
|
56
|
+
tenant_id: "org-1",
|
|
57
|
+
email: "ada@acme.com",
|
|
58
|
+
});
|
|
59
|
+
});
|
|
60
|
+
//# sourceMappingURL=login.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"login.test.js","sourceRoot":"","sources":["../../src/test/login.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,9 @@
|
|
|
1
1
|
import { test } from "node:test";
|
|
2
2
|
import assert from "node:assert";
|
|
3
3
|
import { buildTelemetryEvent, eventToDict } from "../lib/telemetry.js";
|
|
4
|
+
import fs from "fs";
|
|
5
|
+
import os from "os";
|
|
6
|
+
import path from "path";
|
|
4
7
|
test("buildTelemetryEvent - null input returns null", () => {
|
|
5
8
|
assert.strictEqual(buildTelemetryEvent(null), null);
|
|
6
9
|
assert.strictEqual(buildTelemetryEvent(undefined), null);
|
|
@@ -198,4 +201,58 @@ test("buildTelemetryEvent - glob normal path raw", () => {
|
|
|
198
201
|
const event = buildTelemetryEvent(inv);
|
|
199
202
|
assert(event);
|
|
200
203
|
});
|
|
204
|
+
test("buildTelemetryEvent - carries every hook's hash from OPTIMUS_HOOK_MANIFEST", () => {
|
|
205
|
+
const saved = process.env.OPTIMUS_HOOK_MANIFEST;
|
|
206
|
+
try {
|
|
207
|
+
process.env.OPTIMUS_HOOK_MANIFEST = JSON.stringify({
|
|
208
|
+
"claude/optimus-tool-call": "a".repeat(64),
|
|
209
|
+
"claude/optimus-hook-common": "b".repeat(64),
|
|
210
|
+
"claude/empty": "",
|
|
211
|
+
});
|
|
212
|
+
const event = buildTelemetryEvent({ tool_name: "Read", tool_input: {} }, "claude");
|
|
213
|
+
assert.deepStrictEqual(event?.tool_call_metadata.hook_manifest, {
|
|
214
|
+
"claude/optimus-tool-call": "a".repeat(64),
|
|
215
|
+
"claude/optimus-hook-common": "b".repeat(64),
|
|
216
|
+
});
|
|
217
|
+
process.env.OPTIMUS_HOOK_MANIFEST = "not json";
|
|
218
|
+
const malformed = buildTelemetryEvent({ tool_name: "Read", tool_input: {} }, "claude");
|
|
219
|
+
assert.strictEqual(malformed?.tool_call_metadata.hook_manifest, undefined);
|
|
220
|
+
delete process.env.OPTIMUS_HOOK_MANIFEST;
|
|
221
|
+
const absent = buildTelemetryEvent({ tool_name: "Read", tool_input: {} }, "claude");
|
|
222
|
+
assert.strictEqual(absent?.tool_call_metadata.hook_manifest, undefined);
|
|
223
|
+
}
|
|
224
|
+
finally {
|
|
225
|
+
if (saved !== undefined)
|
|
226
|
+
process.env.OPTIMUS_HOOK_MANIFEST = saved;
|
|
227
|
+
else
|
|
228
|
+
delete process.env.OPTIMUS_HOOK_MANIFEST;
|
|
229
|
+
}
|
|
230
|
+
});
|
|
231
|
+
function codexSession(originator) {
|
|
232
|
+
const dir = fs.mkdtempSync(path.join(os.tmpdir(), "codex-session-"));
|
|
233
|
+
const file = path.join(dir, "rollout.jsonl");
|
|
234
|
+
const meta = { type: "session_meta", payload: { originator, cli_version: "0.166.0" } };
|
|
235
|
+
fs.writeFileSync(file, JSON.stringify(meta) + "\n");
|
|
236
|
+
return file;
|
|
237
|
+
}
|
|
238
|
+
test("buildTelemetryEvent - a Codex event says which product ran the tool", () => {
|
|
239
|
+
const inv = {
|
|
240
|
+
tool_name: "Bash",
|
|
241
|
+
tool_input: {},
|
|
242
|
+
raw_event: { transcript_path: codexSession("codex_work_desktop") },
|
|
243
|
+
};
|
|
244
|
+
const event = buildTelemetryEvent(inv, "codex");
|
|
245
|
+
assert.deepStrictEqual(event?.tool_call_metadata.agent_product, {
|
|
246
|
+
originator: "codex_work_desktop",
|
|
247
|
+
version: "0.166.0",
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
test("buildTelemetryEvent - other agents send no product", () => {
|
|
251
|
+
const inv = {
|
|
252
|
+
tool_name: "Bash",
|
|
253
|
+
tool_input: {},
|
|
254
|
+
raw_event: { transcript_path: codexSession("codex-tui") },
|
|
255
|
+
};
|
|
256
|
+
assert.strictEqual(buildTelemetryEvent(inv, "claude")?.tool_call_metadata.agent_product, undefined);
|
|
257
|
+
});
|
|
201
258
|
//# sourceMappingURL=telemetry.test.js.map
|
|
@@ -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;
|
|
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":"transcript.test.d.ts","sourceRoot":"","sources":["../../src/test/transcript.test.ts"],"names":[],"mappings":""}
|