aws-runtime-bridge 1.9.9 → 1.9.20
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/adapter/AcodeSdkAdapter.d.ts +40 -0
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/AcodeSdkAdapter.js +353 -7
- package/dist/adapter/AcodeSdkAdapter.test.js +155 -8
- package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/OpencodeSdkAdapter.js +36 -3
- package/dist/adapter/instance-ai-config-resolver.d.ts +49 -0
- package/dist/adapter/instance-ai-config-resolver.d.ts.map +1 -0
- package/dist/adapter/instance-ai-config-resolver.js +46 -0
- package/dist/adapter/types.d.ts +27 -2
- package/dist/adapter/types.d.ts.map +1 -1
- package/dist/index.js +7 -3
- package/dist/routes/dashboard.d.ts.map +1 -1
- package/dist/routes/dashboard.js +1092 -8
- package/dist/routes/events.d.ts +7 -0
- package/dist/routes/events.d.ts.map +1 -0
- package/dist/routes/events.js +22 -0
- package/dist/routes/file-browser.d.ts +1 -1
- package/dist/routes/file-browser.d.ts.map +1 -1
- package/dist/routes/file-browser.js +25 -9
- package/dist/routes/file-snapshot.d.ts +10 -0
- package/dist/routes/file-snapshot.d.ts.map +1 -0
- package/dist/routes/file-snapshot.js +156 -0
- package/dist/routes/git.d.ts +10 -0
- package/dist/routes/git.d.ts.map +1 -1
- package/dist/routes/git.js +305 -2
- package/dist/routes/git.test.js +39 -2
- package/dist/routes/instance.js +3 -1
- package/dist/routes/memory.d.ts +3 -0
- package/dist/routes/memory.d.ts.map +1 -1
- package/dist/routes/memory.js +3 -0
- package/dist/routes/terminal.d.ts +2 -1
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +378 -41
- package/dist/routes/terminal.test.js +33 -7
- package/dist/services/agent-event-store.d.ts +59 -0
- package/dist/services/agent-event-store.d.ts.map +1 -0
- package/dist/services/agent-event-store.js +68 -0
- package/dist/services/event-delta-pusher.d.ts +40 -0
- package/dist/services/event-delta-pusher.d.ts.map +1 -0
- package/dist/services/event-delta-pusher.js +95 -0
- package/dist/services/fileSnapshotStore.d.ts +96 -0
- package/dist/services/fileSnapshotStore.d.ts.map +1 -0
- package/dist/services/fileSnapshotStore.js +500 -0
- package/dist/services/instance-ai-config-service.d.ts +49 -0
- package/dist/services/instance-ai-config-service.d.ts.map +1 -0
- package/dist/services/instance-ai-config-service.js +174 -0
- package/dist/services/panel-auth.d.ts +23 -0
- package/dist/services/panel-auth.d.ts.map +1 -1
- package/dist/services/panel-auth.js +64 -1
- package/dist/services/ring-buffer.d.ts +67 -0
- package/dist/services/ring-buffer.d.ts.map +1 -0
- package/dist/services/ring-buffer.js +103 -0
- package/dist/services/session-output.d.ts +47 -3
- package/dist/services/session-output.d.ts.map +1 -1
- package/dist/services/session-output.js +112 -2
- package/dist/utils/instance-ai-config-debug-logger.d.ts +37 -0
- package/dist/utils/instance-ai-config-debug-logger.d.ts.map +1 -0
- package/dist/utils/instance-ai-config-debug-logger.js +63 -0
- package/dist/utils/logger.d.ts +18 -0
- package/dist/utils/logger.d.ts.map +1 -1
- package/dist/utils/logger.js +48 -4
- package/package/acode/dist/built-in-file-tools.d.ts +1 -1
- package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
- package/package/acode/dist/built-in-file-tools.js +5 -3
- package/package/acode/dist/builtins/commandArtifacts.d.ts +8 -1
- package/package/acode/dist/builtins/commandArtifacts.d.ts.map +1 -1
- package/package/acode/dist/builtins/commandArtifacts.js +24 -4
- package/package/acode/dist/builtins/shellCommandResult.d.ts +1 -0
- package/package/acode/dist/builtins/shellCommandResult.d.ts.map +1 -1
- package/package/acode/dist/builtins/shellCommandResult.js +3 -3
- package/package/acode/dist/builtins/shellCommandRunner.d.ts +1 -0
- package/package/acode/dist/builtins/shellCommandRunner.d.ts.map +1 -1
- package/package/acode/dist/builtins/shellCommandRunner.js +1 -0
- package/package/acode/dist/cli.js +2 -0
- package/package/acode/dist/runtime.d.ts.map +1 -1
- package/package/acode/dist/runtime.js +156 -5
- package/package/acode/dist/types.d.ts +1 -0
- package/package/acode/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +5 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js +16 -0
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +136 -0
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/context-manager.js +473 -0
- package/package/aws-client-agent-mcp/dist/context-manager.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +6 -0
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts.map +1 -0
- package/package/aws-client-agent-mcp/dist/context-manager.test.js +307 -0
- package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -0
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +170 -2
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +947 -9
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +103 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +15 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +62 -2
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +46 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js +164 -12
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +8 -0
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js +88 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +7 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js +18 -0
- package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +103 -2
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +27 -2
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js +122 -5
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
- package/package.json +1 -1
|
@@ -4,10 +4,20 @@
|
|
|
4
4
|
* 管理终端会话的输出缓冲和刷新机制
|
|
5
5
|
*/
|
|
6
6
|
import axios from "axios";
|
|
7
|
-
import { requestRuntimeAccessTokenRefreshForServer } from "../services/auto-register.js";
|
|
8
7
|
import { resolveSchedulerBaseUrlFrom } from "../config.js";
|
|
8
|
+
import { requestRuntimeAccessTokenRefreshForServer } from "../services/auto-register.js";
|
|
9
9
|
import { logger } from "../utils/logger.js";
|
|
10
|
+
import { agentEventStore } from "./agent-event-store.js";
|
|
11
|
+
import { scheduleEventPush } from "./event-delta-pusher.js";
|
|
12
|
+
import { RingBuffer } from "./ring-buffer.js";
|
|
10
13
|
import { getRuntimeAccessToken } from "./runtime-binding.js";
|
|
14
|
+
/**
|
|
15
|
+
* 全局桥接侧事件环状缓冲区。
|
|
16
|
+
*
|
|
17
|
+
* 容量 2000 条,适用于记录非关键状态/输出事件。
|
|
18
|
+
* 通过 sendStatus/sendOutput 自动写入,同时保留原有的 server 回调路径。
|
|
19
|
+
*/
|
|
20
|
+
export const bridgeEventBuffer = new RingBuffer(2000);
|
|
11
21
|
function runtimeAuthHeaders(options, callbackBaseUrl = resolveRuntimeCallbackBaseUrl(options)) {
|
|
12
22
|
const token = options?.runtimeAccessToken ||
|
|
13
23
|
getRuntimeAccessToken(undefined, callbackBaseUrl) ||
|
|
@@ -59,6 +69,8 @@ async function tryRefreshRuntimeToken(serverBaseUrl) {
|
|
|
59
69
|
tokenRefreshPromise = null;
|
|
60
70
|
}
|
|
61
71
|
}
|
|
72
|
+
/** 单条 output 事件的文本长度上限(需求 4.1.3 #1),超过则截断。 */
|
|
73
|
+
const MAX_SINGLE_OUTPUT_CHARS = 8000;
|
|
62
74
|
/** 单个会话待发送输出上限,避免调度器不可达时内存无限增长。 */
|
|
63
75
|
const MAX_PENDING_OUTPUT_CHARS = 64 * 1024;
|
|
64
76
|
/** 单次回调最大发送量,避免一次 POST 携带过大的终端噪声。 */
|
|
@@ -73,8 +85,12 @@ export const sessions = new Map();
|
|
|
73
85
|
* @param status - 状态
|
|
74
86
|
* @param actionInfo - 可选的动作详情
|
|
75
87
|
*/
|
|
76
|
-
export async function sendStatus(agentId, sessionId, status, actionInfo, usage, authOptions) {
|
|
88
|
+
export async function sendStatus(agentId, sessionId, status, actionInfo, usage, authOptions, timestamp, sourceEventType) {
|
|
77
89
|
const payload = { agentId, sessionId, status };
|
|
90
|
+
// 添加时间戳(仅当提供了有效时间戳时才传递,保持原始事件时间顺序)
|
|
91
|
+
if (timestamp !== undefined) {
|
|
92
|
+
payload.timestamp = timestamp;
|
|
93
|
+
}
|
|
78
94
|
// 添加细粒度动作信息
|
|
79
95
|
if (actionInfo) {
|
|
80
96
|
if (actionInfo.actionType)
|
|
@@ -92,6 +108,13 @@ export async function sendStatus(agentId, sessionId, status, actionInfo, usage,
|
|
|
92
108
|
if (usage) {
|
|
93
109
|
payload.inputTokens = usage.inputTokens;
|
|
94
110
|
payload.outputTokens = usage.outputTokens;
|
|
111
|
+
if (usage.contextLimit) {
|
|
112
|
+
payload.contextLimit = usage.contextLimit;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
// 添加来源事件类型(用于前端时间线灰度区分,如 thinking / ai_request)
|
|
116
|
+
if (sourceEventType) {
|
|
117
|
+
payload.sourceEventType = sourceEventType;
|
|
95
118
|
}
|
|
96
119
|
const callbackBaseUrl = resolveRuntimeCallbackBaseUrl(authOptions);
|
|
97
120
|
const headers = runtimeAuthHeaders(authOptions, callbackBaseUrl);
|
|
@@ -129,6 +152,27 @@ export async function sendStatus(agentId, sessionId, status, actionInfo, usage,
|
|
|
129
152
|
});
|
|
130
153
|
return undefined;
|
|
131
154
|
}
|
|
155
|
+
finally {
|
|
156
|
+
// 不论 server 回调成功或失败,都在桥接侧本地记录状态事件
|
|
157
|
+
const eventPayload = {
|
|
158
|
+
category: "status",
|
|
159
|
+
agentId,
|
|
160
|
+
sessionId,
|
|
161
|
+
status,
|
|
162
|
+
actionType: actionInfo?.actionType,
|
|
163
|
+
actionLabel: actionInfo?.actionLabel,
|
|
164
|
+
actionDetail: actionInfo?.actionDetail,
|
|
165
|
+
actionResult: actionInfo?.actionResult,
|
|
166
|
+
actionId: actionInfo?.actionId,
|
|
167
|
+
inputTokens: usage?.inputTokens,
|
|
168
|
+
outputTokens: usage?.outputTokens,
|
|
169
|
+
sourceEventType,
|
|
170
|
+
};
|
|
171
|
+
bridgeEventBuffer.append(eventPayload);
|
|
172
|
+
// 同步写入 per-agent 事件存储并调度差量推送
|
|
173
|
+
const entry = agentEventStore.append(agentId, eventPayload);
|
|
174
|
+
scheduleEventPush(agentId, entry, authOptions);
|
|
175
|
+
}
|
|
132
176
|
}
|
|
133
177
|
/**
|
|
134
178
|
* 发送输出到调度器
|
|
@@ -174,6 +218,47 @@ export async function sendOutput(agentId, output, sessionId, seq, metadata, auth
|
|
|
174
218
|
error,
|
|
175
219
|
});
|
|
176
220
|
}
|
|
221
|
+
finally {
|
|
222
|
+
// 不论 server 回调成功或失败,都在桥接侧本地记录输出事件
|
|
223
|
+
// 需求 4.1.3 #1:截断超长 output,确保单条事件体积可控
|
|
224
|
+
const truncatedOutput = output.length > MAX_SINGLE_OUTPUT_CHARS
|
|
225
|
+
? `${output.slice(0, MAX_SINGLE_OUTPUT_CHARS)}...(truncated)`
|
|
226
|
+
: output;
|
|
227
|
+
const eventPayload = {
|
|
228
|
+
category: "output",
|
|
229
|
+
agentId,
|
|
230
|
+
sessionId,
|
|
231
|
+
output: truncatedOutput,
|
|
232
|
+
seq,
|
|
233
|
+
sourceEventType: metadata?.sourceEventType,
|
|
234
|
+
logLevel: metadata?.logLevel,
|
|
235
|
+
logCategory: metadata?.logCategory,
|
|
236
|
+
};
|
|
237
|
+
// output 事件合并写入:同 session + 同 sourceEventType + 10s 窗口内追加到同一条
|
|
238
|
+
bridgeEventBuffer.appendOrMerge(eventPayload, (lastEntry) => {
|
|
239
|
+
const last = lastEntry.data;
|
|
240
|
+
return (last.category === "output" &&
|
|
241
|
+
last.sessionId === sessionId &&
|
|
242
|
+
last.sourceEventType === metadata?.sourceEventType &&
|
|
243
|
+
Date.now() - lastEntry.timestamp <= 10_000);
|
|
244
|
+
}, (lastData, newData) => {
|
|
245
|
+
// 内容去重:如果新内容已包含在已合并内容中,跳过拼接防止重复
|
|
246
|
+
const existingOutput = lastData.output || "";
|
|
247
|
+
const newOutput = newData.output || "";
|
|
248
|
+
const merged = existingOutput.includes(newOutput)
|
|
249
|
+
? existingOutput
|
|
250
|
+
: `${existingOutput}${newOutput}`;
|
|
251
|
+
return {
|
|
252
|
+
...lastData,
|
|
253
|
+
output: merged.length > MAX_SINGLE_OUTPUT_CHARS
|
|
254
|
+
? `${merged.slice(0, MAX_SINGLE_OUTPUT_CHARS)}...(truncated)`
|
|
255
|
+
: merged,
|
|
256
|
+
};
|
|
257
|
+
});
|
|
258
|
+
// 同步写入 per-agent 事件存储(同样合并)并调度差量推送
|
|
259
|
+
const entry = agentEventStore.appendOrMergeOutput(agentId, eventPayload);
|
|
260
|
+
scheduleEventPush(agentId, entry, authOptions);
|
|
261
|
+
}
|
|
177
262
|
}
|
|
178
263
|
/**
|
|
179
264
|
* 发送 AskUserQuestion 事件到调度器。
|
|
@@ -210,6 +295,18 @@ export async function sendQuestionRequest(agentId, sessionId, questions, authOpt
|
|
|
210
295
|
}
|
|
211
296
|
// ignore transient callback failures
|
|
212
297
|
}
|
|
298
|
+
finally {
|
|
299
|
+
// 记录 question 事件到 per-agent 存储
|
|
300
|
+
const eventPayload = {
|
|
301
|
+
category: "question",
|
|
302
|
+
agentId,
|
|
303
|
+
sessionId,
|
|
304
|
+
questions,
|
|
305
|
+
};
|
|
306
|
+
bridgeEventBuffer.append(eventPayload);
|
|
307
|
+
const entry = agentEventStore.append(agentId, eventPayload);
|
|
308
|
+
scheduleEventPush(agentId, entry, authOptions);
|
|
309
|
+
}
|
|
213
310
|
}
|
|
214
311
|
/**
|
|
215
312
|
* 发送工作区文件变更事件到调度器,由调度器通过 WebSocket 通知前端刷新预览。
|
|
@@ -241,6 +338,19 @@ export async function sendFileChanged(payload) {
|
|
|
241
338
|
}
|
|
242
339
|
// ignore transient callback failures
|
|
243
340
|
}
|
|
341
|
+
finally {
|
|
342
|
+
// 记录 file_changed 事件到 per-agent 存储
|
|
343
|
+
const eventPayload = {
|
|
344
|
+
category: "file_changed",
|
|
345
|
+
agentId: "",
|
|
346
|
+
sessionId: null,
|
|
347
|
+
workspacePath: payload.workspacePath,
|
|
348
|
+
filePath: payload.filePath,
|
|
349
|
+
eventType: payload.eventType,
|
|
350
|
+
size: payload.size,
|
|
351
|
+
};
|
|
352
|
+
bridgeEventBuffer.append(eventPayload);
|
|
353
|
+
}
|
|
244
354
|
}
|
|
245
355
|
/**
|
|
246
356
|
* 追加会话输出到有界缓冲区。
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Instance AI 配置调试日志记录器
|
|
3
|
+
*
|
|
4
|
+
* 将 AI 配置解析/应用过程写入固定日志文件,
|
|
5
|
+
* 供 bridge + 后端共享调试。
|
|
6
|
+
*/
|
|
7
|
+
export interface DebugLogEntry {
|
|
8
|
+
level: "info" | "warn" | "error";
|
|
9
|
+
category: string;
|
|
10
|
+
message: string;
|
|
11
|
+
source: string;
|
|
12
|
+
sessionId?: string;
|
|
13
|
+
agentId?: string;
|
|
14
|
+
details?: Record<string, unknown>;
|
|
15
|
+
}
|
|
16
|
+
/**
|
|
17
|
+
* 调试日志记录器。
|
|
18
|
+
* 所有日志异步追加到固定文件,不阻塞主流程。
|
|
19
|
+
*/
|
|
20
|
+
export declare class InstanceAiConfigDebugLogger {
|
|
21
|
+
private readonly logPath;
|
|
22
|
+
constructor(logPath?: string);
|
|
23
|
+
/**
|
|
24
|
+
* 写入一条调试日志。
|
|
25
|
+
* 格式:ISO时间 | level | 消息
|
|
26
|
+
*/
|
|
27
|
+
log(entry: DebugLogEntry): Promise<void>;
|
|
28
|
+
/**
|
|
29
|
+
* 刷新日志(当前实现为无操作,追加写入天然实时落盘)。
|
|
30
|
+
*/
|
|
31
|
+
flush(): Promise<void>;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* 获取全局单例的调试日志记录器。
|
|
35
|
+
*/
|
|
36
|
+
export declare function getInstanceAiConfigDebugLogger(): InstanceAiConfigDebugLogger;
|
|
37
|
+
//# sourceMappingURL=instance-ai-config-debug-logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"instance-ai-config-debug-logger.d.ts","sourceRoot":"","sources":["../../src/utils/instance-ai-config-debug-logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAWH,MAAM,WAAW,aAAa;IAC5B,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACnC;AAED;;;GAGG;AACH,qBAAa,2BAA2B;IACtC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;gBAErB,OAAO,GAAE,MAAuB;IAI5C;;;OAGG;IACG,GAAG,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,IAAI,CAAC;IA2B9C;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAG7B;AAID;;GAEG;AACH,wBAAgB,8BAA8B,IAAI,2BAA2B,CAK5E"}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Instance AI 配置调试日志记录器
|
|
3
|
+
*
|
|
4
|
+
* 将 AI 配置解析/应用过程写入固定日志文件,
|
|
5
|
+
* 供 bridge + 后端共享调试。
|
|
6
|
+
*/
|
|
7
|
+
import fs from "node:fs/promises";
|
|
8
|
+
import path from "node:path";
|
|
9
|
+
import os from "node:os";
|
|
10
|
+
const DEBUG_LOG_PATH = path.join(os.userInfo().homedir, "Instance-ai-configuration-debug.log");
|
|
11
|
+
/**
|
|
12
|
+
* 调试日志记录器。
|
|
13
|
+
* 所有日志异步追加到固定文件,不阻塞主流程。
|
|
14
|
+
*/
|
|
15
|
+
export class InstanceAiConfigDebugLogger {
|
|
16
|
+
constructor(logPath = DEBUG_LOG_PATH) {
|
|
17
|
+
this.logPath = logPath;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* 写入一条调试日志。
|
|
21
|
+
* 格式:ISO时间 | level | 消息
|
|
22
|
+
*/
|
|
23
|
+
async log(entry) {
|
|
24
|
+
try {
|
|
25
|
+
const timestamp = new Date().toISOString();
|
|
26
|
+
const parts = [
|
|
27
|
+
`[${timestamp}]`,
|
|
28
|
+
`[${entry.level.toUpperCase()}]`,
|
|
29
|
+
`[${entry.source}]`,
|
|
30
|
+
`[${entry.category}]`,
|
|
31
|
+
entry.message,
|
|
32
|
+
];
|
|
33
|
+
if (entry.sessionId)
|
|
34
|
+
parts.push(`session=${entry.sessionId}`);
|
|
35
|
+
if (entry.agentId)
|
|
36
|
+
parts.push(`agent=${entry.agentId}`);
|
|
37
|
+
const line = parts.join(" ");
|
|
38
|
+
const detailLine = entry.details
|
|
39
|
+
? ` ${JSON.stringify(entry.details, null, 2)}`
|
|
40
|
+
: "";
|
|
41
|
+
await fs.appendFile(this.logPath, `${line}\n${detailLine ? `${detailLine}\n` : ""}`, "utf-8");
|
|
42
|
+
}
|
|
43
|
+
catch {
|
|
44
|
+
// 调试日志写入失败不阻塞主流程
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* 刷新日志(当前实现为无操作,追加写入天然实时落盘)。
|
|
49
|
+
*/
|
|
50
|
+
async flush() {
|
|
51
|
+
// appendFile 每次调用已保证落盘
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
let defaultLogger;
|
|
55
|
+
/**
|
|
56
|
+
* 获取全局单例的调试日志记录器。
|
|
57
|
+
*/
|
|
58
|
+
export function getInstanceAiConfigDebugLogger() {
|
|
59
|
+
if (!defaultLogger) {
|
|
60
|
+
defaultLogger = new InstanceAiConfigDebugLogger();
|
|
61
|
+
}
|
|
62
|
+
return defaultLogger;
|
|
63
|
+
}
|
package/dist/utils/logger.d.ts
CHANGED
|
@@ -2,8 +2,26 @@
|
|
|
2
2
|
* 统一日志模块
|
|
3
3
|
*
|
|
4
4
|
* 提供结构化日志输出,支持不同日志级别和格式化
|
|
5
|
+
* 附带环形缓冲区,capture 最近 N 条日志供面板查看
|
|
5
6
|
*/
|
|
6
7
|
export type LogLevel = 'debug' | 'info' | 'warn' | 'error';
|
|
8
|
+
/** 向缓冲区追加一条日志 */
|
|
9
|
+
export declare function pushLog(level: LogLevel, prefix: string, message: string): void;
|
|
10
|
+
/**
|
|
11
|
+
* 返回缓冲区中最近的日志(按时间倒序)
|
|
12
|
+
* @param maxCount 最多返回条数
|
|
13
|
+
* @param filterLevel 可选级别过滤
|
|
14
|
+
*/
|
|
15
|
+
export declare function getRecentLogs(maxCount?: number, filterLevel?: LogLevel): Array<{
|
|
16
|
+
level: LogLevel;
|
|
17
|
+
timestamp: string;
|
|
18
|
+
prefix: string;
|
|
19
|
+
message: string;
|
|
20
|
+
}>;
|
|
21
|
+
/** 启用/禁用缓冲区(测试时使用) */
|
|
22
|
+
export declare function setLogBufferEnabled(enabled: boolean): void;
|
|
23
|
+
/** 清空缓冲区 */
|
|
24
|
+
export declare function clearLogBuffer(): void;
|
|
7
25
|
export interface LogConfig {
|
|
8
26
|
level: LogLevel;
|
|
9
27
|
prefix?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAO3D,iBAAiB;AACjB,wBAAgB,OAAO,CAAC,KAAK,EAAE,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,IAAI,CAM9E;AAED;;;;GAIG;AACH,wBAAgB,aAAa,CAAC,QAAQ,SAAM,EAAE,WAAW,CAAC,EAAE,QAAQ,GAAG,KAAK,CAAC;IAAE,KAAK,EAAE,QAAQ,CAAC;IAAC,SAAS,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,CAAC,CAQpJ;AAED,sBAAsB;AACtB,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,OAAO,GAAG,IAAI,CAE1D;AAED,YAAY;AACZ,wBAAgB,cAAc,IAAI,IAAI,CAErC;AAED,MAAM,WAAW,SAAS;IACxB,KAAK,EAAE,QAAQ,CAAC;IAChB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,OAAO,CAAC;CACrB;AAkCD;;GAEG;AACH,qBAAa,MAAM;IACjB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAW;IACjC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAS;IAChC,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAU;gBAExB,MAAM,GAAE,SAA6B;IAMjD,OAAO,CAAC,SAAS;IAIjB,OAAO,CAAC,aAAa;IAkBrB,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAQ/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAQ9B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAQ9B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAQ/B;;OAEG;IACH,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM;CAO9B;AAQD,eAAO,MAAM,MAAM;qBACA,OAAO,EAAE,KAAG,IAAI;oBACjB,OAAO,EAAE,KAAG,IAAI;oBAChB,OAAO,EAAE,KAAG,IAAI;qBACf,OAAO,EAAE,KAAG,IAAI;oBACjB,MAAM,KAAG,MAAM;CAChC,CAAC;AAGF,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,OAAO,CAAC,SAAS,CAAC,GAAG,MAAM,CAMhF"}
|
package/dist/utils/logger.js
CHANGED
|
@@ -2,7 +2,43 @@
|
|
|
2
2
|
* 统一日志模块
|
|
3
3
|
*
|
|
4
4
|
* 提供结构化日志输出,支持不同日志级别和格式化
|
|
5
|
+
* 附带环形缓冲区,capture 最近 N 条日志供面板查看
|
|
5
6
|
*/
|
|
7
|
+
// ── 环形日志缓冲区 ──────────────────────────────────────
|
|
8
|
+
const MAX_LOG_ENTRIES = 500;
|
|
9
|
+
const logBuffer = [];
|
|
10
|
+
let logBufferEnabled = true;
|
|
11
|
+
/** 向缓冲区追加一条日志 */
|
|
12
|
+
export function pushLog(level, prefix, message) {
|
|
13
|
+
if (!logBufferEnabled)
|
|
14
|
+
return;
|
|
15
|
+
logBuffer.push({ level, timestamp: new Date().toISOString(), prefix, message });
|
|
16
|
+
if (logBuffer.length > MAX_LOG_ENTRIES) {
|
|
17
|
+
logBuffer.splice(0, logBuffer.length - MAX_LOG_ENTRIES);
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* 返回缓冲区中最近的日志(按时间倒序)
|
|
22
|
+
* @param maxCount 最多返回条数
|
|
23
|
+
* @param filterLevel 可选级别过滤
|
|
24
|
+
*/
|
|
25
|
+
export function getRecentLogs(maxCount = 200, filterLevel) {
|
|
26
|
+
let entries = logBuffer;
|
|
27
|
+
if (filterLevel) {
|
|
28
|
+
const levels = ['debug', 'info', 'warn', 'error'];
|
|
29
|
+
const minIdx = levels.indexOf(filterLevel);
|
|
30
|
+
entries = entries.filter(e => levels.indexOf(e.level) >= minIdx);
|
|
31
|
+
}
|
|
32
|
+
return entries.slice(-maxCount).reverse();
|
|
33
|
+
}
|
|
34
|
+
/** 启用/禁用缓冲区(测试时使用) */
|
|
35
|
+
export function setLogBufferEnabled(enabled) {
|
|
36
|
+
logBufferEnabled = enabled;
|
|
37
|
+
}
|
|
38
|
+
/** 清空缓冲区 */
|
|
39
|
+
export function clearLogBuffer() {
|
|
40
|
+
logBuffer.length = 0;
|
|
41
|
+
}
|
|
6
42
|
const LOG_LEVEL_PRIORITY = {
|
|
7
43
|
debug: 0,
|
|
8
44
|
info: 1,
|
|
@@ -59,22 +95,30 @@ export class Logger {
|
|
|
59
95
|
}
|
|
60
96
|
debug(...args) {
|
|
61
97
|
if (this.shouldLog('debug')) {
|
|
62
|
-
|
|
98
|
+
const msg = this.formatMessage('debug', args);
|
|
99
|
+
console.debug(msg);
|
|
100
|
+
pushLog('debug', this.prefix, formatArgs(args));
|
|
63
101
|
}
|
|
64
102
|
}
|
|
65
103
|
info(...args) {
|
|
66
104
|
if (this.shouldLog('info')) {
|
|
67
|
-
|
|
105
|
+
const msg = this.formatMessage('info', args);
|
|
106
|
+
console.info(msg);
|
|
107
|
+
pushLog('info', this.prefix, formatArgs(args));
|
|
68
108
|
}
|
|
69
109
|
}
|
|
70
110
|
warn(...args) {
|
|
71
111
|
if (this.shouldLog('warn')) {
|
|
72
|
-
|
|
112
|
+
const msg = this.formatMessage('warn', args);
|
|
113
|
+
console.warn(msg);
|
|
114
|
+
pushLog('warn', this.prefix, formatArgs(args));
|
|
73
115
|
}
|
|
74
116
|
}
|
|
75
117
|
error(...args) {
|
|
76
118
|
if (this.shouldLog('error')) {
|
|
77
|
-
|
|
119
|
+
const msg = this.formatMessage('error', args);
|
|
120
|
+
console.error(msg);
|
|
121
|
+
pushLog('error', this.prefix, formatArgs(args));
|
|
78
122
|
}
|
|
79
123
|
}
|
|
80
124
|
/**
|
|
@@ -16,5 +16,5 @@ export interface ACodeBuiltInTool {
|
|
|
16
16
|
export interface ACodeBuiltInToolExecutionContext {
|
|
17
17
|
readonly onOutput?: CommandOutputSink;
|
|
18
18
|
}
|
|
19
|
-
export declare function createBuiltInFileTools(workingDirectory: string): ACodeBuiltInTool[];
|
|
19
|
+
export declare function createBuiltInFileTools(workingDirectory: string, agentId?: string): ACodeBuiltInTool[];
|
|
20
20
|
//# sourceMappingURL=built-in-file-tools.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"built-in-file-tools.d.ts","sourceRoot":"","sources":["../src/built-in-file-tools.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AACjC,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,OAAO,CACL,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,gCAAgC,GACzC,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CACvC;
|
|
1
|
+
{"version":3,"file":"built-in-file-tools.d.ts","sourceRoot":"","sources":["../src/built-in-file-tools.ts"],"names":[],"mappings":"AAIA,OAAO,EAEL,KAAK,iBAAiB,EACvB,MAAM,kCAAkC,CAAC;AAE1C,MAAM,MAAM,SAAS,GACjB,MAAM,GACN,MAAM,GACN,OAAO,GACP,IAAI,GACJ,SAAS,EAAE,GACX;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AACjC,MAAM,MAAM,UAAU,GAAG;IAAE,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,CAAA;CAAE,CAAC;AAEtD,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,SAAS,CAAC;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,UAAU,CAAC;IACxB,OAAO,CACL,IAAI,EAAE,UAAU,EAChB,OAAO,CAAC,EAAE,gCAAgC,GACzC,OAAO,CAAC,OAAO,CAAC,CAAC;CACrB;AAED,MAAM,WAAW,gCAAgC;IAC/C,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CACvC;AAufD,wBAAgB,sBAAsB,CACpC,gBAAgB,EAAE,MAAM,EACxB,OAAO,CAAC,EAAE,MAAM,GACf,gBAAgB,EAAE,CAQpB"}
|
|
@@ -298,7 +298,7 @@ function readFileTool(workingDirectory) {
|
|
|
298
298
|
},
|
|
299
299
|
};
|
|
300
300
|
}
|
|
301
|
-
function bashTool(workingDirectory) {
|
|
301
|
+
function bashTool(workingDirectory, agentId) {
|
|
302
302
|
return {
|
|
303
303
|
kind: "builtin",
|
|
304
304
|
toolName: "Bash",
|
|
@@ -341,6 +341,7 @@ function bashTool(workingDirectory) {
|
|
|
341
341
|
const resolved = await resolveWorkspaceDirectory(workingDirectory, cwdArg);
|
|
342
342
|
const result = await runShellCommand({
|
|
343
343
|
commandText: command,
|
|
344
|
+
agentId,
|
|
344
345
|
workspaceRoot: resolved.workspaceRoot,
|
|
345
346
|
cwd: resolved.cwd,
|
|
346
347
|
timeoutMs,
|
|
@@ -370,11 +371,12 @@ function bashTool(workingDirectory) {
|
|
|
370
371
|
},
|
|
371
372
|
};
|
|
372
373
|
}
|
|
373
|
-
export function createBuiltInFileTools(workingDirectory) {
|
|
374
|
+
export function createBuiltInFileTools(workingDirectory, agentId) {
|
|
375
|
+
const resolvedAgentId = agentId || "unknown";
|
|
374
376
|
return [
|
|
375
377
|
readFileTool(workingDirectory),
|
|
376
378
|
writeFileTool(workingDirectory),
|
|
377
379
|
editFileTool(workingDirectory),
|
|
378
|
-
bashTool(workingDirectory),
|
|
380
|
+
bashTool(workingDirectory, resolvedAgentId),
|
|
379
381
|
];
|
|
380
382
|
}
|
|
@@ -3,7 +3,14 @@ export declare const LONG_COMMAND_LINE_LIMIT = 300;
|
|
|
3
3
|
export declare const MAX_COMMAND_OUTPUT_BYTES: number;
|
|
4
4
|
export declare function toDisplayPath(targetPath: string): string;
|
|
5
5
|
export declare function countOutputLines(output: string): number;
|
|
6
|
-
export declare function
|
|
6
|
+
export declare function buildAcodeCmdDistDir(agentId: string): string;
|
|
7
|
+
export declare function buildAcodeAgentDir(agentId: string): string;
|
|
8
|
+
export declare function writeCommandArtifactFile(agentId: string, suffix: string, extension: string, content: string, now?: Date): Promise<string>;
|
|
9
|
+
/**
|
|
10
|
+
* 清理 ACode 重启时指定 agentId 的旧 spillover 输出目录。
|
|
11
|
+
* 删除 ~/.agentswork/acode/<agentId>/cmd-dist/ 下的所有内容。
|
|
12
|
+
*/
|
|
13
|
+
export declare function cleanupAcodeCmdDist(agentId: string): Promise<void>;
|
|
7
14
|
export declare function buildCommandOutputSpilloverContent(input: {
|
|
8
15
|
readonly commandText: string;
|
|
9
16
|
readonly commandFilePath?: string;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"commandArtifacts.d.ts","sourceRoot":"","sources":["../../src/builtins/commandArtifacts.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"commandArtifacts.d.ts","sourceRoot":"","sources":["../../src/builtins/commandArtifacts.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,mCAAmC,MAAM,CAAC;AACvD,eAAO,MAAM,uBAAuB,MAAM,CAAC;AAC3C,eAAO,MAAM,wBAAwB,QAAa,CAAC;AAEnD,wBAAgB,aAAa,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAExD;AAMD,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAWvD;AAED,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE5D;AAED,wBAAgB,kBAAkB,CAAC,OAAO,EAAE,MAAM,GAAG,MAAM,CAE1D;AAyBD,wBAAsB,wBAAwB,CAC5C,OAAO,EAAE,MAAM,EACf,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,OAAa,GACf,OAAO,CAAC,MAAM,CAAC,CAUjB;AAED;;;GAGG;AACH,wBAAsB,mBAAmB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAOxE;AAED,wBAAgB,kCAAkC,CAAC,KAAK,EAAE;IACxD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,OAAO,EAAE,IAAI,CAAC;IACvB,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,GAAG,MAAM,CAmBT;AAED,wBAAgB,kCAAkC,CAChD,cAAc,EAAE,MAAM,EACtB,eAAe,EAAE,MAAM,GACtB,MAAM,CAMR;AAED,wBAAgB,cAAc,CAAC,KAAK,EAAE,MAAM,GAAG;IAAE,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAA;CAAE,CAWvE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { randomUUID } from "node:crypto";
|
|
2
2
|
import { promises as fs } from "node:fs";
|
|
3
|
+
import os from "node:os";
|
|
3
4
|
import path from "node:path";
|
|
4
5
|
export const COMMAND_OUTPUT_SPILLOVER_LINE_LIMIT = 300;
|
|
5
6
|
export const LONG_COMMAND_LINE_LIMIT = 300;
|
|
@@ -22,21 +23,40 @@ export function countOutputLines(output) {
|
|
|
22
23
|
? withoutTrailingLineBreak.split("\n").length
|
|
23
24
|
: 1;
|
|
24
25
|
}
|
|
25
|
-
function
|
|
26
|
+
export function buildAcodeCmdDistDir(agentId) {
|
|
27
|
+
return path.join(os.homedir(), ".acode", "cmd-dist", agentId);
|
|
28
|
+
}
|
|
29
|
+
export function buildAcodeAgentDir(agentId) {
|
|
30
|
+
return path.join(os.homedir(), ".acode", "cmd-dist", agentId);
|
|
31
|
+
}
|
|
32
|
+
function buildCommandArtifactPath(agentId, now, suffix, extension) {
|
|
26
33
|
const year = now.getFullYear();
|
|
27
34
|
const month = padDatePart(now.getMonth() + 1);
|
|
28
35
|
const day = padDatePart(now.getDate());
|
|
29
36
|
const hour = padDatePart(now.getHours());
|
|
30
37
|
const minute = padDatePart(now.getMinutes());
|
|
31
38
|
const timestamp = `${year}${month}${day}-${hour}${minute}${padDatePart(now.getSeconds())}-${String(now.getMilliseconds()).padStart(3, "0")}-${process.pid}-${randomUUID().slice(0, 8)}`;
|
|
32
|
-
return path.join(
|
|
39
|
+
return path.join(buildAcodeCmdDistDir(agentId), `${year}-${month}-${day}`, hour, minute, `${timestamp}-${suffix}.${extension}`);
|
|
33
40
|
}
|
|
34
|
-
export async function writeCommandArtifactFile(
|
|
35
|
-
const targetPath = buildCommandArtifactPath(
|
|
41
|
+
export async function writeCommandArtifactFile(agentId, suffix, extension, content, now = new Date()) {
|
|
42
|
+
const targetPath = buildCommandArtifactPath(agentId, now, suffix, extension);
|
|
36
43
|
await fs.mkdir(path.dirname(targetPath), { recursive: true });
|
|
37
44
|
await fs.writeFile(targetPath, content, "utf-8");
|
|
38
45
|
return targetPath;
|
|
39
46
|
}
|
|
47
|
+
/**
|
|
48
|
+
* 清理 ACode 重启时指定 agentId 的旧 spillover 输出目录。
|
|
49
|
+
* 删除 ~/.agentswork/acode/<agentId>/cmd-dist/ 下的所有内容。
|
|
50
|
+
*/
|
|
51
|
+
export async function cleanupAcodeCmdDist(agentId) {
|
|
52
|
+
const cmdDistDir = buildAcodeCmdDistDir(agentId);
|
|
53
|
+
try {
|
|
54
|
+
await fs.rm(cmdDistDir, { recursive: true, force: true });
|
|
55
|
+
}
|
|
56
|
+
catch {
|
|
57
|
+
// 目录不存在或权限不足时静默忽略
|
|
58
|
+
}
|
|
59
|
+
}
|
|
40
60
|
export function buildCommandOutputSpilloverContent(input) {
|
|
41
61
|
return [
|
|
42
62
|
`Command: ${input.commandText}`,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shellCommandResult.d.ts","sourceRoot":"","sources":["../../src/builtins/shellCommandResult.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CAClC;AAED,UAAU,uBAAuB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACrB;AA0CD,wBAAsB,yBAAyB,CAC9C,KAAK,EAAE,uBAAuB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAuD7B"}
|
|
1
|
+
{"version":3,"file":"shellCommandResult.d.ts","sourceRoot":"","sources":["../../src/builtins/shellCommandResult.ts"],"names":[],"mappings":"AASA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,8BAA8B,CAAC;AAEzE,MAAM,WAAW,kBAAkB;IAClC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,UAAU,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,cAAc,CAAC,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,EAAE,MAAM,CAAC;IACjC,QAAQ,CAAC,eAAe,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,gBAAgB,EAAE,MAAM,CAAC;CAClC;AAED,UAAU,uBAAuB;IAChC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,IAAI,CAAC;IACjC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC,OAAO,GAAG,IAAI,CAAC;IACvC,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,SAAS,EAAE,IAAI,CAAC;IACzB,QAAQ,CAAC,QAAQ,EAAE,OAAO,CAAC;IAC3B,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;IACrC,QAAQ,CAAC,QAAQ,EAAE,oBAAoB,CAAC;IACxC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;CACrB;AA0CD,wBAAsB,yBAAyB,CAC9C,KAAK,EAAE,uBAAuB,GAC5B,OAAO,CAAC,kBAAkB,CAAC,CAuD7B"}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { buildCommandOutputSpilloverContent, COMMAND_OUTPUT_SPILLOVER_LINE_LIMIT, countOutputLines, formatCommandOutputSpilloverStdout, toDisplayPath, truncateOutput, writeCommandArtifactFile, } from "./commandArtifacts.js";
|
|
2
|
-
async function writeCommandOutputSpilloverFile(
|
|
3
|
-
return writeCommandArtifactFile(
|
|
2
|
+
async function writeCommandOutputSpilloverFile(agentId, content) {
|
|
3
|
+
return writeCommandArtifactFile(agentId, "cmd", "out", content);
|
|
4
4
|
}
|
|
5
5
|
function buildShellCommandResult(input) {
|
|
6
6
|
return {
|
|
@@ -24,7 +24,7 @@ export async function resolveClosedShellCommand(input) {
|
|
|
24
24
|
const endedAt = new Date();
|
|
25
25
|
const outputLineCount = countOutputLines(`${input.stdout}${input.stderr}`);
|
|
26
26
|
if (outputLineCount > COMMAND_OUTPUT_SPILLOVER_LINE_LIMIT) {
|
|
27
|
-
const outputFilePath = await writeCommandOutputSpilloverFile(input.
|
|
27
|
+
const outputFilePath = await writeCommandOutputSpilloverFile(input.agentId, buildCommandOutputSpilloverContent({
|
|
28
28
|
commandText: input.prepared.originalCommandText,
|
|
29
29
|
commandFilePath: input.prepared.commandFilePath,
|
|
30
30
|
commandLineCount: input.prepared.commandLineCount,
|
|
@@ -3,6 +3,7 @@ import { type ShellCommandResult } from "./shellCommandResult.js";
|
|
|
3
3
|
export type { CommandOutputEvent, CommandOutputSink };
|
|
4
4
|
export interface RunShellCommandOptions {
|
|
5
5
|
readonly commandText: string;
|
|
6
|
+
readonly agentId: string;
|
|
6
7
|
readonly workspaceRoot: string;
|
|
7
8
|
readonly cwd: string;
|
|
8
9
|
readonly timeoutMs: number;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"shellCommandRunner.d.ts","sourceRoot":"","sources":["../../src/builtins/shellCommandRunner.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEtB,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAEN,KAAK,kBAAkB,EACvB,MAAM,yBAAyB,CAAC;AAMjC,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;AAEtD,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CACtC;AAED,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAInC,wBAAsB,eAAe,CACpC,OAAO,EAAE,sBAAsB,GAC7B,OAAO,CAAC,kBAAkB,CAAC,
|
|
1
|
+
{"version":3,"file":"shellCommandRunner.d.ts","sourceRoot":"","sources":["../../src/builtins/shellCommandRunner.ts"],"names":[],"mappings":"AAEA,OAAO,EACN,KAAK,kBAAkB,EACvB,KAAK,iBAAiB,EAEtB,MAAM,0BAA0B,CAAC;AAKlC,OAAO,EAEN,KAAK,kBAAkB,EACvB,MAAM,yBAAyB,CAAC;AAMjC,YAAY,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,CAAC;AAEtD,MAAM,WAAW,sBAAsB;IACtC,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,mBAAmB,EAAE,MAAM,CAAC;IACrC,QAAQ,CAAC,QAAQ,CAAC,EAAE,iBAAiB,CAAC;CACtC;AAED,YAAY,EAAE,kBAAkB,EAAE,CAAC;AAInC,wBAAsB,eAAe,CACpC,OAAO,EAAE,sBAAsB,GAC7B,OAAO,CAAC,kBAAkB,CAAC,CAsH7B"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
#!/usr/bin/env node
|
|
2
2
|
import { randomUUID } from 'node:crypto';
|
|
3
|
+
import os from 'node:os';
|
|
3
4
|
import path from 'node:path';
|
|
4
5
|
import { ACodeRuntime } from './runtime.js';
|
|
5
6
|
function getFlagValue(args, name) {
|
|
@@ -18,6 +19,7 @@ async function main() {
|
|
|
18
19
|
const prompt = getFlagValue(args, '--prompt') || args.filter((arg) => !arg.startsWith('--')).join(' ');
|
|
19
20
|
const runtime = new ACodeRuntime({
|
|
20
21
|
sessionId: getFlagValue(args, '--session-id') || randomUUID(),
|
|
22
|
+
agentId: getFlagValue(args, '--agent-id') || os.hostname(),
|
|
21
23
|
workingDirectory: cwd,
|
|
22
24
|
configPath,
|
|
23
25
|
skillsDir,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;
|
|
1
|
+
{"version":3,"file":"runtime.d.ts","sourceRoot":"","sources":["../src/runtime.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAmB3C,OAAO,KAAK,EAOV,kBAAkB,EAEnB,MAAM,YAAY,CAAC;AAksCpB,qBAAa,YAAa,SAAQ,YAAY;IAsChC,OAAO,CAAC,QAAQ,CAAC,MAAM;IArCnC,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAe;IACvC,OAAO,CAAC,mBAAmB,CAAqB;IAEhD,OAAO,CAAC,KAAK,CAoBX;IAEF,OAAO,CAAC,eAAe,CAAgC;IAEvD,OAAO,CAAC,WAAW,CAAoC;IAEvD,OAAO,CAAC,UAAU,CAAS;IAE3B,OAAO,CAAC,cAAc,CAAS;IAE/B,OAAO,CAAC,sBAAsB,CAAS;IACvC,OAAO,CAAC,cAAc,CAAK;IAC3B,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAyB;gBAExB,MAAM,EAAE,kBAAkB;IAevD,OAAO,CAAC,cAAc;IAatB;;;;OAIG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAoG5B;;;;OAIG;IACG,MAAM,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5C;;;OAGG;IACG,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC;IAWnC,OAAO,CAAC,gBAAgB;YAIV,aAAa;IAoO3B,oDAAoD;IAC9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,uCAAuC;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B3B,OAAO,CAAC,kBAAkB;YAaZ,YAAY;YAyJZ,qBAAqB;YAmLrB,wBAAwB;YA8ExB,eAAe;YAqSf,sBAAsB;IA6CpC;;;OAGG;IACH,OAAO,CAAC,uBAAuB;IAiC/B;;;OAGG;IACH,OAAO,CAAC,iBAAiB;YAQX,oCAAoC;IAsBlD,OAAO,CAAC,uBAAuB;YAuBjB,iBAAiB;IA2C/B,OAAO,CAAC,kBAAkB;YA2BZ,oBAAoB;CAiBnC"}
|