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.
Files changed (121) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +40 -0
  2. package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
  3. package/dist/adapter/AcodeSdkAdapter.js +353 -7
  4. package/dist/adapter/AcodeSdkAdapter.test.js +155 -8
  5. package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
  6. package/dist/adapter/OpencodeSdkAdapter.js +36 -3
  7. package/dist/adapter/instance-ai-config-resolver.d.ts +49 -0
  8. package/dist/adapter/instance-ai-config-resolver.d.ts.map +1 -0
  9. package/dist/adapter/instance-ai-config-resolver.js +46 -0
  10. package/dist/adapter/types.d.ts +27 -2
  11. package/dist/adapter/types.d.ts.map +1 -1
  12. package/dist/index.js +7 -3
  13. package/dist/routes/dashboard.d.ts.map +1 -1
  14. package/dist/routes/dashboard.js +1092 -8
  15. package/dist/routes/events.d.ts +7 -0
  16. package/dist/routes/events.d.ts.map +1 -0
  17. package/dist/routes/events.js +22 -0
  18. package/dist/routes/file-browser.d.ts +1 -1
  19. package/dist/routes/file-browser.d.ts.map +1 -1
  20. package/dist/routes/file-browser.js +25 -9
  21. package/dist/routes/file-snapshot.d.ts +10 -0
  22. package/dist/routes/file-snapshot.d.ts.map +1 -0
  23. package/dist/routes/file-snapshot.js +156 -0
  24. package/dist/routes/git.d.ts +10 -0
  25. package/dist/routes/git.d.ts.map +1 -1
  26. package/dist/routes/git.js +305 -2
  27. package/dist/routes/git.test.js +39 -2
  28. package/dist/routes/instance.js +3 -1
  29. package/dist/routes/memory.d.ts +3 -0
  30. package/dist/routes/memory.d.ts.map +1 -1
  31. package/dist/routes/memory.js +3 -0
  32. package/dist/routes/terminal.d.ts +2 -1
  33. package/dist/routes/terminal.d.ts.map +1 -1
  34. package/dist/routes/terminal.js +378 -41
  35. package/dist/routes/terminal.test.js +33 -7
  36. package/dist/services/agent-event-store.d.ts +59 -0
  37. package/dist/services/agent-event-store.d.ts.map +1 -0
  38. package/dist/services/agent-event-store.js +68 -0
  39. package/dist/services/event-delta-pusher.d.ts +40 -0
  40. package/dist/services/event-delta-pusher.d.ts.map +1 -0
  41. package/dist/services/event-delta-pusher.js +95 -0
  42. package/dist/services/fileSnapshotStore.d.ts +96 -0
  43. package/dist/services/fileSnapshotStore.d.ts.map +1 -0
  44. package/dist/services/fileSnapshotStore.js +500 -0
  45. package/dist/services/instance-ai-config-service.d.ts +49 -0
  46. package/dist/services/instance-ai-config-service.d.ts.map +1 -0
  47. package/dist/services/instance-ai-config-service.js +174 -0
  48. package/dist/services/panel-auth.d.ts +23 -0
  49. package/dist/services/panel-auth.d.ts.map +1 -1
  50. package/dist/services/panel-auth.js +64 -1
  51. package/dist/services/ring-buffer.d.ts +67 -0
  52. package/dist/services/ring-buffer.d.ts.map +1 -0
  53. package/dist/services/ring-buffer.js +103 -0
  54. package/dist/services/session-output.d.ts +47 -3
  55. package/dist/services/session-output.d.ts.map +1 -1
  56. package/dist/services/session-output.js +112 -2
  57. package/dist/utils/instance-ai-config-debug-logger.d.ts +37 -0
  58. package/dist/utils/instance-ai-config-debug-logger.d.ts.map +1 -0
  59. package/dist/utils/instance-ai-config-debug-logger.js +63 -0
  60. package/dist/utils/logger.d.ts +18 -0
  61. package/dist/utils/logger.d.ts.map +1 -1
  62. package/dist/utils/logger.js +48 -4
  63. package/package/acode/dist/built-in-file-tools.d.ts +1 -1
  64. package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
  65. package/package/acode/dist/built-in-file-tools.js +5 -3
  66. package/package/acode/dist/builtins/commandArtifacts.d.ts +8 -1
  67. package/package/acode/dist/builtins/commandArtifacts.d.ts.map +1 -1
  68. package/package/acode/dist/builtins/commandArtifacts.js +24 -4
  69. package/package/acode/dist/builtins/shellCommandResult.d.ts +1 -0
  70. package/package/acode/dist/builtins/shellCommandResult.d.ts.map +1 -1
  71. package/package/acode/dist/builtins/shellCommandResult.js +3 -3
  72. package/package/acode/dist/builtins/shellCommandRunner.d.ts +1 -0
  73. package/package/acode/dist/builtins/shellCommandRunner.d.ts.map +1 -1
  74. package/package/acode/dist/builtins/shellCommandRunner.js +1 -0
  75. package/package/acode/dist/cli.js +2 -0
  76. package/package/acode/dist/runtime.d.ts.map +1 -1
  77. package/package/acode/dist/runtime.js +156 -5
  78. package/package/acode/dist/types.d.ts +1 -0
  79. package/package/acode/dist/types.d.ts.map +1 -1
  80. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +5 -0
  81. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
  82. package/package/aws-client-agent-mcp/dist/agent-client.js +16 -0
  83. package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
  84. package/package/aws-client-agent-mcp/dist/context-manager.d.ts +136 -0
  85. package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +1 -0
  86. package/package/aws-client-agent-mcp/dist/context-manager.js +473 -0
  87. package/package/aws-client-agent-mcp/dist/context-manager.js.map +1 -0
  88. package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +6 -0
  89. package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts.map +1 -0
  90. package/package/aws-client-agent-mcp/dist/context-manager.test.js +307 -0
  91. package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -0
  92. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +170 -2
  93. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
  94. package/package/aws-client-agent-mcp/dist/mcp-server.js +947 -9
  95. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
  96. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +103 -1
  97. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
  98. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +15 -1
  99. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
  100. package/package/aws-client-agent-mcp/dist/mcp-tools.js +62 -2
  101. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
  102. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +46 -1
  103. package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
  104. package/package/aws-client-agent-mcp/dist/memory-store.js +164 -12
  105. package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
  106. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +8 -0
  107. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -1
  108. package/package/aws-client-agent-mcp/dist/memory-tools.js +88 -1
  109. package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
  110. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +7 -1
  111. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
  112. package/package/aws-client-agent-mcp/dist/server-memory-store.js +18 -0
  113. package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
  114. package/package/aws-client-agent-mcp/dist/types.d.ts +103 -2
  115. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
  116. package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
  117. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +27 -2
  118. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
  119. package/package/aws-client-agent-mcp/dist/websocket-client.js +122 -5
  120. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
  121. 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
