aws-runtime-bridge 1.9.33 → 1.9.41
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/adapter/AcodeSdkAdapter.d.ts +66 -5
- package/dist/adapter/AcodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/AcodeSdkAdapter.js +771 -69
- package/dist/adapter/ClaudeSdkAdapter.d.ts +6 -0
- package/dist/adapter/ClaudeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/ClaudeSdkAdapter.js +24 -1
- package/dist/adapter/OpencodeSdkAdapter.d.ts +19 -0
- package/dist/adapter/OpencodeSdkAdapter.d.ts.map +1 -1
- package/dist/adapter/OpencodeSdkAdapter.js +62 -0
- package/dist/adapter/idle-poll-loop.d.ts +2 -1
- package/dist/adapter/idle-poll-loop.d.ts.map +1 -1
- package/dist/adapter/types.d.ts +86 -9
- package/dist/adapter/types.d.ts.map +1 -1
- package/dist/adapter/types.js +15 -5
- package/dist/index.js +15 -0
- package/dist/routes/acode-todos.d.ts +11 -0
- package/dist/routes/acode-todos.d.ts.map +1 -0
- package/dist/routes/acode-todos.js +75 -0
- package/dist/routes/ai-sources.js +4 -1
- package/dist/routes/dashboard.d.ts.map +1 -1
- package/dist/routes/dashboard.js +1 -1
- package/dist/routes/memory.d.ts +1 -1
- package/dist/routes/memory.d.ts.map +1 -1
- package/dist/routes/memory.js +3 -3
- package/dist/routes/pty.d.ts.map +1 -1
- package/dist/routes/pty.js +9 -0
- package/dist/routes/runtime-binding.d.ts.map +1 -1
- package/dist/routes/runtime-binding.js +6 -3
- package/dist/routes/sessions.js +89 -4
- package/dist/routes/sub-agents.d.ts +14 -0
- package/dist/routes/sub-agents.d.ts.map +1 -0
- package/dist/routes/sub-agents.js +267 -0
- package/dist/routes/terminal.d.ts +12 -1
- package/dist/routes/terminal.d.ts.map +1 -1
- package/dist/routes/terminal.js +326 -24
- package/dist/services/acode-package.d.ts +8 -1
- package/dist/services/acode-package.d.ts.map +1 -1
- package/dist/services/acode-package.js +33 -4
- package/dist/services/agent-event-store.d.ts +1 -0
- package/dist/services/agent-event-store.d.ts.map +1 -1
- package/dist/services/aws-client-agent-mcp.d.ts.map +1 -1
- package/dist/services/aws-client-agent-mcp.js +11 -4
- package/dist/services/event-delta-pusher.js +4 -4
- package/dist/services/fileSnapshotStore.js +1 -1
- package/dist/services/legacy-path-migration.d.ts +3 -0
- package/dist/services/legacy-path-migration.d.ts.map +1 -0
- package/dist/services/legacy-path-migration.js +66 -0
- package/dist/services/lifecycle-state.d.ts.map +1 -1
- package/dist/services/lifecycle-state.js +1 -1
- package/dist/services/runtime-binding.d.ts +5 -0
- package/dist/services/runtime-binding.d.ts.map +1 -1
- package/dist/services/runtime-binding.js +33 -1
- package/dist/services/session-output.d.ts +10 -1
- package/dist/services/session-output.d.ts.map +1 -1
- package/dist/services/session-output.js +54 -4
- package/dist/services/sub-agent-manager-instance.d.ts +4 -0
- package/dist/services/sub-agent-manager-instance.d.ts.map +1 -0
- package/dist/services/sub-agent-manager-instance.js +12 -0
- package/dist/services/workspace-files.d.ts +1 -0
- package/dist/services/workspace-files.d.ts.map +1 -1
- package/dist/services/workspace-files.js +57 -1
- package/package/acode/dist/ask-user-question-tool.d.ts +47 -0
- package/package/acode/dist/ask-user-question-tool.d.ts.map +1 -0
- package/package/acode/dist/ask-user-question-tool.js +233 -0
- package/package/acode/dist/built-in-file-tools.d.ts +2 -0
- package/package/acode/dist/built-in-file-tools.d.ts.map +1 -1
- package/package/acode/dist/built-in-file-tools.js +504 -3
- package/package/acode/dist/compaction.d.ts +242 -0
- package/package/acode/dist/compaction.d.ts.map +1 -0
- package/package/acode/dist/compaction.js +919 -0
- package/package/acode/dist/config.d.ts +6 -1
- package/package/acode/dist/config.d.ts.map +1 -1
- package/package/acode/dist/config.js +27 -2
- package/package/acode/dist/index.d.ts +4 -0
- package/package/acode/dist/index.d.ts.map +1 -1
- package/package/acode/dist/index.js +4 -0
- package/package/acode/dist/runtime.d.ts +257 -0
- package/package/acode/dist/runtime.d.ts.map +1 -1
- package/package/acode/dist/runtime.js +1843 -191
- package/package/acode/dist/skill-tool.d.ts +30 -0
- package/package/acode/dist/skill-tool.d.ts.map +1 -0
- package/package/acode/dist/skill-tool.js +174 -0
- package/package/acode/dist/sub-agent-manager.d.ts +264 -0
- package/package/acode/dist/sub-agent-manager.d.ts.map +1 -0
- package/package/acode/dist/sub-agent-manager.js +825 -0
- package/package/acode/dist/sub-agent-store.d.ts +40 -0
- package/package/acode/dist/sub-agent-store.d.ts.map +1 -0
- package/package/acode/dist/sub-agent-store.js +164 -0
- package/package/acode/dist/sub-agent-tools.d.ts +72 -0
- package/package/acode/dist/sub-agent-tools.d.ts.map +1 -0
- package/package/acode/dist/sub-agent-tools.js +429 -0
- package/package/acode/dist/sub-agent-types.d.ts +85 -0
- package/package/acode/dist/sub-agent-types.d.ts.map +1 -0
- package/package/acode/dist/sub-agent-types.js +8 -0
- package/package/acode/dist/todo-store.d.ts +42 -0
- package/package/acode/dist/todo-store.d.ts.map +1 -0
- package/package/acode/dist/todo-store.js +68 -0
- package/package/acode/dist/todo-tool.d.ts +6 -0
- package/package/acode/dist/todo-tool.d.ts.map +1 -0
- package/package/acode/dist/todo-tool.js +138 -0
- package/package/acode/dist/types.d.ts +41 -1
- package/package/acode/dist/types.d.ts.map +1 -1
- package/package/acode/package.json +13 -2
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +9 -0
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/agent-client.js +69 -10
- package/package/aws-client-agent-mcp/dist/agent-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/config.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/config.js +4 -0
- package/package/aws-client-agent-mcp/dist/config.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/constants.d.ts +2 -0
- package/package/aws-client-agent-mcp/dist/constants.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/constants.js +3 -1
- package/package/aws-client-agent-mcp/dist/constants.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +4 -1
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.js +6 -2
- package/package/aws-client-agent-mcp/dist/context-manager.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/context-manager.test.js +5 -3
- package/package/aws-client-agent-mcp/dist/context-manager.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +5 -0
- package/package/aws-client-agent-mcp/dist/http-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/http-client.js +15 -1
- package/package/aws-client-agent-mcp/dist/http-client.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +162 -71
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.js +1007 -504
- package/package/aws-client-agent-mcp/dist/mcp-server.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js +371 -253
- package/package/aws-client-agent-mcp/dist/mcp-server.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +6 -17
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/mcp-tools.js +20 -75
- package/package/aws-client-agent-mcp/dist/mcp-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +45 -45
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.js +114 -162
- package/package/aws-client-agent-mcp/dist/memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-store.test.js +175 -164
- package/package/aws-client-agent-mcp/dist/memory-store.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +3 -9
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/memory-tools.js +31 -58
- package/package/aws-client-agent-mcp/dist/memory-tools.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +40 -9
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/message-buffer.js +123 -23
- package/package/aws-client-agent-mcp/dist/message-buffer.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +13 -13
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/server-memory-store.js +23 -16
- package/package/aws-client-agent-mcp/dist/server-memory-store.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.js +8 -5
- package/package/aws-client-agent-mcp/dist/status-reporter.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js +93 -0
- package/package/aws-client-agent-mcp/dist/status-reporter.test.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.d.ts +12 -25
- package/package/aws-client-agent-mcp/dist/types.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/types.js.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +34 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts.map +1 -1
- package/package/aws-client-agent-mcp/dist/websocket-client.js +146 -18
- package/package/aws-client-agent-mcp/dist/websocket-client.js.map +1 -1
- package/package.json +17 -7
- package/dist/adapter/AcodeSdkAdapter.test.d.ts +0 -2
- package/dist/adapter/AcodeSdkAdapter.test.d.ts.map +0 -1
- package/dist/adapter/AcodeSdkAdapter.test.js +0 -2000
- package/dist/adapter/AdapterRegistry.test.d.ts +0 -5
- package/dist/adapter/AdapterRegistry.test.d.ts.map +0 -1
- package/dist/adapter/AdapterRegistry.test.js +0 -118
- package/dist/adapter/ClaudeSdkAdapter.test.d.ts +0 -2
- package/dist/adapter/ClaudeSdkAdapter.test.d.ts.map +0 -1
- package/dist/adapter/ClaudeSdkAdapter.test.js +0 -311
- package/dist/adapter/CodexSdkAdapter.test.d.ts +0 -2
- package/dist/adapter/CodexSdkAdapter.test.d.ts.map +0 -1
- package/dist/adapter/CodexSdkAdapter.test.js +0 -270
- package/dist/adapter/OpencodeSdkAdapter.test.d.ts +0 -2
- package/dist/adapter/OpencodeSdkAdapter.test.d.ts.map +0 -1
- package/dist/adapter/OpencodeSdkAdapter.test.js +0 -158
- package/dist/adapter/acode-tool-names.test.d.ts +0 -2
- package/dist/adapter/acode-tool-names.test.d.ts.map +0 -1
- package/dist/adapter/acode-tool-names.test.js +0 -28
- package/dist/adapter/adapter.test.d.ts +0 -5
- package/dist/adapter/adapter.test.d.ts.map +0 -1
- package/dist/adapter/adapter.test.js +0 -180
- package/dist/adapter/idle-poll-loop.test.d.ts +0 -2
- package/dist/adapter/idle-poll-loop.test.d.ts.map +0 -1
- package/dist/adapter/idle-poll-loop.test.js +0 -85
- package/dist/adapter/types.test.d.ts +0 -2
- package/dist/adapter/types.test.d.ts.map +0 -1
- package/dist/adapter/types.test.js +0 -50
- package/dist/adapters/cc-switch/mcp-acode.test.d.ts +0 -2
- package/dist/adapters/cc-switch/mcp-acode.test.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-acode.test.js +0 -80
- package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts +0 -2
- package/dist/adapters/cc-switch/mcp-claudecode.test.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-claudecode.test.js +0 -75
- package/dist/adapters/cc-switch/mcp-codex.test.d.ts +0 -2
- package/dist/adapters/cc-switch/mcp-codex.test.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-codex.test.js +0 -126
- package/dist/adapters/cc-switch/mcp-opencode.test.d.ts +0 -2
- package/dist/adapters/cc-switch/mcp-opencode.test.d.ts.map +0 -1
- package/dist/adapters/cc-switch/mcp-opencode.test.js +0 -62
- package/dist/adapters/cc-switch/skill-directory.test.d.ts +0 -2
- package/dist/adapters/cc-switch/skill-directory.test.d.ts.map +0 -1
- package/dist/adapters/cc-switch/skill-directory.test.js +0 -74
- package/dist/config.test.d.ts +0 -2
- package/dist/config.test.d.ts.map +0 -1
- package/dist/config.test.js +0 -107
- package/dist/routes/ai-sources.test.d.ts +0 -2
- package/dist/routes/ai-sources.test.d.ts.map +0 -1
- package/dist/routes/ai-sources.test.js +0 -169
- package/dist/routes/file-browser.test.d.ts +0 -5
- package/dist/routes/file-browser.test.d.ts.map +0 -1
- package/dist/routes/file-browser.test.js +0 -155
- package/dist/routes/git.test.d.ts +0 -2
- package/dist/routes/git.test.d.ts.map +0 -1
- package/dist/routes/git.test.js +0 -330
- package/dist/routes/instance.test.d.ts +0 -5
- package/dist/routes/instance.test.d.ts.map +0 -1
- package/dist/routes/instance.test.js +0 -389
- package/dist/routes/mcp.test.d.ts +0 -5
- package/dist/routes/mcp.test.d.ts.map +0 -1
- package/dist/routes/mcp.test.js +0 -92
- package/dist/routes/memory-route-wiring.test.d.ts +0 -2
- package/dist/routes/memory-route-wiring.test.d.ts.map +0 -1
- package/dist/routes/memory-route-wiring.test.js +0 -15
- package/dist/routes/memory.test.d.ts +0 -2
- package/dist/routes/memory.test.d.ts.map +0 -1
- package/dist/routes/memory.test.js +0 -177
- package/dist/routes/properties.test.d.ts +0 -5
- package/dist/routes/properties.test.d.ts.map +0 -1
- package/dist/routes/properties.test.js +0 -72
- package/dist/routes/pty.test.d.ts +0 -2
- package/dist/routes/pty.test.d.ts.map +0 -1
- package/dist/routes/pty.test.js +0 -82
- package/dist/routes/runtime-binding.test.d.ts +0 -2
- package/dist/routes/runtime-binding.test.d.ts.map +0 -1
- package/dist/routes/runtime-binding.test.js +0 -32
- package/dist/routes/sessions.test.d.ts +0 -5
- package/dist/routes/sessions.test.d.ts.map +0 -1
- package/dist/routes/sessions.test.js +0 -86
- package/dist/routes/skills.test.d.ts +0 -5
- package/dist/routes/skills.test.d.ts.map +0 -1
- package/dist/routes/skills.test.js +0 -50
- package/dist/routes/system-metrics.test.d.ts +0 -2
- package/dist/routes/system-metrics.test.d.ts.map +0 -1
- package/dist/routes/system-metrics.test.js +0 -16
- package/dist/routes/terminal.stop-options.test.d.ts +0 -2
- package/dist/routes/terminal.stop-options.test.d.ts.map +0 -1
- package/dist/routes/terminal.stop-options.test.js +0 -39
- package/dist/routes/terminal.test.d.ts +0 -2
- package/dist/routes/terminal.test.d.ts.map +0 -1
- package/dist/routes/terminal.test.js +0 -746
- package/dist/routes/yml.test.d.ts +0 -5
- package/dist/routes/yml.test.d.ts.map +0 -1
- package/dist/routes/yml.test.js +0 -58
- package/dist/services/ai-source-apply.test.d.ts +0 -2
- package/dist/services/ai-source-apply.test.d.ts.map +0 -1
- package/dist/services/ai-source-apply.test.js +0 -138
- package/dist/services/auto-register.test.d.ts +0 -2
- package/dist/services/auto-register.test.d.ts.map +0 -1
- package/dist/services/auto-register.test.js +0 -184
- package/dist/services/aws-client-agent-mcp.test.d.ts +0 -2
- package/dist/services/aws-client-agent-mcp.test.d.ts.map +0 -1
- package/dist/services/aws-client-agent-mcp.test.js +0 -242
- package/dist/services/bridge-package-publish-hooks.test.d.ts +0 -2
- package/dist/services/bridge-package-publish-hooks.test.d.ts.map +0 -1
- package/dist/services/bridge-package-publish-hooks.test.js +0 -136
- package/dist/services/cc-switch-discovery.test.d.ts +0 -2
- package/dist/services/cc-switch-discovery.test.d.ts.map +0 -1
- package/dist/services/cc-switch-discovery.test.js +0 -56
- package/dist/services/cli-commands.test.d.ts +0 -2
- package/dist/services/cli-commands.test.d.ts.map +0 -1
- package/dist/services/cli-commands.test.js +0 -230
- package/dist/services/instance-init-service.test.d.ts +0 -2
- package/dist/services/instance-init-service.test.d.ts.map +0 -1
- package/dist/services/instance-init-service.test.js +0 -140
- package/dist/services/instance-state.test.d.ts +0 -2
- package/dist/services/instance-state.test.d.ts.map +0 -1
- package/dist/services/instance-state.test.js +0 -245
- package/dist/services/mcp-launch-binding-queue.test.d.ts +0 -2
- package/dist/services/mcp-launch-binding-queue.test.d.ts.map +0 -1
- package/dist/services/mcp-launch-binding-queue.test.js +0 -181
- package/dist/services/runtime-binding.test.d.ts +0 -2
- package/dist/services/runtime-binding.test.d.ts.map +0 -1
- package/dist/services/runtime-binding.test.js +0 -78
- package/dist/services/runtime-lifecycle-policy.test.d.ts +0 -2
- package/dist/services/runtime-lifecycle-policy.test.d.ts.map +0 -1
- package/dist/services/runtime-lifecycle-policy.test.js +0 -41
- package/dist/services/session-output.test.d.ts +0 -5
- package/dist/services/session-output.test.d.ts.map +0 -1
- package/dist/services/session-output.test.js +0 -177
- package/dist/services/startup-config-wizard.test.d.ts +0 -2
- package/dist/services/startup-config-wizard.test.d.ts.map +0 -1
- package/dist/services/startup-config-wizard.test.js +0 -184
- package/dist/services/terminal-persistence.test.d.ts +0 -5
- package/dist/services/terminal-persistence.test.d.ts.map +0 -1
- package/dist/services/terminal-persistence.test.js +0 -159
- package/dist/services/tool-installer.test.d.ts +0 -2
- package/dist/services/tool-installer.test.d.ts.map +0 -1
- package/dist/services/tool-installer.test.js +0 -225
- package/dist/services/workspace-files.test.d.ts +0 -2
- package/dist/services/workspace-files.test.d.ts.map +0 -1
- package/dist/services/workspace-files.test.js +0 -648
- package/dist/services/workspace-watch.test.d.ts +0 -2
- package/dist/services/workspace-watch.test.d.ts.map +0 -1
- package/dist/services/workspace-watch.test.js +0 -38
- package/dist/utils/file-utils.test.d.ts +0 -2
- package/dist/utils/file-utils.test.d.ts.map +0 -1
- package/dist/utils/file-utils.test.js +0 -244
- package/dist/utils/logger.test.d.ts +0 -2
- package/dist/utils/logger.test.d.ts.map +0 -1
- package/dist/utils/logger.test.js +0 -93
- package/dist/utils/sdk-package-loader.test.d.ts +0 -2
- package/dist/utils/sdk-package-loader.test.d.ts.map +0 -1
- package/dist/utils/sdk-package-loader.test.js +0 -84
- package/dist/utils/validation.test.d.ts +0 -2
- package/dist/utils/validation.test.d.ts.map +0 -1
- package/dist/utils/validation.test.js +0 -88
- package/dist/utils/yaml-utils.test.d.ts +0 -2
- package/dist/utils/yaml-utils.test.d.ts.map +0 -1
- package/dist/utils/yaml-utils.test.js +0 -363
|
@@ -1,177 +0,0 @@
|
|
|
1
|
-
import { mkdtemp, mkdir, writeFile } from "node:fs/promises";
|
|
2
|
-
import os from "node:os";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
import { describe, expect, it } from "vitest";
|
|
5
|
-
import { listPermanentMemoriesFromWorkspace, resolvePermanentMemoryStorePath, resolvePermanentMemoryStorePathCandidates, } from "./memory.js";
|
|
6
|
-
describe("runtime permanent memory route helpers", () => {
|
|
7
|
-
it("resolves permanent memory under the agent workspace", () => {
|
|
8
|
-
expect(resolvePermanentMemoryStorePath("/workspace/project", "Backend/Engineer:Lead").replace(/\\/g, "/")).toBe("/workspace/project/.agentswork/memory/memory/Backend_Engineer_Lead");
|
|
9
|
-
});
|
|
10
|
-
it("uses a stable fallback directory when role name is blank", () => {
|
|
11
|
-
expect(resolvePermanentMemoryStorePath("/workspace/project", " ").replace(/\\/g, "/")).toBe("/workspace/project/.agentswork/memory/memory/default-role");
|
|
12
|
-
});
|
|
13
|
-
it("resolves the role directory before the default-role fallback", () => {
|
|
14
|
-
const candidates = resolvePermanentMemoryStorePathCandidates("/workspace/project", "Backend Engineer").map((candidate) => ({
|
|
15
|
-
...candidate,
|
|
16
|
-
path: candidate.path.replace(/\\/g, "/"),
|
|
17
|
-
}));
|
|
18
|
-
expect(candidates).toEqual([
|
|
19
|
-
{
|
|
20
|
-
path: "/workspace/project/.agentswork/memory/memory/Backend Engineer",
|
|
21
|
-
isFallback: false,
|
|
22
|
-
},
|
|
23
|
-
{
|
|
24
|
-
path: "/workspace/project/.agentswork/memory/memory/default-role",
|
|
25
|
-
isFallback: true,
|
|
26
|
-
},
|
|
27
|
-
]);
|
|
28
|
-
});
|
|
29
|
-
it("does not duplicate the default-role candidate when role name is blank", () => {
|
|
30
|
-
const candidates = resolvePermanentMemoryStorePathCandidates("/workspace/project", " ").map((candidate) => ({
|
|
31
|
-
...candidate,
|
|
32
|
-
path: candidate.path.replace(/\\/g, "/"),
|
|
33
|
-
}));
|
|
34
|
-
expect(candidates).toEqual([
|
|
35
|
-
{
|
|
36
|
-
path: "/workspace/project/.agentswork/memory/memory/default-role",
|
|
37
|
-
isFallback: false,
|
|
38
|
-
},
|
|
39
|
-
]);
|
|
40
|
-
});
|
|
41
|
-
it("lists only permanent memory records from workspace-local domain files", async () => {
|
|
42
|
-
const workspacePath = await mkdtemp(path.join(os.tmpdir(), "aws-memory-workspace-"));
|
|
43
|
-
const storePath = resolvePermanentMemoryStorePath(workspacePath, "Backend Engineer");
|
|
44
|
-
await mkdir(storePath, { recursive: true });
|
|
45
|
-
await writeFile(path.join(storePath, "core.json"), JSON.stringify({
|
|
46
|
-
by_uri: {
|
|
47
|
-
"core://agent/profile": {
|
|
48
|
-
id: "m-1",
|
|
49
|
-
uri: "Core://agent/profile/",
|
|
50
|
-
content: "profile",
|
|
51
|
-
memory_type: "memory",
|
|
52
|
-
createdAt: "2026-01-01T00:00:00.000Z",
|
|
53
|
-
updatedAt: "2026-01-02T00:00:00.000Z",
|
|
54
|
-
version: 2,
|
|
55
|
-
},
|
|
56
|
-
"core://task/current": {
|
|
57
|
-
id: "t-1",
|
|
58
|
-
uri: "core://task/current",
|
|
59
|
-
content: "task",
|
|
60
|
-
memory_type: "task_list",
|
|
61
|
-
createdAt: "2026-01-01T00:00:00.000Z",
|
|
62
|
-
updatedAt: "2026-01-03T00:00:00.000Z",
|
|
63
|
-
version: 1,
|
|
64
|
-
},
|
|
65
|
-
},
|
|
66
|
-
}), "utf-8");
|
|
67
|
-
const records = await listPermanentMemoriesFromWorkspace(workspacePath, "Backend Engineer");
|
|
68
|
-
expect(records).toHaveLength(1);
|
|
69
|
-
expect(records[0]).toMatchObject({
|
|
70
|
-
id: "m-1",
|
|
71
|
-
uri: "core://agent/profile",
|
|
72
|
-
domain: "core",
|
|
73
|
-
path: "agent/profile",
|
|
74
|
-
content: "profile",
|
|
75
|
-
memory_type: "memory",
|
|
76
|
-
version: 2,
|
|
77
|
-
});
|
|
78
|
-
});
|
|
79
|
-
it("falls back to default-role records when the requested role directory is empty", async () => {
|
|
80
|
-
const workspacePath = await mkdtemp(path.join(os.tmpdir(), "aws-memory-workspace-"));
|
|
81
|
-
const fallbackStorePath = resolvePermanentMemoryStorePath(workspacePath, "");
|
|
82
|
-
await mkdir(fallbackStorePath, { recursive: true });
|
|
83
|
-
await writeFile(path.join(fallbackStorePath, "task.json"), JSON.stringify({
|
|
84
|
-
by_uri: {
|
|
85
|
-
"task://todo/current": {
|
|
86
|
-
id: "m-default-role",
|
|
87
|
-
uri: "task://todo/current",
|
|
88
|
-
content: "default role memory should still display",
|
|
89
|
-
memory_type: "memory",
|
|
90
|
-
createdAt: "2026-01-01T00:00:00.000Z",
|
|
91
|
-
updatedAt: "2026-01-02T00:00:00.000Z",
|
|
92
|
-
version: 1,
|
|
93
|
-
},
|
|
94
|
-
},
|
|
95
|
-
}), "utf-8");
|
|
96
|
-
const records = await listPermanentMemoriesFromWorkspace(workspacePath, "W网盘开发员-2号");
|
|
97
|
-
expect(records).toHaveLength(1);
|
|
98
|
-
expect(records[0]).toMatchObject({
|
|
99
|
-
id: "m-default-role",
|
|
100
|
-
uri: "task://todo/current",
|
|
101
|
-
domain: "task",
|
|
102
|
-
content: "default role memory should still display",
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
it("falls back when the requested role directory has no normalized permanent records", async () => {
|
|
106
|
-
const workspacePath = await mkdtemp(path.join(os.tmpdir(), "aws-memory-workspace-"));
|
|
107
|
-
const roleStorePath = resolvePermanentMemoryStorePath(workspacePath, "Backend Engineer");
|
|
108
|
-
const fallbackStorePath = resolvePermanentMemoryStorePath(workspacePath, "");
|
|
109
|
-
await mkdir(roleStorePath, { recursive: true });
|
|
110
|
-
await mkdir(fallbackStorePath, { recursive: true });
|
|
111
|
-
await writeFile(path.join(roleStorePath, "task.json"), JSON.stringify({
|
|
112
|
-
by_uri: {
|
|
113
|
-
"task://todo/server-managed": {
|
|
114
|
-
id: "task-list-record",
|
|
115
|
-
uri: "task://todo/server-managed",
|
|
116
|
-
content: "not a permanent memory",
|
|
117
|
-
memory_type: "task_list",
|
|
118
|
-
updatedAt: "2026-01-03T00:00:00.000Z",
|
|
119
|
-
},
|
|
120
|
-
},
|
|
121
|
-
}), "utf-8");
|
|
122
|
-
await writeFile(path.join(fallbackStorePath, "task.json"), JSON.stringify({
|
|
123
|
-
by_uri: {
|
|
124
|
-
"task://todo/permanent": {
|
|
125
|
-
id: "m-fallback-permanent",
|
|
126
|
-
uri: "task://todo/permanent",
|
|
127
|
-
content: "fallback permanent memory",
|
|
128
|
-
memory_type: "memory",
|
|
129
|
-
updatedAt: "2026-01-02T00:00:00.000Z",
|
|
130
|
-
},
|
|
131
|
-
},
|
|
132
|
-
}), "utf-8");
|
|
133
|
-
const records = await listPermanentMemoriesFromWorkspace(workspacePath, "Backend Engineer");
|
|
134
|
-
expect(records).toHaveLength(1);
|
|
135
|
-
expect(records[0]).toMatchObject({
|
|
136
|
-
id: "m-fallback-permanent",
|
|
137
|
-
uri: "task://todo/permanent",
|
|
138
|
-
content: "fallback permanent memory",
|
|
139
|
-
});
|
|
140
|
-
});
|
|
141
|
-
it("keeps role-specific permanent memory isolated when the role directory has records", async () => {
|
|
142
|
-
const workspacePath = await mkdtemp(path.join(os.tmpdir(), "aws-memory-workspace-"));
|
|
143
|
-
const roleStorePath = resolvePermanentMemoryStorePath(workspacePath, "Backend Engineer");
|
|
144
|
-
const fallbackStorePath = resolvePermanentMemoryStorePath(workspacePath, "");
|
|
145
|
-
await mkdir(roleStorePath, { recursive: true });
|
|
146
|
-
await mkdir(fallbackStorePath, { recursive: true });
|
|
147
|
-
await writeFile(path.join(roleStorePath, "core.json"), JSON.stringify({
|
|
148
|
-
by_uri: {
|
|
149
|
-
"core://role/specific": {
|
|
150
|
-
id: "m-role",
|
|
151
|
-
uri: "core://role/specific",
|
|
152
|
-
content: "role-specific memory wins",
|
|
153
|
-
memory_type: "memory",
|
|
154
|
-
updatedAt: "2026-01-03T00:00:00.000Z",
|
|
155
|
-
},
|
|
156
|
-
},
|
|
157
|
-
}), "utf-8");
|
|
158
|
-
await writeFile(path.join(fallbackStorePath, "core.json"), JSON.stringify({
|
|
159
|
-
by_uri: {
|
|
160
|
-
"core://default/old": {
|
|
161
|
-
id: "m-default",
|
|
162
|
-
uri: "core://default/old",
|
|
163
|
-
content: "old default-role memory",
|
|
164
|
-
memory_type: "memory",
|
|
165
|
-
updatedAt: "2026-01-02T00:00:00.000Z",
|
|
166
|
-
},
|
|
167
|
-
},
|
|
168
|
-
}), "utf-8");
|
|
169
|
-
const records = await listPermanentMemoriesFromWorkspace(workspacePath, "Backend Engineer");
|
|
170
|
-
expect(records).toHaveLength(1);
|
|
171
|
-
expect(records[0]).toMatchObject({
|
|
172
|
-
id: "m-role",
|
|
173
|
-
uri: "core://role/specific",
|
|
174
|
-
content: "role-specific memory wins",
|
|
175
|
-
});
|
|
176
|
-
});
|
|
177
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"properties.test.d.ts","sourceRoot":"","sources":["../../src/routes/properties.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,72 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Properties 路由单元测试
|
|
3
|
-
*/
|
|
4
|
-
import { describe, it, expect } from 'vitest';
|
|
5
|
-
describe('properties route validation', () => {
|
|
6
|
-
it('requires content for write', () => {
|
|
7
|
-
const validateWriteRequest = (body) => {
|
|
8
|
-
if (!body.content || !String(body.content).trim())
|
|
9
|
-
return { valid: false, error: 'content is required' };
|
|
10
|
-
return { valid: true };
|
|
11
|
-
};
|
|
12
|
-
expect(validateWriteRequest({}).valid).toBe(false);
|
|
13
|
-
expect(validateWriteRequest({ content: '' }).valid).toBe(false);
|
|
14
|
-
expect(validateWriteRequest({ content: 'key=value' }).valid).toBe(true);
|
|
15
|
-
});
|
|
16
|
-
});
|
|
17
|
-
describe('properties file operations', () => {
|
|
18
|
-
it('resolves relative propertiesPath', () => {
|
|
19
|
-
const resolvePath = (workspacePath, propertiesPath) => {
|
|
20
|
-
const defaultPath = '.agentswork/my.properties';
|
|
21
|
-
const resolved = propertiesPath || defaultPath;
|
|
22
|
-
if (workspacePath && !resolved.startsWith('/'))
|
|
23
|
-
return `${workspacePath}/${resolved}`;
|
|
24
|
-
return resolved;
|
|
25
|
-
};
|
|
26
|
-
expect(resolvePath('/project', 'config/app.properties')).toBe('/project/config/app.properties');
|
|
27
|
-
expect(resolvePath('/project')).toBe('/project/.agentswork/my.properties');
|
|
28
|
-
});
|
|
29
|
-
it('parses properties content', () => {
|
|
30
|
-
const parseProperties = (content) => {
|
|
31
|
-
const result = {};
|
|
32
|
-
const lines = content.split('\n');
|
|
33
|
-
for (const line of lines) {
|
|
34
|
-
const trimmed = line.trim();
|
|
35
|
-
if (!trimmed || trimmed.startsWith('#') || trimmed.startsWith('!'))
|
|
36
|
-
continue;
|
|
37
|
-
const eqIndex = trimmed.indexOf('=');
|
|
38
|
-
if (eqIndex > 0) {
|
|
39
|
-
result[trimmed.slice(0, eqIndex).trim()] = trimmed.slice(eqIndex + 1).trim();
|
|
40
|
-
}
|
|
41
|
-
}
|
|
42
|
-
return result;
|
|
43
|
-
};
|
|
44
|
-
const props = parseProperties(`
|
|
45
|
-
# Comment
|
|
46
|
-
agent.role.name=Backend Developer
|
|
47
|
-
project.workspace.path=/home/project
|
|
48
|
-
`);
|
|
49
|
-
expect(props['agent.role.name']).toBe('Backend Developer');
|
|
50
|
-
expect(props['project.workspace.path']).toBe('/home/project');
|
|
51
|
-
});
|
|
52
|
-
it('handles empty content', () => {
|
|
53
|
-
const parseProperties = (content) => {
|
|
54
|
-
if (!content.trim())
|
|
55
|
-
return {};
|
|
56
|
-
const result = {};
|
|
57
|
-
const lines = content.split('\n');
|
|
58
|
-
for (const line of lines) {
|
|
59
|
-
const trimmed = line.trim();
|
|
60
|
-
if (!trimmed || trimmed.startsWith('#'))
|
|
61
|
-
continue;
|
|
62
|
-
const eqIndex = trimmed.indexOf('=');
|
|
63
|
-
if (eqIndex > 0) {
|
|
64
|
-
result[trimmed.slice(0, eqIndex).trim()] = trimmed.slice(eqIndex + 1).trim();
|
|
65
|
-
}
|
|
66
|
-
}
|
|
67
|
-
return result;
|
|
68
|
-
};
|
|
69
|
-
expect(parseProperties('')).toEqual({});
|
|
70
|
-
expect(parseProperties('# Only comments')).toEqual({});
|
|
71
|
-
});
|
|
72
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"pty.test.d.ts","sourceRoot":"","sources":["../../src/routes/pty.test.ts"],"names":[],"mappings":""}
|
package/dist/routes/pty.test.js
DELETED
|
@@ -1,82 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from 'node:fs';
|
|
2
|
-
import { dirname, resolve } from 'node:path';
|
|
3
|
-
import { fileURLToPath } from 'node:url';
|
|
4
|
-
import { afterEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
-
const ptyWrite = vi.fn();
|
|
6
|
-
const ptyKill = vi.fn();
|
|
7
|
-
vi.mock('node-pty', () => ({
|
|
8
|
-
spawn: vi.fn(() => ({
|
|
9
|
-
write: ptyWrite,
|
|
10
|
-
kill: ptyKill,
|
|
11
|
-
onData: vi.fn(),
|
|
12
|
-
onExit: vi.fn(),
|
|
13
|
-
})),
|
|
14
|
-
}));
|
|
15
|
-
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
16
|
-
afterEach(async () => {
|
|
17
|
-
const { closeAllPtySessions } = await import('./pty.js');
|
|
18
|
-
closeAllPtySessions('test-cleanup');
|
|
19
|
-
ptyWrite.mockClear();
|
|
20
|
-
ptyKill.mockClear();
|
|
21
|
-
});
|
|
22
|
-
describe('ordinary PTY persistence policy', () => {
|
|
23
|
-
it('falls back from non-interactive Linux login shells', async () => {
|
|
24
|
-
const { resolveDefaultShell } = await import('./pty.js');
|
|
25
|
-
expect(resolveDefaultShell('linux', { SHELL: '/usr/sbin/nologin' }, (candidate) => candidate === '/bin/bash')).toEqual({ shell: '/bin/bash', args: [] });
|
|
26
|
-
expect(resolveDefaultShell('linux', { SHELL: '/bin/false' }, (candidate) => candidate === '/bin/sh')).toEqual({ shell: '/bin/sh', args: [] });
|
|
27
|
-
});
|
|
28
|
-
it('falls back when Linux SHELL points to a missing absolute path', async () => {
|
|
29
|
-
const { resolveDefaultShell } = await import('./pty.js');
|
|
30
|
-
expect(resolveDefaultShell('linux', { SHELL: '/missing/shell' }, (candidate) => candidate === '/bin/bash')).toEqual({ shell: '/bin/bash', args: [] });
|
|
31
|
-
});
|
|
32
|
-
it('keeps persistent dashboard PTY sessions alive across browser disconnects', () => {
|
|
33
|
-
const source = readFileSync(resolve(currentDir, './pty.ts'), 'utf-8');
|
|
34
|
-
expect(source).toContain('persistent: boolean');
|
|
35
|
-
expect(source).toContain('persistent?: unknown');
|
|
36
|
-
expect(source).toContain('persistent: input.persistent === true');
|
|
37
|
-
expect(source).toContain('ownerUserId: String(input.ownerUserId || "").trim() || undefined');
|
|
38
|
-
expect(source).toContain('tenantId: String(input.tenantId || "").trim() || undefined');
|
|
39
|
-
expect(source).toContain('projectName: String(input.projectName || "").trim() || undefined');
|
|
40
|
-
expect(source).toContain('if (!session.persistent) {');
|
|
41
|
-
expect(source).toContain('resolvePtyExitedTtlMs');
|
|
42
|
-
expect(source).toContain('closePtySession(session.id, "exited-timeout")');
|
|
43
|
-
expect(source).toContain('session.sockets.size === 0 && session.status === "running" && !session.persistent');
|
|
44
|
-
});
|
|
45
|
-
it('documents optional pre-command injection without exposing template IDs', () => {
|
|
46
|
-
const source = readFileSync(resolve(currentDir, './pty.ts'), 'utf-8');
|
|
47
|
-
expect(source).toContain('preCommand?: unknown');
|
|
48
|
-
expect(source).toContain('preCommand: record.preCommand');
|
|
49
|
-
expect(source).toContain('injectPtyPreCommand(session, input.preCommand)');
|
|
50
|
-
expect(source).toContain('command.replace(/\\n/g, "\\r")');
|
|
51
|
-
expect(source).toContain('session.ptyProcess.write(payload)');
|
|
52
|
-
expect(source).not.toContain('preCommandTemplateId');
|
|
53
|
-
});
|
|
54
|
-
it('writes multiline pre-commands as enter-separated PTY input', async () => {
|
|
55
|
-
const { createPtySession } = await import('./pty.js');
|
|
56
|
-
createPtySession({
|
|
57
|
-
workspacePath: process.cwd(),
|
|
58
|
-
preCommand: 'echo one\necho two',
|
|
59
|
-
persistent: true,
|
|
60
|
-
});
|
|
61
|
-
expect(ptyWrite).toHaveBeenCalledTimes(1);
|
|
62
|
-
expect(ptyWrite).toHaveBeenCalledWith('echo one\recho two\r');
|
|
63
|
-
});
|
|
64
|
-
it('normalizes a trailing LF to exactly one final PTY enter', async () => {
|
|
65
|
-
const { createPtySession } = await import('./pty.js');
|
|
66
|
-
createPtySession({
|
|
67
|
-
workspacePath: process.cwd(),
|
|
68
|
-
preCommand: 'echo one\n',
|
|
69
|
-
persistent: true,
|
|
70
|
-
});
|
|
71
|
-
expect(ptyWrite).toHaveBeenCalledTimes(1);
|
|
72
|
-
expect(ptyWrite).toHaveBeenCalledWith('echo one\r');
|
|
73
|
-
});
|
|
74
|
-
it('keeps no-template PTY creation from writing pre-command input', async () => {
|
|
75
|
-
const { createPtySession } = await import('./pty.js');
|
|
76
|
-
createPtySession({
|
|
77
|
-
workspacePath: process.cwd(),
|
|
78
|
-
persistent: true,
|
|
79
|
-
});
|
|
80
|
-
expect(ptyWrite).not.toHaveBeenCalled();
|
|
81
|
-
});
|
|
82
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"runtime-binding.test.d.ts","sourceRoot":"","sources":["../../src/routes/runtime-binding.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,32 +0,0 @@
|
|
|
1
|
-
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
2
|
-
vi.mock("../services/runtime-binding.js", () => ({
|
|
3
|
-
clearRuntimeBinding: vi.fn(),
|
|
4
|
-
getRuntimeBindingPublicState: vi.fn(() => ({ paired: true })),
|
|
5
|
-
getRuntimePairingCode: vi.fn(() => "000-000"),
|
|
6
|
-
hasRuntimeBinding: vi.fn(() => true),
|
|
7
|
-
saveRuntimeBinding: vi.fn(),
|
|
8
|
-
validateRuntimeBindingToken: vi.fn(() => true),
|
|
9
|
-
validateRuntimePairingCode: vi.fn(() => true),
|
|
10
|
-
}));
|
|
11
|
-
vi.mock("../services/mcp-launch-binding-queue.js", () => ({
|
|
12
|
-
claimMcpLaunchBinding: vi.fn(),
|
|
13
|
-
getMcpLaunchQueueSize: vi.fn(() => 0),
|
|
14
|
-
}));
|
|
15
|
-
afterEach(() => {
|
|
16
|
-
vi.clearAllMocks();
|
|
17
|
-
});
|
|
18
|
-
describe("runtime binding token request", () => {
|
|
19
|
-
it("rejects bridge-scoped token refresh for MCP nodes", async () => {
|
|
20
|
-
const { resolveRuntimeTokenRequest } = await import("./runtime-binding.js");
|
|
21
|
-
const result = resolveRuntimeTokenRequest({
|
|
22
|
-
userId: "user-1",
|
|
23
|
-
serverUrl: "ws://localhost:7380/ws/agent",
|
|
24
|
-
forceRefresh: true,
|
|
25
|
-
rejectedRuntimeAccessToken: "stale-token",
|
|
26
|
-
});
|
|
27
|
-
expect(result).toEqual({
|
|
28
|
-
success: false,
|
|
29
|
-
error: "MCP runtime token must be claimed from launch binding; bridge-scoped token refresh is disabled",
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"sessions.test.d.ts","sourceRoot":"","sources":["../../src/routes/sessions.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Sessions 路由单元测试
|
|
3
|
-
*/
|
|
4
|
-
import { describe, it, expect } from 'vitest';
|
|
5
|
-
import { resolveActiveSdkSessionSnapshotStatus } from './sessions.js';
|
|
6
|
-
describe('sessions route validation', () => {
|
|
7
|
-
it('requires agentId for recovery', () => {
|
|
8
|
-
const validateRecoverRequest = (body) => {
|
|
9
|
-
if (!body.agentId)
|
|
10
|
-
return { valid: false, error: 'agentId is required' };
|
|
11
|
-
return { valid: true };
|
|
12
|
-
};
|
|
13
|
-
expect(validateRecoverRequest({}).valid).toBe(false);
|
|
14
|
-
expect(validateRecoverRequest({ agentId: 'agent-123' }).valid).toBe(true);
|
|
15
|
-
});
|
|
16
|
-
it('uses provided workspacePath when available', () => {
|
|
17
|
-
const resolveWorkspacePath = (provided, persisted) => {
|
|
18
|
-
return provided || persisted || null;
|
|
19
|
-
};
|
|
20
|
-
expect(resolveWorkspacePath('/provided/path', '/persisted/path')).toBe('/provided/path');
|
|
21
|
-
expect(resolveWorkspacePath(undefined, '/persisted/path')).toBe('/persisted/path');
|
|
22
|
-
expect(resolveWorkspacePath(undefined, undefined)).toBe(null);
|
|
23
|
-
});
|
|
24
|
-
it('resolves command with fallback chain', () => {
|
|
25
|
-
const resolveCommand = (provided, persisted) => {
|
|
26
|
-
return provided || persisted || 'claude';
|
|
27
|
-
};
|
|
28
|
-
expect(resolveCommand('custom-cmd', 'persisted-cmd')).toBe('custom-cmd');
|
|
29
|
-
expect(resolveCommand(undefined, 'persisted-cmd')).toBe('persisted-cmd');
|
|
30
|
-
expect(resolveCommand(undefined, undefined)).toBe('claude');
|
|
31
|
-
});
|
|
32
|
-
});
|
|
33
|
-
describe('session persistence', () => {
|
|
34
|
-
it('transitions from running to stopped on exit', () => {
|
|
35
|
-
const sessions = [
|
|
36
|
-
{ sessionId: 'session-1', status: 'running' },
|
|
37
|
-
{ sessionId: 'session-2', status: 'running' },
|
|
38
|
-
];
|
|
39
|
-
const updated = sessions.map(s => s.sessionId === 'session-1' ? { ...s, status: 'stopped' } : s);
|
|
40
|
-
expect(updated[0].status).toBe('stopped');
|
|
41
|
-
expect(updated[1].status).toBe('running');
|
|
42
|
-
});
|
|
43
|
-
it('filters out active sessions from persisted list', () => {
|
|
44
|
-
const active = [{ sessionId: 'session-1' }];
|
|
45
|
-
const persisted = [{ sessionId: 'session-1' }, { sessionId: 'session-2' }];
|
|
46
|
-
const activeIds = new Set(active.map(s => s.sessionId));
|
|
47
|
-
const result = persisted.filter(s => !activeIds.has(s.sessionId));
|
|
48
|
-
expect(result.length).toBe(1);
|
|
49
|
-
expect(result[0].sessionId).toBe('session-2');
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
describe('active SDK session snapshots', () => {
|
|
53
|
-
it('reports the adapter fine-grained status instead of hardcoded running', () => {
|
|
54
|
-
expect(resolveActiveSdkSessionSnapshotStatus('waiting_input', 'running')).toBe('waiting_input');
|
|
55
|
-
expect(resolveActiveSdkSessionSnapshotStatus('tool_using', undefined)).toBe('tool_using');
|
|
56
|
-
});
|
|
57
|
-
it('keeps idle listener snapshots in waiting_input even if adapter is temporarily tool_using', () => {
|
|
58
|
-
expect(resolveActiveSdkSessionSnapshotStatus('tool_using', 'waiting_input', 'idle')).toBe('waiting_input');
|
|
59
|
-
});
|
|
60
|
-
it('uses current runtime status when adapter status is unavailable', () => {
|
|
61
|
-
expect(resolveActiveSdkSessionSnapshotStatus(undefined, 'thinking')).toBe('thinking');
|
|
62
|
-
});
|
|
63
|
-
it('falls back to running only for legacy sessions without status details', () => {
|
|
64
|
-
expect(resolveActiveSdkSessionSnapshotStatus(undefined, undefined)).toBe('running');
|
|
65
|
-
});
|
|
66
|
-
});
|
|
67
|
-
describe('terminal configuration', () => {
|
|
68
|
-
it('selects correct shell for platform', () => {
|
|
69
|
-
const getShellConfig = (platform) => {
|
|
70
|
-
if (platform === 'win32')
|
|
71
|
-
return { shell: 'powershell.exe', args: ['-NoLogo'] };
|
|
72
|
-
return { shell: 'bash', args: [] };
|
|
73
|
-
};
|
|
74
|
-
expect(getShellConfig('win32').shell).toBe('powershell.exe');
|
|
75
|
-
expect(getShellConfig('linux').shell).toBe('bash');
|
|
76
|
-
});
|
|
77
|
-
it('generates correct terminal environment', () => {
|
|
78
|
-
const buildTerminalEnv = (agentId, baseEnv) => ({
|
|
79
|
-
...baseEnv,
|
|
80
|
-
AWS_AGENT_ID: agentId,
|
|
81
|
-
});
|
|
82
|
-
const env = buildTerminalEnv('agent-123', { PATH: '/usr/bin' });
|
|
83
|
-
expect(env.AWS_AGENT_ID).toBe('agent-123');
|
|
84
|
-
expect(env.PATH).toBe('/usr/bin');
|
|
85
|
-
});
|
|
86
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"skills.test.d.ts","sourceRoot":"","sources":["../../src/routes/skills.test.ts"],"names":[],"mappings":"AAAA;;GAEG"}
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
/**
|
|
2
|
-
* Skills 路由单元测试
|
|
3
|
-
*/
|
|
4
|
-
import { describe, it, expect } from 'vitest';
|
|
5
|
-
describe('skills route validation', () => {
|
|
6
|
-
it('requires agentId for list', () => {
|
|
7
|
-
const validateListRequest = (body) => {
|
|
8
|
-
if (!body.agentId)
|
|
9
|
-
return { valid: false, error: 'agentId is required' };
|
|
10
|
-
return { valid: true };
|
|
11
|
-
};
|
|
12
|
-
expect(validateListRequest({}).valid).toBe(false);
|
|
13
|
-
expect(validateListRequest({ agentId: 'agent-1' }).valid).toBe(true);
|
|
14
|
-
});
|
|
15
|
-
it('requires agentId and skillId for get', () => {
|
|
16
|
-
const validateGetRequest = (body) => {
|
|
17
|
-
if (!body.agentId || !body.skillId)
|
|
18
|
-
return { valid: false, error: 'agentId and skillId are required' };
|
|
19
|
-
return { valid: true };
|
|
20
|
-
};
|
|
21
|
-
expect(validateGetRequest({}).valid).toBe(false);
|
|
22
|
-
expect(validateGetRequest({ agentId: 'agent-1', skillId: 'skill-1' }).valid).toBe(true);
|
|
23
|
-
});
|
|
24
|
-
it('normalizes skill name', () => {
|
|
25
|
-
const normalizeSkillName = (name) => name ? String(name).trim() : undefined;
|
|
26
|
-
expect(normalizeSkillName(' test-skill ')).toBe('test-skill');
|
|
27
|
-
expect(normalizeSkillName('')).toBe(undefined);
|
|
28
|
-
});
|
|
29
|
-
it('normalizes apps', () => {
|
|
30
|
-
const normalizeApps = (apps) => {
|
|
31
|
-
if (!apps)
|
|
32
|
-
return [];
|
|
33
|
-
if (typeof apps === 'string')
|
|
34
|
-
return apps.split(',').map(s => s.trim()).filter(Boolean);
|
|
35
|
-
if (Array.isArray(apps))
|
|
36
|
-
return apps.filter(s => typeof s === 'string').map(s => String(s).trim()).filter(Boolean);
|
|
37
|
-
return [];
|
|
38
|
-
};
|
|
39
|
-
expect(normalizeApps('claude,opencode')).toEqual(['claude', 'opencode']);
|
|
40
|
-
expect(normalizeApps(['claude', 'opencode'])).toEqual(['claude', 'opencode']);
|
|
41
|
-
});
|
|
42
|
-
it('allows supported per-tool toggle app ids', () => {
|
|
43
|
-
const isSupportedToggleAppId = (appId) => ['acode', 'claudecode', 'opencode'].includes(appId);
|
|
44
|
-
expect(isSupportedToggleAppId('acode')).toBe(true);
|
|
45
|
-
expect(isSupportedToggleAppId('claudecode')).toBe(true);
|
|
46
|
-
expect(isSupportedToggleAppId('opencode')).toBe(true);
|
|
47
|
-
expect(isSupportedToggleAppId('codex')).toBe(false);
|
|
48
|
-
expect(isSupportedToggleAppId('openclaw')).toBe(false);
|
|
49
|
-
});
|
|
50
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"system-metrics.test.d.ts","sourceRoot":"","sources":["../../src/routes/system-metrics.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
import { readFileSync } from "node:fs";
|
|
2
|
-
import { dirname, resolve } from "node:path";
|
|
3
|
-
import { fileURLToPath } from "node:url";
|
|
4
|
-
import { describe, expect, it } from "vitest";
|
|
5
|
-
const currentDir = dirname(fileURLToPath(import.meta.url));
|
|
6
|
-
const srcDir = resolve(currentDir, "..");
|
|
7
|
-
describe("system metrics route wiring", () => {
|
|
8
|
-
it("mounts the authenticated machine metrics route under /runtime", () => {
|
|
9
|
-
const routeSource = readFileSync(resolve(currentDir, "./system-metrics.ts"), "utf-8");
|
|
10
|
-
const indexSource = readFileSync(resolve(srcDir, "./index.ts"), "utf-8");
|
|
11
|
-
expect(routeSource).toContain('systemMetricsRouter.get("/system-metrics", validateToken');
|
|
12
|
-
expect(routeSource).toContain("collectSystemMetrics");
|
|
13
|
-
expect(indexSource).toContain('import { systemMetricsRouter } from "./routes/system-metrics.js";');
|
|
14
|
-
expect(indexSource).toContain('app.use("/runtime", systemMetricsRouter);');
|
|
15
|
-
});
|
|
16
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.stop-options.test.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.stop-options.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
import { describe, expect, it } from "vitest";
|
|
2
|
-
import { parseRuntimeStopOptions, resolveRuntimeContextResetSupport, } from "./terminal.js";
|
|
3
|
-
describe("runtime stop options", () => {
|
|
4
|
-
it("notifies stopped status for manual stop requests by default", () => {
|
|
5
|
-
const options = parseRuntimeStopOptions({ sessionId: "session-1" });
|
|
6
|
-
expect(options).toEqual({
|
|
7
|
-
statusNotified: true,
|
|
8
|
-
reason: undefined,
|
|
9
|
-
});
|
|
10
|
-
});
|
|
11
|
-
it("suppresses stopped status for internal context reset requests", () => {
|
|
12
|
-
const options = parseRuntimeStopOptions({
|
|
13
|
-
sessionId: "session-1",
|
|
14
|
-
suppressStatus: true,
|
|
15
|
-
reason: "context_reset_after_task_submit",
|
|
16
|
-
});
|
|
17
|
-
expect(options).toEqual({
|
|
18
|
-
statusNotified: false,
|
|
19
|
-
reason: "context_reset_after_task_submit",
|
|
20
|
-
});
|
|
21
|
-
});
|
|
22
|
-
});
|
|
23
|
-
describe("runtime context reset support", () => {
|
|
24
|
-
it("allows only ACode sessions whose adapter exposes resetContext", () => {
|
|
25
|
-
expect(resolveRuntimeContextResetSupport("acode", true)).toEqual({
|
|
26
|
-
supported: true,
|
|
27
|
-
});
|
|
28
|
-
expect(resolveRuntimeContextResetSupport("claude-code", false)).toEqual({
|
|
29
|
-
supported: false,
|
|
30
|
-
statusCode: 400,
|
|
31
|
-
error: "context reset without restart is only supported by ACode",
|
|
32
|
-
});
|
|
33
|
-
expect(resolveRuntimeContextResetSupport("acode", false)).toEqual({
|
|
34
|
-
supported: false,
|
|
35
|
-
statusCode: 500,
|
|
36
|
-
error: "ACode adapter does not expose resetContext",
|
|
37
|
-
});
|
|
38
|
-
});
|
|
39
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terminal.test.d.ts","sourceRoot":"","sources":["../../src/routes/terminal.test.ts"],"names":[],"mappings":""}
|