aws-runtime-bridge 1.9.32 → 1.9.40

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 (276) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +35 -1
  2. package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
  3. package/dist/adapter/AcodeSdkAdapter.js +417 -40
  4. package/dist/adapter/ClaudeSdkAdapter.d.ts +6 -0
  5. package/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -1
  6. package/dist/adapter/ClaudeSdkAdapter.js +23 -1
  7. package/dist/adapter/idle-poll-loop.d.ts +2 -1
  8. package/dist/adapter/idle-poll-loop.d.ts.map +1 -1
  9. package/dist/adapter/types.d.ts +65 -3
  10. package/dist/adapter/types.d.ts.map +1 -1
  11. package/dist/adapter/types.js +5 -4
  12. package/dist/index.js +4 -0
  13. package/dist/routes/acode-todos.d.ts +11 -0
  14. package/dist/routes/acode-todos.d.ts.map +1 -0
  15. package/dist/routes/acode-todos.js +75 -0
  16. package/dist/routes/memory.d.ts +1 -1
  17. package/dist/routes/memory.d.ts.map +1 -1
  18. package/dist/routes/memory.js +3 -3
  19. package/dist/routes/pty.d.ts.map +1 -1
  20. package/dist/routes/pty.js +9 -0
  21. package/dist/routes/sub-agents.d.ts +14 -0
  22. package/dist/routes/sub-agents.d.ts.map +1 -0
  23. package/dist/routes/sub-agents.js +253 -0
  24. package/dist/routes/terminal.d.ts +9 -1
  25. package/dist/routes/terminal.d.ts.map +1 -1
  26. package/dist/routes/terminal.js +207 -22
  27. package/dist/services/agent-event-store.d.ts +1 -0
  28. package/dist/services/agent-event-store.d.ts.map +1 -1
  29. package/dist/services/event-delta-pusher.js +4 -4
  30. package/dist/services/session-output.d.ts +3 -0
  31. package/dist/services/session-output.d.ts.map +1 -1
  32. package/dist/services/session-output.js +38 -2
  33. package/dist/services/sub-agent-manager-instance.d.ts +4 -0
  34. package/dist/services/sub-agent-manager-instance.d.ts.map +1 -0
  35. package/dist/services/sub-agent-manager-instance.js +12 -0
  36. package/dist/services/workspace-files.d.ts +1 -0
  37. package/dist/services/workspace-files.d.ts.map +1 -1
  38. package/dist/services/workspace-files.js +57 -1
  39. package/package/acode/dist/ask-user-question-tool.d.ts +47 -0
  40. package/package/acode/dist/ask-user-question-tool.d.ts.map +1 -0
  41. package/package/acode/dist/ask-user-question-tool.js +233 -0
  42. package/package/acode/dist/built-in-file-tools.d.ts +2 -0
  43. package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
  44. package/package/acode/dist/compaction.d.ts +206 -0
  45. package/package/acode/dist/compaction.d.ts.map +1 -0
  46. package/package/acode/dist/compaction.js +664 -0
  47. package/package/acode/dist/config.d.ts +6 -1
  48. package/package/acode/dist/config.d.ts.map +1 -1
  49. package/package/acode/dist/config.js +27 -2
  50. package/package/acode/dist/index.d.ts +4 -0
  51. package/package/acode/dist/index.d.ts.map +1 -1
  52. package/package/acode/dist/index.js +4 -0
  53. package/package/acode/dist/runtime.d.ts +137 -0
  54. package/package/acode/dist/runtime.d.ts.map +1 -1
  55. package/package/acode/dist/runtime.js +974 -172
  56. package/package/acode/dist/skill-tool.d.ts +30 -0
  57. package/package/acode/dist/skill-tool.d.ts.map +1 -0
  58. package/package/acode/dist/skill-tool.js +174 -0
  59. package/package/acode/dist/sub-agent-manager.d.ts +169 -0
  60. package/package/acode/dist/sub-agent-manager.d.ts.map +1 -0
  61. package/package/acode/dist/sub-agent-manager.js +535 -0
  62. package/package/acode/dist/sub-agent-store.d.ts +33 -0
  63. package/package/acode/dist/sub-agent-store.d.ts.map +1 -0
  64. package/package/acode/dist/sub-agent-store.js +109 -0
  65. package/package/acode/dist/sub-agent-tools.d.ts +72 -0
  66. package/package/acode/dist/sub-agent-tools.d.ts.map +1 -0
  67. package/package/acode/dist/sub-agent-tools.js +429 -0
  68. package/package/acode/dist/sub-agent-types.d.ts +81 -0
  69. package/package/acode/dist/sub-agent-types.d.ts.map +1 -0
  70. package/package/acode/dist/sub-agent-types.js +8 -0
  71. package/package/acode/dist/todo-store.d.ts +42 -0
  72. package/package/acode/dist/todo-store.d.ts.map +1 -0
  73. package/package/acode/dist/todo-store.js +68 -0
  74. package/package/acode/dist/todo-tool.d.ts +6 -0
  75. package/package/acode/dist/todo-tool.d.ts.map +1 -0
  76. package/package/acode/dist/todo-tool.js +138 -0
  77. package/package/acode/dist/types.d.ts +22 -1
  78. package/package/acode/dist/types.d.ts.map +1 -1
  79. package/package/acode/package.json +13 -2
  80. package/package/aws-client-agent-mcp/dist/context-manager.test.js +0 -2
  81. package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -1
  82. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +83 -45
  83. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
  84. package/package/aws-client-agent-mcp/dist/mcp-server.js +451 -325
  85. package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
  86. package/package/aws-client-agent-mcp/dist/mcp-server.test.js +259 -241
  87. package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
  88. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +1 -19
  89. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
  90. package/package/aws-client-agent-mcp/dist/mcp-tools.js +2 -69
  91. package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
  92. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +17 -19
  93. package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
  94. package/package/aws-client-agent-mcp/dist/memory-store.js +62 -99
  95. package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
  96. package/package/aws-client-agent-mcp/dist/memory-store.test.js +207 -125
  97. package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +1 -1
  98. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +3 -4
  99. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -1
  100. package/package/aws-client-agent-mcp/dist/memory-tools.js +28 -33
  101. package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
  102. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +27 -9
  103. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -1
  104. package/package/aws-client-agent-mcp/dist/message-buffer.js +100 -23
  105. package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -1
  106. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +1 -3
  107. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
  108. package/package/aws-client-agent-mcp/dist/server-memory-store.js +7 -11
  109. package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
  110. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -1
  111. package/package/aws-client-agent-mcp/dist/status-reporter.js +8 -5
  112. package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -1
  113. package/package/aws-client-agent-mcp/dist/status-reporter.test.js +93 -0
  114. package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +1 -1
  115. package/package/aws-client-agent-mcp/dist/types.d.ts +3 -25
  116. package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
  117. package/package.json +17 -7
  118. package/dist/adapter/AcodeSdkAdapter.test.d.ts +0 -2
  119. package/dist/adapter/AcodeSdkAdapter.test.d.ts.map +0 -1
  120. package/dist/adapter/AcodeSdkAdapter.test.js +0 -2000
  121. package/dist/adapter/AdapterRegistry.test.d.ts +0 -5
  122. package/dist/adapter/AdapterRegistry.test.d.ts.map +0 -1
  123. package/dist/adapter/AdapterRegistry.test.js +0 -118
  124. package/dist/adapter/ClaudeSdkAdapter.test.d.ts +0 -2
  125. package/dist/adapter/ClaudeSdkAdapter.test.d.ts.map +0 -1
  126. package/dist/adapter/ClaudeSdkAdapter.test.js +0 -311
  127. package/dist/adapter/CodexSdkAdapter.test.d.ts +0 -2
  128. package/dist/adapter/CodexSdkAdapter.test.d.ts.map +0 -1
  129. package/dist/adapter/CodexSdkAdapter.test.js +0 -270
  130. package/dist/adapter/OpencodeSdkAdapter.test.d.ts +0 -2
  131. package/dist/adapter/OpencodeSdkAdapter.test.d.ts.map +0 -1
  132. package/dist/adapter/OpencodeSdkAdapter.test.js +0 -158
  133. package/dist/adapter/acode-tool-names.test.d.ts +0 -2
  134. package/dist/adapter/acode-tool-names.test.d.ts.map +0 -1
  135. package/dist/adapter/acode-tool-names.test.js +0 -28
  136. package/dist/adapter/adapter.test.d.ts +0 -5
  137. package/dist/adapter/adapter.test.d.ts.map +0 -1
  138. package/dist/adapter/adapter.test.js +0 -180
  139. package/dist/adapter/idle-poll-loop.test.d.ts +0 -2
  140. package/dist/adapter/idle-poll-loop.test.d.ts.map +0 -1
  141. package/dist/adapter/idle-poll-loop.test.js +0 -85
  142. package/dist/adapter/types.test.d.ts +0 -2
  143. package/dist/adapter/types.test.d.ts.map +0 -1
  144. package/dist/adapter/types.test.js +0 -50
  145. package/dist/adapters/cc-switch/mcp-acode.test.d.ts +0 -2
  146. package/dist/adapters/cc-switch/mcp-acode.test.d.ts.map +0 -1
  147. package/dist/adapters/cc-switch/mcp-acode.test.js +0 -80
  148. package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts +0 -2
  149. package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts.map +0 -1
  150. package/dist/adapters/cc-switch/mcp-claudecode.test.js +0 -75
  151. package/dist/adapters/cc-switch/mcp-codex.test.d.ts +0 -2
  152. package/dist/adapters/cc-switch/mcp-codex.test.d.ts.map +0 -1
  153. package/dist/adapters/cc-switch/mcp-codex.test.js +0 -126
  154. package/dist/adapters/cc-switch/mcp-opencode.test.d.ts +0 -2
  155. package/dist/adapters/cc-switch/mcp-opencode.test.d.ts.map +0 -1
  156. package/dist/adapters/cc-switch/mcp-opencode.test.js +0 -62
  157. package/dist/adapters/cc-switch/skill-directory.test.d.ts +0 -2
  158. package/dist/adapters/cc-switch/skill-directory.test.d.ts.map +0 -1
  159. package/dist/adapters/cc-switch/skill-directory.test.js +0 -74
  160. package/dist/config.test.d.ts +0 -2
  161. package/dist/config.test.d.ts.map +0 -1
  162. package/dist/config.test.js +0 -107
  163. package/dist/routes/ai-sources.test.d.ts +0 -2
  164. package/dist/routes/ai-sources.test.d.ts.map +0 -1
  165. package/dist/routes/ai-sources.test.js +0 -169
  166. package/dist/routes/file-browser.test.d.ts +0 -5
  167. package/dist/routes/file-browser.test.d.ts.map +0 -1
  168. package/dist/routes/file-browser.test.js +0 -155
  169. package/dist/routes/git.test.d.ts +0 -2
  170. package/dist/routes/git.test.d.ts.map +0 -1
  171. package/dist/routes/git.test.js +0 -330
  172. package/dist/routes/instance.test.d.ts +0 -5
  173. package/dist/routes/instance.test.d.ts.map +0 -1
  174. package/dist/routes/instance.test.js +0 -389
  175. package/dist/routes/mcp.test.d.ts +0 -5
  176. package/dist/routes/mcp.test.d.ts.map +0 -1
  177. package/dist/routes/mcp.test.js +0 -92
  178. package/dist/routes/memory-route-wiring.test.d.ts +0 -2
  179. package/dist/routes/memory-route-wiring.test.d.ts.map +0 -1
  180. package/dist/routes/memory-route-wiring.test.js +0 -15
  181. package/dist/routes/memory.test.d.ts +0 -2
  182. package/dist/routes/memory.test.d.ts.map +0 -1
  183. package/dist/routes/memory.test.js +0 -177
  184. package/dist/routes/properties.test.d.ts +0 -5
  185. package/dist/routes/properties.test.d.ts.map +0 -1
  186. package/dist/routes/properties.test.js +0 -72
  187. package/dist/routes/pty.test.d.ts +0 -2
  188. package/dist/routes/pty.test.d.ts.map +0 -1
  189. package/dist/routes/pty.test.js +0 -82
  190. package/dist/routes/runtime-binding.test.d.ts +0 -2
  191. package/dist/routes/runtime-binding.test.d.ts.map +0 -1
  192. package/dist/routes/runtime-binding.test.js +0 -32
  193. package/dist/routes/sessions.test.d.ts +0 -5
  194. package/dist/routes/sessions.test.d.ts.map +0 -1
  195. package/dist/routes/sessions.test.js +0 -86
  196. package/dist/routes/skills.test.d.ts +0 -5
  197. package/dist/routes/skills.test.d.ts.map +0 -1
  198. package/dist/routes/skills.test.js +0 -50
  199. package/dist/routes/system-metrics.test.d.ts +0 -2
  200. package/dist/routes/system-metrics.test.d.ts.map +0 -1
  201. package/dist/routes/system-metrics.test.js +0 -16
  202. package/dist/routes/terminal.stop-options.test.d.ts +0 -2
  203. package/dist/routes/terminal.stop-options.test.d.ts.map +0 -1
  204. package/dist/routes/terminal.stop-options.test.js +0 -39
  205. package/dist/routes/terminal.test.d.ts +0 -2
  206. package/dist/routes/terminal.test.d.ts.map +0 -1
  207. package/dist/routes/terminal.test.js +0 -746
  208. package/dist/routes/yml.test.d.ts +0 -5
  209. package/dist/routes/yml.test.d.ts.map +0 -1
  210. package/dist/routes/yml.test.js +0 -58
  211. package/dist/services/ai-source-apply.test.d.ts +0 -2
  212. package/dist/services/ai-source-apply.test.d.ts.map +0 -1
  213. package/dist/services/ai-source-apply.test.js +0 -138
  214. package/dist/services/auto-register.test.d.ts +0 -2
  215. package/dist/services/auto-register.test.d.ts.map +0 -1
  216. package/dist/services/auto-register.test.js +0 -184
  217. package/dist/services/aws-client-agent-mcp.test.d.ts +0 -2
  218. package/dist/services/aws-client-agent-mcp.test.d.ts.map +0 -1
  219. package/dist/services/aws-client-agent-mcp.test.js +0 -242
  220. package/dist/services/bridge-package-publish-hooks.test.d.ts +0 -2
  221. package/dist/services/bridge-package-publish-hooks.test.d.ts.map +0 -1
  222. package/dist/services/bridge-package-publish-hooks.test.js +0 -136
  223. package/dist/services/cc-switch-discovery.test.d.ts +0 -2
  224. package/dist/services/cc-switch-discovery.test.d.ts.map +0 -1
  225. package/dist/services/cc-switch-discovery.test.js +0 -56
  226. package/dist/services/cli-commands.test.d.ts +0 -2
  227. package/dist/services/cli-commands.test.d.ts.map +0 -1
  228. package/dist/services/cli-commands.test.js +0 -230
  229. package/dist/services/instance-init-service.test.d.ts +0 -2
  230. package/dist/services/instance-init-service.test.d.ts.map +0 -1
  231. package/dist/services/instance-init-service.test.js +0 -140
  232. package/dist/services/instance-state.test.d.ts +0 -2
  233. package/dist/services/instance-state.test.d.ts.map +0 -1
  234. package/dist/services/instance-state.test.js +0 -245
  235. package/dist/services/mcp-launch-binding-queue.test.d.ts +0 -2
  236. package/dist/services/mcp-launch-binding-queue.test.d.ts.map +0 -1
  237. package/dist/services/mcp-launch-binding-queue.test.js +0 -181
  238. package/dist/services/runtime-binding.test.d.ts +0 -2
  239. package/dist/services/runtime-binding.test.d.ts.map +0 -1
  240. package/dist/services/runtime-binding.test.js +0 -78
  241. package/dist/services/runtime-lifecycle-policy.test.d.ts +0 -2
  242. package/dist/services/runtime-lifecycle-policy.test.d.ts.map +0 -1
  243. package/dist/services/runtime-lifecycle-policy.test.js +0 -41
  244. package/dist/services/session-output.test.d.ts +0 -5
  245. package/dist/services/session-output.test.d.ts.map +0 -1
  246. package/dist/services/session-output.test.js +0 -177
  247. package/dist/services/startup-config-wizard.test.d.ts +0 -2
  248. package/dist/services/startup-config-wizard.test.d.ts.map +0 -1
  249. package/dist/services/startup-config-wizard.test.js +0 -184
  250. package/dist/services/terminal-persistence.test.d.ts +0 -5
  251. package/dist/services/terminal-persistence.test.d.ts.map +0 -1
  252. package/dist/services/terminal-persistence.test.js +0 -159
  253. package/dist/services/tool-installer.test.d.ts +0 -2
  254. package/dist/services/tool-installer.test.d.ts.map +0 -1
  255. package/dist/services/tool-installer.test.js +0 -225
  256. package/dist/services/workspace-files.test.d.ts +0 -2
  257. package/dist/services/workspace-files.test.d.ts.map +0 -1
  258. package/dist/services/workspace-files.test.js +0 -648
  259. package/dist/services/workspace-watch.test.d.ts +0 -2
  260. package/dist/services/workspace-watch.test.d.ts.map +0 -1
  261. package/dist/services/workspace-watch.test.js +0 -38
  262. package/dist/utils/file-utils.test.d.ts +0 -2
  263. package/dist/utils/file-utils.test.d.ts.map +0 -1
  264. package/dist/utils/file-utils.test.js +0 -244
  265. package/dist/utils/logger.test.d.ts +0 -2
  266. package/dist/utils/logger.test.d.ts.map +0 -1
  267. package/dist/utils/logger.test.js +0 -93
  268. package/dist/utils/sdk-package-loader.test.d.ts +0 -2
  269. package/dist/utils/sdk-package-loader.test.d.ts.map +0 -1
  270. package/dist/utils/sdk-package-loader.test.js +0 -84
  271. package/dist/utils/validation.test.d.ts +0 -2
  272. package/dist/utils/validation.test.d.ts.map +0 -1
  273. package/dist/utils/validation.test.js +0 -88
  274. package/dist/utils/yaml-utils.test.d.ts +0 -2
  275. package/dist/utils/yaml-utils.test.d.ts.map +0 -1
  276. package/dist/utils/yaml-utils.test.js +0 -363