+ }
@@ -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;;;;GAIG;AAEH,MAAM,MAAM,QAAQ,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE3D,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;IAM/B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAM9B,IAAI,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAM9B,KAAK,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,GAAG,IAAI;IAM/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"}
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"}
@@ -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
- console.debug(this.formatMessage('debug', args));
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
- console.info(this.formatMessage('info', args));
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
- console.warn(this.formatMessage('warn', args));
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
- console.error(this.formatMessage('error', args));
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;AAsfD,wBAAgB,sBAAsB,CACpC,gBAAgB,EAAE,MAAM,GACvB,gBAAgB,EAAE,CAOpB"}
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 writeCommandArtifactFile(workspaceRoot: string, suffix: string, extension: string, content: string, now?: Date): Promise<string>;
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":"AAIA,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;AA4BD,wBAAsB,wBAAwB,CAC5C,aAAa,EAAE,MAAM,EACrB,MAAM,EAAE,MAAM,EACd,SAAS,EAAE,MAAM,EACjB,OAAO,EAAE,MAAM,EACf,GAAG,OAAa,GACf,OAAO,CAAC,MAAM,CAAC,CAUjB;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
+ {"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 buildCommandArtifactPath(workspaceRoot, now, suffix, extension) {
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(workspaceRoot, ".agentswork", "acode", "cmd-dist", `${year}-${month}-${day}`, hour, minute, `${timestamp}-${suffix}.${extension}`);
39
+ return path.join(buildAcodeCmdDistDir(agentId), `${year}-${month}-${day}`, hour, minute, `${timestamp}-${suffix}.${extension}`);
33
40
  }
34
- export async function writeCommandArtifactFile(workspaceRoot, suffix, extension, content, now = new Date()) {
35
- const targetPath = buildCommandArtifactPath(workspaceRoot, now, suffix, extension);
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}`,
@@ -22,6 +22,7 @@ interface ClosedShellCommandInput {
22
22
  readonly timedOut: boolean;
23
23
  readonly inactivityTimedOut: boolean;
24
24
  readonly prepared: PreparedShellCommand;
25
+ readonly agentId: string;
25
26
  readonly workspaceRoot: string;
26
27
  readonly cwd: string;
27
28
  }
@@ -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(workspaceRoot, content) {
3
- return writeCommandArtifactFile(workspaceRoot, "cmd", "out", content);
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.workspaceRoot, buildCommandOutputSpilloverContent({
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,CAqH7B"}
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"}
@@ -106,6 +106,7 @@ export async function runShellCommand(options) {
106
106
  timedOut,
107
107
  inactivityTimedOut,
108
108
  prepared,
109
+ agentId: options.agentId,
109
110
  workspaceRoot: options.workspaceRoot,
110
111
  cwd: options.cwd,
111
112
  }).then(resolve, reject);
@@ -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;AAkB3C,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;IA2F5B;;;;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;IA6F3B,oDAAoD;IAC9C,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAM5B,uCAAuC;IACjC,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC;IA+B3B,OAAO,CAAC,kBAAkB;YAaZ,YAAY;YAoFZ,qBAAqB;YAuKrB,wBAAwB;YA8ExB,eAAe;YAuMf,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"}
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"}