aws-runtime-bridge 1.9.10 → 1.9.21

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 (132) 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 +376 -10
  4. package/dist/adapter/AcodeSdkAdapter.test.js +155 -8
  5. package/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -1
  6. package/dist/adapter/ClaudeSdkAdapter.js +17 -1
  7. package/dist/adapter/CodexSdkAdapter.d.ts.map +1 -1
  8. package/dist/adapter/CodexSdkAdapter.js +15 -1
  9. package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
  10. package/dist/adapter/OpencodeSdkAdapter.js +56 -4
  11. package/dist/adapter/instance-ai-config-resolver.d.ts +49 -0
  12. package/dist/adapter/instance-ai-config-resolver.d.ts.map +1 -0
  13. package/dist/adapter/instance-ai-config-resolver.js +46 -0
  14. package/dist/adapter/types.d.ts +29 -2
  15. package/dist/adapter/types.d.ts.map +1 -1
  16. package/dist/index.js +5 -1
  17. package/dist/routes/dashboard.d.ts.map +1 -1
  18. package/dist/routes/dashboard.js +749 -15
  19. package/dist/routes/events.d.ts +7 -0
  20. package/dist/routes/events.d.ts.map +1 -0
  21. package/dist/routes/events.js +22 -0
  22. package/dist/routes/file-browser.d.ts +1 -1
  23. package/dist/routes/file-browser.d.ts.map +1 -1
  24. package/dist/routes/file-browser.js +25 -9
  25. package/dist/routes/file-snapshot.d.ts +10 -0
  26. package/dist/routes/file-snapshot.d.ts.map +1 -0
  27. package/dist/routes/file-snapshot.js +156 -0
  28. package/dist/routes/git.d.ts +10 -0
  29. package/dist/routes/git.d.ts.map +1 -1
  30. package/dist/routes/git.js +405 -2
  31. package/dist/routes/git.test.js +39 -2
  32. package/dist/routes/instance.js +3 -1
  33. package/dist/routes/memory.d.ts +3 -0
  34. package/dist/routes/memory.d.ts.map +1 -1
  35. package/dist/routes/memory.js +3 -0
  36. package/dist/routes/terminal.d.ts +17 -3
  37. package/dist/routes/terminal.d.ts.map +1 -1
  38. package/dist/routes/terminal.js +464 -47
  39. package/dist/routes/terminal.test.js +37 -9
  40. package/dist/services/agent-event-store.d.ts +60 -0
  41. package/dist/services/agent-event-store.d.ts.map +1 -0
  42. package/dist/services/agent-event-store.js +68 -0
  43. package/dist/services/event-delta-pusher.d.ts +40 -0
  44. package/dist/services/event-delta-pusher.d.ts.map +1 -0
  45. package/dist/services/event-delta-pusher.js +95 -0
  46. package/dist/services/fileSnapshotStore.d.ts +96 -0
  47. package/dist/services/fileSnapshotStore.d.ts.map +1 -0
  48. package/dist/services/fileSnapshotStore.js +500 -0
  49. package/dist/services/instance-ai-config-service.d.ts +49 -0
  50. package/dist/services/instance-ai-config-service.d.ts.map +1 -0
  51. package/dist/services/instance-ai-config-service.js +174 -0
  52. package/dist/services/panel-auth.d.ts +8 -0
  53. package/dist/services/panel-auth.d.ts.map +1 -1
  54. package/dist/services/panel-auth.js +8 -0
  55. package/dist/services/ring-buffer.d.ts +67 -0
  56. package/dist/services/ring-buffer.d.ts.map +1 -0
  57. package/dist/services/ring-buffer.js +103 -0
  58. package/dist/services/session-output.d.ts +49 -3
  59. package/dist/services/session-output.d.ts.map +1 -1
  60. package/dist/services/session-output.js +115 -2
  61. package/dist/utils/instance-ai-config-debug-logger.d.ts +37 -0
  62. package/dist/utils/instance-ai-config-debug-logger.d.ts.map +1 -0
  63. package/dist/utils/instance-ai-config-debug-logger.js +63 -0
  64. package/dist/utils/logger.d.ts +18 -0
  65. package/dist/utils/logger.d.ts.map +1 -1
  66. package/dist/utils/logger.js +48 -4
  67. package/package/acode/dist/built-in-file-tools.d.ts +1 -1
  68. package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
  69. package/package/acode/dist/built-in-file-tools.js +5 -3
  70. package/package/acode/dist/builtins/commandArtifacts.d.ts +8 -1
  71. package/package/acode/dist/builtins/commandArtifacts.d.ts.map +1 -1
  72. package/package/acode/dist/builtins/commandArtifacts.js +24 -4
  73. package/package/acode/dist/builtins/shellCommandResult.d.ts +1 -0
  74. package/package/acode/dist/builtins/shellCommandResult.d.ts.map +1 -1
  75. package/package/acode/dist/builtins/shellCommandResult.js +3 -3
  76. package/package/acode/dist/builtins/shellCommandRunner.d.ts +1 -0
  77. package/package/acode/dist/builtins/shellCommandRunner.d.ts.map +1 -1
  78. package/package/acode/dist/builtins/shellCommandRunner.js +1 -0
  79. package/package/acode/dist/builtins/shellOutputDecoder.d.ts +25 -2
  80. package/package/acode/dist/builtins/shellOutputDecoder.d.ts.map +1 -1
  81. package/package/acode/dist/builtins/shellOutputDecoder.js +69 -5
  82. package/package/acode/dist/cli.js +2 -0
  83. package/package/acode/dist/runtime.d.ts.map +1 -1
  84. package/package/acode/dist/runtime.js +156 -5
  85. package/package/acode/dist/types.d.ts +1 -0
  86. package/package/acode/dist/types.d.ts.map +1 -1
  87. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +10 -3
  88. package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
  89. package/package/aws-client-agent-mcp/dist/agent-client.js +33 -11
  90. package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
  91. package/package/aws-client-agent-mcp/dist/context-manager.d.ts +136 -0
  92. package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +1 -0
  93. package/package/aws-client-agent-mcp/dist/context-manager.js +473 -0
  94. package/package/aws-client-agent-mcp/dist/context-manager.js.map +1 -0
  95. package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +6 -0
  96. package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts.map +1 -0
  97. package/package/aws-client-agent-mcp/dist/context-manager.test.js +307 -0
  98. package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -0
  99. package/package/aws-client-agent-mcp/dist/http-client.d.ts +11 -0
  100. package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
  101. package/package/aws-client-agent-mcp/dist/http-client.js +67 -0
  102. package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
  103. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +166 -10
  104. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
  105. package/package/aws-client-agent-mcp/dist/mcp-server.js +933 -41
  106. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
  107. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +150 -130
  108. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
  109. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +15 -1
  110. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
  111. package/package/aws-client-agent-mcp/dist/mcp-tools.js +62 -2
  112. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
  113. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +58 -1
  114. package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
  115. package/package/aws-client-agent-mcp/dist/memory-store.js +246 -15
  116. package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
  117. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +8 -0
  118. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -1
  119. package/package/aws-client-agent-mcp/dist/memory-tools.js +106 -2
  120. package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
  121. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +7 -1
  122. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
  123. package/package/aws-client-agent-mcp/dist/server-memory-store.js +18 -0
  124. package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
  125. package/package/aws-client-agent-mcp/dist/types.d.ts +103 -2
  126. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
  127. package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
  128. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +27 -2
  129. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
  130. package/package/aws-client-agent-mcp/dist/websocket-client.js +123 -5
  131. package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
  132. package/package.json +1 -1
