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,136 +0,0 @@
|
|
|
1
|
-
import { createHmac } from "node:crypto";
|
|
2
|
-
import { afterEach, describe, expect, it, vi } from "vitest";
|
|
3
|
-
import { createBridgePackagePublishPayload, createBridgePublishSignature, notifyBridgePackagePublished, readBridgePackageInfo, } from "./bridge-package-publish-hooks.js";
|
|
4
|
-
const originalEnv = { ...process.env };
|
|
5
|
-
function createLoggerMock() {
|
|
6
|
-
return {
|
|
7
|
-
info: vi.fn(),
|
|
8
|
-
warn: vi.fn(),
|
|
9
|
-
error: vi.fn(),
|
|
10
|
-
};
|
|
11
|
-
}
|
|
12
|
-
function createPublishEnv(overrides = {}) {
|
|
13
|
-
return {
|
|
14
|
-
...originalEnv,
|
|
15
|
-
BRIDGE_PACKAGE_ON_PUBLIC_HOOKS_URL: "",
|
|
16
|
-
BRIDGE_PACKAGE_ON_PUBLIC_HOOKS_SECRET: "",
|
|
17
|
-
GITHUB_REPOSITORY: "owner/repo",
|
|
18
|
-
GITHUB_REF: "refs/heads/main",
|
|
19
|
-
GITHUB_SHA: "abc123",
|
|
20
|
-
GITHUB_RUN_ID: "456",
|
|
21
|
-
GITHUB_RUN_NUMBER: "789",
|
|
22
|
-
...overrides,
|
|
23
|
-
};
|
|
24
|
-
}
|
|
25
|
-
const packageInfo = {
|
|
26
|
-
name: "aws-runtime-bridge",
|
|
27
|
-
version: "1.7.6",
|
|
28
|
-
};
|
|
29
|
-
afterEach(() => {
|
|
30
|
-
process.env = { ...originalEnv };
|
|
31
|
-
vi.clearAllMocks();
|
|
32
|
-
vi.restoreAllMocks();
|
|
33
|
-
});
|
|
34
|
-
describe("bridge package publish hooks", () => {
|
|
35
|
-
it("reads the bridge package name and version from package.json", async () => {
|
|
36
|
-
await expect(readBridgePackageInfo()).resolves.toMatchObject({
|
|
37
|
-
name: "aws-runtime-bridge",
|
|
38
|
-
version: expect.stringMatching(/^\d+\.\d+\.\d+/),
|
|
39
|
-
});
|
|
40
|
-
});
|
|
41
|
-
it("creates a publish payload with GitHub Actions metadata", () => {
|
|
42
|
-
const payload = createBridgePackagePublishPayload(packageInfo, createPublishEnv(), () => new Date("2026-05-23T12:00:00.000Z"));
|
|
43
|
-
expect(payload).toEqual({
|
|
44
|
-
package: "aws-runtime-bridge",
|
|
45
|
-
version: "1.7.6",
|
|
46
|
-
repository: "owner/repo",
|
|
47
|
-
ref: "refs/heads/main",
|
|
48
|
-
sha: "abc123",
|
|
49
|
-
runId: "456",
|
|
50
|
-
runNumber: "789",
|
|
51
|
-
publishedAt: "2026-05-23T12:00:00.000Z",
|
|
52
|
-
});
|
|
53
|
-
});
|
|
54
|
-
it("signs the exact request body with HMAC SHA-256", () => {
|
|
55
|
-
const body = JSON.stringify({ package: "aws-runtime-bridge", version: "1.7.6" });
|
|
56
|
-
const secret = "test-secret";
|
|
57
|
-
const expectedDigest = createHmac("sha256", secret).update(body, "utf-8").digest("hex");
|
|
58
|
-
expect(createBridgePublishSignature(body, secret)).toBe(`sha256=${expectedDigest}`);
|
|
59
|
-
});
|
|
60
|
-
it("skips notification when both hook URL and secret are absent", async () => {
|
|
61
|
-
const post = vi.fn();
|
|
62
|
-
const logger = createLoggerMock();
|
|
63
|
-
await expect(notifyBridgePackagePublished({
|
|
64
|
-
env: createPublishEnv(),
|
|
65
|
-
logger,
|
|
66
|
-
packageInfo,
|
|
67
|
-
post,
|
|
68
|
-
})).resolves.toBe(false);
|
|
69
|
-
expect(post).not.toHaveBeenCalled();
|
|
70
|
-
expect(logger.info).toHaveBeenCalledWith("Bridge package publish hook is not configured. Skipping notification.");
|
|
71
|
-
expect(JSON.stringify(logger)).not.toContain("test-secret");
|
|
72
|
-
});
|
|
73
|
-
it("skips notification when only one hook setting is configured", async () => {
|
|
74
|
-
const post = vi.fn();
|
|
75
|
-
const logger = createLoggerMock();
|
|
76
|
-
await expect(notifyBridgePackagePublished({
|
|
77
|
-
env: createPublishEnv({
|
|
78
|
-
BRIDGE_PACKAGE_ON_PUBLIC_HOOKS_URL: "https://hooks.example.test/bridge",
|
|
79
|
-
BRIDGE_PACKAGE_ON_PUBLIC_HOOKS_SECRET: "",
|
|
80
|
-
}),
|
|
81
|
-
logger,
|
|
82
|
-
packageInfo,
|
|
83
|
-
post,
|
|
84
|
-
})).resolves.toBe(false);
|
|
85
|
-
expect(post).not.toHaveBeenCalled();
|
|
86
|
-
expect(logger.warn).toHaveBeenCalledWith("Bridge package publish hook requires both BRIDGE_PACKAGE_ON_PUBLIC_HOOKS_URL and BRIDGE_PACKAGE_ON_PUBLIC_HOOKS_SECRET. Skipping notification.");
|
|
87
|
-
});
|
|
88
|
-
it("sends signed publish notification when hook URL and secret are configured", async () => {
|
|
89
|
-
const post = vi.fn().mockResolvedValue({ data: { success: true } });
|
|
90
|
-
const logger = createLoggerMock();
|
|
91
|
-
const secret = "super-secret-value";
|
|
92
|
-
const env = createPublishEnv({
|
|
93
|
-
BRIDGE_PACKAGE_ON_PUBLIC_HOOKS_URL: "https://hooks.example.test/bridge?token=url-token",
|
|
94
|
-
BRIDGE_PACKAGE_ON_PUBLIC_HOOKS_SECRET: secret,
|
|
95
|
-
});
|
|
96
|
-
await expect(notifyBridgePackagePublished({
|
|
97
|
-
env,
|
|
98
|
-
logger,
|
|
99
|
-
packageInfo,
|
|
100
|
-
now: () => new Date("2026-05-23T12:00:00.000Z"),
|
|
101
|
-
post,
|
|
102
|
-
})).resolves.toBe(true);
|
|
103
|
-
expect(post).toHaveBeenCalledTimes(1);
|
|
104
|
-
const [url, body, config] = post.mock.calls[0] ?? [];
|
|
105
|
-
expect(url).toBe("https://hooks.example.test/bridge?token=url-token");
|
|
106
|
-
expect(typeof body).toBe("string");
|
|
107
|
-
expect(JSON.parse(body)).toMatchObject({
|
|
108
|
-
package: "aws-runtime-bridge",
|
|
109
|
-
version: "1.7.6",
|
|
110
|
-
publishedAt: "2026-05-23T12:00:00.000Z",
|
|
111
|
-
});
|
|
112
|
-
expect(config).toMatchObject({
|
|
113
|
-
headers: {
|
|
114
|
-
"Content-Type": "application/json",
|
|
115
|
-
"X-Bridge-Signature": createBridgePublishSignature(body, secret),
|
|
116
|
-
"X-Bridge-Timestamp": "1779537600",
|
|
117
|
-
},
|
|
118
|
-
timeout: 10_000,
|
|
119
|
-
});
|
|
120
|
-
expect(logger.info).toHaveBeenCalledWith("Notifying bridge package publish hook for aws-runtime-bridge@1.7.6 (https://hooks.example.test).");
|
|
121
|
-
expect(JSON.stringify(logger.info.mock.calls)).not.toContain(secret);
|
|
122
|
-
expect(JSON.stringify(logger.info.mock.calls)).not.toContain("url-token");
|
|
123
|
-
});
|
|
124
|
-
it("surfaces notification failures when hook is configured", async () => {
|
|
125
|
-
const post = vi.fn().mockRejectedValue(new Error("network unavailable"));
|
|
126
|
-
await expect(notifyBridgePackagePublished({
|
|
127
|
-
env: createPublishEnv({
|
|
128
|
-
BRIDGE_PACKAGE_ON_PUBLIC_HOOKS_URL: "https://hooks.example.test/bridge",
|
|
129
|
-
BRIDGE_PACKAGE_ON_PUBLIC_HOOKS_SECRET: "test-secret",
|
|
130
|
-
}),
|
|
131
|
-
logger: createLoggerMock(),
|
|
132
|
-
packageInfo,
|
|
133
|
-
post,
|
|
134
|
-
})).rejects.toThrow("network unavailable");
|
|
135
|
-
});
|
|
136
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cc-switch-discovery.test.d.ts","sourceRoot":"","sources":["../../src/services/cc-switch-discovery.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,56 +0,0 @@
|
|
|
1
|
-
import { mkdir, mkdtemp, readFile, readdir, rm, writeFile } from 'node:fs/promises';
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { afterEach, beforeEach, describe, expect, it } from 'vitest';
|
|
5
|
-
import { discoverCcSwitchConfiguredItems, loadCcSwitchSdk } from './cc-switch-sdk.js';
|
|
6
|
-
import { getAgentInitRoot } from './instance-state.js';
|
|
7
|
-
import { syncLegacyStateFromSdk } from './instance-init-service.js';
|
|
8
|
-
describe('CC Switch discovery flow', () => {
|
|
9
|
-
const previousRuntimeHome = process.env.AWS_RUNTIME_HOME_DIR;
|
|
10
|
-
let runtimeHome = '';
|
|
11
|
-
let agentId = '';
|
|
12
|
-
beforeEach(async () => {
|
|
13
|
-
runtimeHome = await mkdtemp(path.join(os.tmpdir(), 'cc-switch-discovery-runtime-'));
|
|
14
|
-
agentId = `agent-discovery-${Date.now()}-${Math.random().toString(36).slice(2)}`;
|
|
15
|
-
process.env.AWS_RUNTIME_HOME_DIR = runtimeHome;
|
|
16
|
-
});
|
|
17
|
-
afterEach(async () => {
|
|
18
|
-
if (previousRuntimeHome === undefined) {
|
|
19
|
-
delete process.env.AWS_RUNTIME_HOME_DIR;
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
process.env.AWS_RUNTIME_HOME_DIR = previousRuntimeHome;
|
|
23
|
-
}
|
|
24
|
-
await rm(runtimeHome, { recursive: true, force: true });
|
|
25
|
-
if (agentId) {
|
|
26
|
-
await rm(getAgentInitRoot(agentId), { recursive: true, force: true });
|
|
27
|
-
}
|
|
28
|
-
});
|
|
29
|
-
it('discovers configured MCP and Skill items into instance state without rewriting source app files', async () => {
|
|
30
|
-
const opencodeConfigPath = path.join(runtimeHome, '.config', 'opencode', 'opencode.json');
|
|
31
|
-
const codexSkillDir = path.join(runtimeHome, '.codex', 'skills', 'codex-review');
|
|
32
|
-
const opencodeConfig = {
|
|
33
|
-
theme: 'dark',
|
|
34
|
-
mcpServers: {
|
|
35
|
-
'legacy-opencode': {
|
|
36
|
-
type: 'remote',
|
|
37
|
-
url: 'http://localhost:9999/sse',
|
|
38
|
-
},
|
|
39
|
-
},
|
|
40
|
-
};
|
|
41
|
-
await mkdir(path.dirname(opencodeConfigPath), { recursive: true });
|
|
42
|
-
await writeFile(opencodeConfigPath, JSON.stringify(opencodeConfig, null, 2), 'utf-8');
|
|
43
|
-
await mkdir(codexSkillDir, { recursive: true });
|
|
44
|
-
await writeFile(path.join(codexSkillDir, 'SKILL.md'), '---\nname: Codex Review\ndescription: Review code with Codex\n---\n# Skill\n', 'utf-8');
|
|
45
|
-
const beforeOpencodeRaw = await readFile(opencodeConfigPath, 'utf-8');
|
|
46
|
-
const beforeCodexEntries = await readdir(path.dirname(codexSkillDir));
|
|
47
|
-
const sdk = await loadCcSwitchSdk(agentId);
|
|
48
|
-
const imported = await discoverCcSwitchConfiguredItems(sdk);
|
|
49
|
-
const synced = await syncLegacyStateFromSdk(agentId, sdk);
|
|
50
|
-
expect(imported).toEqual({ mcpServers: 1, skills: 1 });
|
|
51
|
-
expect(synced.state.mcpServers.some((item) => item.name === 'legacy-opencode')).toBe(true);
|
|
52
|
-
expect(synced.state.skills.some((item) => item.name === 'Codex Review')).toBe(true);
|
|
53
|
-
expect(await readFile(opencodeConfigPath, 'utf-8')).toBe(beforeOpencodeRaw);
|
|
54
|
-
expect(await readdir(path.dirname(codexSkillDir))).toEqual(beforeCodexEntries);
|
|
55
|
-
});
|
|
56
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"cli-commands.test.d.ts","sourceRoot":"","sources":["../../src/services/cli-commands.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,230 +0,0 @@
|
|
|
1
|
-
import { existsSync, 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 { createSystemdUnitContent, handleCliCommand, readPackageVersion, } from "./cli-commands.js";
|
|
6
|
-
const tempRoots = [];
|
|
7
|
-
function createPackageRoot(version = "9.8.7") {
|
|
8
|
-
const root = mkdtempSync(path.join(os.tmpdir(), "aws-bridge-cli-"));
|
|
9
|
-
tempRoots.push(root);
|
|
10
|
-
mkdirSync(root, { recursive: true });
|
|
11
|
-
writeFileSync(path.join(root, "package.json"), JSON.stringify({ name: "aws-runtime-bridge", version }), "utf-8");
|
|
12
|
-
return root;
|
|
13
|
-
}
|
|
14
|
-
function createServiceUnitPath() {
|
|
15
|
-
const root = mkdtempSync(path.join(os.tmpdir(), "aws-bridge-service-"));
|
|
16
|
-
tempRoots.push(root);
|
|
17
|
-
return path.join(root, "systemd", "awsb.service");
|
|
18
|
-
}
|
|
19
|
-
function quotedSystemdArg(value) {
|
|
20
|
-
return `"${value.replace(/\\/g, "\\\\").replace(/"/g, '\\"')}"`;
|
|
21
|
-
}
|
|
22
|
-
afterEach(() => {
|
|
23
|
-
for (const root of tempRoots.splice(0)) {
|
|
24
|
-
rmSync(root, { recursive: true, force: true });
|
|
25
|
-
}
|
|
26
|
-
});
|
|
27
|
-
describe("cli commands", () => {
|
|
28
|
-
it("reads package version from package root", () => {
|
|
29
|
-
const packageRoot = createPackageRoot("1.2.3");
|
|
30
|
-
expect(readPackageVersion(packageRoot)).toBe("1.2.3");
|
|
31
|
-
});
|
|
32
|
-
it("prints version for -v", async () => {
|
|
33
|
-
const packageRoot = createPackageRoot("1.2.3");
|
|
34
|
-
const output = [];
|
|
35
|
-
const result = await handleCliCommand({
|
|
36
|
-
argv: ["-v"],
|
|
37
|
-
packageRoot,
|
|
38
|
-
stdout: (message) => output.push(message),
|
|
39
|
-
});
|
|
40
|
-
expect(result).toEqual({ handled: true, exitCode: 0 });
|
|
41
|
-
expect(output).toEqual(["aws-runtime-bridge 1.2.3"]);
|
|
42
|
-
});
|
|
43
|
-
it("prints version for version command", async () => {
|
|
44
|
-
const packageRoot = createPackageRoot("2.0.0");
|
|
45
|
-
const output = [];
|
|
46
|
-
const result = await handleCliCommand({
|
|
47
|
-
argv: ["version"],
|
|
48
|
-
packageRoot,
|
|
49
|
-
stdout: (message) => output.push(message),
|
|
50
|
-
});
|
|
51
|
-
expect(result).toEqual({ handled: true, exitCode: 0 });
|
|
52
|
-
expect(output).toEqual(["aws-runtime-bridge 2.0.0"]);
|
|
53
|
-
});
|
|
54
|
-
it("runs npm global update for update command", async () => {
|
|
55
|
-
const output = [];
|
|
56
|
-
const commands = [];
|
|
57
|
-
const result = await handleCliCommand({
|
|
58
|
-
argv: ["update"],
|
|
59
|
-
stdout: (message) => output.push(message),
|
|
60
|
-
runCommand: (command, args) => {
|
|
61
|
-
commands.push({ command, args });
|
|
62
|
-
return { status: 0 };
|
|
63
|
-
},
|
|
64
|
-
});
|
|
65
|
-
expect(result).toEqual({ handled: true, exitCode: 0 });
|
|
66
|
-
expect(commands).toEqual([
|
|
67
|
-
{ command: "npm", args: ["install", "-g", "aws-runtime-bridge@latest"] },
|
|
68
|
-
]);
|
|
69
|
-
expect(output.at(-1)).toBe("[runtime-bridge] 更新完成。请重新运行 awsb -v 查看当前版本。");
|
|
70
|
-
});
|
|
71
|
-
it("returns npm exit code when update fails", async () => {
|
|
72
|
-
const errors = [];
|
|
73
|
-
const result = await handleCliCommand({
|
|
74
|
-
argv: ["update"],
|
|
75
|
-
stdout: () => undefined,
|
|
76
|
-
stderr: (message) => errors.push(message),
|
|
77
|
-
runCommand: () => ({ status: 7 }),
|
|
78
|
-
});
|
|
79
|
-
expect(result).toEqual({ handled: true, exitCode: 7 });
|
|
80
|
-
expect(errors).toEqual(["[runtime-bridge] 更新失败,npm 退出码: 7"]);
|
|
81
|
-
});
|
|
82
|
-
it("runs interactive config command", async () => {
|
|
83
|
-
const result = await handleCliCommand({
|
|
84
|
-
argv: ["config"],
|
|
85
|
-
configure: async () => "configured",
|
|
86
|
-
});
|
|
87
|
-
expect(result).toEqual({ handled: true, exitCode: 0 });
|
|
88
|
-
});
|
|
89
|
-
it("returns non-zero when config command fails", async () => {
|
|
90
|
-
const result = await handleCliCommand({
|
|
91
|
-
argv: ["config"],
|
|
92
|
-
configure: async () => "failed",
|
|
93
|
-
});
|
|
94
|
-
expect(result).toEqual({ handled: true, exitCode: 1 });
|
|
95
|
-
});
|
|
96
|
-
it("creates a systemd unit that starts the current executable with setup skipped", () => {
|
|
97
|
-
const executablePath = "/opt/aws-runtime-bridge/dist/index.js";
|
|
98
|
-
const unit = createSystemdUnitContent(executablePath);
|
|
99
|
-
expect(unit).toContain("Description=AgentsWorkStudio Runtime Bridge");
|
|
100
|
-
expect(unit).toContain("Environment=AWS_BRIDGE_SKIP_SETUP=true");
|
|
101
|
-
expect(unit).toContain(`ExecStart=${quotedSystemdArg(process.execPath)} ${quotedSystemdArg(executablePath)}`);
|
|
102
|
-
expect(unit).toContain("Restart=on-failure");
|
|
103
|
-
expect(unit).toContain("WantedBy=multi-user.target");
|
|
104
|
-
});
|
|
105
|
-
it("installs service, enables autostart, and starts when inactive", async () => {
|
|
106
|
-
const output = [];
|
|
107
|
-
const commands = [];
|
|
108
|
-
const serviceUnitPath = createServiceUnitPath();
|
|
109
|
-
const executablePath = "/usr/local/bin/awsb";
|
|
110
|
-
const result = await handleCliCommand({
|
|
111
|
-
argv: ["service", "install"],
|
|
112
|
-
platform: "linux",
|
|
113
|
-
serviceUnitPath,
|
|
114
|
-
executablePath,
|
|
115
|
-
stdout: (message) => output.push(message),
|
|
116
|
-
runCommand: (command, args) => {
|
|
117
|
-
commands.push({ command, args });
|
|
118
|
-
if (args[0] === "is-active") {
|
|
119
|
-
return { status: 3 };
|
|
120
|
-
}
|
|
121
|
-
return { status: 0 };
|
|
122
|
-
},
|
|
123
|
-
});
|
|
124
|
-
expect(result).toEqual({ handled: true, exitCode: 0 });
|
|
125
|
-
expect(readFileSync(serviceUnitPath, "utf-8")).toContain(`ExecStart=${quotedSystemdArg(process.execPath)} ${quotedSystemdArg(executablePath)}`);
|
|
126
|
-
expect(commands).toEqual([
|
|
127
|
-
{ command: "systemctl", args: ["daemon-reload"] },
|
|
128
|
-
{ command: "systemctl", args: ["enable", "awsb.service"] },
|
|
129
|
-
{ command: "systemctl", args: ["is-active", "--quiet", "awsb.service"] },
|
|
130
|
-
{ command: "systemctl", args: ["start", "awsb.service"] },
|
|
131
|
-
]);
|
|
132
|
-
expect(output.at(-1)).toBe("[runtime-bridge] awsb systemd 服务已安装、已启用开机自启并已启动。");
|
|
133
|
-
});
|
|
134
|
-
it("does not start service during install when it is already active", async () => {
|
|
135
|
-
const commands = [];
|
|
136
|
-
const serviceUnitPath = createServiceUnitPath();
|
|
137
|
-
const result = await handleCliCommand({
|
|
138
|
-
argv: ["service", "install"],
|
|
139
|
-
platform: "linux",
|
|
140
|
-
serviceUnitPath,
|
|
141
|
-
executablePath: "/usr/local/bin/awsb",
|
|
142
|
-
runCommand: (command, args) => {
|
|
143
|
-
commands.push({ command, args });
|
|
144
|
-
return { status: 0 };
|
|
145
|
-
},
|
|
146
|
-
});
|
|
147
|
-
expect(result).toEqual({ handled: true, exitCode: 0 });
|
|
148
|
-
expect(commands).toEqual([
|
|
149
|
-
{ command: "systemctl", args: ["daemon-reload"] },
|
|
150
|
-
{ command: "systemctl", args: ["enable", "awsb.service"] },
|
|
151
|
-
{ command: "systemctl", args: ["is-active", "--quiet", "awsb.service"] },
|
|
152
|
-
]);
|
|
153
|
-
});
|
|
154
|
-
it("uninstalls service by stopping, disabling, removing unit, and reloading systemd", async () => {
|
|
155
|
-
const output = [];
|
|
156
|
-
const commands = [];
|
|
157
|
-
const serviceUnitPath = createServiceUnitPath();
|
|
158
|
-
mkdirSync(path.dirname(serviceUnitPath), { recursive: true });
|
|
159
|
-
writeFileSync(serviceUnitPath, "unit", "utf-8");
|
|
160
|
-
const result = await handleCliCommand({
|
|
161
|
-
argv: ["service", "uninstall"],
|
|
162
|
-
platform: "linux",
|
|
163
|
-
serviceUnitPath,
|
|
164
|
-
stdout: (message) => output.push(message),
|
|
165
|
-
runCommand: (command, args) => {
|
|
166
|
-
commands.push({ command, args });
|
|
167
|
-
return { status: 0 };
|
|
168
|
-
},
|
|
169
|
-
});
|
|
170
|
-
expect(result).toEqual({ handled: true, exitCode: 0 });
|
|
171
|
-
expect(existsSync(serviceUnitPath)).toBe(false);
|
|
172
|
-
expect(commands).toEqual([
|
|
173
|
-
{ command: "systemctl", args: ["is-active", "--quiet", "awsb.service"] },
|
|
174
|
-
{ command: "systemctl", args: ["stop", "awsb.service"] },
|
|
175
|
-
{ command: "systemctl", args: ["disable", "awsb.service"] },
|
|
176
|
-
{ command: "systemctl", args: ["daemon-reload"] },
|
|
177
|
-
]);
|
|
178
|
-
expect(output.at(-1)).toBe("[runtime-bridge] awsb systemd 服务已卸载。");
|
|
179
|
-
});
|
|
180
|
-
it("tolerates uninstall when service is inactive and unit is absent", async () => {
|
|
181
|
-
const output = [];
|
|
182
|
-
const commands = [];
|
|
183
|
-
const serviceUnitPath = createServiceUnitPath();
|
|
184
|
-
const result = await handleCliCommand({
|
|
185
|
-
argv: ["service", "uninstall"],
|
|
186
|
-
platform: "linux",
|
|
187
|
-
serviceUnitPath,
|
|
188
|
-
stdout: (message) => output.push(message),
|
|
189
|
-
runCommand: (command, args) => {
|
|
190
|
-
commands.push({ command, args });
|
|
191
|
-
if (args[0] === "is-active" || args[0] === "disable") {
|
|
192
|
-
return { status: 1 };
|
|
193
|
-
}
|
|
194
|
-
return { status: 0 };
|
|
195
|
-
},
|
|
196
|
-
});
|
|
197
|
-
expect(result).toEqual({ handled: true, exitCode: 0 });
|
|
198
|
-
expect(commands).toEqual([
|
|
199
|
-
{ command: "systemctl", args: ["is-active", "--quiet", "awsb.service"] },
|
|
200
|
-
{ command: "systemctl", args: ["disable", "awsb.service"] },
|
|
201
|
-
{ command: "systemctl", args: ["daemon-reload"] },
|
|
202
|
-
]);
|
|
203
|
-
expect(output).toContain("[runtime-bridge] awsb systemd unit 不存在,跳过删除。");
|
|
204
|
-
});
|
|
205
|
-
it("fails service commands clearly on non-linux platforms", async () => {
|
|
206
|
-
const errors = [];
|
|
207
|
-
const result = await handleCliCommand({
|
|
208
|
-
argv: ["service", "install"],
|
|
209
|
-
platform: "win32",
|
|
210
|
-
stderr: (message) => errors.push(message),
|
|
211
|
-
});
|
|
212
|
-
expect(result).toEqual({ handled: true, exitCode: 1 });
|
|
213
|
-
expect(errors).toEqual([
|
|
214
|
-
"[runtime-bridge] service 命令仅支持 Linux systemd 环境。",
|
|
215
|
-
]);
|
|
216
|
-
});
|
|
217
|
-
it("prints service help for missing subcommand", async () => {
|
|
218
|
-
const output = [];
|
|
219
|
-
const result = await handleCliCommand({
|
|
220
|
-
argv: ["service"],
|
|
221
|
-
stdout: (message) => output.push(message),
|
|
222
|
-
});
|
|
223
|
-
expect(result).toEqual({ handled: true, exitCode: 1 });
|
|
224
|
-
expect(output).toEqual(["Usage: awsb service <install|uninstall>"]);
|
|
225
|
-
});
|
|
226
|
-
it("does not handle normal startup arguments", async () => {
|
|
227
|
-
const result = await handleCliCommand({ argv: [] });
|
|
228
|
-
expect(result).toEqual({ handled: false, exitCode: 0 });
|
|
229
|
-
});
|
|
230
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"instance-init-service.test.d.ts","sourceRoot":"","sources":["../../src/services/instance-init-service.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,140 +0,0 @@
|
|
|
1
|
-
import { promises as fs } from 'node:fs';
|
|
2
|
-
import os from 'node:os';
|
|
3
|
-
import path from 'node:path';
|
|
4
|
-
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
|
5
|
-
const detectToolStatusesMock = vi.fn();
|
|
6
|
-
const ensureToolsInstalledMock = vi.fn();
|
|
7
|
-
const installSkillPackageToSdkMock = vi.fn();
|
|
8
|
-
const runCcSwitchAdapterMock = vi.fn();
|
|
9
|
-
vi.mock('./tool-installer.js', () => ({
|
|
10
|
-
detectToolStatuses: detectToolStatusesMock,
|
|
11
|
-
ensureToolsInstalled: ensureToolsInstalledMock,
|
|
12
|
-
}));
|
|
13
|
-
vi.mock('./cc-switch-sdk.js', () => ({
|
|
14
|
-
loadCcSwitchSdk: vi.fn(async () => activeSdk),
|
|
15
|
-
runCcSwitchAdapter: runCcSwitchAdapterMock,
|
|
16
|
-
toSdkAppsFromEnabledTools: (enabledTools) => {
|
|
17
|
-
const tools = Array.isArray(enabledTools) ? enabledTools : [];
|
|
18
|
-
return {
|
|
19
|
-
claude: false,
|
|
20
|
-
acode: false,
|
|
21
|
-
claudecode: tools.includes('claude') || tools.includes('claudecode'),
|
|
22
|
-
codex: tools.includes('codex'),
|
|
23
|
-
gemini: tools.includes('gemini'),
|
|
24
|
-
opencode: tools.includes('opencode'),
|
|
25
|
-
openclaw: tools.includes('openclaw'),
|
|
26
|
-
};
|
|
27
|
-
},
|
|
28
|
-
}));
|
|
29
|
-
vi.mock('../utils/file-utils.js', async (importOriginal) => {
|
|
30
|
-
const original = await importOriginal();
|
|
31
|
-
return {
|
|
32
|
-
...original,
|
|
33
|
-
installSkillPackageToSdk: installSkillPackageToSdkMock,
|
|
34
|
-
};
|
|
35
|
-
});
|
|
36
|
-
class MockSdk {
|
|
37
|
-
constructor() {
|
|
38
|
-
this.createdMcpInputs = [];
|
|
39
|
-
this.installedSkills = [];
|
|
40
|
-
this.mcpServers = [];
|
|
41
|
-
}
|
|
42
|
-
getAllSkills() {
|
|
43
|
-
return this.installedSkills;
|
|
44
|
-
}
|
|
45
|
-
getAllMcpServers() {
|
|
46
|
-
return this.mcpServers;
|
|
47
|
-
}
|
|
48
|
-
async createMcpServer(input) {
|
|
49
|
-
this.createdMcpInputs.push({ name: input.name, apps: input.apps });
|
|
50
|
-
const server = {
|
|
51
|
-
id: `mcp-${this.mcpServers.length + 1}`,
|
|
52
|
-
name: input.name,
|
|
53
|
-
server: input.server,
|
|
54
|
-
apps: input.apps,
|
|
55
|
-
};
|
|
56
|
-
this.mcpServers.push(server);
|
|
57
|
-
return server;
|
|
58
|
-
}
|
|
59
|
-
async updateMcpServer(id, input) {
|
|
60
|
-
const existing = this.mcpServers.find((server) => server.id === id);
|
|
61
|
-
if (!existing) {
|
|
62
|
-
throw new Error(`missing mcp ${id}`);
|
|
63
|
-
}
|
|
64
|
-
if (input.apps) {
|
|
65
|
-
existing.apps = input.apps;
|
|
66
|
-
}
|
|
67
|
-
if (input.server) {
|
|
68
|
-
existing.server = input.server;
|
|
69
|
-
}
|
|
70
|
-
return existing;
|
|
71
|
-
}
|
|
72
|
-
}
|
|
73
|
-
let activeSdk;
|
|
74
|
-
function status(tool, installed) {
|
|
75
|
-
return {
|
|
76
|
-
tool,
|
|
77
|
-
installed,
|
|
78
|
-
executable: installed ? tool : null,
|
|
79
|
-
version: installed ? '1.0.0' : null,
|
|
80
|
-
installing: false,
|
|
81
|
-
error: installed ? null : 'not installed',
|
|
82
|
-
};
|
|
83
|
-
}
|
|
84
|
-
describe('initInstance enabled tool initialization', () => {
|
|
85
|
-
const originalRuntimeHomeDir = process.env.AWS_RUNTIME_HOME_DIR;
|
|
86
|
-
let runtimeHomeDir;
|
|
87
|
-
beforeEach(async () => {
|
|
88
|
-
runtimeHomeDir = path.join(os.tmpdir(), `aws-init-enabled-tools-${Date.now()}`);
|
|
89
|
-
process.env.AWS_RUNTIME_HOME_DIR = runtimeHomeDir;
|
|
90
|
-
activeSdk = new MockSdk();
|
|
91
|
-
vi.clearAllMocks();
|
|
92
|
-
runCcSwitchAdapterMock.mockResolvedValue({ ok: true, snapshot: { skills: 0, mcpServers: 0 } });
|
|
93
|
-
installSkillPackageToSdkMock.mockImplementation(async (_sdk, skillPackage, _skillDir, apps) => {
|
|
94
|
-
const installed = {
|
|
95
|
-
id: 'skill-1',
|
|
96
|
-
name: String(skillPackage.skillName || 'demo-skill'),
|
|
97
|
-
directory: '/demo-skill',
|
|
98
|
-
apps,
|
|
99
|
-
installedAt: Date.now(),
|
|
100
|
-
};
|
|
101
|
-
activeSdk.installedSkills.push(installed);
|
|
102
|
-
return installed;
|
|
103
|
-
});
|
|
104
|
-
});
|
|
105
|
-
afterEach(async () => {
|
|
106
|
-
if (originalRuntimeHomeDir === undefined) {
|
|
107
|
-
delete process.env.AWS_RUNTIME_HOME_DIR;
|
|
108
|
-
}
|
|
109
|
-
else {
|
|
110
|
-
process.env.AWS_RUNTIME_HOME_DIR = originalRuntimeHomeDir;
|
|
111
|
-
}
|
|
112
|
-
await fs.rm(runtimeHomeDir, { recursive: true, force: true });
|
|
113
|
-
});
|
|
114
|
-
it('persists requested tools but configures MCP and skills only for installed tools', async () => {
|
|
115
|
-
detectToolStatusesMock.mockResolvedValue({
|
|
116
|
-
claude: status('claude', true),
|
|
117
|
-
opencode: status('opencode', false),
|
|
118
|
-
codex: status('codex', false),
|
|
119
|
-
});
|
|
120
|
-
const { initInstance } = await import('./instance-init-service.js');
|
|
121
|
-
const result = await initInstance('agent-installed-only', runtimeHomeDir, {
|
|
122
|
-
ccSwitchEnabledTools: ['claude', 'opencode', 'codex'],
|
|
123
|
-
skillPackages: [{ skillName: 'demo-skill', downloadUrl: 'https://example.com/skill.zip' }],
|
|
124
|
-
mcpServers: [{ name: 'aws-mcp', command: 'node', args: ['server.js'] }],
|
|
125
|
-
});
|
|
126
|
-
expect(ensureToolsInstalledMock).not.toHaveBeenCalled();
|
|
127
|
-
expect(result.enabledTools).toEqual(['claude', 'opencode', 'codex']);
|
|
128
|
-
expect(result.ok).toBe(true);
|
|
129
|
-
expect(installSkillPackageToSdkMock).toHaveBeenCalledWith(activeSdk, expect.objectContaining({ skillName: 'demo-skill' }), expect.any(String), expect.objectContaining({ claudecode: true, opencode: false, codex: false }));
|
|
130
|
-
expect(activeSdk.createdMcpInputs).toEqual([
|
|
131
|
-
{
|
|
132
|
-
name: 'aws-mcp',
|
|
133
|
-
apps: expect.objectContaining({ claudecode: true, opencode: false, codex: false }),
|
|
134
|
-
},
|
|
135
|
-
]);
|
|
136
|
-
const statePath = path.join(runtimeHomeDir, '.aws-bridge', 'instances', 'agent-installed-only', 'state.json');
|
|
137
|
-
const state = JSON.parse(await fs.readFile(statePath, 'utf-8'));
|
|
138
|
-
expect(state.enabledTools).toEqual(['claude', 'opencode', 'codex']);
|
|
139
|
-
});
|
|
140
|
-
});
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"instance-state.test.d.ts","sourceRoot":"","sources":["../../src/services/instance-state.test.ts"],"names":[],"mappings":""}
|