aws-runtime-bridge 1.9.91 → 1.9.93
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 +22 -126
- package/dist/adapter/AdapterRegistry.d.ts +10 -38
- package/dist/adapter/ClaudeSdkAdapter.d.ts +21 -84
- package/dist/adapter/CodexSdkAdapter.d.ts +2 -10
- package/dist/adapter/OpencodeSdkAdapter.d.ts +6 -42
- package/dist/adapter/acode-tool-names.d.ts +3 -12
- package/dist/adapter/idle-poll-loop.d.ts +4 -16
- package/dist/adapter/index.d.ts +1 -4
- package/dist/adapter/instance-ai-config-resolver.d.ts +9 -29
- package/dist/adapter/types.d.ts +124 -242
- package/dist/adapters/cc-switch/common.d.ts +4 -14
- package/dist/adapters/cc-switch/index.d.ts +3 -11
- package/dist/adapters/cc-switch/mcp-acode.d.ts +1 -7
- package/dist/adapters/cc-switch/mcp-claude.d.ts +1 -5
- package/dist/adapters/cc-switch/mcp-claudecode.d.ts +1 -5
- package/dist/adapters/cc-switch/mcp-codex.d.ts +1 -7
- package/dist/adapters/cc-switch/mcp-opencode.d.ts +3 -11
- package/dist/adapters/cc-switch/mcp-placeholder.d.ts +1 -5
- package/dist/adapters/cc-switch/skill-acode.d.ts +1 -6
- package/dist/adapters/cc-switch/skill-claude.d.ts +1 -5
- package/dist/adapters/cc-switch/skill-claudecode.d.ts +1 -5
- package/dist/adapters/cc-switch/skill-opencode.d.ts +1 -5
- package/dist/adapters/cc-switch/skill-placeholder.d.ts +1 -5
- package/dist/config.d.ts +39 -57
- package/dist/index.d.ts +1 -5
- package/dist/middleware/auth.d.ts +4 -22
- package/dist/routes/acode-todos.d.ts +1 -9
- package/dist/routes/dashboard.d.ts +1 -6
- package/dist/routes/events.d.ts +1 -5
- package/dist/routes/file-browser.d.ts +2 -8
- package/dist/routes/file-diff-rollback.d.ts +13 -41
- package/dist/routes/file-snapshot.d.ts +1 -8
- package/dist/routes/git.d.ts +18 -91
- package/dist/routes/instance.d.ts +4 -15
- package/dist/routes/processes.d.ts +1 -5
- package/dist/routes/properties.d.ts +1 -5
- package/dist/routes/pty.d.ts +9 -36
- package/dist/routes/runtime-binding.d.ts +1 -4
- package/dist/routes/sessions.d.ts +2 -9
- package/dist/routes/sub-agents.d.ts +1 -12
- package/dist/routes/task-context.d.ts +1 -6
- package/dist/routes/terminal.d.ts +18 -92
- package/dist/routes/yml.d.ts +1 -5
- package/dist/services/acode-package.d.ts +2 -12
- package/dist/services/agent-event-store.d.ts +6 -26
- package/dist/services/agent-process-manager.d.ts +30 -184
- package/dist/services/ai-source-apply.d.ts +1 -3
- package/dist/services/auto-register.d.ts +29 -106
- package/dist/services/bridge-package-publish-hooks.d.ts +5 -19
- package/dist/services/cc-switch-sdk.d.ts +1 -6
- package/dist/services/cli-commands.d.ts +12 -33
- package/dist/services/cli-commands.js +6 -6
- package/dist/services/event-delta-pusher.d.ts +5 -20
- package/dist/services/fileSnapshotStore.d.ts +7 -35
- package/dist/services/instance-ai-config-service.d.ts +4 -21
- package/dist/services/instance-service.d.ts +1 -10
- package/dist/services/instance-state.d.ts +5 -30
- package/dist/services/legacy-path-migration.d.ts +1 -1
- package/dist/services/lifecycle-state.d.ts +1 -4
- package/dist/services/mcp-launch-binding-queue.d.ts +2 -8
- package/dist/services/orphan-monitor.d.ts +20 -63
- package/dist/services/panel-auth.d.ts +12 -28
- package/dist/services/process-detector.d.ts +18 -122
- package/dist/services/process-registry.d.ts +30 -150
- package/dist/services/ring-buffer.d.ts +9 -42
- package/dist/services/runtime-binding.d.ts +2 -9
- package/dist/services/runtime-lifecycle-policy.d.ts +3 -15
- package/dist/services/session-output.d.ts +14 -67
- package/dist/services/startup-config-wizard.d.ts +3 -10
- package/dist/services/system-metrics.d.ts +1 -4
- package/dist/services/terminal-persistence.d.ts +10 -53
- package/dist/services/tool-installer.d.ts +6 -18
- package/dist/services/tunnel-client.d.ts +3 -18
- package/dist/services/windows-service-manager.d.ts +1 -13
- package/dist/services/workspace-files.d.ts +17 -57
- package/dist/services/workspace-watch.d.ts +2 -6
- package/dist/services/workspaceTaskChangeWatcher.d.ts +13 -51
- package/dist/types.d.ts +2 -8
- package/dist/utils/instance-ai-config-debug-logger.d.ts +5 -20
- package/dist/utils/logger.d.ts +7 -20
- package/dist/utils/mcp-utils.d.ts +8 -44
- package/dist/utils/path-utils.d.ts +3 -15
- package/dist/utils/sdk-package-loader.d.ts +2 -8
- package/dist/utils/validation.d.ts +3 -20
- package/dist/utils/yaml-utils.d.ts +8 -56
- package/node_modules/@cc-switch/sdk/dist/index.d.ts +1 -6
- package/node_modules/@cc-switch/sdk/dist/sdk.d.ts +11 -42
- package/package/acode/dist/ask-user-question-tool.d.ts +7 -20
- package/package/acode/dist/built-in-file-tools.d.ts +3 -6
- package/package/acode/dist/built-in-symbols-tool.d.ts +1 -4
- package/package/acode/dist/builtins/commandArtifacts.d.ts +1 -4
- package/package/acode/dist/builtins/shellOutputDecoder.d.ts +3 -18
- package/package/acode/dist/commands/commandLoader.d.ts +1 -4
- package/package/acode/dist/commands/commandParser.d.ts +1 -4
- package/package/acode/dist/compaction.d.ts +38 -175
- package/package/acode/dist/config.d.ts +1 -4
- package/package/acode/dist/fs-utils.d.ts +1 -19
- package/package/acode/dist/hooks/hookBus.d.ts +1 -4
- package/package/acode/dist/mcpToolNames.d.ts +2 -8
- package/package/acode/dist/parsers/ast-cache.d.ts +7 -20
- package/package/acode/dist/parsers/language-detector.d.ts +1 -5
- package/package/acode/dist/parsers/language-queries.d.ts +1 -1
- package/package/acode/dist/parsers/tree-sitter-loader.d.ts +4 -12
- package/package/acode/dist/parsers/types.d.ts +19 -30
- package/package/acode/dist/runtime.d.ts +47 -269
- package/package/acode/dist/skill-tool.d.ts +3 -23
- package/package/acode/dist/sub-agent-manager.d.ts +41 -206
- package/package/acode/dist/sub-agent-store.d.ts +12 -61
- package/package/acode/dist/sub-agent-tools.d.ts +9 -18
- package/package/acode/dist/sub-agent-types.d.ts +32 -38
- package/package/acode/dist/todo-store.d.ts +8 -23
- package/package/acode/dist/todo-tool.d.ts +2 -2
- package/package/acode/dist/types.d.ts +17 -38
- package/package/aws-client-agent-mcp/dist/agent-client.d.ts +44 -161
- package/package/aws-client-agent-mcp/dist/config.d.ts +4 -18
- package/package/aws-client-agent-mcp/dist/constants.d.ts +1 -3
- package/package/aws-client-agent-mcp/dist/context-manager.d.ts +25 -95
- package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +1 -4
- package/package/aws-client-agent-mcp/dist/http-client.d.ts +15 -56
- package/package/aws-client-agent-mcp/dist/index.d.ts +1 -11
- package/package/aws-client-agent-mcp/dist/logger.d.ts +5 -22
- package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +76 -365
- package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +21 -83
- package/package/aws-client-agent-mcp/dist/memory-store.d.ts +15 -70
- package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +4 -17
- package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +23 -92
- package/package/aws-client-agent-mcp/dist/messageContent.d.ts +5 -29
- package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +2 -9
- package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +17 -55
- package/package/aws-client-agent-mcp/dist/types.d.ts +66 -125
- package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +30 -125
- package/package/cc-switch-sdk/dist/index.d.ts +1 -6
- package/package/cc-switch-sdk/dist/sdk.d.ts +11 -42
- package/package.json +1 -1
|
@@ -1,116 +1,56 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
*
|
|
4
|
-
* 实现 Bridge 实例启动后自动向调度中心注册的功能
|
|
5
|
-
*
|
|
6
|
-
* 配置来源(优先级从高到低):
|
|
7
|
-
* 1. 环境变量
|
|
8
|
-
* 2. 用户目录下的 .aws-bridge/config.json 文件
|
|
9
|
-
*/
|
|
10
|
-
/**
|
|
11
|
-
* 自动注册配置
|
|
12
|
-
*/
|
|
1
|
+
|
|
2
|
+
|
|
13
3
|
interface AutoRegisterConfig {
|
|
14
|
-
|
|
4
|
+
|
|
15
5
|
enabled: boolean;
|
|
16
|
-
|
|
6
|
+
|
|
17
7
|
serverUrl?: string;
|
|
18
|
-
|
|
8
|
+
|
|
19
9
|
tenantId?: string;
|
|
20
|
-
|
|
10
|
+
|
|
21
11
|
userKey: string;
|
|
22
|
-
|
|
12
|
+
|
|
23
13
|
connectionKey?: string;
|
|
24
|
-
|
|
14
|
+
|
|
25
15
|
instanceName?: string;
|
|
26
|
-
|
|
16
|
+
|
|
27
17
|
instanceId?: string;
|
|
28
|
-
|
|
18
|
+
|
|
29
19
|
projectName?: string;
|
|
30
|
-
|
|
20
|
+
|
|
31
21
|
roleName?: string;
|
|
32
|
-
|
|
22
|
+
|
|
33
23
|
workspacePath?: string;
|
|
34
|
-
|
|
35
|
-
* 注册地址(推荐)
|
|
36
|
-
* - 支持 `host:port`、纯 `host`(自动补 AWS_RUNTIME_BRIDGE_PORT)、完整 URL(`http://...` / `https://...`,原样使用)
|
|
37
|
-
* - 优先级高于 registerIp / virtualIp
|
|
38
|
-
*/
|
|
24
|
+
|
|
39
25
|
registerAddr?: string;
|
|
40
|
-
|
|
41
|
-
* 注册 IP(已废弃,仅做向后兼容回退)
|
|
42
|
-
* - 仅接受纯 IP/host,端口由 AWS_RUNTIME_BRIDGE_PORT 决定
|
|
43
|
-
* - 推荐迁移到 registerAddr
|
|
44
|
-
*/
|
|
26
|
+
|
|
45
27
|
registerIp?: string;
|
|
46
|
-
|
|
28
|
+
|
|
47
29
|
virtualIp?: string;
|
|
48
|
-
|
|
49
|
-
* 是否启用隧道模式(三态):
|
|
50
|
-
* - true:显式启用隧道模式,bridge 经 WebSocket 反向连出到 server,
|
|
51
|
-
* server 经 /tunnel/{instanceId}/ 虚拟路径反向调用 bridge。
|
|
52
|
-
* - false:显式禁用隧道模式,即使未填 registerAddr 也走直连(用于 loopback 场景)。
|
|
53
|
-
* - undefined(默认):未填 registerAddr/registerIp/virtualIp 时自动判定为隧道模式(向后兼容)。
|
|
54
|
-
*/
|
|
30
|
+
|
|
55
31
|
tunnel?: boolean;
|
|
56
|
-
|
|
32
|
+
|
|
57
33
|
preferSameLanIp?: boolean;
|
|
58
|
-
|
|
34
|
+
|
|
59
35
|
maxRetries?: number;
|
|
60
|
-
|
|
36
|
+
|
|
61
37
|
retryInterval?: number;
|
|
62
38
|
}
|
|
63
39
|
export declare function getConfiguredConnectionKeys(): string[];
|
|
64
|
-
|
|
40
|
+
|
|
65
41
|
export declare function cancelBackgroundRegisterRetries(): void;
|
|
66
|
-
|
|
67
|
-
* 配置文件路径
|
|
68
|
-
*
|
|
69
|
-
* 默认使用 os.homedir(),但 Windows 服务以 LocalSystem 身份运行时 homedir() 是
|
|
70
|
-
* System32\systemprofile,找不到用户配置 → 不注册 → 不建隧道。
|
|
71
|
-
* 因此优先读 AWS_RUNTIME_HOME_DIR 环境变量(与 getRuntimeHomeDir 一致),
|
|
72
|
-
* 让 `awsb service install` 把当前用户主目录注入到服务环境变量中。
|
|
73
|
-
*/
|
|
42
|
+
|
|
74
43
|
export declare function getAutoRegisterConfigFilePath(): string;
|
|
75
|
-
|
|
76
|
-
* 加载自动注册配置
|
|
77
|
-
*
|
|
78
|
-
* 优先级:环境变量 > 配置文件 > 默认值
|
|
79
|
-
*
|
|
80
|
-
* 如果没有配置文件且没有环境变量,则不启用自动注册
|
|
81
|
-
*/
|
|
44
|
+
|
|
82
45
|
export declare function loadConfig(): AutoRegisterConfig;
|
|
83
46
|
export declare function loadConfigs(): AutoRegisterConfig[];
|
|
84
47
|
export declare function isTunnelConfig(config?: AutoRegisterConfig): boolean;
|
|
85
48
|
export declare function loadPrimaryLifecycleConfig(): AutoRegisterConfig;
|
|
86
|
-
|
|
87
|
-
* 通过入站 runtime token 反查其所属调度中心地址。
|
|
88
|
-
*
|
|
89
|
-
* 场景:调度中心发起 /runtime/start 时,请求头 X-Runtime-Token 携带的是该 server
|
|
90
|
-
* 签发给本 bridge 的实例 token(RuntimeBridgeService.resolveRuntimeBridgeAuthToken)。
|
|
91
|
-
* bridge 本地 scoped token store(runtime-tokens.properties)按 serverUrl 存储这些
|
|
92
|
-
* 实例 token,因此匹配命中即可确定来源 server,避免多 autoRegisterTargets 时回退到
|
|
93
|
-
* DEFAULT_SCHEDULER_BASE_URL(localhost:8080)导致回调打错服务器。
|
|
94
|
-
*
|
|
95
|
-
* 候选来源:所有 autoRegisterTargets 的 serverUrl + binding.json 的 schedulerBaseUrl。
|
|
96
|
-
* 仅在 launch body 未显式携带 schedulerBaseUrl 时作为兜底使用。
|
|
97
|
-
*/
|
|
49
|
+
|
|
98
50
|
export declare function resolveSchedulerBaseUrlFromToken(token: unknown): string | undefined;
|
|
99
|
-
|
|
100
|
-
* 自动注册主函数
|
|
101
|
-
*
|
|
102
|
-
* 带重试机制的注册逻辑
|
|
103
|
-
*
|
|
104
|
-
* 配置来源(优先级从高到低):
|
|
105
|
-
* 1. 传入的 customConfig
|
|
106
|
-
* 2. 环境变量
|
|
107
|
-
* 3. ~/.aws-bridge/config.json 配置文件
|
|
108
|
-
* 4. 默认值
|
|
109
|
-
*/
|
|
51
|
+
|
|
110
52
|
export declare function autoRegister(customConfig?: Partial<AutoRegisterConfig>): Promise<boolean>;
|
|
111
|
-
|
|
112
|
-
* 注销实例
|
|
113
|
-
*/
|
|
53
|
+
|
|
114
54
|
export declare function requestRuntimeAccessTokenRefresh(): Promise<{
|
|
115
55
|
success: boolean;
|
|
116
56
|
runtimeAccessToken?: string;
|
|
@@ -124,9 +64,7 @@ export declare function requestRuntimeAccessTokenRefreshForServer(serverBaseUrl:
|
|
|
124
64
|
error?: string;
|
|
125
65
|
}>;
|
|
126
66
|
export declare function unregister(): Promise<boolean>;
|
|
127
|
-
|
|
128
|
-
* 获取注册状态
|
|
129
|
-
*/
|
|
67
|
+
|
|
130
68
|
export declare function getRegistrationState(): {
|
|
131
69
|
registered: boolean;
|
|
132
70
|
instanceId?: string;
|
|
@@ -134,26 +72,11 @@ export declare function getRegistrationState(): {
|
|
|
134
72
|
lastAttempt?: Date;
|
|
135
73
|
error?: string;
|
|
136
74
|
};
|
|
137
|
-
|
|
138
|
-
* 检查是否已注册
|
|
139
|
-
*/
|
|
75
|
+
|
|
140
76
|
export declare function isRegistered(): boolean;
|
|
141
|
-
|
|
142
|
-
* 获取实例 ID
|
|
143
|
-
*/
|
|
77
|
+
|
|
144
78
|
export declare function getInstanceId(): string | undefined;
|
|
145
|
-
|
|
146
|
-
* ★★★ Bridge 重启清理
|
|
147
|
-
*
|
|
148
|
-
* 当 aws-runtime-bridge 重启时调用,通知调度中心将该 bridge 关联的所有 Agent 设置为离线。
|
|
149
|
-
*
|
|
150
|
-
* 清理逻辑:
|
|
151
|
-
* 1. 调用调度中心的 /api/instances/bridge-restart-cleanup 接口
|
|
152
|
-
* 2. 传入 instanceId 或 runtimeBridgeBaseUrl
|
|
153
|
-
* 3. 调度中心会将关联的 Agent 设置为 is_online=false, runtime_status='stopped'
|
|
154
|
-
*
|
|
155
|
-
* @returns 清理结果
|
|
156
|
-
*/
|
|
79
|
+
|
|
157
80
|
export declare function bridgeRestartCleanup(): Promise<{
|
|
158
81
|
success: boolean;
|
|
159
82
|
agentCount?: number;
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* Bridge 包发布后通知服务
|
|
3
|
-
*
|
|
4
|
-
* 主干流程:读取 GitHub Actions 注入的 webhook URL 与密钥;两者均配置时,
|
|
5
|
-
* 读取当前包名/版本并发送带 HMAC 签名的 JSON 通知;任一配置缺失时安全跳过。
|
|
6
|
-
*/
|
|
1
|
+
|
|
7
2
|
import axios from "axios";
|
|
8
3
|
import { type Logger } from "../utils/logger.js";
|
|
9
4
|
export interface BridgePackageInfo {
|
|
@@ -27,21 +22,12 @@ interface NotifyOptions {
|
|
|
27
22
|
now?: () => Date;
|
|
28
23
|
post?: typeof axios.post;
|
|
29
24
|
}
|
|
30
|
-
|
|
31
|
-
* 具体功能实现:读取 package.json 中用于通知服务识别包版本的最小信息。
|
|
32
|
-
*/
|
|
25
|
+
|
|
33
26
|
export declare function readBridgePackageInfo(): Promise<BridgePackageInfo>;
|
|
34
|
-
|
|
35
|
-
* 具体功能实现:构造稳定的发布通知负载,附带 GitHub Actions 上下文便于服务端审计。
|
|
36
|
-
*/
|
|
27
|
+
|
|
37
28
|
export declare function createBridgePackagePublishPayload(packageInfo: BridgePackageInfo, env?: NodeJS.ProcessEnv, now?: () => Date): BridgePackagePublishPayload;
|
|
38
|
-
|
|
39
|
-
* 具体功能实现:对实际发送的 JSON 字符串签名,保证服务端验签与请求体完全一致。
|
|
40
|
-
*/
|
|
29
|
+
|
|
41
30
|
export declare function createBridgePublishSignature(body: string, secret: string): string;
|
|
42
|
-
|
|
43
|
-
* 主逻辑:根据环境变量决定跳过或发送发布通知;已配置 webhook 时失败会抛出,
|
|
44
|
-
* 让 GitHub Actions 明确暴露“包已发布但通知失败”的状态。
|
|
45
|
-
*/
|
|
31
|
+
|
|
46
32
|
export declare function notifyBridgePackagePublished(options?: NotifyOptions): Promise<boolean>;
|
|
47
33
|
export {};
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* CC-Switch SDK 包装层
|
|
3
|
-
*
|
|
4
|
-
* 负责创建 SDK 实例并注入 adapters。
|
|
5
|
-
* adapters 实现在 src/adapters/cc-switch/ 中。
|
|
6
|
-
*/
|
|
1
|
+
|
|
7
2
|
import { AiConfigService, CcSwitchSdk, type AppFlags } from '@cc-switch/sdk';
|
|
8
3
|
import type { CcSwitchAppPaths, AdapterResult, SdkApps } from '../types.js';
|
|
9
4
|
import { InstanceService } from './instance-service.js';
|
|
@@ -15,55 +15,34 @@ export interface CliCommandOptions {
|
|
|
15
15
|
stderr?: (message: string) => void;
|
|
16
16
|
runCommand?: (command: string, args: string[]) => CommandRunResult;
|
|
17
17
|
configure?: () => Promise<StartupConfigWizardResult>;
|
|
18
|
-
|
|
18
|
+
|
|
19
19
|
configureExample?: () => Promise<StartupConfigWizardResult>;
|
|
20
20
|
platform?: NodeJS.Platform;
|
|
21
21
|
serviceUnitPath?: string;
|
|
22
22
|
executablePath?: string;
|
|
23
|
-
|
|
23
|
+
|
|
24
24
|
windowsServiceLogPath?: string;
|
|
25
|
-
|
|
25
|
+
|
|
26
26
|
windowsServiceManager?: WindowsServiceManager;
|
|
27
|
-
|
|
27
|
+
|
|
28
28
|
launchdPlistPath?: string;
|
|
29
|
-
|
|
29
|
+
|
|
30
30
|
launchdLogPath?: string;
|
|
31
|
-
|
|
32
|
-
* macOS launchd 域目标(默认 `gui/${process.getuid()}`)。
|
|
33
|
-
* service-target = `${domainTarget}/${LAUNCHD_LABEL}`,测试时可注入固定值避免依赖 getuid。
|
|
34
|
-
*/
|
|
31
|
+
|
|
35
32
|
launchdDomainTarget?: string;
|
|
36
|
-
|
|
33
|
+
|
|
37
34
|
findRunningBridgeProcesses?: (platform: NodeJS.Platform) => number[];
|
|
38
|
-
|
|
35
|
+
|
|
39
36
|
killBridgeProcess?: (pid: number, platform: NodeJS.Platform) => void;
|
|
40
|
-
|
|
37
|
+
|
|
41
38
|
prompt?: (question: string) => Promise<string>;
|
|
42
|
-
|
|
43
|
-
* 解析全局 node_modules 路径(默认执行 `npm root -g`)。
|
|
44
|
-
* 用于 update 前清理旧版残留目录,避免 macOS 专用 fsevents 在 Windows 上
|
|
45
|
-
* 触发 node-gyp 编译失败。
|
|
46
|
-
*/
|
|
39
|
+
|
|
47
40
|
globalModulePath?: () => string | null;
|
|
48
41
|
}
|
|
49
42
|
export declare function readPackageVersion(packageRoot?: string): string;
|
|
50
|
-
|
|
51
|
-
* 生成 systemd unit 内容,主流程是用当前 Node 可执行文件启动当前 CLI 入口。
|
|
52
|
-
*/
|
|
43
|
+
|
|
53
44
|
export declare function createSystemdUnitContent(executablePath: string): string;
|
|
54
|
-
|
|
55
|
-
* 生成 macOS launchd plist 内容。
|
|
56
|
-
*
|
|
57
|
-
* - Label:launchd 注册的服务标识,必须与 plist 文件名匹配;
|
|
58
|
-
* - ProgramArguments:用当前 Node 可执行文件启动 CLI 入口;
|
|
59
|
-
* - RunAtLoad=true:bootstrap 时立即启动;
|
|
60
|
-
* - KeepAlive=true:进程退出后自动拉起(对应 systemd Restart=always 语义;
|
|
61
|
-
* systemd 用 on-failure,launchd 没有细粒度条件时用 true 最稳);
|
|
62
|
-
* - StandardOutPath/StandardErrorPath:与 Windows 服务日志统一放在 ~/.aws-bridge/log/;
|
|
63
|
-
* - AWS_RUNTIME_HOME_DIR:注入当前用户主目录,避免 LaunchAgent 在某些上下文下
|
|
64
|
-
* 解析到错误 home 导致读不到 ~/.aws-bridge/config.json(与 Windows LocalSystem
|
|
65
|
-
* 场景同源,统一注入更稳)。
|
|
66
|
-
*/
|
|
45
|
+
|
|
67
46
|
export declare function createLaunchdPlistContent(executablePath: string, options?: {
|
|
68
47
|
userHomeDir?: string;
|
|
69
48
|
logPath?: string;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
|
-
import{spawnSync as
|
|
2
|
-
`)}function
|
|
3
|
-
`)}function
|
|
4
|
-
`)}function
|
|
5
|
-
`)}function
|
|
6
|
-
npm install -g aws-runtime-bridge`),{handled:!0,exitCode:1}}async function we(e){const r=e.windowsServiceManager;if(!r&&!Z())return be(e.stderr);const n=e.windowsServiceLogPath||B,s=o.dirname(e.executablePath),a=S.homedir();try{await(r||X()).install({name:H,description:"awsb runtime bridge",script:e.executablePath,workingDirectory:s,env:[{name:"AWS_BRIDGE_SKIP_SETUP",value:"true"},{name:"AWS_RUNTIME_HOME_DIR",value:a}],logpath:F})}catch(i){const h=i instanceof Error?i:new Error(String(i));return e.stderr(`[runtime-bridge] \u5B89\u88C5 Windows \u670D\u52A1\u5931\u8D25: ${h.message}`),{handled:!0,exitCode:1}}const t=e.runCommand("sc.exe",["start",x]);return d(t)?(e.stdout(`[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u5B89\u88C5\u5E76\u5DF2\u542F\u52A8\uFF08\u65E5\u5FD7: ${n}\uFF09\u3002`),{handled:!0,exitCode:0}):(e.stderr(`[runtime-bridge] \u542F\u52A8 Windows \u670D\u52A1\u5931\u8D25: ${t.error?.message??`\u9000\u51FA\u7801 ${t.status??"unknown"}`}`),{handled:!0,exitCode:t.status??1})}function Ce(e){const r=s=>e.runCommand("sc.exe",s);r(["stop",x]);const n=r(["delete",x]);return d(n)?(e.stdout("[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u5378\u8F7D\u3002"),{handled:!0,exitCode:0}):(e.stderr(`[runtime-bridge] \u5378\u8F7D Windows \u670D\u52A1\u5931\u8D25: ${n.error?.message??`\u9000\u51FA\u7801 ${n.status??"unknown"}`}`),{handled:!0,exitCode:n.status??1})}function xe(e){const r=s=>e.runCommand("sc.exe",s);r(["stop",x]);const n=r(["start",x]);return d(n)?(e.stdout("[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u91CD\u542F\u3002"),{handled:!0,exitCode:0}):(e.stderr(`[runtime-bridge] \u91CD\u542F Windows \u670D\u52A1\u5931\u8D25: ${n.error?.message??`\u9000\u51FA\u7801 ${n.status??"unknown"}`}`),{handled:!0,exitCode:n.status??1})}function Pe(e){const r=e.runCommand("sc.exe",["start",x]);return d(r)?(e.stdout("[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0}):(e.stderr(`[runtime-bridge] \u542F\u52A8 Windows \u670D\u52A1\u5931\u8D25: ${r.error?.message??`\u9000\u51FA\u7801 ${r.status??"unknown"}`}`),{handled:!0,exitCode:r.status??1})}function Se(e){const r=e.runCommand("sc.exe",["stop",x]);return d(r)?(e.stdout("[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u505C\u6B62\u3002"),{handled:!0,exitCode:0}):(e.stderr(`[runtime-bridge] \u505C\u6B62 Windows \u670D\u52A1\u5931\u8D25: ${r.error?.message??`\u9000\u51FA\u7801 ${r.status??"unknown"}`}`),{handled:!0,exitCode:r.status??1})}function ve(){return`gui/${process.getuid?.()??0}`}function R(e){return e.launchdDomainTarget||ve()}function L(e){return`${e}/${T}`}function D(e,r){return r.error?`[runtime-bridge] ${e}\u5931\u8D25: ${r.error.message}`:`[runtime-bridge] ${e}\u5931\u8D25\uFF0Claunchctl \u9000\u51FA\u7801: ${r.status??"unknown"}`}function ye(e){if(!k(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||_,n=e.launchdLogPath||W,s=ce(e.executablePath,{userHomeDir:S.homedir(),logPath:n});try{p(o.dirname(r),{recursive:!0}),p(o.dirname(n),{recursive:!0}),N(r,s,{encoding:"utf-8",mode:420})}catch(i){const h=i instanceof Error?i:new Error(String(i));return e.stderr(`[runtime-bridge] \u5199\u5165 launchd plist \u5931\u8D25: ${h.message}`),{handled:!0,exitCode:1}}const a=R(e);e.runCommand("launchctl",["bootout",L(a)]);const t=e.runCommand("launchctl",["bootstrap",a,r]);return d(t)?(e.stdout(`[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u5B89\u88C5\u5E76\u5DF2\u542F\u52A8\uFF08\u65E5\u5FD7: ${n}\uFF09\u3002`),{handled:!0,exitCode:0}):(e.stderr(D("\u5B89\u88C5 awsb \u670D\u52A1",t)),{handled:!0,exitCode:t.status??1})}function $e(e){if(!k(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||_,n=R(e),s=L(n),a=e.runCommand("launchctl",["bootout",s]);if(a.error)return e.stderr(D("\u5378\u8F7D awsb \u670D\u52A1",a)),{handled:!0,exitCode:1};if(l(r))try{M(r)}catch(t){const i=t instanceof Error?t:new Error(String(t));return e.stderr(`[runtime-bridge] \u5220\u9664 launchd plist \u5931\u8D25: ${i.message}`),{handled:!0,exitCode:1}}else e.stdout("[runtime-bridge] awsb launchd plist \u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u5220\u9664\u3002");return e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u5378\u8F7D\u3002"),{handled:!0,exitCode:0}}function Ee(e){if(!k(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||_;if(!l(r))return e.stderr("[runtime-bridge] awsb launchd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const n=R(e),s=L(n),a=e.runCommand("launchctl",["kickstart",s]);if(d(a))return e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0};const t=e.runCommand("launchctl",["bootstrap",n,r]);return d(t)?(e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0}):(e.stderr(D("\u542F\u52A8 awsb \u670D\u52A1",t)),{handled:!0,exitCode:t.status??1})}function ke(e){if(!k(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=R(e),n=e.runCommand("launchctl",["bootout",L(r)]);return d(n)?(e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u505C\u6B62\u3002"),{handled:!0,exitCode:0}):(e.stderr(D("\u505C\u6B62 awsb \u670D\u52A1",n)),{handled:!0,exitCode:n.status??1})}function Re(e){if(!k(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||_;if(!l(r))return e.stderr("[runtime-bridge] awsb launchd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const n=R(e);e.runCommand("launchctl",["bootout",L(n)]);const s=e.runCommand("launchctl",["bootstrap",n,r]);return d(s)?(e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u91CD\u542F\u3002"),{handled:!0,exitCode:0}):(e.stderr(D("\u91CD\u542F awsb \u670D\u52A1",s)),{handled:!0,exitCode:s.status??1})}async function Le(e,r,n,s){const a=e[1];if(!a||a==="-h"||a==="--help"||a==="help")return G(n),{handled:!0,exitCode:a?0:1};const t={stdout:n,stderr:s,runCommand:r.runCommand||I,platform:r.platform||process.platform,serviceUnitPath:r.serviceUnitPath||j,executablePath:r.executablePath||de(),windowsServiceManager:r.windowsServiceManager,launchdPlistPath:r.launchdPlistPath,launchdLogPath:r.launchdLogPath,launchdDomainTarget:r.launchdDomainTarget};return t.platform!=="linux"&&t.platform!=="win32"&&t.platform!=="darwin"?(s("[runtime-bridge] service \u547D\u4EE4\u4EC5\u652F\u6301 Linux systemd\u3001Windows \u670D\u52A1\u4E0E macOS launchd \u73AF\u5883\u3002"),{handled:!0,exitCode:1}):a==="install"?t.platform==="win32"?await we(t):t.platform==="darwin"?ye(t):le(t):a==="uninstall"?t.platform==="win32"?Ce(t):t.platform==="darwin"?$e(t):me(t):a==="restart"?t.platform==="win32"?xe(t):t.platform==="darwin"?Re(t):fe(t):a==="start"?t.platform==="win32"?Pe(t):t.platform==="darwin"?Ee(t):ge(t):a==="stop"?t.platform==="win32"?Se(t):t.platform==="darwin"?ke(t):he(t):(s(`[runtime-bridge] \u672A\u77E5 service \u5B50\u547D\u4EE4: ${a}`),G(n),{handled:!0,exitCode:1})}function V(e){return e?e.split(/\r?\n/).map(r=>r.trim()).filter(r=>/^\d+$/.test(r)).map(Number):[]}function De(e){try{if(e==="win32"){const n=P("powershell",["-NoProfile","-Command",`Get-CimInstance Win32_Process -Filter "Name='node.exe'" | Where-Object { $_.CommandLine -like '*aws-runtime-bridge*' -and $_.ProcessId -ne ${process.pid} } | ForEach-Object { $_.ProcessId }`],{encoding:"utf-8"});return V(n.stdout)}const r=P("pgrep",["-f","aws-runtime-bridge"],{encoding:"utf-8"});return V(r.stdout).filter(n=>n!==process.pid)}catch{return[]}}function _e(e,r){if(r==="win32"){P("taskkill",["/PID",String(e),"/F","/T"],{stdio:"ignore"});return}P("kill",["-9",String(e)],{stdio:"ignore"})}function pe(e){if(!process.stdin.isTTY)return Promise.resolve("n");const r=q({input:process.stdin,output:process.stdout});return r.question(e).finally(()=>r.close())}async function Te(e,r,n){const s=e.runCommand||I,a=e.platform||process.platform,t=e.findRunningBridgeProcesses||De,i=e.prompt||pe,h=e.killBridgeProcess||_e,u=e.globalModulePath||ne;r("[runtime-bridge] \u6B63\u5728\u66F4\u65B0 aws-runtime-bridge \u5230\u6700\u65B0\u7248\u672C...");const c=t(a).filter(w=>w!==process.pid);let b=!1;if(c.length>0){r(`[runtime-bridge] \u68C0\u6D4B\u5230 aws-runtime-bridge \u6B63\u5728\u8FD0\u884C (PID: ${c.join(", ")})\uFF0C\u66F4\u65B0\u65F6\u8FD9\u4E9B\u8FDB\u7A0B\u53EF\u80FD\u5360\u7528\u6587\u4EF6\u5BFC\u81F4\u8986\u76D6\u5931\u8D25\u3002`);const w=(await i("\u662F\u5426\u5173\u95ED\u4E0A\u8FF0\u8FDB\u7A0B\u4EE5\u7EE7\u7EED\u66F4\u65B0? (y/N) ")).trim().toLowerCase();if(w==="y"||w==="yes")for(const C of c)try{h(C,a),r(`[runtime-bridge] \u5DF2\u5173\u95ED\u8FDB\u7A0B PID: ${C}`)}catch($){const K=$ instanceof Error?$:new Error(String($));n(`[runtime-bridge] \u5173\u95ED\u8FDB\u7A0B PID ${C} \u5931\u8D25: ${K.message}`)}else b=!0,r("[runtime-bridge] \u5DF2\u9009\u62E9\u4E0D\u5173\u95ED\u8FDB\u7A0B\uFF0C\u5C06\u4EE5 --force \u65B9\u5F0F\u5F3A\u5236\u5B89\u88C5\uFF08\u82E5\u6587\u4EF6\u4ECD\u88AB\u5360\u7528\u53EF\u80FD\u4F1A\u6709\u8B66\u544A\uFF09\u3002")}const U=u();if(U){const w=o.join(U,"aws-runtime-bridge");if(l(w)){r("[runtime-bridge] \u6E05\u7406\u65E7\u7248\u672C\u6B8B\u7559\u76EE\u5F55...");try{J(w,{recursive:!0,force:!0})}catch(C){const $=C instanceof Error?C:new Error(String(C));n(`[runtime-bridge] \u6E05\u7406\u6B8B\u7559\u76EE\u5F55\u5931\u8D25\uFF08\u5C06\u5C1D\u8BD5\u7EE7\u7EED\u5B89\u88C5\uFF09: ${$.message}`)}}}const A=["install","-g","aws-runtime-bridge@latest","--omit=optional"];b&&A.push("--force");const y=s("npm",A);return y.error?(n(`[runtime-bridge] \u66F4\u65B0\u5931\u8D25: ${y.error.message}`),{handled:!0,exitCode:1}):y.status!==0?(n(`[runtime-bridge] \u66F4\u65B0\u5931\u8D25\uFF0Cnpm \u9000\u51FA\u7801: ${y.status??"unknown"}`),{handled:!0,exitCode:y.status??1}):(r("[runtime-bridge] \u66F4\u65B0\u5B8C\u6210\u3002\u8BF7\u91CD\u65B0\u8FD0\u884C awsb -v \u67E5\u770B\u5F53\u524D\u7248\u672C\u3002"),{handled:!0,exitCode:0})}function We(e,r,n){const a=(e.argv||process.argv.slice(2)).slice(1).some(u=>u==="--follow"||u==="-f"),t=e.platform||process.platform,i=e.runCommand||I,h=e.serviceUnitPath||j;if(t==="linux"){if(!l(h))return n("[runtime-bridge] awsb \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF08awsb service install\uFF09\uFF0C\u65E0\u65E5\u5FD7\u53EF\u67E5\u770B\u3002"),{handled:!0,exitCode:1};const u=["-u",m];a?u.push("-f"):u.push("-n","200","--no-pager");const c=i("journalctl",u);return c.error?(n(`[runtime-bridge] \u8BFB\u53D6\u65E5\u5FD7\u5931\u8D25: ${c.error.message}`),{handled:!0,exitCode:1}):{handled:!0,exitCode:c.status??0}}if(t==="win32"){const u=e.windowsServiceLogPath||B;if(!l(u))return n(`[runtime-bridge] \u5C1A\u672A\u751F\u6210\u65E5\u5FD7\u6587\u4EF6: ${u}\u3002\u8BF7\u5148\u6267\u884C \`awsb service install\` \u5E76\u8FD0\u884C\u670D\u52A1\u3002`),{handled:!0,exitCode:1};const c=`Get-Content -Encoding UTF8 -Tail 200 "${u}"`+(a?" -Wait":""),b=i("powershell",["-NoProfile","-Command",c]);return b.error?(n(`[runtime-bridge] \u8BFB\u53D6\u65E5\u5FD7\u5931\u8D25: ${b.error.message}`),{handled:!0,exitCode:1}):{handled:!0,exitCode:b.status??0}}if(t==="darwin"){const u=e.launchdLogPath||W;if(!l(u))return n(`[runtime-bridge] \u5C1A\u672A\u751F\u6210\u65E5\u5FD7\u6587\u4EF6: ${u}\u3002\u8BF7\u5148\u6267\u884C \`awsb service install\` \u5E76\u8FD0\u884C\u670D\u52A1\u3002`),{handled:!0,exitCode:1};const b=i("tail",a?["-f",u]:["-n","200",u]);return b.error?(n(`[runtime-bridge] \u8BFB\u53D6\u65E5\u5FD7\u5931\u8D25: ${b.error.message}`),{handled:!0,exitCode:1}):{handled:!0,exitCode:b.status??0}}return n("[runtime-bridge] awsb log \u4EC5\u652F\u6301 Linux systemd\u3001Windows \u670D\u52A1\u4E0E macOS launchd \u73AF\u5883\u3002"),{handled:!0,exitCode:1}}async function Fe(e={}){const r=e.argv||process.argv.slice(2),n=r[0],s=e.stdout||ae,a=e.stderr||se;if(ie(n))return s(`aws-runtime-bridge ${te(e.packageRoot)}`),{handled:!0,exitCode:0};if(n==="update")return await Te(e,s,a);if(n==="config"){const t=r[1];if(t==="example"||t==="minimal"||t==="--minimal"||t==="-m")return{handled:!0,exitCode:await(e.configureExample||Q)()==="created"?0:1};const h=await(e.configure||z)();return{handled:!0,exitCode:h==="configured"||h==="created"?0:1}}return n==="service"?await Le(r,e,s,a):n==="log"?We(e,s,a):{handled:!1,exitCode:0}}export{ce as createLaunchdPlistContent,oe as createSystemdUnitContent,Fe as handleCliCommand,te as readPackageVersion};
|
|
1
|
+
import{spawnSync as v}from"node:child_process";import{createInterface as J}from"node:readline/promises";import{existsSync as m,mkdirSync as p,readFileSync as z,rmSync as Q,unlinkSync as N,writeFileSync as O}from"node:fs";import c from"node:path";import P from"node:os";import{fileURLToPath as j}from"node:url";import{configureStartupConfig as X,printConfigExampleCommand as Z}from"./startup-config-wizard.js";import{createWindowsServiceManager as ee,isNodeWindowsAvailable as re}from"./windows-service-manager.js";const f="awsb.service",T=`/etc/systemd/system/${f}`,H="awsb",C=`${H}.exe`,F=c.join(P.homedir(),".aws-bridge","log"),B=c.join(F,"awsb.out.log"),I="com.agentsworkstudio.awsb",D=c.join(P.homedir(),"Library","LaunchAgents",`${I}.plist`),te=c.join(P.homedir(),".aws-bridge","log"),U=c.join(te,"awsb.out.log");function ne(){const e=j(import.meta.url);return c.resolve(c.dirname(e),"..","..")}function ae(e=ne()){const r=c.join(e,"package.json");return JSON.parse(z(r,"utf-8")).version||"unknown"}function _(e,r){const t=v(e,r,{shell:process.platform==="win32",stdio:"inherit"});return{status:t.status,error:t.error}}function ie(){try{const e=v("npm",["root","-g"],{shell:process.platform==="win32",encoding:"utf-8",stdio:["ignore","pipe","ignore"]});if(e.status===0&&e.stdout){const r=e.stdout.trim();if(r)return r}}catch{}return null}function se(e){process.stdout.write(`${e}
|
|
2
|
+
`)}function ue(e){process.stderr.write(`${e}
|
|
3
|
+
`)}function de(e){return e==="-v"||e==="--version"||e==="version"}function oe(e){return`"${e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function G(){return process.argv[1]?c.resolve(process.argv[1]):j(import.meta.url)}function ce(e){return["[Unit]","Description=AgentsWorkStudio Runtime Bridge","After=network-online.target","Wants=network-online.target","","[Service]","Type=simple","Environment=AWS_BRIDGE_SKIP_SETUP=true",`ExecStart=${[process.execPath,e].map(t=>oe(t)).join(" ")}`,"Restart=on-failure","RestartSec=5s","","[Install]","WantedBy=multi-user.target",""].join(`
|
|
4
|
+
`)}function S(e){return e.replace(/&/g,"&").replace(/</g,"<").replace(/>/g,">")}function le(e,r={}){const t=r.userHomeDir??P.homedir(),i=r.logPath??U,a=i.replace(/\.out\.log$/,".err.log");return['<?xml version="1.0" encoding="UTF-8"?>','<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">','<plist version="1.0">',"<dict>"," <key>Label</key>",` <string>${S(I)}</string>`," <key>ProgramArguments</key>"," <array>",` <string>${S(process.execPath)}</string>`,` <string>${S(e)}</string>`," </array>"," <key>EnvironmentVariables</key>"," <dict>"," <key>AWS_BRIDGE_SKIP_SETUP</key>"," <string>true</string>"," <key>AWS_RUNTIME_HOME_DIR</key>",` <string>${S(t)}</string>`," </dict>"," <key>RunAtLoad</key>"," <true/>"," <key>KeepAlive</key>"," <true/>"," <key>StandardOutPath</key>",` <string>${S(i)}</string>`," <key>StandardErrorPath</key>",` <string>${S(a)}</string>`,"</dict>","</plist>",""].join(`
|
|
5
|
+
`)}function g(e,r){return e("systemctl",r)}function h(e,r){return r.error?`[runtime-bridge] ${e}\u5931\u8D25: ${r.error.message}`:`[runtime-bridge] ${e}\u5931\u8D25\uFF0Csystemctl \u9000\u51FA\u7801: ${r.status??"unknown"}`}function d(e){return!e.error&&e.status===0}function E(e,r){return e==="linux"?!0:(r("[runtime-bridge] service \u547D\u4EE4\u4EC5\u652F\u6301 Linux systemd \u73AF\u5883\u3002"),!1)}function R(e,r){return e==="darwin"?!0:(r("[runtime-bridge] service \u547D\u4EE4\u4EC5\u652F\u6301 macOS launchd \u73AF\u5883\u3002"),!1)}function V(e){e("Usage: awsb service <install|uninstall|start|stop|restart>")}function me(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=ce(e.executablePath);try{p(c.dirname(e.serviceUnitPath),{recursive:!0}),O(e.serviceUnitPath,r,{encoding:"utf-8",mode:420})}catch(n){const s=n instanceof Error?n:new Error(String(n));return e.stderr(`[runtime-bridge] \u5199\u5165 systemd unit \u5931\u8D25: ${s.message}`),{handled:!0,exitCode:1}}const t=g(e.runCommand,["daemon-reload"]);if(!d(t))return e.stderr(h("\u91CD\u8F7D systemd",t)),{handled:!0,exitCode:t.status??1};const i=g(e.runCommand,["enable",f]);if(!d(i))return e.stderr(h("\u542F\u7528 awsb \u5F00\u673A\u81EA\u542F",i)),{handled:!0,exitCode:i.status??1};const a=g(e.runCommand,["is-active","--quiet",f]);if(a.error)return e.stderr(h("\u68C0\u67E5 awsb \u670D\u52A1\u72B6\u6001",a)),{handled:!0,exitCode:1};if(a.status!==0){const n=g(e.runCommand,["start",f]);return d(n)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u5B89\u88C5\u3001\u5DF2\u542F\u7528\u5F00\u673A\u81EA\u542F\u5E76\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0}):(e.stderr(h("\u542F\u52A8 awsb \u670D\u52A1",n)),{handled:!0,exitCode:n.status??1})}return e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u5B89\u88C5\u5E76\u5DF2\u542F\u7528\u5F00\u673A\u81EA\u542F\uFF1B\u670D\u52A1\u5DF2\u5728\u8FD0\u884C\u3002"),{handled:!0,exitCode:0}}function fe(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=m(e.serviceUnitPath),t=g(e.runCommand,["is-active","--quiet",f]);if(t.error)return e.stderr(h("\u68C0\u67E5 awsb \u670D\u52A1\u72B6\u6001",t)),{handled:!0,exitCode:1};if(t.status===0){const n=g(e.runCommand,["stop",f]);if(!d(n))return e.stderr(h("\u505C\u6B62 awsb \u670D\u52A1",n)),{handled:!0,exitCode:n.status??1}}const i=g(e.runCommand,["disable",f]);if(i.error||i.status!==0&&r)return e.stderr(h("\u7981\u7528 awsb \u5F00\u673A\u81EA\u542F",i)),{handled:!0,exitCode:i.status??1};if(r)try{N(e.serviceUnitPath)}catch(n){const s=n instanceof Error?n:new Error(String(n));return e.stderr(`[runtime-bridge] \u5220\u9664 systemd unit \u5931\u8D25: ${s.message}`),{handled:!0,exitCode:1}}else e.stdout("[runtime-bridge] awsb systemd unit \u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u5220\u9664\u3002");const a=g(e.runCommand,["daemon-reload"]);return d(a)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u5378\u8F7D\u3002"),{handled:!0,exitCode:0}):(e.stderr(h("\u91CD\u8F7D systemd",a)),{handled:!0,exitCode:a.status??1})}function ge(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};if(!m(e.serviceUnitPath))return e.stderr("[runtime-bridge] awsb systemd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const r=g(e.runCommand,["restart",f]);return d(r)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u91CD\u542F\u3002"),{handled:!0,exitCode:0}):(e.stderr(h("\u91CD\u542F awsb \u670D\u52A1",r)),{handled:!0,exitCode:r.status??1})}function he(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};if(!m(e.serviceUnitPath))return e.stderr("[runtime-bridge] awsb systemd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const r=g(e.runCommand,["start",f]);return d(r)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0}):(e.stderr(h("\u542F\u52A8 awsb \u670D\u52A1",r)),{handled:!0,exitCode:r.status??1})}function we(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};if(!m(e.serviceUnitPath))return e.stderr("[runtime-bridge] awsb systemd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const r=g(e.runCommand,["stop",f]);return d(r)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u505C\u6B62\u3002"),{handled:!0,exitCode:0}):(e.stderr(h("\u505C\u6B62 awsb \u670D\u52A1",r)),{handled:!0,exitCode:r.status??1})}function be(e){return e(`[runtime-bridge] \u672A\u68C0\u6D4B\u5230 node-windows \u6A21\u5757\u3002\u8BF7\u91CD\u65B0\u5B89\u88C5 aws-runtime-bridge\uFF1A
|
|
6
|
+
npm install -g aws-runtime-bridge`),{handled:!0,exitCode:1}}async function q(e){const r=e.windowsServiceManager;if(!r&&!re())return be(e.stderr);const t=e.windowsServiceLogPath||B,i=c.dirname(e.executablePath),a=P.homedir();try{await(r||ee()).install({name:H,description:"awsb runtime bridge",script:e.executablePath,workingDirectory:i,env:[{name:"AWS_BRIDGE_SKIP_SETUP",value:"true"},{name:"AWS_RUNTIME_HOME_DIR",value:a}],logpath:F})}catch(s){const o=s instanceof Error?s:new Error(String(s));return e.stderr(`[runtime-bridge] \u5B89\u88C5 Windows \u670D\u52A1\u5931\u8D25: ${o.message}`),{handled:!0,exitCode:1}}const n=e.runCommand("sc.exe",["start",C]);return d(n)?(e.stdout(`[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u5B89\u88C5\u5E76\u5DF2\u542F\u52A8\uFF08\u65E5\u5FD7: ${t}\uFF09\u3002`),{handled:!0,exitCode:0}):(e.stderr(`[runtime-bridge] \u542F\u52A8 Windows \u670D\u52A1\u5931\u8D25: ${n.error?.message??`\u9000\u51FA\u7801 ${n.status??"unknown"}`}`),{handled:!0,exitCode:n.status??1})}function Ce(e){const r=i=>e.runCommand("sc.exe",i);r(["stop",C]);const t=r(["delete",C]);return d(t)?(e.stdout("[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u5378\u8F7D\u3002"),{handled:!0,exitCode:0}):(e.stderr(`[runtime-bridge] \u5378\u8F7D Windows \u670D\u52A1\u5931\u8D25: ${t.error?.message??`\u9000\u51FA\u7801 ${t.status??"unknown"}`}`),{handled:!0,exitCode:t.status??1})}function xe(e){const r=i=>e.runCommand("sc.exe",i);r(["stop",C]);const t=r(["start",C]);return d(t)?(e.stdout("[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u91CD\u542F\u3002"),{handled:!0,exitCode:0}):(e.stderr(`[runtime-bridge] \u91CD\u542F Windows \u670D\u52A1\u5931\u8D25: ${t.error?.message??`\u9000\u51FA\u7801 ${t.status??"unknown"}`}`),{handled:!0,exitCode:t.status??1})}function ve(e){const r=e.runCommand("sc.exe",["start",C]);return d(r)?(e.stdout("[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0}):(e.stderr(`[runtime-bridge] \u542F\u52A8 Windows \u670D\u52A1\u5931\u8D25: ${r.error?.message??`\u9000\u51FA\u7801 ${r.status??"unknown"}`}`),{handled:!0,exitCode:r.status??1})}function Pe(e){const r=e.runCommand("sc.exe",["stop",C]);return d(r)?(e.stdout("[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2\u505C\u6B62\u3002"),{handled:!0,exitCode:0}):(e.stderr(`[runtime-bridge] \u505C\u6B62 Windows \u670D\u52A1\u5931\u8D25: ${r.error?.message??`\u9000\u51FA\u7801 ${r.status??"unknown"}`}`),{handled:!0,exitCode:r.status??1})}function Se(){return`gui/${process.getuid?.()??0}`}function k(e){return e.launchdDomainTarget||Se()}function W(e){return`${e}/${I}`}function L(e,r){return r.error?`[runtime-bridge] ${e}\u5931\u8D25: ${r.error.message}`:`[runtime-bridge] ${e}\u5931\u8D25\uFF0Claunchctl \u9000\u51FA\u7801: ${r.status??"unknown"}`}function ye(e){if(!R(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||D,t=e.launchdLogPath||U,i=le(e.executablePath,{userHomeDir:P.homedir(),logPath:t});try{p(c.dirname(r),{recursive:!0}),p(c.dirname(t),{recursive:!0}),O(r,i,{encoding:"utf-8",mode:420})}catch(s){const o=s instanceof Error?s:new Error(String(s));return e.stderr(`[runtime-bridge] \u5199\u5165 launchd plist \u5931\u8D25: ${o.message}`),{handled:!0,exitCode:1}}const a=k(e);e.runCommand("launchctl",["bootout",W(a)]);const n=e.runCommand("launchctl",["bootstrap",a,r]);return d(n)?(e.stdout(`[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u5B89\u88C5\u5E76\u5DF2\u542F\u52A8\uFF08\u65E5\u5FD7: ${t}\uFF09\u3002`),{handled:!0,exitCode:0}):(e.stderr(L("\u5B89\u88C5 awsb \u670D\u52A1",n)),{handled:!0,exitCode:n.status??1})}function $e(e){if(!R(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||D,t=k(e),i=W(t),a=e.runCommand("launchctl",["bootout",i]);if(a.error)return e.stderr(L("\u5378\u8F7D awsb \u670D\u52A1",a)),{handled:!0,exitCode:1};if(m(r))try{N(r)}catch(n){const s=n instanceof Error?n:new Error(String(n));return e.stderr(`[runtime-bridge] \u5220\u9664 launchd plist \u5931\u8D25: ${s.message}`),{handled:!0,exitCode:1}}else e.stdout("[runtime-bridge] awsb launchd plist \u4E0D\u5B58\u5728\uFF0C\u8DF3\u8FC7\u5220\u9664\u3002");return e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u5378\u8F7D\u3002"),{handled:!0,exitCode:0}}function Ee(e){if(!R(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||D;if(!m(r))return e.stderr("[runtime-bridge] awsb launchd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const t=k(e),i=W(t),a=e.runCommand("launchctl",["kickstart",i]);if(d(a))return e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0};const n=e.runCommand("launchctl",["bootstrap",t,r]);return d(n)?(e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u542F\u52A8\u3002"),{handled:!0,exitCode:0}):(e.stderr(L("\u542F\u52A8 awsb \u670D\u52A1",n)),{handled:!0,exitCode:n.status??1})}function Re(e){if(!R(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=k(e),t=e.runCommand("launchctl",["bootout",W(r)]);return d(t)?(e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u505C\u6B62\u3002"),{handled:!0,exitCode:0}):(e.stderr(L("\u505C\u6B62 awsb \u670D\u52A1",t)),{handled:!0,exitCode:t.status??1})}function ke(e){if(!R(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||D;if(!m(r))return e.stderr("[runtime-bridge] awsb launchd \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF0C\u8BF7\u5148\u6267\u884C `awsb service install`\u3002"),{handled:!0,exitCode:1};const t=k(e);e.runCommand("launchctl",["bootout",W(t)]);const i=e.runCommand("launchctl",["bootstrap",t,r]);return d(i)?(e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u91CD\u542F\u3002"),{handled:!0,exitCode:0}):(e.stderr(L("\u91CD\u542F awsb \u670D\u52A1",i)),{handled:!0,exitCode:i.status??1})}async function We(e,r,t,i){const a=e[1];if(!a||a==="-h"||a==="--help"||a==="help")return V(t),{handled:!0,exitCode:a?0:1};const n={stdout:t,stderr:i,runCommand:r.runCommand||_,platform:r.platform||process.platform,serviceUnitPath:r.serviceUnitPath||T,executablePath:r.executablePath||G(),windowsServiceManager:r.windowsServiceManager,launchdPlistPath:r.launchdPlistPath,launchdLogPath:r.launchdLogPath,launchdDomainTarget:r.launchdDomainTarget};return n.platform!=="linux"&&n.platform!=="win32"&&n.platform!=="darwin"?(i("[runtime-bridge] service \u547D\u4EE4\u4EC5\u652F\u6301 Linux systemd\u3001Windows \u670D\u52A1\u4E0E macOS launchd \u73AF\u5883\u3002"),{handled:!0,exitCode:1}):a==="install"?n.platform==="win32"?await q(n):n.platform==="darwin"?ye(n):me(n):a==="uninstall"?n.platform==="win32"?Ce(n):n.platform==="darwin"?$e(n):fe(n):a==="restart"?n.platform==="win32"?xe(n):n.platform==="darwin"?ke(n):ge(n):a==="start"?n.platform==="win32"?ve(n):n.platform==="darwin"?Ee(n):he(n):a==="stop"?n.platform==="win32"?Pe(n):n.platform==="darwin"?Re(n):we(n):(i(`[runtime-bridge] \u672A\u77E5 service \u5B50\u547D\u4EE4: ${a}`),V(t),{handled:!0,exitCode:1})}function K(e){return e?e.split(/\r?\n/).map(r=>r.trim()).filter(r=>/^\d+$/.test(r)).map(Number):[]}function Le(e){try{if(e==="win32"){const t=v("powershell",["-NoProfile","-Command",`Get-CimInstance Win32_Process -Filter "Name='node.exe'" | Where-Object { $_.CommandLine -like '*aws-runtime-bridge*' -and $_.ProcessId -ne ${process.pid} } | ForEach-Object { $_.ProcessId }`],{encoding:"utf-8"});return K(t.stdout)}const r=v("pgrep",["-f","aws-runtime-bridge"],{encoding:"utf-8"});return K(r.stdout).filter(t=>t!==process.pid)}catch{return[]}}function De(e,r){if(r==="win32"){v("taskkill",["/PID",String(e),"/F","/T"],{stdio:"ignore"});return}v("kill",["-9",String(e)],{stdio:"ignore"})}function _e(e){if(!process.stdin.isTTY)return Promise.resolve("n");const r=J({input:process.stdin,output:process.stdout});return r.question(e).finally(()=>r.close())}async function pe(e,r,t){const i=e.runCommand||_,a=e.platform||process.platform,n=e.findRunningBridgeProcesses||Le,s=e.prompt||_e,o=e.killBridgeProcess||De,u=e.globalModulePath||ie;r("[runtime-bridge] \u6B63\u5728\u66F4\u65B0 aws-runtime-bridge \u5230\u6700\u65B0\u7248\u672C...");const l=n(a).filter(b=>b!==process.pid);let w=!1;if(l.length>0){r(`[runtime-bridge] \u68C0\u6D4B\u5230 aws-runtime-bridge \u6B63\u5728\u8FD0\u884C (PID: ${l.join(", ")})\uFF0C\u66F4\u65B0\u65F6\u8FD9\u4E9B\u8FDB\u7A0B\u53EF\u80FD\u5360\u7528\u6587\u4EF6\u5BFC\u81F4\u8986\u76D6\u5931\u8D25\u3002`);const b=(await s("\u662F\u5426\u5173\u95ED\u4E0A\u8FF0\u8FDB\u7A0B\u4EE5\u7EE7\u7EED\u66F4\u65B0? (y/N) ")).trim().toLowerCase();if(b==="y"||b==="yes")for(const x of l)try{o(x,a),r(`[runtime-bridge] \u5DF2\u5173\u95ED\u8FDB\u7A0B PID: ${x}`)}catch($){const Y=$ instanceof Error?$:new Error(String($));t(`[runtime-bridge] \u5173\u95ED\u8FDB\u7A0B PID ${x} \u5931\u8D25: ${Y.message}`)}else w=!0,r("[runtime-bridge] \u5DF2\u9009\u62E9\u4E0D\u5173\u95ED\u8FDB\u7A0B\uFF0C\u5C06\u4EE5 --force \u65B9\u5F0F\u5F3A\u5236\u5B89\u88C5\uFF08\u82E5\u6587\u4EF6\u4ECD\u88AB\u5360\u7528\u53EF\u80FD\u4F1A\u6709\u8B66\u544A\uFF09\u3002")}const A=u();if(A){const b=c.join(A,"aws-runtime-bridge");if(m(b)){r("[runtime-bridge] \u6E05\u7406\u65E7\u7248\u672C\u6B8B\u7559\u76EE\u5F55...");try{Q(b,{recursive:!0,force:!0})}catch(x){const $=x instanceof Error?x:new Error(String(x));t(`[runtime-bridge] \u6E05\u7406\u6B8B\u7559\u76EE\u5F55\u5931\u8D25\uFF08\u5C06\u5C1D\u8BD5\u7EE7\u7EED\u5B89\u88C5\uFF09: ${$.message}`)}}}const M=["install","-g","aws-runtime-bridge@latest","--omit=optional"];w&&M.push("--force");const y=i("npm",M);if(y.error)return t(`[runtime-bridge] \u66F4\u65B0\u5931\u8D25: ${y.error.message}`),{handled:!0,exitCode:1};if(y.status!==0)return t(`[runtime-bridge] \u66F4\u65B0\u5931\u8D25\uFF0Cnpm \u9000\u51FA\u7801: ${y.status??"unknown"}`),{handled:!0,exitCode:y.status??1};if(a==="win32"){const b=await Te(e,r,t);if(b.exitCode!==0)return b}return r("[runtime-bridge] \u66F4\u65B0\u5B8C\u6210\u3002\u8BF7\u91CD\u65B0\u8FD0\u884C awsb -v \u67E5\u770B\u5F53\u524D\u7248\u672C\u3002"),{handled:!0,exitCode:0}}async function Te(e,r,t){const i=e.runCommand||_,a=i("sc.exe",["query",C]);if(!d(a))return{handled:!0,exitCode:0};r("[runtime-bridge] \u68C0\u6D4B\u5230 Windows \u670D\u52A1\u5DF2\u6CE8\u518C\uFF0C\u6B63\u5728\u91CD\u5EFA\u670D\u52A1\u6587\u4EF6\uFF08daemon/winsw.exe\uFF09..."),i("sc.exe",["stop",C]);const n=i("sc.exe",["delete",C]);d(n)||t(`[runtime-bridge] \u5220\u9664\u65E7 SCM \u8BB0\u5F55\u5931\u8D25: ${n.error?.message??`\u9000\u51FA\u7801 ${n.status??"unknown"}`}\uFF08\u5C1D\u8BD5\u7EE7\u7EED\u5B89\u88C5\uFF09`);const s={stdout:r,stderr:t,runCommand:i,platform:"win32",serviceUnitPath:e.serviceUnitPath||T,executablePath:e.executablePath||G(),windowsServiceManager:e.windowsServiceManager};try{return(await q(s)).exitCode!==0?(t("[runtime-bridge] \u91CD\u5EFA Windows \u670D\u52A1\u6587\u4EF6\u5931\u8D25\u3002\u5305\u5DF2\u66F4\u65B0\uFF0C\u8BF7\u624B\u52A8\u6267\u884C `awsb service uninstall && awsb service install` \u4FEE\u590D\u670D\u52A1\u3002"),{handled:!0,exitCode:0}):(r("[runtime-bridge] Windows \u670D\u52A1\u6587\u4EF6\u5DF2\u91CD\u5EFA\u3002"),{handled:!0,exitCode:0})}catch(o){const u=o instanceof Error?o:new Error(String(o));return t(`[runtime-bridge] \u91CD\u5EFA Windows \u670D\u52A1\u6587\u4EF6\u5F02\u5E38: ${u.message}\u3002\u5305\u5DF2\u66F4\u65B0\uFF0C\u8BF7\u624B\u52A8\u6267\u884C \`awsb service uninstall && awsb service install\` \u4FEE\u590D\u670D\u52A1\u3002`),{handled:!0,exitCode:0}}}function Ie(e,r,t){const a=(e.argv||process.argv.slice(2)).slice(1).some(u=>u==="--follow"||u==="-f"),n=e.platform||process.platform,s=e.runCommand||_,o=e.serviceUnitPath||T;if(n==="linux"){if(!m(o))return t("[runtime-bridge] awsb \u670D\u52A1\u5C1A\u672A\u5B89\u88C5\uFF08awsb service install\uFF09\uFF0C\u65E0\u65E5\u5FD7\u53EF\u67E5\u770B\u3002"),{handled:!0,exitCode:1};const u=["-u",f];a?u.push("-f"):u.push("-n","200","--no-pager");const l=s("journalctl",u);return l.error?(t(`[runtime-bridge] \u8BFB\u53D6\u65E5\u5FD7\u5931\u8D25: ${l.error.message}`),{handled:!0,exitCode:1}):{handled:!0,exitCode:l.status??0}}if(n==="win32"){const u=e.windowsServiceLogPath||B;if(!m(u))return t(`[runtime-bridge] \u5C1A\u672A\u751F\u6210\u65E5\u5FD7\u6587\u4EF6: ${u}\u3002\u8BF7\u5148\u6267\u884C \`awsb service install\` \u5E76\u8FD0\u884C\u670D\u52A1\u3002`),{handled:!0,exitCode:1};const l=`Get-Content -Encoding UTF8 -Tail 200 "${u}"`+(a?" -Wait":""),w=s("powershell",["-NoProfile","-Command",l]);return w.error?(t(`[runtime-bridge] \u8BFB\u53D6\u65E5\u5FD7\u5931\u8D25: ${w.error.message}`),{handled:!0,exitCode:1}):{handled:!0,exitCode:w.status??0}}if(n==="darwin"){const u=e.launchdLogPath||U;if(!m(u))return t(`[runtime-bridge] \u5C1A\u672A\u751F\u6210\u65E5\u5FD7\u6587\u4EF6: ${u}\u3002\u8BF7\u5148\u6267\u884C \`awsb service install\` \u5E76\u8FD0\u884C\u670D\u52A1\u3002`),{handled:!0,exitCode:1};const w=s("tail",a?["-f",u]:["-n","200",u]);return w.error?(t(`[runtime-bridge] \u8BFB\u53D6\u65E5\u5FD7\u5931\u8D25: ${w.error.message}`),{handled:!0,exitCode:1}):{handled:!0,exitCode:w.status??0}}return t("[runtime-bridge] awsb log \u4EC5\u652F\u6301 Linux systemd\u3001Windows \u670D\u52A1\u4E0E macOS launchd \u73AF\u5883\u3002"),{handled:!0,exitCode:1}}async function Be(e={}){const r=e.argv||process.argv.slice(2),t=r[0],i=e.stdout||se,a=e.stderr||ue;if(de(t))return i(`aws-runtime-bridge ${ae(e.packageRoot)}`),{handled:!0,exitCode:0};if(t==="update")return await pe(e,i,a);if(t==="config"){const n=r[1];if(n==="example"||n==="minimal"||n==="--minimal"||n==="-m")return{handled:!0,exitCode:await(e.configureExample||Z)()==="created"?0:1};const o=await(e.configure||X)();return{handled:!0,exitCode:o==="configured"||o==="created"?0:1}}return t==="service"?await We(r,e,i,a):t==="log"?Ie(e,i,a):{handled:!1,exitCode:0}}export{le as createLaunchdPlistContent,ce as createSystemdUnitContent,Be as handleCliCommand,ae as readPackageVersion};
|
|
7
7
|
|
|
@@ -1,9 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* 事件差量推送调度器
|
|
3
|
-
*
|
|
4
|
-
* 将 agent 事件缓冲区中的新事件差量推送到调度中心。
|
|
5
|
-
* 提供全局心跳调度和推送统计查询。
|
|
6
|
-
*/
|
|
1
|
+
|
|
7
2
|
import { type BridgeEventPayload } from "./agent-event-store.js";
|
|
8
3
|
import { type RingBufferEntry } from "./ring-buffer.js";
|
|
9
4
|
export interface RuntimeCallbackAuthOptions {
|
|
@@ -19,21 +14,11 @@ export interface PushStatEntry {
|
|
|
19
14
|
lastLatencyMs?: number;
|
|
20
15
|
lastError?: string;
|
|
21
16
|
}
|
|
22
|
-
|
|
23
|
-
* 调度一次差量推送:将 agent 的新事件推送到调度中心。
|
|
24
|
-
* 暂以单次 push 模式实现,后续可按需改为批量/定时 flush。
|
|
25
|
-
*/
|
|
17
|
+
|
|
26
18
|
export declare function scheduleEventPush(agentId: string, _entry: RingBufferEntry<BridgeEventPayload>, authOptions?: RuntimeCallbackAuthOptions): Promise<void>;
|
|
27
|
-
|
|
28
|
-
* 启动全局心跳调度器。
|
|
29
|
-
* 每 30s 向调度中心发送空包,检测连接存活。
|
|
30
|
-
*/
|
|
19
|
+
|
|
31
20
|
export declare function startHeartbeatScheduler(): void;
|
|
32
|
-
|
|
33
|
-
* 停止全局心跳调度器。
|
|
34
|
-
*/
|
|
21
|
+
|
|
35
22
|
export declare function stopHeartbeatScheduler(): void;
|
|
36
|
-
|
|
37
|
-
* 返回所有 agent 的推送统计。
|
|
38
|
-
*/
|
|
23
|
+
|
|
39
24
|
export declare function getAllPushStats(): PushStatEntry[];
|
|
@@ -1,13 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
* 文件快照存储服务
|
|
3
|
-
*
|
|
4
|
-
* 借鉴 Claude Code fileHistory 的确定性整文件覆盖方案,替代 git stash 实现稳定快照。
|
|
5
|
-
* - 快照 = 工作区那一刻所有文件的内容哈希副本 + index.json 映射
|
|
6
|
-
* - 还原 = "先清后写"整文件覆盖,零冲突,幂等
|
|
7
|
-
* - 内容哈希去重:相同文件内容跨快照共享一份物理副本
|
|
8
|
-
*/
|
|
1
|
+
|
|
9
2
|
export interface SnapshotIndexEntry {
|
|
10
|
-
|
|
3
|
+
|
|
11
4
|
backupName: string;
|
|
12
5
|
size: number;
|
|
13
6
|
mtime: number;
|
|
@@ -50,46 +43,25 @@ export interface SnapshotListItem {
|
|
|
50
43
|
fileCount: number;
|
|
51
44
|
totalBytes: number;
|
|
52
45
|
}
|
|
53
|
-
|
|
54
|
-
* 创建工作区文件快照。
|
|
55
|
-
*
|
|
56
|
-
* 算法(借鉴 Claude Code fileHistoryMakeSnapshot):
|
|
57
|
-
* 1. 遍历工作区收集所有文件
|
|
58
|
-
* 2. 对每个文件计算内容哈希,拷贝到快照目录(去重)
|
|
59
|
-
* 3. 写入 index.json 和 meta.json
|
|
60
|
-
*/
|
|
46
|
+
|
|
61
47
|
export declare function createSnapshot(params: {
|
|
62
48
|
workspacePath: string;
|
|
63
49
|
snapshotId?: string;
|
|
64
50
|
snapshotName?: string;
|
|
65
51
|
triggerType?: string;
|
|
66
52
|
}): Promise<CreateSnapshotResult>;
|
|
67
|
-
|
|
68
|
-
* 还原工作区到快照状态。
|
|
69
|
-
*
|
|
70
|
-
* 算法(借鉴 Claude Code applySnapshot):
|
|
71
|
-
* 1. 可选:还原前自动创建安全网快照(preRestoreBackup)
|
|
72
|
-
* 2. 读取目标快照 index.json
|
|
73
|
-
* 3. 删除工作区中"快照后新增"的文件
|
|
74
|
-
* 4. 从备份逐文件覆盖,内容相同则跳过
|
|
75
|
-
*/
|
|
53
|
+
|
|
76
54
|
export declare function restoreSnapshot(params: {
|
|
77
55
|
workspacePath: string;
|
|
78
56
|
snapshotKey: string;
|
|
79
57
|
preRestoreBackup?: boolean;
|
|
80
58
|
}): Promise<RestoreSnapshotResult>;
|
|
81
|
-
|
|
82
|
-
* 列出指定工作区的所有快照
|
|
83
|
-
*/
|
|
59
|
+
|
|
84
60
|
export declare function listSnapshots(workspacePath: string): Promise<SnapshotListItem[]>;
|
|
85
|
-
|
|
86
|
-
* 删除指定快照
|
|
87
|
-
*/
|
|
61
|
+
|
|
88
62
|
export declare function deleteSnapshot(snapshotKey: string): Promise<{
|
|
89
63
|
ok: boolean;
|
|
90
64
|
error?: string;
|
|
91
65
|
}>;
|
|
92
|
-
|
|
93
|
-
* 获取快照根目录(供诊断/调试使用)
|
|
94
|
-
*/
|
|
66
|
+
|
|
95
67
|
export declare function getSnapshotRootPath(): string;
|
|
@@ -1,10 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* AI 配置服务
|
|
3
|
-
*
|
|
4
|
-
* 管理 ACode 实例的 AI provider 配置(model/baseURL/apiKey)。
|
|
5
|
-
* 支持三层来源(api > env > file)仲裁,deep-merge 后写入
|
|
6
|
-
* per-instance acode.json 供 ACode runtime 加载。
|
|
7
|
-
*/
|
|
1
|
+
|
|
8
2
|
export interface AdapterInstanceAiConfig {
|
|
9
3
|
model?: string;
|
|
10
4
|
baseURL?: string;
|
|
@@ -12,7 +6,7 @@ export interface AdapterInstanceAiConfig {
|
|
|
12
6
|
effort?: string;
|
|
13
7
|
}
|
|
14
8
|
interface PrepareOptions {
|
|
15
|
-
|
|
9
|
+
|
|
16
10
|
apiOverrides?: AdapterInstanceAiConfig;
|
|
17
11
|
agentId: string;
|
|
18
12
|
sessionId?: string;
|
|
@@ -30,19 +24,8 @@ interface PrepareResult {
|
|
|
30
24
|
};
|
|
31
25
|
perInstanceConfigPath: string;
|
|
32
26
|
}
|
|
33
|
-
|
|
34
|
-
* 脱敏日志中的敏感字段(apiKey / secret / token / password)。
|
|
35
|
-
* 返回新对象,不修改原对象。
|
|
36
|
-
*/
|
|
27
|
+
|
|
37
28
|
export declare function redactForLog(obj: Record<string, unknown>): Record<string, unknown>;
|
|
38
|
-
|
|
39
|
-
* 准备 ACode 实例配置。
|
|
40
|
-
*
|
|
41
|
-
* 主流程:
|
|
42
|
-
* 1. 从 apiOverrides(请求体)、env(环境变量)、file(acode.json)三层收集配置
|
|
43
|
-
* 2. 按 api > env > file 优先级仲裁每个字段
|
|
44
|
-
* 3. 将仲裁结果 deep-merge 写入 per-instance acode.json
|
|
45
|
-
* 4. 返回合并后的 config 和 per-instance 文件路径
|
|
46
|
-
*/
|
|
29
|
+
|
|
47
30
|
export declare function prepareAcodeInstanceConfig(options: PrepareOptions): Promise<PrepareResult>;
|
|
48
31
|
export {};
|
|
@@ -1,13 +1,4 @@
|
|
|
1
|
-
|
|
2
|
-
* InstanceService - Agent 实例初始化服务
|
|
3
|
-
*
|
|
4
|
-
* 负责 Agent 实例的生命周期管理:
|
|
5
|
-
* - 实例根目录、workspace 路径管理
|
|
6
|
-
* - 实例状态持久化
|
|
7
|
-
* - Skill/MCP 包安装流程
|
|
8
|
-
*
|
|
9
|
-
* 注意:此服务属于 Agent 运行时层,不属于 cc-switch-sdk 配置管理层
|
|
10
|
-
*/
|
|
1
|
+
|
|
11
2
|
import type { AppId, InstalledSkill, McpServer } from '@cc-switch/sdk';
|
|
12
3
|
import { CcSwitchSdk } from '@cc-switch/sdk';
|
|
13
4
|
export interface SkillPackage {
|
|
@@ -1,35 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
* 实例状态持久化服务
|
|
3
|
-
*
|
|
4
|
-
* 管理 Agent 实例的初始化状态持久化
|
|
5
|
-
*/
|
|
1
|
+
|
|
6
2
|
import type { InstanceState } from '../types.js';
|
|
7
|
-
|
|
8
|
-
* 获取实例状态文件路径
|
|
9
|
-
*
|
|
10
|
-
* @param agentId - Agent ID
|
|
11
|
-
* @returns 状态文件路径
|
|
12
|
-
*/
|
|
3
|
+
|
|
13
4
|
export declare function getInstanceStateFile(agentId: string): string;
|
|
14
|
-
|
|
15
|
-
* 加载实例状态
|
|
16
|
-
*
|
|
17
|
-
* @param agentId - Agent ID
|
|
18
|
-
* @returns 实例状态
|
|
19
|
-
*/
|
|
5
|
+
|
|
20
6
|
export declare function loadInstanceState(agentId: string): Promise<InstanceState>;
|
|
21
|
-
|
|
22
|
-
* 保存实例状态
|
|
23
|
-
*
|
|
24
|
-
* @param agentId - Agent ID
|
|
25
|
-
* @param state - 部分实例状态
|
|
26
|
-
* @returns 完整的实例状态
|
|
27
|
-
*/
|
|
7
|
+
|
|
28
8
|
export declare function saveInstanceState(agentId: string, state: Partial<InstanceState>): Promise<InstanceState>;
|
|
29
|
-
|
|
30
|
-
* 获取 Agent 初始化根目录
|
|
31
|
-
*
|
|
32
|
-
* @param agentId - Agent ID
|
|
33
|
-
* @returns 初始化根目录路径
|
|
34
|
-
*/
|
|
9
|
+
|
|
35
10
|
export declare function getAgentInitRoot(agentId: string): string;
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
|
|
1
|
+
|
|
2
2
|
export declare function migrateOldPathsOnStartup(): void;
|
|
@@ -22,8 +22,5 @@ export declare function createBridgeLifecycleOperation(input: {
|
|
|
22
22
|
}): BridgeLifecycleOperation;
|
|
23
23
|
export declare function upsertBridgeLifecycleOperation(operation: BridgeLifecycleOperation): Promise<void>;
|
|
24
24
|
export declare function removeBridgeLifecycleOperation(operationId: string): Promise<void>;
|
|
25
|
-
|
|
26
|
-
* 投递 Bridge 生命周期通知。
|
|
27
|
-
* 主流程:把已完成操作回调调度中心;已接收的操作从本地状态移除,失败则保留待下次启动重试。
|
|
28
|
-
*/
|
|
25
|
+
|
|
29
26
|
export declare function deliverPendingBridgeLifecycleNotifications(): Promise<void>;
|