@@ -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,28 @@
1
1
  import { TextDecoder } from "node:util";
2
+ /**
3
+ * 自动检测解码器接口。暴露 TextDecoder 兼容的 decode() 方法,
4
+ * 调用方仍可像使用 TextDecoder 一样使用(decode(chunk, options))。
5
+ */
6
+ export interface OutputDecoder {
7
+ decode(chunk?: Uint8Array | ArrayBuffer | null, options?: {
8
+ stream?: boolean;
9
+ }): string;
10
+ }
2
11
  export declare function resolveShellOutputEncoding(platform?: NodeJS.Platform, env?: NodeJS.ProcessEnv): string;
3
- export declare function createShellOutputDecoder(encoding?: string): TextDecoder;
4
- export declare function decodeShellOutputChunk(decoder: TextDecoder, chunk?: Buffer, end?: boolean): string;
12
+ /**
13
+ * 创建一个自动检测编码的流式解码器。
14
+ *
15
+ * 主流程:优先使用环境变量指定的编码 -> Windows 上自动检测 UTF-8/GB18030 ->
16
+ * 非 Windows 默认 UTF-8。
17
+ *
18
+ * 自动检测策略:先用 UTF-8 解码;如果输出中出现 \uFFFD(替换字符),
19
+ * 说明实际编码不是 UTF-8,立即切换为 GB18030 并用已缓冲的原始字节重新解码。
20
+ * 这样可以同时覆盖 UTF-8 输出(PowerShell Core、WSL 等)和 GBK 输出(cmd.exe 等)。
21
+ */
22
+ export declare function createShellOutputDecoder(encoding?: string): OutputDecoder;
23
+ /**
24
+ * 解码 shell 输出 chunk。
25
+ * 兼容旧接口,decoder 可以是 TextDecoder 或 OutputDecoder。
26
+ */
27
+ export declare function decodeShellOutputChunk(decoder: OutputDecoder | TextDecoder, chunk?: Buffer, end?: boolean): string;
5
28
  //# sourceMappingURL=shellOutputDecoder.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"shellOutputDecoder.d.ts","sourceRoot":"","sources":["../../src/builtins/shellOutputDecoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAKxC,wBAAgB,0BAA0B,CACzC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,MAAM,CAUR;AAED,wBAAgB,wBAAwB,CACvC,QAAQ,SAA+B,GACrC,WAAW,CAMb;AAED,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,WAAW,EACpB,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,UAAQ,GACT,MAAM,CAQR"}
