aws-runtime-bridge 1.9.92 → 1.9.94

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (134) hide show
  1. package/dist/adapter/AcodeSdkAdapter.d.ts +22 -126
  2. package/dist/adapter/AdapterRegistry.d.ts +10 -38
  3. package/dist/adapter/ClaudeSdkAdapter.d.ts +21 -84
  4. package/dist/adapter/CodexSdkAdapter.d.ts +2 -10
  5. package/dist/adapter/OpencodeSdkAdapter.d.ts +6 -42
  6. package/dist/adapter/acode-tool-names.d.ts +3 -12
  7. package/dist/adapter/idle-poll-loop.d.ts +4 -16
  8. package/dist/adapter/index.d.ts +1 -4
  9. package/dist/adapter/instance-ai-config-resolver.d.ts +9 -29
  10. package/dist/adapter/types.d.ts +124 -242
  11. package/dist/adapters/cc-switch/common.d.ts +4 -14
  12. package/dist/adapters/cc-switch/index.d.ts +3 -11
  13. package/dist/adapters/cc-switch/mcp-acode.d.ts +1 -7
  14. package/dist/adapters/cc-switch/mcp-claude.d.ts +1 -5
  15. package/dist/adapters/cc-switch/mcp-claudecode.d.ts +1 -5
  16. package/dist/adapters/cc-switch/mcp-codex.d.ts +1 -7
  17. package/dist/adapters/cc-switch/mcp-opencode.d.ts +3 -11
  18. package/dist/adapters/cc-switch/mcp-placeholder.d.ts +1 -5
  19. package/dist/adapters/cc-switch/skill-acode.d.ts +1 -6
  20. package/dist/adapters/cc-switch/skill-claude.d.ts +1 -5
  21. package/dist/adapters/cc-switch/skill-claudecode.d.ts +1 -5
  22. package/dist/adapters/cc-switch/skill-opencode.d.ts +1 -5
  23. package/dist/adapters/cc-switch/skill-placeholder.d.ts +1 -5
  24. package/dist/config.d.ts +39 -57
  25. package/dist/index.d.ts +1 -5
  26. package/dist/middleware/auth.d.ts +4 -22
  27. package/dist/routes/acode-todos.d.ts +1 -9
  28. package/dist/routes/dashboard.d.ts +1 -6
  29. package/dist/routes/events.d.ts +1 -5
  30. package/dist/routes/file-browser.d.ts +2 -8
  31. package/dist/routes/file-diff-rollback.d.ts +13 -41
  32. package/dist/routes/file-snapshot.d.ts +1 -8
  33. package/dist/routes/git.d.ts +18 -91
  34. package/dist/routes/instance.d.ts +4 -15
  35. package/dist/routes/processes.d.ts +1 -5
  36. package/dist/routes/properties.d.ts +1 -5
  37. package/dist/routes/pty.d.ts +9 -36
  38. package/dist/routes/runtime-binding.d.ts +1 -4
  39. package/dist/routes/sessions.d.ts +2 -9
  40. package/dist/routes/sub-agents.d.ts +1 -12
  41. package/dist/routes/task-context.d.ts +1 -6
  42. package/dist/routes/terminal.d.ts +18 -92
  43. package/dist/routes/yml.d.ts +1 -5
  44. package/dist/services/acode-package.d.ts +2 -12
  45. package/dist/services/agent-event-store.d.ts +6 -26
  46. package/dist/services/agent-process-manager.d.ts +30 -184
  47. package/dist/services/ai-source-apply.d.ts +1 -3
  48. package/dist/services/auto-register.d.ts +29 -106
  49. package/dist/services/bridge-package-publish-hooks.d.ts +5 -19
  50. package/dist/services/cc-switch-sdk.d.ts +1 -6
  51. package/dist/services/cli-commands.d.ts +12 -33
  52. package/dist/services/cli-commands.js +6 -6
  53. package/dist/services/event-delta-pusher.d.ts +5 -20
  54. package/dist/services/fileSnapshotStore.d.ts +7 -35
  55. package/dist/services/instance-ai-config-service.d.ts +4 -21
  56. package/dist/services/instance-service.d.ts +1 -10
  57. package/dist/services/instance-state.d.ts +5 -30
  58. package/dist/services/legacy-path-migration.d.ts +1 -1
  59. package/dist/services/lifecycle-state.d.ts +1 -4
  60. package/dist/services/mcp-launch-binding-queue.d.ts +2 -8
  61. package/dist/services/orphan-monitor.d.ts +20 -63
  62. package/dist/services/panel-auth.d.ts +12 -28
  63. package/dist/services/process-detector.d.ts +18 -122
  64. package/dist/services/process-registry.d.ts +30 -150
  65. package/dist/services/ring-buffer.d.ts +9 -42
  66. package/dist/services/runtime-binding.d.ts +2 -9
  67. package/dist/services/runtime-lifecycle-policy.d.ts +3 -15
  68. package/dist/services/session-output.d.ts +14 -67
  69. package/dist/services/startup-config-wizard.d.ts +3 -10
  70. package/dist/services/system-metrics.d.ts +1 -4
  71. package/dist/services/terminal-persistence.d.ts +10 -53
  72. package/dist/services/tool-installer.d.ts +6 -18
  73. package/dist/services/tunnel-client.d.ts +3 -18
  74. package/dist/services/windows-service-manager.d.ts +1 -13
  75. package/dist/services/workspace-files.d.ts +17 -57
  76. package/dist/services/workspace-watch.d.ts +2 -6
  77. package/dist/services/workspaceTaskChangeWatcher.d.ts +13 -51
  78. package/dist/types.d.ts +2 -8
  79. package/dist/utils/instance-ai-config-debug-logger.d.ts +5 -20
  80. package/dist/utils/logger.d.ts +7 -20
  81. package/dist/utils/mcp-utils.d.ts +8 -44
  82. package/dist/utils/path-utils.d.ts +3 -15
  83. package/dist/utils/sdk-package-loader.d.ts +2 -8
  84. package/dist/utils/validation.d.ts +3 -20
  85. package/dist/utils/yaml-utils.d.ts +8 -56
  86. package/node_modules/@cc-switch/sdk/dist/index.d.ts +1 -6
  87. package/node_modules/@cc-switch/sdk/dist/sdk.d.ts +11 -42
  88. package/package/acode/dist/ask-user-question-tool.d.ts +7 -20
  89. package/package/acode/dist/built-in-file-tools.d.ts +3 -6
  90. package/package/acode/dist/built-in-symbols-tool.d.ts +1 -4
  91. package/package/acode/dist/builtins/commandArtifacts.d.ts +1 -4
  92. package/package/acode/dist/builtins/shellOutputDecoder.d.ts +3 -18
  93. package/package/acode/dist/commands/commandLoader.d.ts +1 -4
  94. package/package/acode/dist/commands/commandParser.d.ts +1 -4
  95. package/package/acode/dist/compaction.d.ts +38 -175
  96. package/package/acode/dist/config.d.ts +1 -4
  97. package/package/acode/dist/fs-utils.d.ts +1 -19
  98. package/package/acode/dist/hooks/hookBus.d.ts +1 -4
  99. package/package/acode/dist/mcpToolNames.d.ts +2 -8
  100. package/package/acode/dist/parsers/ast-cache.d.ts +7 -20
  101. package/package/acode/dist/parsers/language-detector.d.ts +1 -5
  102. package/package/acode/dist/parsers/language-queries.d.ts +1 -1
  103. package/package/acode/dist/parsers/tree-sitter-loader.d.ts +4 -12
  104. package/package/acode/dist/parsers/types.d.ts +19 -30
  105. package/package/acode/dist/runtime.d.ts +47 -269
  106. package/package/acode/dist/skill-tool.d.ts +3 -23
  107. package/package/acode/dist/sub-agent-manager.d.ts +41 -206
  108. package/package/acode/dist/sub-agent-store.d.ts +12 -61
  109. package/package/acode/dist/sub-agent-tools.d.ts +9 -18
  110. package/package/acode/dist/sub-agent-types.d.ts +32 -38
  111. package/package/acode/dist/todo-store.d.ts +8 -23
  112. package/package/acode/dist/todo-tool.d.ts +2 -2
  113. package/package/acode/dist/types.d.ts +17 -38
  114. package/package/aws-client-agent-mcp/dist/agent-client.d.ts +44 -161
  115. package/package/aws-client-agent-mcp/dist/config.d.ts +4 -18
  116. package/package/aws-client-agent-mcp/dist/constants.d.ts +1 -3
  117. package/package/aws-client-agent-mcp/dist/context-manager.d.ts +25 -95
  118. package/package/aws-client-agent-mcp/dist/context-manager.test.d.ts +1 -4
  119. package/package/aws-client-agent-mcp/dist/http-client.d.ts +15 -56
  120. package/package/aws-client-agent-mcp/dist/index.d.ts +1 -11
  121. package/package/aws-client-agent-mcp/dist/logger.d.ts +5 -22
  122. package/package/aws-client-agent-mcp/dist/mcp-server.d.ts +76 -365
  123. package/package/aws-client-agent-mcp/dist/mcp-tools.d.ts +21 -83
  124. package/package/aws-client-agent-mcp/dist/memory-store.d.ts +15 -70
  125. package/package/aws-client-agent-mcp/dist/memory-tools.d.ts +4 -17
  126. package/package/aws-client-agent-mcp/dist/message-buffer.d.ts +23 -92
  127. package/package/aws-client-agent-mcp/dist/messageContent.d.ts +5 -29
  128. package/package/aws-client-agent-mcp/dist/server-memory-store.d.ts +2 -9
  129. package/package/aws-client-agent-mcp/dist/status-reporter.d.ts +17 -55
  130. package/package/aws-client-agent-mcp/dist/types.d.ts +66 -125
  131. package/package/aws-client-agent-mcp/dist/websocket-client.d.ts +30 -125
  132. package/package/cc-switch-sdk/dist/index.d.ts +1 -6
  133. package/package/cc-switch-sdk/dist/sdk.d.ts +11 -42
  134. package/package.json +1 -1
