optimus-tool-call 0.2.2 → 0.2.5
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/capture-prompt.d.ts +14 -0
- package/dist/capture-prompt.d.ts.map +1 -0
- package/dist/capture-prompt.js +173 -0
- package/dist/capture-prompt.js.map +1 -0
- package/dist/index.js +47 -91
- package/dist/index.js.map +1 -1
- package/dist/lib/endpoint-config.d.ts +1 -1
- package/dist/lib/endpoint-config.d.ts.map +1 -1
- package/dist/lib/endpoint-config.js +1 -1
- package/dist/lib/endpoint-config.js.map +1 -1
- package/dist/lib/machine-auth.d.ts +1 -1
- package/dist/lib/machine-auth.d.ts.map +1 -1
- package/dist/lib/machine-auth.js +1 -1
- package/dist/lib/machine-auth.js.map +1 -1
- package/dist/lib/startup-sync.js +1 -1
- package/dist/lib/startup-sync.js.map +1 -1
- package/dist/lib/streaming.d.ts.map +1 -1
- package/dist/lib/streaming.js +34 -7
- package/dist/lib/streaming.js.map +1 -1
- package/dist/lib/telemetry/canonical.d.ts +26 -0
- package/dist/lib/telemetry/canonical.d.ts.map +1 -0
- package/dist/lib/telemetry/canonical.js +153 -0
- package/dist/lib/telemetry/canonical.js.map +1 -0
- package/dist/lib/telemetry/index.d.ts +1 -0
- package/dist/lib/telemetry/index.d.ts.map +1 -1
- package/dist/lib/telemetry/index.js +1 -0
- package/dist/lib/telemetry/index.js.map +1 -1
- package/dist/lib/tofu.d.ts +14 -0
- package/dist/lib/tofu.d.ts.map +1 -0
- package/dist/lib/tofu.js +39 -0
- package/dist/lib/tofu.js.map +1 -0
- package/dist/test/canonical.test.d.ts +2 -0
- package/dist/test/canonical.test.d.ts.map +1 -0
- package/dist/test/canonical.test.js +117 -0
- package/dist/test/canonical.test.js.map +1 -0
- package/dist/test/endpoint-config.test.js +4 -4
- package/dist/test/endpoint-config.test.js.map +1 -1
- package/dist/test/integration-canonical.test.d.ts +2 -0
- package/dist/test/integration-canonical.test.d.ts.map +1 -0
- package/dist/test/integration-canonical.test.js +157 -0
- package/dist/test/integration-canonical.test.js.map +1 -0
- package/package.json +6 -5
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* optimus-capture-prompt — Cursor hook to capture and store prompt text
|
|
4
|
+
*
|
|
5
|
+
* Runs on beforeSubmitPrompt hook. Reads the prompt from stdin (if available),
|
|
6
|
+
* stores it in a temp file keyed by session ID, so that the tool-call hook
|
|
7
|
+
* can retrieve it when processing tool invocations.
|
|
8
|
+
*
|
|
9
|
+
* Cursor hook protocol for beforeSubmitPrompt:
|
|
10
|
+
* - stdin: JSON with prompt text (format varies by Cursor version)
|
|
11
|
+
* - stdout: {"continue": true|false} JSON
|
|
12
|
+
*/
|
|
13
|
+
export {};
|
|
14
|
+
//# sourceMappingURL=capture-prompt.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-prompt.d.ts","sourceRoot":"","sources":["../src/capture-prompt.ts"],"names":[],"mappings":";AAEA;;;;;;;;;;GAUG"}
|
|
@@ -0,0 +1,173 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
/**
|
|
3
|
+
* optimus-capture-prompt — Cursor hook to capture and store prompt text
|
|
4
|
+
*
|
|
5
|
+
* Runs on beforeSubmitPrompt hook. Reads the prompt from stdin (if available),
|
|
6
|
+
* stores it in a temp file keyed by session ID, so that the tool-call hook
|
|
7
|
+
* can retrieve it when processing tool invocations.
|
|
8
|
+
*
|
|
9
|
+
* Cursor hook protocol for beforeSubmitPrompt:
|
|
10
|
+
* - stdin: JSON with prompt text (format varies by Cursor version)
|
|
11
|
+
* - stdout: {"continue": true|false} JSON
|
|
12
|
+
*/
|
|
13
|
+
import fs from "fs";
|
|
14
|
+
import os from "os";
|
|
15
|
+
import path from "path";
|
|
16
|
+
const dbg = (...args) => { if (process.env.OPTIMUS_DEBUG)
|
|
17
|
+
console.error(...args); };
|
|
18
|
+
async function main() {
|
|
19
|
+
const stdinData = await readStdin();
|
|
20
|
+
dbg("[optimus-capture-prompt] ===== HOOK STARTED =====");
|
|
21
|
+
dbg("[optimus-capture-prompt] stdin length:", stdinData.length);
|
|
22
|
+
dbg("[optimus-capture-prompt] stdin preview:", stdinData.slice(0, 200));
|
|
23
|
+
let promptText = null;
|
|
24
|
+
let payloadSessionId = null;
|
|
25
|
+
try {
|
|
26
|
+
const raw = JSON.parse(stdinData);
|
|
27
|
+
dbg("[optimus-capture-prompt] Parsed JSON successfully");
|
|
28
|
+
dbg("[optimus-capture-prompt] Raw keys:", Object.keys(raw));
|
|
29
|
+
dbg("[optimus-capture-prompt] Raw payload:", JSON.stringify(raw, null, 2).slice(0, 500));
|
|
30
|
+
// Extract session ID for Cursor (from conversation_id or session_id in payload)
|
|
31
|
+
payloadSessionId =
|
|
32
|
+
(typeof raw.conversation_id === "string" && raw.conversation_id) ||
|
|
33
|
+
(typeof raw.session_id === "string" && raw.session_id) ||
|
|
34
|
+
null;
|
|
35
|
+
// Extract prompt from various possible locations in the hook payload
|
|
36
|
+
promptText =
|
|
37
|
+
extractValue(raw, ["prompt"]) ||
|
|
38
|
+
extractValue(raw, ["text"]) ||
|
|
39
|
+
extractValue(raw, ["message"]) ||
|
|
40
|
+
extractValue(raw, ["input"]) ||
|
|
41
|
+
null;
|
|
42
|
+
// Try to extract from nested message structure
|
|
43
|
+
if (!promptText) {
|
|
44
|
+
const msg = raw.message;
|
|
45
|
+
if (msg && typeof msg === "object") {
|
|
46
|
+
promptText =
|
|
47
|
+
extractValue(msg, ["content"]) ||
|
|
48
|
+
extractValue(msg, ["text"]) ||
|
|
49
|
+
extractValue(msg, ["prompt"]) ||
|
|
50
|
+
null;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
dbg("[optimus-capture-prompt] Extracted prompt text:", promptText ? `"${promptText.slice(0, 100)}..."` : "null");
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
// Not valid JSON — might not have prompt in this hook payload
|
|
57
|
+
console.error("[optimus-capture-prompt] Failed to parse JSON:", error);
|
|
58
|
+
}
|
|
59
|
+
// If we have a prompt, store it in a temp file keyed by session ID
|
|
60
|
+
if (promptText) {
|
|
61
|
+
dbg("[optimus-capture-prompt] Storing prompt...");
|
|
62
|
+
try {
|
|
63
|
+
const sessionId = payloadSessionId ||
|
|
64
|
+
process.env.CURSOR_SESSION_ID ||
|
|
65
|
+
process.env.CURSOR_CODE_SESSION_ID ||
|
|
66
|
+
process.env.CLAUDE_CODE_SESSION_ID ||
|
|
67
|
+
"unknown";
|
|
68
|
+
const promptCacheDir = path.join(os.tmpdir(), "optimus-prompt-cache");
|
|
69
|
+
dbg("[optimus-capture-prompt] Session ID:", sessionId);
|
|
70
|
+
dbg("[optimus-capture-prompt] Cache dir:", promptCacheDir);
|
|
71
|
+
// Create cache directory if it doesn't exist
|
|
72
|
+
if (!fs.existsSync(promptCacheDir)) {
|
|
73
|
+
dbg("[optimus-capture-prompt] Creating cache directory...");
|
|
74
|
+
fs.mkdirSync(promptCacheDir, { recursive: true });
|
|
75
|
+
}
|
|
76
|
+
// Write prompt to temp file (with short TTL via filename timestamp)
|
|
77
|
+
const timestamp = Date.now();
|
|
78
|
+
const promptFile = path.join(promptCacheDir, `prompt-${sessionId}-${timestamp}.txt`);
|
|
79
|
+
fs.writeFileSync(promptFile, promptText, "utf-8");
|
|
80
|
+
dbg(`[optimus-capture-prompt] Wrote prompt file: ${promptFile}`);
|
|
81
|
+
// Also write a "latest" symlink for easy access
|
|
82
|
+
const latestFile = path.join(promptCacheDir, `prompt-${sessionId}.txt`);
|
|
83
|
+
try {
|
|
84
|
+
fs.unlinkSync(latestFile);
|
|
85
|
+
}
|
|
86
|
+
catch {
|
|
87
|
+
// File might not exist
|
|
88
|
+
}
|
|
89
|
+
try {
|
|
90
|
+
fs.symlinkSync(promptFile, latestFile);
|
|
91
|
+
dbg(`[optimus-capture-prompt] Created symlink: ${latestFile}`);
|
|
92
|
+
}
|
|
93
|
+
catch (e) {
|
|
94
|
+
dbg(`[optimus-capture-prompt] Symlink creation failed (non-fatal):`, e);
|
|
95
|
+
}
|
|
96
|
+
dbg(`[optimus-capture-prompt] SUCCESS: Stored prompt at ${promptFile}`);
|
|
97
|
+
// Clean up old prompt files (older than 5 minutes)
|
|
98
|
+
cleanupOldPromptFiles(promptCacheDir, sessionId);
|
|
99
|
+
}
|
|
100
|
+
catch (error) {
|
|
101
|
+
// Non-fatal — if we can't cache the prompt, the tool-call hook just won't have it
|
|
102
|
+
console.error("[optimus-capture-prompt] ERROR: Failed to store prompt:", error);
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
else {
|
|
106
|
+
dbg("[optimus-capture-prompt] No prompt text found in hook payload");
|
|
107
|
+
}
|
|
108
|
+
// Always allow — never block on prompt capture
|
|
109
|
+
const response = { continue: true };
|
|
110
|
+
dbg("[optimus-capture-prompt] Returning response:", JSON.stringify(response));
|
|
111
|
+
console.log(JSON.stringify(response));
|
|
112
|
+
}
|
|
113
|
+
async function readStdin() {
|
|
114
|
+
return new Promise((resolve) => {
|
|
115
|
+
let data = "";
|
|
116
|
+
process.stdin.setEncoding("utf8");
|
|
117
|
+
process.stdin.on("readable", () => {
|
|
118
|
+
let chunk;
|
|
119
|
+
while ((chunk = process.stdin.read()) !== null) {
|
|
120
|
+
data += chunk;
|
|
121
|
+
}
|
|
122
|
+
});
|
|
123
|
+
process.stdin.on("end", () => {
|
|
124
|
+
resolve(data);
|
|
125
|
+
});
|
|
126
|
+
process.stdin.on("error", () => {
|
|
127
|
+
resolve("");
|
|
128
|
+
});
|
|
129
|
+
});
|
|
130
|
+
}
|
|
131
|
+
function extractValue(obj, keys) {
|
|
132
|
+
for (const key of keys) {
|
|
133
|
+
const value = obj[key];
|
|
134
|
+
if (value !== undefined && value !== null && typeof value === "string") {
|
|
135
|
+
return value;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
return null;
|
|
139
|
+
}
|
|
140
|
+
function cleanupOldPromptFiles(dir, sessionId) {
|
|
141
|
+
try {
|
|
142
|
+
const files = fs.readdirSync(dir);
|
|
143
|
+
const now = Date.now();
|
|
144
|
+
const maxAge = 5 * 60 * 1000; // 5 minutes
|
|
145
|
+
for (const file of files) {
|
|
146
|
+
// Only clean up files for this session
|
|
147
|
+
if (!file.startsWith(`prompt-${sessionId}-`))
|
|
148
|
+
continue;
|
|
149
|
+
const filePath = path.join(dir, file);
|
|
150
|
+
try {
|
|
151
|
+
const stat = fs.statSync(filePath);
|
|
152
|
+
if (now - stat.mtimeMs > maxAge) {
|
|
153
|
+
fs.unlinkSync(filePath);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
catch {
|
|
157
|
+
// Ignore errors during cleanup
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
catch {
|
|
162
|
+
// Ignore errors during cleanup
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
main().catch((err) => {
|
|
166
|
+
if (process.env.OPTIMUS_DEBUG) {
|
|
167
|
+
console.error("[optimus-capture-prompt] Fatal error:", err);
|
|
168
|
+
}
|
|
169
|
+
const response = { continue: true };
|
|
170
|
+
console.log(JSON.stringify(response));
|
|
171
|
+
process.exit(0);
|
|
172
|
+
});
|
|
173
|
+
//# sourceMappingURL=capture-prompt.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"capture-prompt.js","sourceRoot":"","sources":["../src/capture-prompt.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -8,43 +8,70 @@
|
|
|
8
8
|
import fs from "fs";
|
|
9
9
|
import { buildTelemetryEvent, eventToDict } from "./lib/telemetry.js";
|
|
10
10
|
import { queueEvent, ensureShutdown } from "./lib/streaming.js";
|
|
11
|
+
import { normalizeToCanonical } from "./lib/telemetry/canonical.js";
|
|
12
|
+
const dbg = (...args) => { if (process.env.OPTIMUS_DEBUG)
|
|
13
|
+
console.error(...args); };
|
|
11
14
|
async function main() {
|
|
15
|
+
dbg("[optimus-tool-call] ===== HOOK STARTED =====");
|
|
16
|
+
dbg("[optimus-tool-call] NODE_ENV:", process.env.NODE_ENV);
|
|
17
|
+
dbg("[optimus-tool-call] CURSOR:", process.env.CURSOR);
|
|
18
|
+
dbg("[optimus-tool-call] CURSOR_SESSION_ID:", process.env.CURSOR_SESSION_ID);
|
|
19
|
+
dbg("[optimus-tool-call] CLAUDE_CODE_SESSION_ID:", process.env.CLAUDE_CODE_SESSION_ID);
|
|
12
20
|
// Setup shutdown handling
|
|
13
21
|
ensureShutdown();
|
|
14
22
|
// Read stdin
|
|
15
23
|
const stdinData = await readStdin();
|
|
16
|
-
|
|
17
|
-
|
|
24
|
+
dbg("[optimus-tool-call] stdin length:", stdinData.length);
|
|
25
|
+
dbg("[optimus-tool-call] stdin preview:", stdinData.slice(0, 300));
|
|
26
|
+
// Parse and normalize to canonical format
|
|
27
|
+
let canonical;
|
|
18
28
|
try {
|
|
19
29
|
const raw = JSON.parse(stdinData);
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
dbg("[optimus-tool-call] Parsed JSON successfully");
|
|
31
|
+
dbg("[optimus-tool-call] Raw keys:", Object.keys(raw));
|
|
32
|
+
// Normalize to canonical format (works for both Claude and Cursor)
|
|
33
|
+
canonical = normalizeToCanonical(raw);
|
|
34
|
+
dbg("[optimus-tool-call] Detected agent:", canonical.agent);
|
|
35
|
+
dbg("[optimus-tool-call] Hook event name:", canonical.hook_event_name);
|
|
36
|
+
dbg("[optimus-tool-call] Tool name:", canonical.tool_name);
|
|
37
|
+
// Try to extract user prompt from transcript file (works for both Claude and Cursor)
|
|
38
|
+
if (!canonical.user_prompt) {
|
|
39
|
+
const transcriptPath = typeof raw.transcript_path === "string" ? raw.transcript_path : null;
|
|
40
|
+
if (transcriptPath) {
|
|
41
|
+
const userPrompt = readLastUserPrompt(transcriptPath);
|
|
42
|
+
if (userPrompt) {
|
|
43
|
+
canonical = { ...canonical, user_prompt: userPrompt };
|
|
44
|
+
}
|
|
31
45
|
}
|
|
32
46
|
}
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
47
|
+
dbg("[optimus-tool-call] Canonical event:", {
|
|
48
|
+
agent: canonical.agent,
|
|
49
|
+
hook_event_name: canonical.hook_event_name,
|
|
50
|
+
tool_name: canonical.tool_name,
|
|
51
|
+
user_prompt_preview: canonical.user_prompt?.slice(0, 100),
|
|
52
|
+
});
|
|
38
53
|
}
|
|
39
54
|
catch (error) {
|
|
40
55
|
// Invalid JSON or parse error — allow and return
|
|
56
|
+
console.error("[optimus-tool-call] ERROR: Failed to parse:", error);
|
|
41
57
|
const response = { continue: true, permission: "allow" };
|
|
42
58
|
console.log(JSON.stringify(response));
|
|
43
59
|
return;
|
|
44
60
|
}
|
|
61
|
+
// Convert canonical to ToolInvocation (for backward compatibility with existing code)
|
|
62
|
+
const invocation = {
|
|
63
|
+
tool_name: canonical.tool_name,
|
|
64
|
+
tool_input: canonical.tool_input,
|
|
65
|
+
tool_use_id: canonical.tool_use_id,
|
|
66
|
+
session_id: canonical.session_id,
|
|
67
|
+
cwd: canonical.cwd,
|
|
68
|
+
hook_event_name: canonical.hook_event_name,
|
|
69
|
+
model: canonical.model,
|
|
70
|
+
user_prompt: canonical.user_prompt,
|
|
71
|
+
raw_event: canonical.raw_event,
|
|
72
|
+
};
|
|
45
73
|
// Build telemetry event
|
|
46
|
-
const
|
|
47
|
-
const event = buildTelemetryEvent(invocation, agentIdentity, invocation.session_id);
|
|
74
|
+
const event = buildTelemetryEvent(invocation, canonical.agent, canonical.session_id);
|
|
48
75
|
if (event) {
|
|
49
76
|
// Server classifies `action_type`; queue raw invocation for all non-null events.
|
|
50
77
|
await queueEvent(event);
|
|
@@ -78,59 +105,6 @@ async function readStdin() {
|
|
|
78
105
|
});
|
|
79
106
|
});
|
|
80
107
|
}
|
|
81
|
-
function parseHookPayload(raw) {
|
|
82
|
-
/**
|
|
83
|
-
* Normalize raw hook payload to ToolInvocation.
|
|
84
|
-
* Handles different hook formats (preToolUse, beforeShellExecution, etc.).
|
|
85
|
-
*/
|
|
86
|
-
const getObj = (value) => value && typeof value === "object" && !Array.isArray(value)
|
|
87
|
-
? value
|
|
88
|
-
: null;
|
|
89
|
-
const getStr = (value) => typeof value === "string" && value.length > 0 ? value : null;
|
|
90
|
-
const toolUse = getObj(raw.toolUse);
|
|
91
|
-
const tool = getObj(raw.tool);
|
|
92
|
-
const toolInput = getObj(raw.tool_input) ??
|
|
93
|
-
getObj(raw.toolInput) ??
|
|
94
|
-
getObj(toolUse?.input) ??
|
|
95
|
-
getObj(tool?.input) ??
|
|
96
|
-
{};
|
|
97
|
-
const hookEventName = getStr(raw.hook_event_name) ?? getStr(raw.hookEventName) ?? getStr(raw.hook_event);
|
|
98
|
-
const commandFromTop = getStr(raw.command);
|
|
99
|
-
const commandFromInput = getStr(toolInput.command) ?? getStr(toolInput.cmd);
|
|
100
|
-
const inferredShellCommand = commandFromTop ?? commandFromInput;
|
|
101
|
-
const toolName = getStr(raw.tool_name) ??
|
|
102
|
-
getStr(raw.toolName) ??
|
|
103
|
-
getStr(toolUse?.name) ??
|
|
104
|
-
getStr(tool?.name) ??
|
|
105
|
-
(hookEventName === "beforeShellExecution" || inferredShellCommand ? "Bash" : "Unknown");
|
|
106
|
-
// DEBUG: Log tool name resolution
|
|
107
|
-
if (process.env.OPTIMUS_DEBUG) {
|
|
108
|
-
console.error("[optimus-tool-call] Tool name resolution:");
|
|
109
|
-
console.error(" raw.tool_name:", raw.tool_name);
|
|
110
|
-
console.error(" raw.toolName:", raw.toolName);
|
|
111
|
-
console.error(" toolUse?.name:", toolUse?.name);
|
|
112
|
-
console.error(" tool?.name:", tool?.name);
|
|
113
|
-
console.error(" Final toolName:", toolName);
|
|
114
|
-
}
|
|
115
|
-
const normalizedToolInput = inferredShellCommand && !("command" in toolInput)
|
|
116
|
-
? { ...toolInput, command: inferredShellCommand }
|
|
117
|
-
: toolInput;
|
|
118
|
-
const sessionId = getStr(raw.session_id) ??
|
|
119
|
-
getStr(raw.sessionId) ??
|
|
120
|
-
getStr(process.env.CLAUDE_CODE_SESSION_ID ?? null) ??
|
|
121
|
-
null;
|
|
122
|
-
return {
|
|
123
|
-
tool_name: toolName,
|
|
124
|
-
tool_input: normalizedToolInput,
|
|
125
|
-
tool_use_id: getStr(raw.tool_use_id) ?? getStr(raw.toolUseId),
|
|
126
|
-
session_id: sessionId,
|
|
127
|
-
cwd: getStr(raw.cwd),
|
|
128
|
-
hook_event_name: hookEventName,
|
|
129
|
-
model: getStr(raw.model),
|
|
130
|
-
agent_message: getStr(raw.agent_message) ?? getStr(raw.agentMessage),
|
|
131
|
-
raw_event: raw,
|
|
132
|
-
};
|
|
133
|
-
}
|
|
134
108
|
/**
|
|
135
109
|
* Read the Claude Code session transcript (JSONL) and return the text of the
|
|
136
110
|
* last user-typed message. Each line is a JSON object; user turns look like:
|
|
@@ -180,24 +154,6 @@ function readLastUserPrompt(transcriptPath) {
|
|
|
180
154
|
}
|
|
181
155
|
return null;
|
|
182
156
|
}
|
|
183
|
-
function detectAgent() {
|
|
184
|
-
/**
|
|
185
|
-
* Detect which agent is running this hook.
|
|
186
|
-
* Can be extended with environment variables or other signals.
|
|
187
|
-
*/
|
|
188
|
-
// Check environment variables for agent identification
|
|
189
|
-
if (process.env.CLAUDE_CODE_SESSION_ID) {
|
|
190
|
-
return "claude";
|
|
191
|
-
}
|
|
192
|
-
if (process.env.CURSOR_SESSION_ID || process.env.CURSOR) {
|
|
193
|
-
return "cursor";
|
|
194
|
-
}
|
|
195
|
-
if (process.env.GITHUB_COPILOT) {
|
|
196
|
-
return "copilot";
|
|
197
|
-
}
|
|
198
|
-
// Default to claude for Claude Code CLI
|
|
199
|
-
return "claude";
|
|
200
|
-
}
|
|
201
157
|
// Run
|
|
202
158
|
main().catch((err) => {
|
|
203
159
|
console.error("[optimus-tool-call] Fatal error:", err);
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AAEA;;;;;GAKG;AAEH,OAAO,EAAE,MAAM,IAAI,CAAC;AACpB,OAAO,EAAE,mBAAmB,EAAE,WAAW,EAAuB,MAAM,oBAAoB,CAAC;AAC3F,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { loadEndpointBase } from "
|
|
1
|
+
export { loadEndpointBase } from "./tofu.js";
|
|
2
2
|
//# sourceMappingURL=endpoint-config.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoint-config.d.ts","sourceRoot":"","sources":["../../src/lib/endpoint-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"endpoint-config.d.ts","sourceRoot":"","sources":["../../src/lib/endpoint-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
export { loadEndpointBase } from "
|
|
1
|
+
export { loadEndpointBase } from "./tofu.js";
|
|
2
2
|
//# sourceMappingURL=endpoint-config.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"endpoint-config.js","sourceRoot":"","sources":["../../src/lib/endpoint-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,
|
|
1
|
+
{"version":3,"file":"endpoint-config.js","sourceRoot":"","sources":["../../src/lib/endpoint-config.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"machine-auth.d.ts","sourceRoot":"","sources":["../../src/lib/machine-auth.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,
|
|
1
|
+
{"version":3,"file":"machine-auth.d.ts","sourceRoot":"","sources":["../../src/lib/machine-auth.ts"],"names":[],"mappings":"AACA,OAAO,EAKL,KAAK,aAAa,EACnB,MAAM,WAAW,CAAC;AAEnB,yFAAyF;AACzF,eAAO,MAAM,8BAA8B,QAI1C,CAAC;AAuBF;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,YAAY,EAAE,MAAM,GACnB,OAAO,CAAC,aAAa,CAAC,CAgBxB;AAED,sEAAsE;AACtE,wBAAgB,sBAAsB,IAAI,IAAI,CAE7C"}
|
package/dist/lib/machine-auth.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import path from "node:path";
|
|
2
|
-
import { ensureAuthentication, loadEndpointBase, readStoredAuthKey, } from "
|
|
2
|
+
import { ensureAuthentication, loadEndpointBase, readStoredAuthKey, } from "./tofu.js";
|
|
3
3
|
/** Same path as log-llm-config: `~/opt-ai-sec/management/auth_key.txt` under `$HOME`. */
|
|
4
4
|
export const OPTIMUS_AUTH_KEY_RELATIVE_PATH = path.join("opt-ai-sec", "management", "auth_key.txt");
|
|
5
5
|
let cached = null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"machine-auth.js","sourceRoot":"","sources":["../../src/lib/machine-auth.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAGlB,MAAM,
|
|
1
|
+
{"version":3,"file":"machine-auth.js","sourceRoot":"","sources":["../../src/lib/machine-auth.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,WAAW,CAAC;AAC7B,OAAO,EACL,oBAAoB,EACpB,gBAAgB,EAChB,iBAAiB,GAGlB,MAAM,WAAW,CAAC;AAEnB,yFAAyF;AACzF,MAAM,CAAC,MAAM,8BAA8B,GAAG,IAAI,CAAC,IAAI,CACrD,YAAY,EACZ,YAAY,EACZ,cAAc,CACf,CAAC;AAEF,IAAI,MAAM,GAAwD,IAAI,CAAC;AAEvE,KAAK,UAAU,eAAe,CAC5B,WAAmB,EACnB,IAA6B;IAE7B,MAAM,GAAG,GAAG,MAAM,KAAK,CAAC,WAAW,EAAE;QACnC,MAAM,EAAE,MAAM;QACd,OAAO,EAAE,EAAE,cAAc,EAAE,kBAAkB,EAAE;QAC/C,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC;KAC3B,CAAC,CAAC;IACH,MAAM,IAAI,GAAG,MAAM,GAAG,CAAC,IAAI,EAAE,CAAC;IAC9B,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC;QACZ,MAAM,IAAI,KAAK,CACb,QAAQ,GAAG,CAAC,MAAM,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,UAAU,EAAE,CACpE,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAI;QAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,gBAAgB,EAAE,CAAC;IAC/D,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAqB,CAAC;AAC9C,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,kBAAkB,CACtC,YAAoB;IAEpB,MAAM,QAAQ,GAAG,iBAAiB,CAAC;QACjC,gBAAgB,EAAE,8BAA8B;KACjD,CAAC,CAAC;IACH,IAAI,CAAC,QAAQ,EAAE,GAAG,IAAI,MAAM,EAAE,YAAY,KAAK,YAAY,EAAE,CAAC;QAC5D,MAAM,GAAG,IAAI,CAAC;IAChB,CAAC;IACD,IAAI,MAAM,EAAE,YAAY,KAAK,YAAY;QAAE,OAAO,MAAM,CAAC,GAAG,CAAC;IAC7D,MAAM,GAAG,GAAG,MAAM,oBAAoB,CAAC;QACrC,YAAY;QACZ,YAAY,EAAE,gBAAgB,EAAE;QAChC,gBAAgB,EAAE,8BAA8B;QAChD,QAAQ,EAAE,eAAe;KAC1B,CAAC,CAAC;IACH,MAAM,GAAG,EAAE,YAAY,EAAE,GAAG,EAAE,CAAC;IAC/B,OAAO,GAAG,CAAC;AACb,CAAC;AAED,sEAAsE;AACtE,MAAM,UAAU,sBAAsB;IACpC,MAAM,GAAG,IAAI,CAAC;AAChB,CAAC"}
|
package/dist/lib/startup-sync.js
CHANGED
|
@@ -9,7 +9,7 @@
|
|
|
9
9
|
* not blocked on every batch. Override interval with `OPTIMUS_STARTUP_SYNC_INTERVAL_MS` (set to
|
|
10
10
|
* `0` to sync on every batch when healthy). Skip entirely with `OPTIMUS_SKIP_STARTUP_SYNC=1`.
|
|
11
11
|
*/
|
|
12
|
-
import { buildStartupEndpointUrl, createSignature, loadEndpointBase, persistAuthKey, readStoredAuthKey, } from "
|
|
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 { resolveUserProfile } from "./user-profile.js";
|
|
15
15
|
const emptyUserProfile = () => ({
|
|
@@ -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,
|
|
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":"streaming.d.ts","sourceRoot":"","sources":["../../src/lib/streaming.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;
|
|
1
|
+
{"version":3,"file":"streaming.d.ts","sourceRoot":"","sources":["../../src/lib/streaming.ts"],"names":[],"mappings":"AAAA;;GAEG;AAKH,OAAO,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAiBhD;;GAEG;AACH,wBAAsB,UAAU,CAAC,KAAK,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC,CAoBrE;AAED;;GAEG;AACH,wBAAsB,WAAW,IAAI,OAAO,CAAC,IAAI,CAAC,CAyBjD;AAiLD;;;GAGG;AACH,wBAAgB,cAAc,IAAI,IAAI,CA0BrC"}
|
package/dist/lib/streaming.js
CHANGED
|
@@ -1,12 +1,15 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Telemetry streaming — batch and send events to Optimus backend.
|
|
3
3
|
*/
|
|
4
|
-
import { createSignature } from "
|
|
4
|
+
import { createSignature } from "./tofu.js";
|
|
5
5
|
import { ensureToolCallAuth } from "./machine-auth.js";
|
|
6
6
|
import { ensureStartupMetadataSynced } from "./startup-sync.js";
|
|
7
7
|
import { cloneToolCallMetadataForWire } from "./telemetry/wire-metadata.js";
|
|
8
8
|
import { loadEndpointBase } from "./endpoint-config.js";
|
|
9
9
|
import { tryResolveHardwareUuid } from "./hardware-uuid.js";
|
|
10
|
+
const DEBUG = !!process.env.OPTIMUS_DEBUG;
|
|
11
|
+
const dbg = (...args) => { if (DEBUG)
|
|
12
|
+
console.error(...args); };
|
|
10
13
|
// Backend configuration
|
|
11
14
|
const OPTIMUS_API_BASE = loadEndpointBase();
|
|
12
15
|
const BATCH_SIZE = parseInt(process.env.OPTIMUS_BATCH_SIZE || "1", 10); // Default to 1 for testing
|
|
@@ -82,17 +85,32 @@ async function sendBatch(events) {
|
|
|
82
85
|
if (events.length === 0) {
|
|
83
86
|
return;
|
|
84
87
|
}
|
|
88
|
+
dbg(`[optimus-tool-call] Sending ${events.length} events to backend...`);
|
|
89
|
+
dbg(`[optimus-tool-call] Event agents:`, events.map(e => e.agent_identity).join(", "));
|
|
85
90
|
const hardwareUuid = tryResolveHardwareUuid();
|
|
86
91
|
if (!hardwareUuid) {
|
|
87
|
-
|
|
92
|
+
const err = "Cannot send tool-call telemetry: set OPTIMUS_HARDWARE_UUID or run on a host with a hardware UUID.";
|
|
93
|
+
console.error(`[optimus-tool-call] ERROR: ${err}`);
|
|
94
|
+
throw new Error(err);
|
|
95
|
+
}
|
|
96
|
+
dbg(`[optimus-tool-call] Hardware UUID: ${hardwareUuid}`);
|
|
97
|
+
try {
|
|
98
|
+
await ensureStartupMetadataSynced(hardwareUuid);
|
|
99
|
+
dbg(`[optimus-tool-call] Startup metadata synced`);
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
console.error(`[optimus-tool-call] ERROR syncing startup metadata:`, err);
|
|
103
|
+
throw err;
|
|
88
104
|
}
|
|
89
|
-
await ensureStartupMetadataSynced(hardwareUuid);
|
|
90
|
-
const auth = await ensureToolCallAuth(hardwareUuid);
|
|
91
105
|
const eventsWire = eventsWireFromTelemetry(events);
|
|
106
|
+
dbg(`[optimus-tool-call] Events wire:`, JSON.stringify(eventsWire, null, 2).slice(0, 500));
|
|
92
107
|
const signingPayload = {
|
|
93
108
|
hardware_uuid: hardwareUuid,
|
|
94
109
|
events: eventsWire,
|
|
95
110
|
};
|
|
111
|
+
dbg(`[optimus-tool-call] Payload ready, signing...`);
|
|
112
|
+
const auth = await ensureToolCallAuth(hardwareUuid);
|
|
113
|
+
dbg(`[optimus-tool-call] Auth obtained, key_id: ${auth.key_id}`);
|
|
96
114
|
const signature = createSignature(signingPayload, auth.key);
|
|
97
115
|
const payload = {
|
|
98
116
|
...signingPayload,
|
|
@@ -100,12 +118,15 @@ async function sendBatch(events) {
|
|
|
100
118
|
key_id: auth.key_id || "",
|
|
101
119
|
};
|
|
102
120
|
const endpoint = new URL("api/tool-calls/events/batch_create/", OPTIMUS_API_BASE).toString();
|
|
121
|
+
dbg(`[optimus-tool-call] Endpoint: ${endpoint}`);
|
|
122
|
+
dbg(`[optimus-tool-call] Payload size: ${JSON.stringify(payload).length} bytes`);
|
|
103
123
|
const headers = {
|
|
104
124
|
"Content-Type": "application/json",
|
|
105
125
|
};
|
|
106
126
|
try {
|
|
107
127
|
// Use fetch if available (Node 18+), fall back to node:http
|
|
108
128
|
if (typeof fetch !== "undefined") {
|
|
129
|
+
dbg(`[optimus-tool-call] Using fetch to send...`);
|
|
109
130
|
const controller = new AbortController();
|
|
110
131
|
const timeoutId = setTimeout(() => controller.abort(), 5000);
|
|
111
132
|
try {
|
|
@@ -115,10 +136,13 @@ async function sendBatch(events) {
|
|
|
115
136
|
body: JSON.stringify(payload),
|
|
116
137
|
signal: controller.signal,
|
|
117
138
|
});
|
|
139
|
+
dbg(`[optimus-tool-call] Response status: ${response.status} ${response.statusText}`);
|
|
118
140
|
if (!response.ok) {
|
|
119
|
-
|
|
141
|
+
const responseText = await response.text();
|
|
142
|
+
dbg(`[optimus-tool-call] Response body: ${responseText}`);
|
|
143
|
+
throw new Error(`HTTP ${response.status}: ${response.statusText} - ${responseText}`);
|
|
120
144
|
}
|
|
121
|
-
|
|
145
|
+
dbg(`[optimus-tool-call] ✅ Successfully sent ${events.length} events`);
|
|
122
146
|
}
|
|
123
147
|
finally {
|
|
124
148
|
clearTimeout(timeoutId);
|
|
@@ -126,11 +150,14 @@ async function sendBatch(events) {
|
|
|
126
150
|
}
|
|
127
151
|
else {
|
|
128
152
|
// Fallback for older Node versions
|
|
153
|
+
dbg(`[optimus-tool-call] Using http fallback...`);
|
|
129
154
|
await sendViaHttp(endpoint, headers, payload);
|
|
130
155
|
}
|
|
131
156
|
}
|
|
132
157
|
catch (err) {
|
|
133
|
-
|
|
158
|
+
const errorMsg = `Failed to send events to ${endpoint}: ${err instanceof Error ? err.message : String(err)}`;
|
|
159
|
+
console.error(`[optimus-tool-call] ❌ ${errorMsg}`);
|
|
160
|
+
throw new Error(errorMsg);
|
|
134
161
|
}
|
|
135
162
|
}
|
|
136
163
|
/**
|