1
+ {"version":3,"file":"shellOutputDecoder.d.ts","sourceRoot":"","sources":["../../src/builtins/shellOutputDecoder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,MAAM,WAAW,CAAC;AAExC;;;GAGG;AACH,MAAM,WAAW,aAAa;IAC7B,MAAM,CAAC,KAAK,CAAC,EAAE,UAAU,GAAG,WAAW,GAAG,IAAI,EAAE,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAE,GAAG,MAAM,CAAC;CACxF;AAKD,wBAAgB,0BAA0B,CACzC,QAAQ,GAAE,MAAM,CAAC,QAA2B,EAC5C,GAAG,GAAE,MAAM,CAAC,UAAwB,GAClC,MAAM,CAUR;AAED;;;;;;;;;GASG;AACH,wBAAgB,wBAAwB,CACvC,QAAQ,SAA+B,GACrC,aAAa,CAYf;AAsDD;;;GAGG;AACH,wBAAgB,sBAAsB,CACrC,OAAO,EAAE,aAAa,GAAG,WAAW,EACpC,KAAK,CAAC,EAAE,MAAM,EACd,GAAG,UAAQ,GACT,MAAM,CAQR"}
@@ -1,5 +1,5 @@
1
1
  import { TextDecoder } from "node:util";
2
- const DEFAULT_WINDOWS_SHELL_OUTPUT_ENCODING = "gb18030";
2
+ const DEFAULT_WINDOWS_SHELL_OUTPUT_ENCODING = "utf-8";
3
3
  const DEFAULT_SHELL_OUTPUT_ENCODING = "utf-8";
4
4
  export function resolveShellOutputEncoding(platform = process.platform, env = process.env) {
5
5
  const configuredEncoding = env.ACODE_COMMAND_OUTPUT_ENCODING?.trim() ||
@@ -11,14 +11,78 @@ export function resolveShellOutputEncoding(platform = process.platform, env = pr
11
11
  ? DEFAULT_WINDOWS_SHELL_OUTPUT_ENCODING
12
12
  : DEFAULT_SHELL_OUTPUT_ENCODING;
13
13
  }
14
+ /**
15
+ * 创建一个自动检测编码的流式解码器。
16
+ *
17
+ * 主流程:优先使用环境变量指定的编码 -> Windows 上自动检测 UTF-8/GB18030 ->
18
+ * 非 Windows 默认 UTF-8。
19
+ *
20
+ * 自动检测策略:先用 UTF-8 解码;如果输出中出现 \uFFFD(替换字符),
21
+ * 说明实际编码不是 UTF-8,立即切换为 GB18030 并用已缓冲的原始字节重新解码。
22
+ * 这样可以同时覆盖 UTF-8 输出(PowerShell Core、WSL 等)和 GBK 输出(cmd.exe 等)。
23
+ */
14
24
  export function createShellOutputDecoder(encoding = resolveShellOutputEncoding()) {
15
- try {
16
- return new TextDecoder(encoding, { fatal: false });
25
+ // 环境变量显式指定了非 utf-8 编码 → 固定编码,不做自动检测
26
+ if (encoding !== "utf-8") {
27
+ try {
28
+ return new TextDecoder(encoding, { fatal: false });
29
+ }
30
+ catch {
31
+ return new TextDecoder(DEFAULT_SHELL_OUTPUT_ENCODING, { fatal: false });
32
+ }
17
33
  }
18
- catch {
19
- return new TextDecoder(DEFAULT_SHELL_OUTPUT_ENCODING, { fatal: false });
34
+ // 默认 utf-8 → 启用自动检测模式
35
+ return createAutoDetectDecoder();
36
+ }
37
+ function createAutoDetectDecoder() {
38
+ let utf8Decoder = null;
39
+ let gbDecoder = null;
40
+ let detectedEncoding = null;
41
+ const rawChunks = [];
42
+ function getDecoder(enc) {
43
+ try {
44
+ return new TextDecoder(enc, { fatal: false });
45
+ }
46
+ catch {
47
+ return new TextDecoder("utf-8", { fatal: false });
48
+ }
20
49
  }
50
+ return {
51
+ decode(chunk, options) {
52
+ if (chunk !== undefined && chunk !== null) {
53
+ rawChunks.push(chunk instanceof ArrayBuffer
54
+ ? Buffer.from(chunk)
55
+ : Buffer.isBuffer(chunk)
56
+ ? chunk
57
+ : Buffer.from(chunk.buffer, chunk.byteOffset, chunk.byteLength));
58
+ }
59
+ if (detectedEncoding === "gb18030") {
60
+ if (!gbDecoder)
61
+ gbDecoder = getDecoder("gb18030");
62
+ return gbDecoder.decode(chunk, options);
63
+ }
64
+ if (!utf8Decoder)
65
+ utf8Decoder = getDecoder("utf-8");
66
+ const result = utf8Decoder.decode(chunk, options);
67
+ if (detectedEncoding === null && result.includes("\uFFFD")) {
68
+ // UTF-8 解码出现替换字符 → 回退到 GB18030
69
+ detectedEncoding = "gb18030";
70
+ gbDecoder = getDecoder("gb18030");
71
+ const fullBuffer = Buffer.concat(rawChunks);
72
+ return gbDecoder.decode(fullBuffer);
73
+ }
74
+ if (detectedEncoding === null && !options?.stream) {
75
+ // 非流式解码(end)且没有替换字符 → 确认 UTF-8
76
+ detectedEncoding = "utf-8";
77
+ }
78
+ return result;
79
+ },
80
+ };
21
81
  }
82
+ /**
83
+ * 解码 shell 输出 chunk。
84
+ * 兼容旧接口,decoder 可以是 TextDecoder 或 OutputDecoder。
85
+ */
22
86
  export function decodeShellOutputChunk(decoder, chunk, end = false) {
23
87
  if (end) {
24
88
  return decoder.decode();
@@ -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"}