visionclaw 0.1.167 → 0.1.169
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/CHANGELOG.md +44 -0
- package/dist/agent/api-proxy.d.ts +26 -0
- package/dist/agent/api-proxy.d.ts.map +1 -0
- package/dist/agent/api-proxy.js +165 -0
- package/dist/agent/api-proxy.js.map +1 -0
- package/dist/agent/command-dispatcher.d.ts +10 -0
- package/dist/agent/command-dispatcher.d.ts.map +1 -1
- package/dist/agent/command-dispatcher.js +14 -0
- package/dist/agent/command-dispatcher.js.map +1 -1
- package/dist/agent/context.js +3 -3
- package/dist/agent/context.js.map +1 -1
- package/dist/agent/data-collector.d.ts.map +1 -1
- package/dist/agent/data-collector.js +124 -20
- package/dist/agent/data-collector.js.map +1 -1
- package/dist/agent/gather-context.d.ts +2 -2
- package/dist/agent/gather-context.d.ts.map +1 -1
- package/dist/agent/gather-context.js +3 -2
- package/dist/agent/gather-context.js.map +1 -1
- package/dist/agent/image-pruner.d.ts.map +1 -1
- package/dist/agent/image-pruner.js +44 -2
- package/dist/agent/image-pruner.js.map +1 -1
- package/dist/agent/loop.d.ts.map +1 -1
- package/dist/agent/loop.js +72 -4
- package/dist/agent/loop.js.map +1 -1
- package/dist/agent/providers/claude/session.d.ts.map +1 -1
- package/dist/agent/providers/claude/session.js +10 -1
- package/dist/agent/providers/claude/session.js.map +1 -1
- package/dist/agent/providers/client-factory.d.ts +8 -0
- package/dist/agent/providers/client-factory.d.ts.map +1 -1
- package/dist/agent/providers/client-factory.js +34 -0
- package/dist/agent/providers/client-factory.js.map +1 -1
- package/dist/agent/providers/openai/session.d.ts.map +1 -1
- package/dist/agent/providers/openai/session.js +7 -0
- package/dist/agent/providers/openai/session.js.map +1 -1
- package/dist/agent/session-trimmer.d.ts +24 -6
- package/dist/agent/session-trimmer.d.ts.map +1 -1
- package/dist/agent/session-trimmer.js +115 -8
- package/dist/agent/session-trimmer.js.map +1 -1
- package/dist/agent/system-prompt.d.ts.map +1 -1
- package/dist/agent/system-prompt.js +2 -0
- package/dist/agent/system-prompt.js.map +1 -1
- package/dist/agent/upgrade-handler.d.ts.map +1 -1
- package/dist/agent/upgrade-handler.js +8 -1
- package/dist/agent/upgrade-handler.js.map +1 -1
- package/dist/agent/usage-handler.d.ts +7 -0
- package/dist/agent/usage-handler.d.ts.map +1 -0
- package/dist/agent/usage-handler.js +28 -0
- package/dist/agent/usage-handler.js.map +1 -0
- package/dist/calendar/scheduler.d.ts +8 -1
- package/dist/calendar/scheduler.d.ts.map +1 -1
- package/dist/calendar/scheduler.js +11 -2
- package/dist/calendar/scheduler.js.map +1 -1
- package/dist/channels/telegram.d.ts.map +1 -1
- package/dist/channels/telegram.js +4 -1
- package/dist/channels/telegram.js.map +1 -1
- package/dist/config/index.d.ts +7 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/index.js +16 -0
- package/dist/config/index.js.map +1 -1
- package/dist/data-processing/convert-demo-cli.d.ts +7 -0
- package/dist/data-processing/convert-demo-cli.d.ts.map +1 -0
- package/dist/data-processing/convert-demo-cli.js +30 -0
- package/dist/data-processing/convert-demo-cli.js.map +1 -0
- package/dist/data-processing/convert-demo.d.ts +26 -0
- package/dist/data-processing/convert-demo.d.ts.map +1 -0
- package/dist/data-processing/convert-demo.js +233 -0
- package/dist/data-processing/convert-demo.js.map +1 -0
- package/dist/data-processing/convert-openai-chat-cli.d.ts +7 -0
- package/dist/data-processing/convert-openai-chat-cli.d.ts.map +1 -0
- package/dist/data-processing/convert-openai-chat-cli.js +30 -0
- package/dist/data-processing/convert-openai-chat-cli.js.map +1 -0
- package/dist/data-processing/convert-openai-chat.d.ts +23 -0
- package/dist/data-processing/convert-openai-chat.d.ts.map +1 -0
- package/dist/data-processing/convert-openai-chat.js +446 -0
- package/dist/data-processing/convert-openai-chat.js.map +1 -0
- package/dist/data-processing/image-recovery.js +1 -1
- package/dist/data-processing/image-recovery.js.map +1 -1
- package/dist/data-processing/index.d.ts +1 -0
- package/dist/data-processing/index.d.ts.map +1 -1
- package/dist/data-processing/index.js +1 -0
- package/dist/data-processing/index.js.map +1 -1
- package/dist/data-processing/record-builder.d.ts.map +1 -1
- package/dist/data-processing/record-builder.js +5 -0
- package/dist/data-processing/record-builder.js.map +1 -1
- package/dist/data-processing/sdk-transcript.d.ts.map +1 -1
- package/dist/data-processing/sdk-transcript.js +16 -5
- package/dist/data-processing/sdk-transcript.js.map +1 -1
- package/dist/data-processing/types.d.ts +7 -0
- package/dist/data-processing/types.d.ts.map +1 -1
- package/dist/data-processing/types.js +7 -0
- package/dist/data-processing/types.js.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/logger.d.ts.map +1 -1
- package/dist/logger.js +8 -4
- package/dist/logger.js.map +1 -1
- package/dist/onboarding/bot-profile.d.ts +5 -0
- package/dist/onboarding/bot-profile.d.ts.map +1 -1
- package/dist/onboarding/bot-profile.js +48 -2
- package/dist/onboarding/bot-profile.js.map +1 -1
- package/dist/onboarding/google-auth.d.ts.map +1 -1
- package/dist/onboarding/google-auth.js +5 -1
- package/dist/onboarding/google-auth.js.map +1 -1
- package/dist/onboarding/onboarding-service-client.d.ts +1 -0
- package/dist/onboarding/onboarding-service-client.d.ts.map +1 -1
- package/dist/onboarding/onboarding-service-client.js.map +1 -1
- package/dist/tools/screenshot.d.ts +1 -1
- package/dist/tools/screenshot.d.ts.map +1 -1
- package/dist/tools/screenshot.js +24 -13
- package/dist/tools/screenshot.js.map +1 -1
- package/dist-agent/bundle.cjs +2678 -1734
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,47 @@
|
|
|
1
|
+
## [0.1.169](https://github.com/babelcloud/visionclaw/compare/v0.1.168...v0.1.169) (2026-03-26)
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
### Bug Fixes
|
|
5
|
+
|
|
6
|
+
* add 1-hour lookback grace period to calendar event fetching ([b251125](https://github.com/babelcloud/visionclaw/commit/b2511253a361167d6f32a5095ef0be5c30425288))
|
|
7
|
+
* add retry + placeholder for failed image downloads ([cc64f00](https://github.com/babelcloud/visionclaw/commit/cc64f009cc8c2833e8ab82f41cb15ad39329f09f)), closes [#45](https://github.com/babelcloud/visionclaw/issues/45)
|
|
8
|
+
* merge duplicate imports from config/types.js ([06ab7db](https://github.com/babelcloud/visionclaw/commit/06ab7db74ecaf26d4a9aa0071cb3ff4107326cbf))
|
|
9
|
+
* recover lost command acks on upgrade restart and heartbeat failure ([#41](https://github.com/babelcloud/visionclaw/issues/41)) ([8ca4952](https://github.com/babelcloud/visionclaw/commit/8ca49528d3c355b5ab6dfc2ebae737d693b4ae2a))
|
|
10
|
+
* remove URL image source fallback that causes Claude API 400 errors ([697bfaf](https://github.com/babelcloud/visionclaw/commit/697bfafb7ebbe6ff58db774fee0562efa1eca1c5))
|
|
11
|
+
* use heartbeat×1.2 lookback for calendar event fetching ([c3d210c](https://github.com/babelcloud/visionclaw/commit/c3d210ccfffdfa8aca3df92024501c23f75885f0))
|
|
12
|
+
|
|
13
|
+
|
|
14
|
+
### Features
|
|
15
|
+
|
|
16
|
+
* **admin:** enhance agent status handling and UI updates ([0f87a11](https://github.com/babelcloud/visionclaw/commit/0f87a119326fd03bab7a4c06349298456e9d51b3))
|
|
17
|
+
* **agent:** add notes column and update functionality in agent management ([3ad37a9](https://github.com/babelcloud/visionclaw/commit/3ad37a983edf602091c16d028eb25f5fb1aa3909))
|
|
18
|
+
* **agent:** add notes functionality to agent management ([e1daaad](https://github.com/babelcloud/visionclaw/commit/e1daaad5f97abc75f07b4335fcfac5e1036bee17))
|
|
19
|
+
* **agent:** add onboardingComplete field to heartbeat and update logic ([3c4df4c](https://github.com/babelcloud/visionclaw/commit/3c4df4ccb565a728dcb6dff0a2416f13b5bb5585))
|
|
20
|
+
* **agent:** add usage command handler and UI button ([17488fe](https://github.com/babelcloud/visionclaw/commit/17488fe9b0347c80385f023d9499dee97d1ece7b))
|
|
21
|
+
* **agent:** integrate notes field into agent API ([0fe5d44](https://github.com/babelcloud/visionclaw/commit/0fe5d44383cc7bbbb119b837090facb413914fd3))
|
|
22
|
+
* **agent:** update agent status logic and heartbeat interval ([ab74498](https://github.com/babelcloud/visionclaw/commit/ab744980ab8ef245c9b8fc8cee9086dc859761e4))
|
|
23
|
+
* **command:** add 'convert-openai-chat' command and improve shutdown handling ([cc98717](https://github.com/babelcloud/visionclaw/commit/cc987177b91cb252e6cc00681d217bd3517fc3c1))
|
|
24
|
+
* **data-pipeline:** upgrade data processing pipeline for enhanced logging and retention ([0d0c436](https://github.com/babelcloud/visionclaw/commit/0d0c436655883c517df3b4dc54addb464a75bd42))
|
|
25
|
+
* **logger:** enhance logging functionality with new system prompt color and extended retention period ([ad4bbb5](https://github.com/babelcloud/visionclaw/commit/ad4bbb5fd94c7f0d4a79b99bf52979a0331982cc))
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
|
|
29
|
+
## [0.1.168](https://github.com/babelcloud/visionclaw/compare/v0.1.167...v0.1.168) (2026-03-24)
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
### Bug Fixes
|
|
33
|
+
|
|
34
|
+
* send periodic heartbeats during long busy periods ([#39](https://github.com/babelcloud/visionclaw/issues/39)) ([b58612a](https://github.com/babelcloud/visionclaw/commit/b58612adade301a9adea75a1f4c2a9901ee2ce17))
|
|
35
|
+
|
|
36
|
+
|
|
37
|
+
### Features
|
|
38
|
+
|
|
39
|
+
* **admin:** implement sorting functionality for agent list ([19b8247](https://github.com/babelcloud/visionclaw/commit/19b8247b2522e0925a3fc8f4adc961c4da34fa72))
|
|
40
|
+
* auto-register Telegram bot commands on startup ([#40](https://github.com/babelcloud/visionclaw/issues/40)) ([974c5f7](https://github.com/babelcloud/visionclaw/commit/974c5f76ecd25d992372fd27c403167fc274ff55))
|
|
41
|
+
* **onboarding:** preload agent profile image for improved loading experience ([b9d8a18](https://github.com/babelcloud/visionclaw/commit/b9d8a18350eacecc32f479ddaea4209a00e3d193))
|
|
42
|
+
|
|
43
|
+
|
|
44
|
+
|
|
1
45
|
## [0.1.167](https://github.com/babelcloud/visionclaw/compare/v0.1.166...v0.1.167) (2026-03-24)
|
|
2
46
|
|
|
3
47
|
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight HTTP proxy that intercepts Anthropic API calls, logs the full
|
|
3
|
+
* request body (system prompt, tools, messages summary) to JSONL, and forwards
|
|
4
|
+
* the request to the real Anthropic API.
|
|
5
|
+
*
|
|
6
|
+
* Dev-mode only — started lazily when `buildAgentEnv()` detects dev mode and
|
|
7
|
+
* the Anthropic direct-API provider. The SDK subprocess (`cli.js`) is pointed
|
|
8
|
+
* to the proxy via `ANTHROPIC_BASE_URL=http://localhost:<port>`.
|
|
9
|
+
*
|
|
10
|
+
* Design: the proxy buffers the incoming request body, forwards it to the
|
|
11
|
+
* upstream via Node.js `https.request()` with explicit HTTP/1.1 ALPN, then
|
|
12
|
+
* pipes the response back to the SDK client.
|
|
13
|
+
*/
|
|
14
|
+
export interface ApiProxyHandle {
|
|
15
|
+
port: number;
|
|
16
|
+
close: () => void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Start the API logging proxy. Returns a handle with the assigned port.
|
|
20
|
+
* Subsequent calls return the same singleton.
|
|
21
|
+
*/
|
|
22
|
+
export declare function startApiProxy(opts: {
|
|
23
|
+
targetBaseUrl?: string;
|
|
24
|
+
logDir: string;
|
|
25
|
+
}): Promise<ApiProxyHandle>;
|
|
26
|
+
//# sourceMappingURL=api-proxy.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-proxy.d.ts","sourceRoot":"","sources":["../../src/agent/api-proxy.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AASH,MAAM,WAAW,cAAc;IAC7B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,IAAI,CAAC;CACnB;AAuDD;;;GAGG;AACH,wBAAsB,aAAa,CAAC,IAAI,EAAE;IACxC,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,MAAM,EAAE,MAAM,CAAC;CAChB,GAAG,OAAO,CAAC,cAAc,CAAC,CA8H1B"}
|
|
@@ -0,0 +1,165 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Lightweight HTTP proxy that intercepts Anthropic API calls, logs the full
|
|
3
|
+
* request body (system prompt, tools, messages summary) to JSONL, and forwards
|
|
4
|
+
* the request to the real Anthropic API.
|
|
5
|
+
*
|
|
6
|
+
* Dev-mode only — started lazily when `buildAgentEnv()` detects dev mode and
|
|
7
|
+
* the Anthropic direct-API provider. The SDK subprocess (`cli.js`) is pointed
|
|
8
|
+
* to the proxy via `ANTHROPIC_BASE_URL=http://localhost:<port>`.
|
|
9
|
+
*
|
|
10
|
+
* Design: the proxy buffers the incoming request body, forwards it to the
|
|
11
|
+
* upstream via Node.js `https.request()` with explicit HTTP/1.1 ALPN, then
|
|
12
|
+
* pipes the response back to the SDK client.
|
|
13
|
+
*/
|
|
14
|
+
import http from "node:http";
|
|
15
|
+
import https from "node:https";
|
|
16
|
+
import fs from "node:fs";
|
|
17
|
+
import path from "node:path";
|
|
18
|
+
import { URL } from "node:url";
|
|
19
|
+
import { logger } from "../logger.js";
|
|
20
|
+
let singleton = null;
|
|
21
|
+
// HTTPS agent that forces HTTP/1.1 via ALPN to avoid HTTP/2 negotiation
|
|
22
|
+
// issues with Cloudflare/Anthropic's edge. Each request gets a fresh TLS
|
|
23
|
+
// connection (keepAlive off) to avoid stale-socket errors during the
|
|
24
|
+
// minutes-long idle periods between agent API calls.
|
|
25
|
+
const httpsAgent = new https.Agent({
|
|
26
|
+
keepAlive: false,
|
|
27
|
+
maxSockets: 10,
|
|
28
|
+
ALPNProtocols: ["http/1.1"],
|
|
29
|
+
});
|
|
30
|
+
/**
|
|
31
|
+
* Extract `<system-reminder>` text blocks from messages.
|
|
32
|
+
*
|
|
33
|
+
* The Claude Agent SDK injects these into user messages to provide the model
|
|
34
|
+
* with skill descriptions, context reminders, and other metadata. We extract
|
|
35
|
+
* them so the API log captures what the model actually sees.
|
|
36
|
+
*/
|
|
37
|
+
function extractSystemReminders(messages) {
|
|
38
|
+
const reminders = [];
|
|
39
|
+
for (const msg of messages) {
|
|
40
|
+
const content = msg.content;
|
|
41
|
+
if (!Array.isArray(content))
|
|
42
|
+
continue;
|
|
43
|
+
for (const block of content) {
|
|
44
|
+
if (block.type === "text" &&
|
|
45
|
+
typeof block.text === "string" &&
|
|
46
|
+
block.text.includes("<system-reminder>")) {
|
|
47
|
+
reminders.push(block.text);
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
return reminders;
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Start the API logging proxy. Returns a handle with the assigned port.
|
|
55
|
+
* Subsequent calls return the same singleton.
|
|
56
|
+
*/
|
|
57
|
+
export async function startApiProxy(opts) {
|
|
58
|
+
if (singleton)
|
|
59
|
+
return singleton;
|
|
60
|
+
const targetBase = opts.targetBaseUrl ?? "https://api.anthropic.com";
|
|
61
|
+
const logDir = opts.logDir;
|
|
62
|
+
if (!fs.existsSync(logDir)) {
|
|
63
|
+
fs.mkdirSync(logDir, { recursive: true });
|
|
64
|
+
}
|
|
65
|
+
// Headers to strip when forwarding
|
|
66
|
+
const STRIP_HEADERS = new Set([
|
|
67
|
+
"host", "connection", "transfer-encoding",
|
|
68
|
+
]);
|
|
69
|
+
const server = http.createServer((req, res) => {
|
|
70
|
+
const isMessagesEndpoint = req.method === "POST" && req.url?.startsWith("/v1/messages");
|
|
71
|
+
const targetUrl = new URL(req.url ?? "/", targetBase);
|
|
72
|
+
// Build outgoing headers
|
|
73
|
+
const fwdHeaders = {};
|
|
74
|
+
for (const [key, value] of Object.entries(req.headers)) {
|
|
75
|
+
if (STRIP_HEADERS.has(key))
|
|
76
|
+
continue;
|
|
77
|
+
fwdHeaders[key] = value;
|
|
78
|
+
}
|
|
79
|
+
fwdHeaders.host = targetUrl.host;
|
|
80
|
+
// Buffer the incoming request body, then forward
|
|
81
|
+
const chunks = [];
|
|
82
|
+
req.on("data", (chunk) => {
|
|
83
|
+
chunks.push(chunk);
|
|
84
|
+
});
|
|
85
|
+
req.on("error", (err) => {
|
|
86
|
+
logger.warn(`[api-proxy] client request error: ${err.message}`);
|
|
87
|
+
});
|
|
88
|
+
req.on("end", () => {
|
|
89
|
+
const body = Buffer.concat(chunks);
|
|
90
|
+
// Log the request (best-effort)
|
|
91
|
+
if (isMessagesEndpoint && body.length > 0) {
|
|
92
|
+
try {
|
|
93
|
+
const parsed = JSON.parse(body.toString("utf-8"));
|
|
94
|
+
const messages = parsed.messages;
|
|
95
|
+
const tools = parsed.tools;
|
|
96
|
+
const entry = {
|
|
97
|
+
timestamp: new Date().toISOString(),
|
|
98
|
+
model: parsed.model,
|
|
99
|
+
system: parsed.system,
|
|
100
|
+
tools: tools ?? [],
|
|
101
|
+
system_reminders: messages ? extractSystemReminders(messages) : [],
|
|
102
|
+
messages_count: messages?.length ?? 0,
|
|
103
|
+
messages_roles: messages?.map((m) => m.role ?? "unknown") ?? [],
|
|
104
|
+
request_size_bytes: body.length,
|
|
105
|
+
};
|
|
106
|
+
const date = new Date().toISOString().slice(0, 10);
|
|
107
|
+
const logPath = path.join(logDir, `api-calls-${date}.jsonl`);
|
|
108
|
+
fs.appendFileSync(logPath, JSON.stringify(entry) + "\n", "utf-8");
|
|
109
|
+
}
|
|
110
|
+
catch {
|
|
111
|
+
// Best-effort logging — don't break the proxy
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
// Forward the complete body to the upstream API via HTTPS.
|
|
115
|
+
// We set content-length explicitly since we have the full body.
|
|
116
|
+
fwdHeaders["content-length"] = String(body.length);
|
|
117
|
+
const proxyReq = https.request({
|
|
118
|
+
hostname: targetUrl.hostname,
|
|
119
|
+
port: 443,
|
|
120
|
+
path: targetUrl.pathname + targetUrl.search,
|
|
121
|
+
method: req.method,
|
|
122
|
+
headers: fwdHeaders,
|
|
123
|
+
agent: httpsAgent,
|
|
124
|
+
}, (proxyRes) => {
|
|
125
|
+
res.writeHead(proxyRes.statusCode ?? 502, proxyRes.headers);
|
|
126
|
+
proxyRes.pipe(res);
|
|
127
|
+
});
|
|
128
|
+
proxyReq.on("error", (err) => {
|
|
129
|
+
if (!req.destroyed) {
|
|
130
|
+
logger.warn(`[api-proxy] upstream error: ${err.message}`);
|
|
131
|
+
}
|
|
132
|
+
if (!res.headersSent) {
|
|
133
|
+
res.writeHead(502, { "Content-Type": "application/json" });
|
|
134
|
+
}
|
|
135
|
+
if (!res.writableEnded) {
|
|
136
|
+
res.end(JSON.stringify({ error: "proxy_error", message: err.message }));
|
|
137
|
+
}
|
|
138
|
+
});
|
|
139
|
+
// Send the buffered body and end the request
|
|
140
|
+
proxyReq.end(body);
|
|
141
|
+
});
|
|
142
|
+
});
|
|
143
|
+
return new Promise((resolve, reject) => {
|
|
144
|
+
server.on("error", reject);
|
|
145
|
+
server.listen(0, "127.0.0.1", () => {
|
|
146
|
+
const addr = server.address();
|
|
147
|
+
if (!addr || typeof addr === "string") {
|
|
148
|
+
reject(new Error("Failed to get proxy server address"));
|
|
149
|
+
return;
|
|
150
|
+
}
|
|
151
|
+
const handle = {
|
|
152
|
+
port: addr.port,
|
|
153
|
+
close: () => {
|
|
154
|
+
server.close();
|
|
155
|
+
httpsAgent.destroy();
|
|
156
|
+
singleton = null;
|
|
157
|
+
},
|
|
158
|
+
};
|
|
159
|
+
singleton = handle;
|
|
160
|
+
logger.system(`[api-proxy] listening on 127.0.0.1:${addr.port}`);
|
|
161
|
+
resolve(handle);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
//# sourceMappingURL=api-proxy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"api-proxy.js","sourceRoot":"","sources":["../../src/agent/api-proxy.ts"],"names":[],"mappings":"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"}
|
|
@@ -22,5 +22,15 @@ export declare class CommandDispatcher {
|
|
|
22
22
|
* Drain all queued acks for inclusion in the next heartbeat.
|
|
23
23
|
*/
|
|
24
24
|
drainAcks(): CommandAck[];
|
|
25
|
+
/**
|
|
26
|
+
* Put acks back into the queue (e.g. when the heartbeat POST fails
|
|
27
|
+
* and the acks were not delivered).
|
|
28
|
+
*/
|
|
29
|
+
requeueAcks(acks: CommandAck[]): void;
|
|
30
|
+
/**
|
|
31
|
+
* Queue a single ack (e.g. a synthetic ack for a command whose ack was
|
|
32
|
+
* lost due to process restart).
|
|
33
|
+
*/
|
|
34
|
+
queueAck(ack: CommandAck): void;
|
|
25
35
|
}
|
|
26
36
|
//# sourceMappingURL=command-dispatcher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-dispatcher.d.ts","sourceRoot":"","sources":["../../src/agent/command-dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AAG7F,MAAM,MAAM,cAAc,GAAG,CAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAElE;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAE9C,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAI/D;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,IAAI;IA8C1C;;OAEG;IACH,SAAS,IAAI,UAAU,EAAE;
|
|
1
|
+
{"version":3,"file":"command-dispatcher.d.ts","sourceRoot":"","sources":["../../src/agent/command-dispatcher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,4CAA4C,CAAC;AAG7F,MAAM,MAAM,cAAc,GAAG,CAC3B,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,OAAO,KACb,OAAO,CAAC;IAAE,MAAM,EAAE,WAAW,GAAG,QAAQ,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAElE;;;;GAIG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqC;IAC9D,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAoB;IAChD,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAqB;IAE9C,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,cAAc,GAAG,IAAI;IAI/D;;;OAGG;IACH,QAAQ,CAAC,QAAQ,EAAE,cAAc,EAAE,GAAG,IAAI;IA8C1C;;OAEG;IACH,SAAS,IAAI,UAAU,EAAE;IAKzB;;;OAGG;IACH,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,GAAG,IAAI;IAIrC;;;OAGG;IACH,QAAQ,CAAC,GAAG,EAAE,UAAU,GAAG,IAAI;CAGhC"}
|
|
@@ -62,5 +62,19 @@ export class CommandDispatcher {
|
|
|
62
62
|
return [];
|
|
63
63
|
return this.pendingAcks.splice(0);
|
|
64
64
|
}
|
|
65
|
+
/**
|
|
66
|
+
* Put acks back into the queue (e.g. when the heartbeat POST fails
|
|
67
|
+
* and the acks were not delivered).
|
|
68
|
+
*/
|
|
69
|
+
requeueAcks(acks) {
|
|
70
|
+
this.pendingAcks.unshift(...acks);
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Queue a single ack (e.g. a synthetic ack for a command whose ack was
|
|
74
|
+
* lost due to process restart).
|
|
75
|
+
*/
|
|
76
|
+
queueAck(ack) {
|
|
77
|
+
this.pendingAcks.push(ack);
|
|
78
|
+
}
|
|
65
79
|
}
|
|
66
80
|
//# sourceMappingURL=command-dispatcher.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"command-dispatcher.js","sourceRoot":"","sources":["../../src/agent/command-dispatcher.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"command-dispatcher.js","sourceRoot":"","sources":["../../src/agent/command-dispatcher.ts"],"names":[],"mappings":"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"}
|
package/dist/agent/context.js
CHANGED
|
@@ -28,10 +28,10 @@ async function resolveImageAttachment(att) {
|
|
|
28
28
|
},
|
|
29
29
|
};
|
|
30
30
|
}
|
|
31
|
-
logger.warn(`Could not resize attachment image,
|
|
31
|
+
logger.warn(`Could not download/resize attachment image after retries, using placeholder: ${att.url}`);
|
|
32
32
|
return {
|
|
33
|
-
type: "
|
|
34
|
-
|
|
33
|
+
type: "text",
|
|
34
|
+
text: "[Image attachment: download failed after retries, image unavailable. Ask the user to resend if needed.]",
|
|
35
35
|
};
|
|
36
36
|
}
|
|
37
37
|
return null;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/agent/context.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,0BAA0B,EAAE,qBAAqB,EAAE,MAAM,wBAAwB,CAAC;AAC3F,OAAO,EAAE,MAAM,EAAE,MAAM,cAAc,CAAC;AAsBtC;;;GAGG;AACH,KAAK,UAAU,sBAAsB,CAAC,GAIrC;IACC,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;QACf,MAAM,OAAO,GAAG,MAAM,qBAAqB,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;QACxD,OAAO;YACL,IAAI,EAAE,OAAO;YACb,MAAM,EAAE;gBACN,IAAI,EAAE,QAAQ;gBACd,UAAU,EAAE,CAAC,GAAG,CAAC,QAAQ,IAAI,WAAW,CAAgB;gBACxD,IAAI,EAAE,OAAO;aACd;SACF,CAAC;IACJ,CAAC;IACD,IAAI,GAAG,CAAC,GAAG,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,MAAM,0BAA0B,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC1D,IAAI,OAAO,EAAE,CAAC;YACZ,OAAO;gBACL,IAAI,EAAE,OAAO;gBACb,MAAM,EAAE;oBACN,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE,OAAO,CAAC,QAAuB;oBAC3C,IAAI,EAAE,OAAO,CAAC,MAAM;iBACrB;aACF,CAAC;QACJ,CAAC;QACD,MAAM,CAAC,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"context.js","sourceRoot":"","sources":["../../src/agent/context.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"data-collector.d.ts","sourceRoot":"","sources":["../../src/agent/data-collector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsBH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"data-collector.d.ts","sourceRoot":"","sources":["../../src/agent/data-collector.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAsBH,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC3D,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAgY9D,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,gBAAgB,GAAG,cAAc,CAkGjF"}
|
|
@@ -96,31 +96,38 @@ function collectLogs(since, tmpDir) {
|
|
|
96
96
|
}
|
|
97
97
|
const allFiles = fs.readdirSync(logsDir).filter((f) => f.endsWith(".jsonl") || f.endsWith(".jsonl.gz"));
|
|
98
98
|
const filtered = allFiles.filter((f) => {
|
|
99
|
-
|
|
99
|
+
// Date-prefixed log files (YYYY-MM-DD.jsonl, api-calls-YYYY-MM-DD.jsonl, etc.)
|
|
100
|
+
const match = /(\d{4}-\d{2}-\d{2})/.exec(f);
|
|
100
101
|
return match ? match[1] >= since : false;
|
|
101
102
|
});
|
|
102
|
-
if
|
|
103
|
-
|
|
103
|
+
// Fallback: if no date-prefixed files matched, pack everything in the folder
|
|
104
|
+
const toPack = filtered.length > 0 ? filtered : allFiles;
|
|
105
|
+
if (toPack.length === 0) {
|
|
106
|
+
logger.system(`[data-collector] No log files found in dir`);
|
|
104
107
|
return null;
|
|
105
108
|
}
|
|
109
|
+
if (filtered.length === 0 && allFiles.length > 0) {
|
|
110
|
+
logger.system(`[data-collector] No dated log files matched since=${since} — falling back to all ${allFiles.length} file(s)`);
|
|
111
|
+
}
|
|
106
112
|
// Copy to tmp for concurrent safety
|
|
107
113
|
const logsTmpDir = path.join(tmpDir, "logs-src");
|
|
108
114
|
fs.mkdirSync(logsTmpDir, { recursive: true });
|
|
109
115
|
let totalBytes = 0;
|
|
110
|
-
for (const f of
|
|
116
|
+
for (const f of toPack) {
|
|
111
117
|
fs.copyFileSync(path.join(logsDir, f), path.join(logsTmpDir, f));
|
|
112
118
|
totalBytes += fs.statSync(path.join(logsTmpDir, f)).size;
|
|
113
119
|
}
|
|
114
120
|
const archivePath = path.join(tmpDir, "logs.tar.gz");
|
|
115
|
-
createTarGz(logsTmpDir, archivePath,
|
|
116
|
-
return { archivePath, fileCount:
|
|
121
|
+
createTarGz(logsTmpDir, archivePath, toPack);
|
|
122
|
+
return { archivePath, fileCount: toPack.length, totalBytes };
|
|
117
123
|
}
|
|
118
|
-
function collectTranscripts(tmpDir) {
|
|
124
|
+
function collectTranscripts(since, tmpDir) {
|
|
119
125
|
const configDir = getConfigDir();
|
|
120
126
|
const transcriptDir = getClaudeTranscriptDirForProfileDir(configDir);
|
|
121
127
|
const sessionFilePath = getSessionFile();
|
|
122
128
|
logger.system(`[data-collector] Transcript dir: ${transcriptDir}`);
|
|
123
129
|
logger.system(`[data-collector] Session file: ${sessionFilePath}`);
|
|
130
|
+
logger.system(`[data-collector] Transcript since: ${since}`);
|
|
124
131
|
if (!fs.existsSync(transcriptDir)) {
|
|
125
132
|
logger.system(`[data-collector] Transcript dir does not exist — skipping`);
|
|
126
133
|
return null;
|
|
@@ -131,22 +138,114 @@ function collectTranscripts(tmpDir) {
|
|
|
131
138
|
return null;
|
|
132
139
|
}
|
|
133
140
|
logger.system(`[data-collector] Active session IDs: ${activeSessionIds.join(", ")}`);
|
|
141
|
+
const sinceMs = new Date(since + "T00:00:00").getTime();
|
|
134
142
|
// Copy active session files to tmp
|
|
135
143
|
const transcriptTmpDir = path.join(tmpDir, "transcripts-src");
|
|
136
144
|
fs.mkdirSync(transcriptTmpDir, { recursive: true });
|
|
137
145
|
let totalBytes = 0;
|
|
138
146
|
const filesToPack = [];
|
|
147
|
+
const copyFile = (src, destRelative) => {
|
|
148
|
+
if (!fs.existsSync(src))
|
|
149
|
+
return;
|
|
150
|
+
const destPath = path.join(transcriptTmpDir, destRelative);
|
|
151
|
+
const destDir = path.dirname(destPath);
|
|
152
|
+
if (!fs.existsSync(destDir))
|
|
153
|
+
fs.mkdirSync(destDir, { recursive: true });
|
|
154
|
+
const srcSize = fs.statSync(src).size;
|
|
155
|
+
logger.system(`[data-collector] Copying transcript file ${destRelative} (${formatBytes(srcSize)})`);
|
|
156
|
+
fs.copyFileSync(src, destPath);
|
|
157
|
+
totalBytes += srcSize;
|
|
158
|
+
filesToPack.push(destRelative);
|
|
159
|
+
};
|
|
160
|
+
// List all files in transcript dir once
|
|
161
|
+
const allDirEntries = fs.readdirSync(transcriptDir);
|
|
139
162
|
for (const sessionId of activeSessionIds) {
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
163
|
+
const countBefore = filesToPack.length;
|
|
164
|
+
// 1. Always copy live transcript (current active data)
|
|
165
|
+
copyFile(path.join(transcriptDir, `${sessionId}.jsonl`), `${sessionId}.jsonl`);
|
|
166
|
+
// Collect all files belonging to this session for date-filtered pass
|
|
167
|
+
const sessionFiles = allDirEntries.filter((f) => f.startsWith(sessionId));
|
|
168
|
+
let datedFilesFound = false;
|
|
169
|
+
// 2. Date-stamped archives: *.archive.YYYY-MM-DD.jsonl
|
|
170
|
+
// and image archives: *.image-archive.YYYY-MM-DD.jsonl
|
|
171
|
+
for (const f of sessionFiles) {
|
|
172
|
+
// Date-stamped archive
|
|
173
|
+
const archiveDate = /\.archive\.(\d{4}-\d{2}-\d{2})\.jsonl$/.exec(f);
|
|
174
|
+
if (archiveDate) {
|
|
175
|
+
datedFilesFound = true;
|
|
176
|
+
if (archiveDate[1] >= since) {
|
|
177
|
+
copyFile(path.join(transcriptDir, f), f);
|
|
178
|
+
}
|
|
144
179
|
continue;
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
180
|
+
}
|
|
181
|
+
// Date-stamped image archive
|
|
182
|
+
const imgArchiveDate = /\.image-archive\.(\d{4}-\d{2}-\d{2})\.jsonl$/.exec(f);
|
|
183
|
+
if (imgArchiveDate) {
|
|
184
|
+
datedFilesFound = true;
|
|
185
|
+
if (imgArchiveDate[1] >= since) {
|
|
186
|
+
copyFile(path.join(transcriptDir, f), f);
|
|
187
|
+
}
|
|
188
|
+
continue;
|
|
189
|
+
}
|
|
190
|
+
}
|
|
191
|
+
if (!datedFilesFound) {
|
|
192
|
+
// Fallback: no date-stamped files found for this session — collect all
|
|
193
|
+
// legacy files (undated archives) regardless of mtime so we don't miss data.
|
|
194
|
+
for (const f of sessionFiles) {
|
|
195
|
+
// Skip the live .jsonl (already copied above)
|
|
196
|
+
if (f === `${sessionId}.jsonl`)
|
|
197
|
+
continue;
|
|
198
|
+
if (!f.endsWith(".jsonl"))
|
|
199
|
+
continue;
|
|
200
|
+
copyFile(path.join(transcriptDir, f), f);
|
|
201
|
+
}
|
|
202
|
+
logger.system(`[data-collector] No dated archives for session ${sessionId.slice(0, 8)} — falling back to all files`);
|
|
203
|
+
}
|
|
204
|
+
else {
|
|
205
|
+
// Date-stamped files exist; also collect legacy undated archives if mtime matches
|
|
206
|
+
for (const f of sessionFiles) {
|
|
207
|
+
if (f === `${sessionId}.archive.jsonl` || f === `${sessionId}.image-archive.jsonl`) {
|
|
208
|
+
const src = path.join(transcriptDir, f);
|
|
209
|
+
try {
|
|
210
|
+
const stat = fs.statSync(src);
|
|
211
|
+
if (stat.mtimeMs >= sinceMs) {
|
|
212
|
+
copyFile(src, f);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
catch { /* ignore */ }
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
// 3. Sub-agent transcripts by mtime (fallback: all if nothing matches)
|
|
220
|
+
const subagentsDir = path.join(transcriptDir, sessionId, "subagents");
|
|
221
|
+
if (fs.existsSync(subagentsDir)) {
|
|
222
|
+
try {
|
|
223
|
+
const subEntries = fs.readdirSync(subagentsDir).filter((s) => s.endsWith(".jsonl"));
|
|
224
|
+
const matchedSubs = [];
|
|
225
|
+
for (const sub of subEntries) {
|
|
226
|
+
const subPath = path.join(subagentsDir, sub);
|
|
227
|
+
try {
|
|
228
|
+
const stat = fs.statSync(subPath);
|
|
229
|
+
if (stat.mtimeMs >= sinceMs) {
|
|
230
|
+
matchedSubs.push(sub);
|
|
231
|
+
}
|
|
232
|
+
}
|
|
233
|
+
catch { /* ignore */ }
|
|
234
|
+
}
|
|
235
|
+
// Fallback: if no sub-agent files matched by mtime, pack all of them
|
|
236
|
+
const subsToPack = matchedSubs.length > 0 ? matchedSubs : subEntries;
|
|
237
|
+
if (matchedSubs.length === 0 && subEntries.length > 0) {
|
|
238
|
+
logger.system(`[data-collector] No sub-agent files matched since=${since} for ${sessionId.slice(0, 8)} — falling back to all ${subEntries.length} file(s)`);
|
|
239
|
+
}
|
|
240
|
+
for (const sub of subsToPack) {
|
|
241
|
+
const relPath = path.join(sessionId, "subagents", sub);
|
|
242
|
+
copyFile(path.join(subagentsDir, sub), relPath);
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
catch { /* ignore */ }
|
|
246
|
+
}
|
|
247
|
+
if (filesToPack.length === countBefore) {
|
|
248
|
+
logger.system(`[data-collector] No transcript files collected for session ${sessionId.slice(0, 8)}`);
|
|
150
249
|
}
|
|
151
250
|
}
|
|
152
251
|
if (filesToPack.length === 0)
|
|
@@ -239,6 +338,11 @@ export function createCollectDataHandler(config) {
|
|
|
239
338
|
.replace(/[-:]/g, "")
|
|
240
339
|
.replace("T", "T")
|
|
241
340
|
.slice(0, 15);
|
|
341
|
+
// Cross-midnight safety: subtract 1 day so trajectories spanning midnight
|
|
342
|
+
// are fully captured (the extra day of overlap is cheap and safe).
|
|
343
|
+
const sinceDate = new Date(since);
|
|
344
|
+
sinceDate.setDate(sinceDate.getDate() - 1);
|
|
345
|
+
const effectiveSince = sinceDate.toISOString().slice(0, 10);
|
|
242
346
|
const creds = getTosCredentials(config);
|
|
243
347
|
const tmpDir = fs.mkdtempSync(path.join(os.tmpdir(), "vc-collect-"));
|
|
244
348
|
let uploadedFiles = 0;
|
|
@@ -246,8 +350,8 @@ export function createCollectDataHandler(config) {
|
|
|
246
350
|
try {
|
|
247
351
|
// 1. Logs
|
|
248
352
|
try {
|
|
249
|
-
logger.system(`[data-collector] Collecting logs since ${since}...`);
|
|
250
|
-
const logs = collectLogs(
|
|
353
|
+
logger.system(`[data-collector] Collecting logs since ${effectiveSince} (requested: ${since})...`);
|
|
354
|
+
const logs = collectLogs(effectiveSince, tmpDir);
|
|
251
355
|
if (logs) {
|
|
252
356
|
const key = `${agentId}/${timestamp}/logs/logs.tar.gz`;
|
|
253
357
|
logger.system(`[data-collector] Uploading logs (${logs.fileCount} files, ${formatBytes(logs.totalBytes)})...`);
|
|
@@ -261,8 +365,8 @@ export function createCollectDataHandler(config) {
|
|
|
261
365
|
}
|
|
262
366
|
// 2. Transcripts
|
|
263
367
|
try {
|
|
264
|
-
logger.system(
|
|
265
|
-
const transcripts = collectTranscripts(tmpDir);
|
|
368
|
+
logger.system(`[data-collector] Collecting transcripts since ${effectiveSince}...`);
|
|
369
|
+
const transcripts = collectTranscripts(effectiveSince, tmpDir);
|
|
266
370
|
if (transcripts) {
|
|
267
371
|
const key = `${agentId}/${timestamp}/transcripts/transcripts.tar.gz`;
|
|
268
372
|
logger.system(`[data-collector] Uploading transcripts (${transcripts.fileCount} files, ${formatBytes(transcripts.totalBytes)} raw)...`);
|