@@ -1,177 +0,0 @@
1
- /**
2
- * Session Output 服务单元测试
3
- */
4
- import axios from "axios";
5
- import { afterEach, describe, expect, it, vi } from "vitest";
6
- import { logger } from "../utils/logger.js";
7
- import { appendSessionOutput, sendOutput, sendStatus, sessions, } from "./session-output.js";
8
- import { getRuntimeAccessToken } from "./runtime-binding.js";
9
- vi.mock("axios", () => ({
10
- default: {
11
- post: vi.fn(),
12
- },
13
- }));
14
- vi.mock("./runtime-binding.js", () => ({
15
- getRuntimeAccessToken: vi.fn(() => "runtime-token"),
16
- }));
17
- vi.mock("../utils/logger.js", () => ({
18
- logger: {
19
- warn: vi.fn(),
20
- },
21
- }));
22
- const mockedAxiosPost = axios.post;
23
- const mockedLogger = vi.mocked(logger);
24
- const mockedGetRuntimeAccessToken = vi.mocked(getRuntimeAccessToken);
25
- const createSession = (overrides = {}) => ({
26
- agentId: "agent-1",
27
- workspacePath: "D:/workspace",
28
- outputBuffer: "",
29
- flushTimer: null,
30
- flushInFlight: null,
31
- seq: 0,
32
- ...overrides,
33
- });
34
- afterEach(() => {
35
- sessions.clear();
36
- vi.clearAllMocks();
37
- });
38
- describe("session-output service", () => {
39
- it("manages sessions map correctly", () => {
40
- sessions.set("session-1", createSession());
41
- expect(sessions.size).toBe(1);
42
- expect(sessions.has("session-1")).toBe(true);
43
- const session = sessions.get("session-1");
44
- if (session)
45
- session.outputBuffer = "test output";
46
- expect(sessions.get("session-1")?.outputBuffer).toBe("test output");
47
- sessions.delete("session-1");
48
- expect(sessions.size).toBe(0);
49
- });
50
- it("finds session by agentId", () => {
51
- sessions.set("session-1", createSession({ agentId: "agent-1" }));
52
- sessions.set("session-2", createSession({ agentId: "agent-2" }));
53
- const findByAgentId = (agentId) => {
54
- for (const [id, session] of sessions) {
55
- if (session.agentId === agentId)
56
- return id;
57
- }
58
- return null;
59
- };
60
- expect(findByAgentId("agent-1")).toBe("session-1");
61
- expect(findByAgentId("agent-3")).toBe(null);
62
- });
63
- it("accumulates output correctly", () => {
64
- sessions.set("session-1", createSession());
65
- appendSessionOutput("session-1", "line1\n");
66
- appendSessionOutput("session-1", "line2\n");
67
- expect(sessions.get("session-1")?.outputBuffer).toBe("line1\nline2\n");
68
- });
69
- it("bounds pending SDK output so callback failures cannot grow memory without limit", () => {
70
- sessions.set("session-bounded", createSession());
71
- appendSessionOutput("session-bounded", "a".repeat(70 * 1024));
72
- const output = sessions.get("session-bounded")?.outputBuffer ?? "";
73
- expect(output.length).toBeLessThanOrEqual(64 * 1024);
74
- expect(output).toContain("AgentsWorkStudio: omitted");
75
- expect(output.endsWith("a")).toBe(true);
76
- });
77
- it("increments sequence correctly", () => {
78
- const session = createSession();
79
- sessions.set("session-1", session);
80
- session.seq += 1;
81
- expect(session.seq).toBe(1);
82
- session.seq += 1;
83
- expect(session.seq).toBe(2);
84
- });
85
- it("builds correct status payload", () => {
86
- const buildStatusPayload = (agentId, sessionId, status) => ({
87
- agentId,
88
- sessionId,
89
- status,
90
- });
91
- expect(buildStatusPayload("agent-1", "session-1", "running")).toEqual({
92
- agentId: "agent-1",
93
- sessionId: "session-1",
94
- status: "running",
95
- });
96
- expect(buildStatusPayload("agent-1", null, "stopped")).toEqual({
97
- agentId: "agent-1",
98
- sessionId: null,
99
- status: "stopped",
100
- });
101
- });
102
- it("does not throw when runtime status callback fails", async () => {
103
- mockedAxiosPost.mockRejectedValueOnce(new Error("scheduler unavailable"));
104
- await expect(sendStatus("agent-1", "session-1", "waiting_input")).resolves.toBeUndefined();
105
- expect(mockedAxiosPost).toHaveBeenCalledWith(expect.stringContaining("/api/runtime/callback/status"), {
106
- agentId: "agent-1",
107
- sessionId: "session-1",
108
- status: "waiting_input",
109
- }, { headers: { "X-Runtime-Token": "runtime-token" } });
110
- expect(mockedLogger.warn).toHaveBeenCalledWith("Runtime status callback failed", expect.objectContaining({
111
- agentId: "agent-1",
112
- sessionId: "session-1",
113
- status: "waiting_input",
114
- }));
115
- });
116
- it("uses explicit runtime callback token before persisted binding token", async () => {
117
- mockedAxiosPost.mockResolvedValueOnce({ data: { ok: true } });
118
- await sendStatus("agent-1", "session-1", "waiting_input", undefined, undefined, {
119
- runtimeAccessToken: "session-runtime-token",
120
- });
121
- expect(mockedAxiosPost).toHaveBeenCalledWith(expect.stringContaining("/api/runtime/callback/status"), {
122
- agentId: "agent-1",
123
- sessionId: "session-1",
124
- status: "waiting_input",
125
- }, { headers: { "X-Runtime-Token": "session-runtime-token" } });
126
- });
127
- it("sends structured source event metadata with SDK output chunks", async () => {
128
- mockedAxiosPost.mockResolvedValueOnce({ data: { ok: true } });
129
- await sendOutput("agent-1", "answer chunk", "session-1", 7, { sourceEventType: "text_delta" }, { runtimeAccessToken: "session-runtime-token" });
130
- expect(mockedAxiosPost).toHaveBeenCalledWith(expect.stringContaining("/api/runtime/callback/output"), {
131
- agentId: "agent-1",
132
- output: "answer chunk",
133
- sessionId: "session-1",
134
- seq: 7,
135
- sourceEventType: "text_delta",
136
- }, { headers: { "X-Runtime-Token": "session-runtime-token" } });
137
- });
138
- it("uses launch scheduler URL for Docker-deployed scheduler callbacks", async () => {
139
- mockedAxiosPost.mockResolvedValue({ data: { ok: true } });
140
- await sendStatus("agent-1", "session-1", "thinking", undefined, undefined, {
141
- runtimeAccessToken: "session-runtime-token",
142
- schedulerBaseUrl: "http://127.0.0.1:7380",
143
- });
144
- await sendOutput("agent-1", "[ACode] 正在请求模型 gpt-test:hello", "session-1", 8, { sourceEventType: "ai_request", logCategory: "acode" }, {
145
- runtimeAccessToken: "session-runtime-token",
146
- schedulerBaseUrl: "http://127.0.0.1:7380",
147
- });
148
- expect(mockedAxiosPost).toHaveBeenNthCalledWith(1, "http://127.0.0.1:7380/api/runtime/callback/status", {
149
- agentId: "agent-1",
150
- sessionId: "session-1",
151
- status: "thinking",
152
- }, { headers: { "X-Runtime-Token": "session-runtime-token" } });
153
- expect(mockedAxiosPost).toHaveBeenNthCalledWith(2, "http://127.0.0.1:7380/api/runtime/callback/output", {
154
- agentId: "agent-1",
155
- output: "[ACode] 正在请求模型 gpt-test:hello",
156
- sessionId: "session-1",
157
- seq: 8,
158
- sourceEventType: "ai_request",
159
- logCategory: "acode",
160
- }, { headers: { "X-Runtime-Token": "session-runtime-token" } });
161
- });
162
- it("looks up persisted runtime token by launch scheduler URL when explicit token is missing", async () => {
163
- mockedAxiosPost.mockResolvedValueOnce({ data: { ok: true } });
164
- mockedGetRuntimeAccessToken.mockImplementationOnce((_, serverBaseUrl) => serverBaseUrl === "http://127.0.0.1:7380"
165
- ? "scoped-7380-token"
166
- : undefined);
167
- await sendStatus("agent-1", "session-1", "thinking", undefined, undefined, {
168
- schedulerBaseUrl: "http://127.0.0.1:7380",
169
- });
170
- expect(mockedGetRuntimeAccessToken).toHaveBeenNthCalledWith(1, undefined, "http://127.0.0.1:7380");
171
- expect(mockedAxiosPost).toHaveBeenCalledWith("http://127.0.0.1:7380/api/runtime/callback/status", {
172
- agentId: "agent-1",
173
- sessionId: "session-1",
174
- status: "thinking",
175
- }, { headers: { "X-Runtime-Token": "scoped-7380-token" } });
176
- });
177
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=startup-config-wizard.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"startup-config-wizard.test.d.ts","sourceRoot":"","sources":["../../src/services/startup-config-wizard.test.ts"],"names":[],"mappings":""}
@@ -1,184 +0,0 @@
1
- import { mkdirSync, mkdtempSync, readFileSync, rmSync, writeFileSync } from "node:fs";
2
- import os from "node:os";
3
- import path from "node:path";
4
- import { afterEach, describe, expect, it } from "vitest";
5
- import { configureStartupConfig, ensureStartupConfig, } from "./startup-config-wizard.js";
6
- class FakePrompt {
7
- constructor(answers) {
8
- this.answers = answers;
9
- this.index = 0;
10
- this.closed = false;
11
- this.prompts = [];
12
- }
13
- async question(prompt) {
14
- this.prompts.push(prompt);
15
- return this.answers[this.index++] ?? "";
16
- }
17
- close() {
18
- this.closed = true;
19
- }
20
- }
21
- const tempRoots = [];
22
- function createConfigPath() {
23
- const root = mkdtempSync(path.join(os.tmpdir(), "aws-bridge-wizard-"));
24
- tempRoots.push(root);
25
- return path.join(root, ".aws-bridge", "config.json");
26
- }
27
- afterEach(() => {
28
- for (const root of tempRoots.splice(0)) {
29
- rmSync(root, { recursive: true, force: true });
30
- }
31
- });
32
- describe("startup config wizard", () => {
33
- it("does not prompt when config file already exists", async () => {
34
- const configPath = createConfigPath();
35
- mkdirSync(path.dirname(configPath), { recursive: true });
36
- writeFileSync(configPath, "{}", "utf-8");
37
- const prompt = new FakePrompt([]);
38
- const result = await ensureStartupConfig({ configPath, interactive: true, prompt });
39
- expect(result).toBe("exists");
40
- expect(prompt.closed).toBe(false);
41
- });
42
- it("writes generated connection key when user chooses no", async () => {
43
- const configPath = createConfigPath();
44
- const prompt = new FakePrompt(["n"]);
45
- const result = await ensureStartupConfig({
46
- configPath,
47
- interactive: true,
48
- prompt,
49
- generateConnectionKey: () => "awsb_test_generated_key",
50
- });
51
- expect(result).toBe("skipped");
52
- expect(JSON.parse(readFileSync(configPath, "utf-8"))).toEqual({
53
- connectionKey: "awsb_test_generated_key",
54
- });
55
- });
56
- it("writes connection key and auto register target from interactive answers", async () => {
57
- const configPath = createConfigPath();
58
- const prompt = new FakePrompt([
59
- "y",
60
- "gkmzjaznX55..",
61
- "http://127.0.0.1:8080",
62
- "至强主机",
63
- "aws_live_crh_g0GGrg5IntODg1sFwnas7qf4yGrcwoisDWPBtd8",
64
- "127.0.0.1",
65
- ]);
66
- const result = await ensureStartupConfig({ configPath, interactive: true, prompt });
67
- expect(result).toBe("created");
68
- expect(JSON.parse(readFileSync(configPath, "utf-8"))).toEqual({
69
- connectionKey: "gkmzjaznX55..",
70
- autoRegisterTargets: [
71
- {
72
- serverUrl: "http://127.0.0.1:8080",
73
- instanceName: "至强主机",
74
- userKey: "aws_live_crh_g0GGrg5IntODg1sFwnas7qf4yGrcwoisDWPBtd8",
75
- registerIp: "127.0.0.1",
76
- },
77
- ],
78
- });
79
- });
80
- it("writes generated connection key and does not block startup in non-interactive environments", async () => {
81
- const configPath = createConfigPath();
82
- const result = await ensureStartupConfig({
83
- configPath,
84
- interactive: false,
85
- generateConnectionKey: () => "awsb_non_interactive_key",
86
- });
87
- expect(result).toBe("non-interactive");
88
- expect(JSON.parse(readFileSync(configPath, "utf-8"))).toEqual({
89
- connectionKey: "awsb_non_interactive_key",
90
- });
91
- });
92
- it("supports environment opt-out for unattended startup", async () => {
93
- const configPath = createConfigPath();
94
- const result = await ensureStartupConfig({
95
- configPath,
96
- interactive: true,
97
- env: { AWS_BRIDGE_SKIP_SETUP: "true" },
98
- generateConnectionKey: () => "awsb_env_skip_key",
99
- });
100
- expect(result).toBe("skipped");
101
- expect(JSON.parse(readFileSync(configPath, "utf-8"))).toEqual({
102
- connectionKey: "awsb_env_skip_key",
103
- });
104
- });
105
- it("reconfigures existing config and keeps current values on empty input", async () => {
106
- const configPath = createConfigPath();
107
- mkdirSync(path.dirname(configPath), { recursive: true });
108
- writeFileSync(configPath, JSON.stringify({
109
- connectionKey: "old-connection-key",
110
- autoRegisterTargets: [
111
- {
112
- serverUrl: "http://old-server:7380",
113
- instanceName: "old-instance",
114
- userKey: "old-user-key",
115
- registerIp: "10.0.0.8",
116
- },
117
- ],
118
- }, null, 2), "utf-8");
119
- const prompt = new FakePrompt(["", "", "", "", ""]);
120
- const result = await configureStartupConfig({
121
- configPath,
122
- interactive: true,
123
- prompt,
124
- });
125
- expect(result).toBe("configured");
126
- expect(JSON.parse(readFileSync(configPath, "utf-8"))).toEqual({
127
- connectionKey: "old-connection-key",
128
- autoRegisterTargets: [
129
- {
130
- serverUrl: "http://old-server:7380",
131
- instanceName: "old-instance",
132
- userKey: "old-user-key",
133
- registerIp: "10.0.0.8",
134
- },
135
- ],
136
- });
137
- expect(prompt.prompts).toEqual([
138
- "connectionKey(面板连接 Bridge 的密钥)(默认使用当前值 old-connection-key,直接回车保留): ",
139
- "serverUrl(调度中心地址)(默认使用当前值 http://old-server:7380,直接回车保留): ",
140
- "instanceName(实例名称)(默认使用当前值 old-instance,直接回车保留): ",
141
- "userKey(用户 API Key)(默认使用当前值 old-user-key,直接回车保留): ",
142
- "registerIp(Bridge 对外访问 IP)(默认使用当前值 10.0.0.8,直接回车保留): ",
143
- ]);
144
- });
145
- it("reconfigures existing config with changed values", async () => {
146
- const configPath = createConfigPath();
147
- mkdirSync(path.dirname(configPath), { recursive: true });
148
- writeFileSync(configPath, JSON.stringify({
149
- connectionKey: "old-connection-key",
150
- autoRegisterTargets: [
151
- {
152
- serverUrl: "http://old-server:7380",
153
- instanceName: "old-instance",
154
- userKey: "old-user-key",
155
- registerIp: "10.0.0.8",
156
- },
157
- ],
158
- }), "utf-8");
159
- const prompt = new FakePrompt([
160
- "new-connection-key",
161
- "http://new-server:7380",
162
- "new-instance",
163
- "new-user-key",
164
- "10.0.0.9",
165
- ]);
166
- const result = await configureStartupConfig({
167
- configPath,
168
- interactive: true,
169
- prompt,
170
- });
171
- expect(result).toBe("configured");
172
- expect(JSON.parse(readFileSync(configPath, "utf-8"))).toEqual({
173
- connectionKey: "new-connection-key",
174
- autoRegisterTargets: [
175
- {
176
- serverUrl: "http://new-server:7380",
177
- instanceName: "new-instance",
178
- userKey: "new-user-key",
179
- registerIp: "10.0.0.9",
180
- },
181
- ],
182
- });
183
- });
184
- });
@@ -1,5 +0,0 @@
1
- /**
2
- * Terminal Persistence 服务单元测试
3
- */
4
- export {};
5
- //# sourceMappingURL=terminal-persistence.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"terminal-persistence.test.d.ts","sourceRoot":"","sources":["../../src/services/terminal-persistence.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
@@ -1,159 +0,0 @@
1
- /**
2
- * Terminal Persistence 服务单元测试
3
- */
4
- import { promises as fs } from 'node:fs';
5
- import path from 'node:path';
6
- import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
7
- const tmpRoot = path.join(process.cwd(), '.tmp-vitest-terminal-persistence');
8
- vi.mock('node:os', () => ({
9
- default: {
10
- tmpdir: () => tmpRoot,
11
- },
12
- }));
13
- const persistence = await import('./terminal-persistence.js');
14
- function makeSession(sessionId, agentId) {
15
- return {
16
- sessionId,
17
- agentId,
18
- workspacePath: `/workspace/${agentId}`,
19
- command: 'claude',
20
- startedAt: new Date(0).toISOString(),
21
- status: 'running',
22
- };
23
- }
24
- describe('terminal-persistence service', () => {
25
- beforeEach(async () => {
26
- await fs.rm(tmpRoot, { recursive: true, force: true });
27
- });
28
- afterEach(async () => {
29
- await fs.rm(tmpRoot, { recursive: true, force: true });
30
- });
31
- it('generates correct file path', () => {
32
- const getPersistedSessionsFile = (tmpdir) => {
33
- return `${tmpdir}/agentswork-runtime-bridge/sessions.json`;
34
- };
35
- const path = getPersistedSessionsFile('/tmp');
36
- expect(path.includes('agentswork-runtime-bridge')).toBe(true);
37
- expect(path.endsWith('sessions.json')).toBe(true);
38
- });
39
- it('serializes sessions to JSON correctly', () => {
40
- const sessions = [{ sessionId: 'session-1', agentId: 'agent-1', status: 'running' }];
41
- const json = JSON.stringify(sessions);
42
- const parsed = JSON.parse(json);
43
- expect(parsed.length).toBe(1);
44
- expect(parsed[0].sessionId).toBe('session-1');
45
- });
46
- it('filters running sessions on load', () => {
47
- const sessions = [
48
- { sessionId: 's1', status: 'running' },
49
- { sessionId: 's2', status: 'stopped' },
50
- { sessionId: 's3', status: 'running' },
51
- ];
52
- const runningSessions = sessions.filter(s => s.status === 'running');
53
- expect(runningSessions.length).toBe(2);
54
- });
55
- it('adds new session', () => {
56
- const sessions = [];
57
- const upsertSession = (newSession) => {
58
- const index = sessions.findIndex(s => s.sessionId === newSession.sessionId);
59
- if (index >= 0)
60
- sessions[index] = newSession;
61
- else
62
- sessions.push(newSession);
63
- };
64
- upsertSession({ sessionId: 'session-1', agentId: 'agent-1' });
65
- expect(sessions.length).toBe(1);
66
- });
67
- it('updates existing session', () => {
68
- const sessions = [{ sessionId: 'session-1', status: 'running' }];
69
- const index = sessions.findIndex(s => s.sessionId === 'session-1');
70
- if (index >= 0)
71
- sessions[index] = { sessionId: 'session-1', status: 'stopped' };
72
- expect(sessions[0].status).toBe('stopped');
73
- });
74
- it('removes session by id', () => {
75
- const sessions = [{ sessionId: 's1' }, { sessionId: 's2' }];
76
- const index = sessions.findIndex(s => s.sessionId === 's2');
77
- if (index >= 0)
78
- sessions.splice(index, 1);
79
- expect(sessions.length).toBe(1);
80
- expect(sessions.find(s => s.sessionId === 's2')).toBeUndefined();
81
- });
82
- it('prefers removing persisted session after stop to prevent later recovery', () => {
83
- const sessions = [
84
- { sessionId: 's1', agentId: 'a1', status: 'running' },
85
- { sessionId: 's2', agentId: 'a2', status: 'running' },
86
- ];
87
- const stoppedSessionId = 's1';
88
- const afterRemove = sessions.filter(s => s.sessionId !== stoppedSessionId);
89
- expect(afterRemove).toEqual([
90
- { sessionId: 's2', agentId: 'a2', status: 'running' },
91
- ]);
92
- expect(afterRemove.find(s => s.sessionId === stoppedSessionId)).toBeUndefined();
93
- });
94
- it('finds session by agentId', () => {
95
- const sessions = [
96
- { sessionId: 's1', agentId: 'a1' },
97
- { sessionId: 's2', agentId: 'a2' },
98
- ];
99
- const found = sessions.find(s => s.agentId === 'a2');
100
- expect(found?.sessionId).toBe('s2');
101
- });
102
- it('handles invalid JSON on load', () => {
103
- const parseSessions = (raw) => {
104
- try {
105
- return JSON.parse(raw);
106
- }
107
- catch {
108
- return [];
109
- }
110
- };
111
- expect(parseSessions('invalid json')).toEqual([]);
112
- });
113
- it('keeps a single running session per agent when upserting', async () => {
114
- await persistence.upsertPersistedSession(makeSession('session-old', 'agent-1'));
115
- await persistence.upsertPersistedSession(makeSession('session-new', 'agent-1'));
116
- const sessions = await persistence.loadPersistedSessions();
117
- expect(sessions).toHaveLength(1);
118
- expect(sessions[0].sessionId).toBe('session-new');
119
- });
120
- it('persists latest runtime action state for restart recovery', async () => {
121
- await persistence.upsertPersistedSession(makeSession('session-1', 'agent-1'));
122
- const updated = await persistence.updatePersistedSessionRuntimeState('session-1', {
123
- runtimeStatus: 'tool_using',
124
- runtimeActionType: 'mcp',
125
- runtimeActionLabel: 'poll_message',
126
- runtimeActionDetail: '等待群聊消息',
127
- });
128
- const sessions = await persistence.loadPersistedSessions();
129
- expect(updated).toBe(true);
130
- expect(sessions[0]).toMatchObject({
131
- sessionId: 'session-1',
132
- runtimeStatus: 'tool_using',
133
- runtimeActionType: 'mcp',
134
- runtimeActionLabel: 'poll_message',
135
- runtimeActionDetail: '等待群聊消息',
136
- });
137
- });
138
- it('serializes concurrent upserts without losing sessions', async () => {
139
- await Promise.all([
140
- persistence.upsertPersistedSession(makeSession('session-1', 'agent-1')),
141
- persistence.upsertPersistedSession(makeSession('session-2', 'agent-2')),
142
- persistence.upsertPersistedSession(makeSession('session-3', 'agent-3')),
143
- ]);
144
- const sessions = await persistence.loadPersistedSessions();
145
- expect(sessions.map(session => session.sessionId).sort()).toEqual(['session-1', 'session-2', 'session-3']);
146
- });
147
- it('does not revive a removed session during concurrent writes', async () => {
148
- await persistence.savePersistedSessions([
149
- makeSession('session-1', 'agent-1'),
150
- makeSession('session-2', 'agent-2'),
151
- ]);
152
- await Promise.all([
153
- persistence.removePersistedSession('session-1'),
154
- persistence.upsertPersistedSession(makeSession('session-3', 'agent-3')),
155
- ]);
156
- const sessions = await persistence.loadPersistedSessions();
157
- expect(sessions.map(session => session.sessionId).sort()).toEqual(['session-2', 'session-3']);
158
- });
159
- });
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=tool-installer.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"tool-installer.test.d.ts","sourceRoot":"","sources":["../../src/services/tool-installer.test.ts"],"names":[],"mappings":""}