@@ -1,116 +1,56 @@
1
- /**
2
- * Bridge 实例自动注册服务
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
- /** 租户 ID(可选,如果提供 userKey 则可自动推导) */
8
+
19
9
  tenantId?: string;
20
- /** 用户 API Key(必填,用于验证身份和自动推导租户) */
10
+
21
11
  userKey: string;
22
- /** 连接 Bridge 机器实例需要的密钥 */
12
+
23
13
  connectionKey?: string;
24
- /** 实例名称(默认使用主机名) */
14
+
25
15
  instanceName?: string;
26
- /** 实例 ID(可选,预声明时发送给 server 作为实例标识;注册成功后自动回填) */
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
- /** 虚拟 IP(EasyTier,兼容旧配置) */
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
- /** 是否优先选择与 serverUrl 同局域网的本机 IP */
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
- /** awsb config example:打印最小配置示例并把占位符模板写入配置文件。 */
18
+
19
19
  configureExample?: () => Promise<StartupConfigWizardResult>;
20
20
  platform?: NodeJS.Platform;
21
21
  serviceUnitPath?: string;
22
22
  executablePath?: string;
23
- /** Windows 服务日志文件路径(默认 ~/.aws-bridge/log/awsb.out.log),供 install 重定向与 log 读取。 */
23
+
24
24
  windowsServiceLogPath?: string;
25
- /** Windows 服务管理器(基于 node-windows),用于 install 操作;测试时可注入 mock。 */
25
+
26
26
  windowsServiceManager?: WindowsServiceManager;
27
- /** macOS launchd plist 文件路径(默认 ~/Library/LaunchAgents/com.agentsworkstudio.awsb.plist)。 */
27
+
28
28
  launchdPlistPath?: string;
29
- /** macOS launchd 日志文件路径(默认 ~/.aws-bridge/log/awsb.out.log),供 install 写入 plist 与 log 读取。 */
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
- /** 检测正在运行的 bridge 进程 PID 列表(默认按平台用 pgrep / powershell)。 */
33
+
37
34
  findRunningBridgeProcesses?: (platform: NodeJS.Platform) => number[];
38
- /** 关闭指定 PID 的进程(默认按平台用 kill -9 / taskkill)。 */
35
+
39
36
  killBridgeProcess?: (pid: number, platform: NodeJS.Platform) => void;
40
- /** 交互式询问,返回用户输入(默认从 stdin 读取一行)。 */
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 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,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}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};
1
+ import{spawnSync as v}from"node:child_process";import{createInterface as z}from"node:readline/promises";import{existsSync as m,mkdirSync as T,readFileSync as Q,rmSync as X,unlinkSync as O,writeFileSync as j}from"node:fs";import o from"node:path";import S from"node:os";import{fileURLToPath as F}from"node:url";import{configureStartupConfig as Z,printConfigExampleCommand as ee}from"./startup-config-wizard.js";import{createWindowsServiceManager as re,isNodeWindowsAvailable as te}from"./windows-service-manager.js";const f="awsb.service",p=`/etc/systemd/system/${f}`,H="awsb",C=`${H}.exe`,B=o.join(S.homedir(),".aws-bridge","log"),G=o.join(B,"awsb.out.log"),I="com.agentsworkstudio.awsb",D=o.join(S.homedir(),"Library","LaunchAgents",`${I}.plist`),ne=o.join(S.homedir(),".aws-bridge","log"),U=o.join(ne,"awsb.out.log");function ae(){const e=F(import.meta.url);return o.resolve(o.dirname(e),"..","..")}function ie(e=ae()){const r=o.join(e,"package.json");return JSON.parse(Q(r,"utf-8")).version||"unknown"}function L(e,r){const t=v(e,r,{shell:process.platform==="win32",stdio:"inherit"});return{status:t.status,error:t.error}}function se(){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 ue(e){process.stdout.write(`${e}
2
+ `)}function de(e){process.stderr.write(`${e}
3
+ `)}function ce(e){return e==="-v"||e==="--version"||e==="version"}function oe(e){return`"${e.replace(/\\/g,"\\\\").replace(/"/g,'\\"')}"`}function V(){return process.argv[1]?o.resolve(process.argv[1]):F(import.meta.url)}function le(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 P(e){return e.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;")}function me(e,r={}){const t=r.userHomeDir??S.homedir(),a=r.logPath??U,i=a.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>${P(I)}</string>`," <key>ProgramArguments</key>"," <array>",` <string>${P(process.execPath)}</string>`,` <string>${P(e)}</string>`," </array>"," <key>EnvironmentVariables</key>"," <dict>"," <key>AWS_BRIDGE_SKIP_SETUP</key>"," <string>true</string>"," <key>AWS_RUNTIME_HOME_DIR</key>",` <string>${P(t)}</string>`," </dict>"," <key>RunAtLoad</key>"," <true/>"," <key>KeepAlive</key>"," <true/>"," <key>StandardOutPath</key>",` <string>${P(a)}</string>`," <key>StandardErrorPath</key>",` <string>${P(i)}</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 q(e){e("Usage: awsb service <install|uninstall|start|stop|restart>")}function fe(e){if(!E(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=le(e.executablePath);try{T(o.dirname(e.serviceUnitPath),{recursive:!0}),j(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 a=g(e.runCommand,["enable",f]);if(!d(a))return e.stderr(h("\u542F\u7528 awsb \u5F00\u673A\u81EA\u542F",a)),{handled:!0,exitCode:a.status??1};const i=g(e.runCommand,["is-active","--quiet",f]);if(i.error)return e.stderr(h("\u68C0\u67E5 awsb \u670D\u52A1\u72B6\u6001",i)),{handled:!0,exitCode:1};if(i.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 ge(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 a=g(e.runCommand,["disable",f]);if(a.error||a.status!==0&&r)return e.stderr(h("\u7981\u7528 awsb \u5F00\u673A\u81EA\u542F",a)),{handled:!0,exitCode:a.status??1};if(r)try{O(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 i=g(e.runCommand,["daemon-reload"]);return d(i)?(e.stdout("[runtime-bridge] awsb systemd \u670D\u52A1\u5DF2\u5378\u8F7D\u3002"),{handled:!0,exitCode:0}):(e.stderr(h("\u91CD\u8F7D systemd",i)),{handled:!0,exitCode:i.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,["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 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,["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 be(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 Ce(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 A(e){const r=e.windowsServiceManager;if(!r&&!te())return Ce(e.stderr);const t=e.windowsServiceLogPath||G,a=o.dirname(e.executablePath),i=S.homedir();try{await(r||re()).install({name:H,description:"awsb runtime bridge",script:e.executablePath,workingDirectory:a,env:[{name:"AWS_BRIDGE_SKIP_SETUP",value:"true"},{name:"AWS_RUNTIME_HOME_DIR",value:i}],logpath:B})}catch(s){const c=s instanceof Error?s:new Error(String(s));return e.stderr(`[runtime-bridge] \u5B89\u88C5 Windows \u670D\u52A1\u5931\u8D25: ${c.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 xe(e){const r=a=>e.runCommand("sc.exe",a);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})}async function ve(e){return e.runCommand("sc.exe",["stop",C]),K(e,"\u91CD\u542F")}async function Se(e){return K(e,"\u542F\u52A8")}const Pe=2;async function K(e,r){const t=e.runCommand("sc.exe",["start",C]);if(d(t))return e.stdout(`[runtime-bridge] awsb Windows \u670D\u52A1\u5DF2${r}\u3002`),{handled:!0,exitCode:0};if(t.status===Pe){e.stdout("[runtime-bridge] \u68C0\u6D4B\u5230 Windows \u670D\u52A1\u4E8C\u8FDB\u5236\u6587\u4EF6\u4E22\u5931\uFF08winsw.exe\uFF09\uFF0C\u6B63\u5728\u91CD\u5EFA..."),e.runCommand("sc.exe",["delete",C]);try{const a=await A(e);return a.exitCode!==0&&e.stderr(`[runtime-bridge] ${r} Windows \u670D\u52A1\u5931\u8D25\u4E14\u81EA\u52A8\u91CD\u5EFA\u5931\u8D25\u3002\u8BF7\u624B\u52A8\u6267\u884C \`awsb service uninstall && awsb service install\` \u4FEE\u590D\u3002`),a}catch(a){const i=a instanceof Error?a:new Error(String(a));return e.stderr(`[runtime-bridge] ${r} Windows \u670D\u52A1\u5931\u8D25\u4E14\u81EA\u52A8\u91CD\u5EFA\u5F02\u5E38: ${i.message}\u3002\u8BF7\u624B\u52A8\u6267\u884C \`awsb service uninstall && awsb service install\` \u4FEE\u590D\u3002`),{handled:!0,exitCode:1}}}return e.stderr(`[runtime-bridge] ${r} Windows \u670D\u52A1\u5931\u8D25: ${t.error?.message??`\u9000\u51FA\u7801 ${t.status??"unknown"}`}`),{handled:!0,exitCode:t.status??1}}function ye(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 $e(){return`gui/${process.getuid?.()??0}`}function k(e){return e.launchdDomainTarget||$e()}function W(e){return`${e}/${I}`}function _(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 Ee(e){if(!R(e.platform,e.stderr))return{handled:!0,exitCode:1};const r=e.launchdPlistPath||D,t=e.launchdLogPath||U,a=me(e.executablePath,{userHomeDir:S.homedir(),logPath:t});try{T(o.dirname(r),{recursive:!0}),T(o.dirname(t),{recursive:!0}),j(r,a,{encoding:"utf-8",mode:420})}catch(s){const c=s instanceof Error?s:new Error(String(s));return e.stderr(`[runtime-bridge] \u5199\u5165 launchd plist \u5931\u8D25: ${c.message}`),{handled:!0,exitCode:1}}const i=k(e);e.runCommand("launchctl",["bootout",W(i)]);const n=e.runCommand("launchctl",["bootstrap",i,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(_("\u5B89\u88C5 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=e.launchdPlistPath||D,t=k(e),a=W(t),i=e.runCommand("launchctl",["bootout",a]);if(i.error)return e.stderr(_("\u5378\u8F7D awsb \u670D\u52A1",i)),{handled:!0,exitCode:1};if(m(r))try{O(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 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),a=W(t),i=e.runCommand("launchctl",["kickstart",a]);if(d(i))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(_("\u542F\u52A8 awsb \u670D\u52A1",n)),{handled:!0,exitCode:n.status??1})}function We(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(_("\u505C\u6B62 awsb \u670D\u52A1",t)),{handled:!0,exitCode:t.status??1})}function _e(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 a=e.runCommand("launchctl",["bootstrap",t,r]);return d(a)?(e.stdout("[runtime-bridge] awsb launchd \u670D\u52A1\u5DF2\u91CD\u542F\u3002"),{handled:!0,exitCode:0}):(e.stderr(_("\u91CD\u542F awsb \u670D\u52A1",a)),{handled:!0,exitCode:a.status??1})}async function De(e,r,t,a){const i=e[1];if(!i||i==="-h"||i==="--help"||i==="help")return q(t),{handled:!0,exitCode:i?0:1};const n={stdout:t,stderr:a,runCommand:r.runCommand||L,platform:r.platform||process.platform,serviceUnitPath:r.serviceUnitPath||p,executablePath:r.executablePath||V(),windowsServiceManager:r.windowsServiceManager,launchdPlistPath:r.launchdPlistPath,launchdLogPath:r.launchdLogPath,launchdDomainTarget:r.launchdDomainTarget};return n.platform!=="linux"&&n.platform!=="win32"&&n.platform!=="darwin"?(a("[runtime-bridge] service \u547D\u4EE4\u4EC5\u652F\u6301 Linux systemd\u3001Windows \u670D\u52A1\u4E0E macOS launchd \u73AF\u5883\u3002"),{handled:!0,exitCode:1}):i==="install"?n.platform==="win32"?await A(n):n.platform==="darwin"?Ee(n):fe(n):i==="uninstall"?n.platform==="win32"?xe(n):n.platform==="darwin"?Re(n):ge(n):i==="restart"?n.platform==="win32"?ve(n):n.platform==="darwin"?_e(n):he(n):i==="start"?n.platform==="win32"?Se(n):n.platform==="darwin"?ke(n):we(n):i==="stop"?n.platform==="win32"?ye(n):n.platform==="darwin"?We(n):be(n):(a(`[runtime-bridge] \u672A\u77E5 service \u5B50\u547D\u4EE4: ${i}`),q(t),{handled:!0,exitCode:1})}function Y(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 Y(t.stdout)}const r=v("pgrep",["-f","aws-runtime-bridge"],{encoding:"utf-8"});return Y(r.stdout).filter(t=>t!==process.pid)}catch{return[]}}function Te(e,r){if(r==="win32"){v("taskkill",["/PID",String(e),"/F","/T"],{stdio:"ignore"});return}v("kill",["-9",String(e)],{stdio:"ignore"})}function pe(e){if(!process.stdin.isTTY)return Promise.resolve("n");const r=z({input:process.stdin,output:process.stdout});return r.question(e).finally(()=>r.close())}async function Ie(e,r,t){const a=e.runCommand||L,i=e.platform||process.platform,n=e.findRunningBridgeProcesses||Le,s=e.prompt||pe,c=e.killBridgeProcess||Te,u=e.globalModulePath||se;r("[runtime-bridge] \u6B63\u5728\u66F4\u65B0 aws-runtime-bridge \u5230\u6700\u65B0\u7248\u672C...");const l=n(i).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{c(x,i),r(`[runtime-bridge] \u5DF2\u5173\u95ED\u8FDB\u7A0B PID: ${x}`)}catch($){const J=$ instanceof Error?$:new Error(String($));t(`[runtime-bridge] \u5173\u95ED\u8FDB\u7A0B PID ${x} \u5931\u8D25: ${J.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 M=u();if(M){const b=o.join(M,"aws-runtime-bridge");if(m(b)){r("[runtime-bridge] \u6E05\u7406\u65E7\u7248\u672C\u6B8B\u7559\u76EE\u5F55...");try{X(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 N=["install","-g","aws-runtime-bridge@latest","--omit=optional"];w&&N.push("--force");const y=a("npm",N);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(i==="win32"){const b=await Ue(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 Ue(e,r,t){const a=e.runCommand||L,i=a("sc.exe",["query",C]);if(!d(i))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..."),a("sc.exe",["stop",C]);const n=a("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:a,platform:"win32",serviceUnitPath:e.serviceUnitPath||p,executablePath:e.executablePath||V(),windowsServiceManager:e.windowsServiceManager};try{return(await A(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(c){const u=c instanceof Error?c:new Error(String(c));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 Ae(e,r,t){const i=(e.argv||process.argv.slice(2)).slice(1).some(u=>u==="--follow"||u==="-f"),n=e.platform||process.platform,s=e.runCommand||L,c=e.serviceUnitPath||p;if(n==="linux"){if(!m(c))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];i?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||G;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}"`+(i?" -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",i?["-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 Ve(e={}){const r=e.argv||process.argv.slice(2),t=r[0],a=e.stdout||ue,i=e.stderr||de;if(ce(t))return a(`aws-runtime-bridge ${ie(e.packageRoot)}`),{handled:!0,exitCode:0};if(t==="update")return await Ie(e,a,i);if(t==="config"){const n=r[1];if(n==="example"||n==="minimal"||n==="--minimal"||n==="-m")return{handled:!0,exitCode:await(e.configureExample||ee)()==="created"?0:1};const c=await(e.configure||Z)();return{handled:!0,exitCode:c==="configured"||c==="created"?0:1}}return t==="service"?await De(r,e,a,i):t==="log"?Ae(e,a,i):{handled:!1,exitCode:0}}export{me as createLaunchdPlistContent,le as createSystemdUnitContent,Ve as handleCliCommand,ie 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
- /** 备份文件名(= sha256(content).slice(0,16));null 表示快照时该文件不存在(占位) */
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
- /** 来自请求体 instanceAiConfig 的覆盖(api > env > file 中的 "api" 层) */
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>;