@actiondock/cli 2.7.0 → 2.8.0

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 (65) hide show
  1. package/README.md +4 -6
  2. package/dist/commands/action/create.js +4 -5
  3. package/dist/commands/add.js +9 -17
  4. package/dist/commands/build.js +3 -18
  5. package/dist/commands/config/delete.js +8 -7
  6. package/dist/commands/config/env.js +7 -11
  7. package/dist/commands/config/get.js +8 -5
  8. package/dist/commands/config/list.js +16 -22
  9. package/dist/commands/config/schema.d.ts +7 -1
  10. package/dist/commands/config/schema.js +44 -67
  11. package/dist/commands/config/set.js +9 -7
  12. package/dist/commands/describe.js +10 -9
  13. package/dist/commands/doctor.js +4 -3
  14. package/dist/commands/export.js +5 -13
  15. package/dist/commands/generate.js +4 -3
  16. package/dist/commands/info.js +3 -1
  17. package/dist/commands/init.js +3 -3
  18. package/dist/commands/link.js +4 -4
  19. package/dist/commands/list.js +19 -10
  20. package/dist/commands/mcp.js +27 -66
  21. package/dist/commands/pack.js +3 -12
  22. package/dist/commands/playbook.js +30 -10
  23. package/dist/commands/profile.js +10 -19
  24. package/dist/commands/remove.js +5 -14
  25. package/dist/commands/run.d.ts +5 -2
  26. package/dist/commands/run.js +19 -20
  27. package/dist/commands/runs.js +26 -35
  28. package/dist/commands/serve.js +66 -44
  29. package/dist/commands/state-list.d.ts +2 -2
  30. package/dist/commands/state-list.js +10 -8
  31. package/dist/commands/state.d.ts +2 -2
  32. package/dist/commands/state.js +110 -103
  33. package/dist/commands/test.js +1 -1
  34. package/dist/commands/validate.js +4 -17
  35. package/dist/errors.d.ts +14 -0
  36. package/dist/errors.js +46 -2
  37. package/dist/index.d.ts +2 -2
  38. package/dist/index.js +3 -3
  39. package/dist/renderer.d.ts +1 -1
  40. package/dist/renderer.js +1 -1
  41. package/dist/services/config-merge.d.ts +6 -5
  42. package/dist/services/config-merge.js +10 -8
  43. package/dist/services/inspect.js +3 -1
  44. package/dist/standalone/index.d.ts +4 -14
  45. package/dist/standalone/index.js +5 -44
  46. package/dist/types.d.ts +2 -1
  47. package/dist/types.js +1 -1
  48. package/dist/utils/cert.js +1 -1
  49. package/dist/utils/duration.d.ts +1 -1
  50. package/dist/utils/duration.js +1 -1
  51. package/dist/utils/index.d.ts +1 -2
  52. package/dist/utils/index.js +1 -2
  53. package/dist/utils/input.d.ts +9 -1
  54. package/dist/utils/input.js +12 -1
  55. package/dist/utils/server-launch.d.ts +61 -0
  56. package/dist/utils/server-launch.js +114 -0
  57. package/dist/utils/target.d.ts +14 -13
  58. package/dist/utils/target.js +20 -39
  59. package/dist/utils/utils.d.ts +101 -1
  60. package/dist/utils/utils.js +97 -7
  61. package/package.json +5 -6
  62. package/dist/utils/bytes.d.ts +0 -1
  63. package/dist/utils/bytes.js +0 -1
  64. package/dist/utils/filter.d.ts +0 -1
  65. package/dist/utils/filter.js +0 -1
@@ -1,52 +1,13 @@
1
- import { StandaloneDispatcher as CoreStandaloneDispatcher, } from "@actiondock/core";
1
+ import { StandaloneDispatcher as CoreStandaloneDispatcher, } from "@actiondock/core/server";
2
2
  /**
3
- * 独立二进制轻量参数解析分发器(委托 Core 统一实现,消除重复逻辑)。
4
- */
5
- export class StandaloneDispatcher extends CoreStandaloneDispatcher {
6
- constructor(options) {
7
- super(options);
8
- }
9
- }
10
- /**
11
- * 运行独立二进制参数解析分发器并返回退出状态码。
3
+ * 运行独立二进制参数解析分发器并返回退出状态码(委托 Core 统一实现)。
12
4
  */
13
5
  export async function runStandaloneCli(argv = process.argv.slice(2), options, control) {
14
- const dispatcher = new StandaloneDispatcher(options);
6
+ const dispatcher = new CoreStandaloneDispatcher(options);
15
7
  return dispatcher.dispatch(argv, control);
16
8
  }
17
9
  /**
18
- * 创建独立二进制运行时分发器实例。
19
- */
20
- export function createStandaloneDispatcher(options) {
21
- return new StandaloneDispatcher(options);
22
- }
23
- /**
24
- * 独立二进制进程入口适配器。
10
+ * 独立二进制进程入口适配器(事实源位于 core 包,此处 re-export 维持既有导入路径兼容)。
25
11
  * 仅在命令行可执行入口调用,负责全局 SIGINT 监听与退出状态码写入。
26
12
  */
27
- export async function runStandaloneProcess(argv = process.argv.slice(2), options) {
28
- const controller = new AbortController();
29
- const control = {
30
- signal: controller.signal,
31
- };
32
- let sigintCount = 0;
33
- const sigintHandler = () => {
34
- sigintCount++;
35
- if (sigintCount === 1) {
36
- control.cancellationSource = "sigint";
37
- controller.abort(new Error("Interrupted by SIGINT"));
38
- }
39
- else {
40
- process.exitCode = 130;
41
- process.exit(130);
42
- }
43
- };
44
- process.on("SIGINT", sigintHandler);
45
- try {
46
- const exitCode = await runStandaloneCli(argv, options, control);
47
- process.exitCode = exitCode;
48
- }
49
- finally {
50
- process.removeListener("SIGINT", sigintHandler);
51
- }
52
- }
13
+ export { runStandaloneProcess } from "@actiondock/core/server";
package/dist/types.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import type { ActionDefinition } from "@actiondock/sdk";
2
- import type { ConfigItemDefinition, InvocationControl } from "@actiondock/core";
2
+ import type { ConfigItemDefinition } from "@actiondock/core/project";
3
+ import type { InvocationControl } from "@actiondock/core/server";
3
4
  export type { InvocationControl };
4
5
  /**
5
6
  * 统一退出码定义(事实源位于 core 包 StandaloneDispatcher,此处仅 re-export 维持既有导入路径兼容)。
package/dist/types.js CHANGED
@@ -1,4 +1,4 @@
1
- import { ExitCode as CoreExitCode } from "@actiondock/core";
1
+ import { ExitCode as CoreExitCode, } from "@actiondock/core/server";
2
2
  /**
3
3
  * 统一退出码定义(事实源位于 core 包 StandaloneDispatcher,此处仅 re-export 维持既有导入路径兼容)。
4
4
  * - SUCCESS: 执行成功(0)
@@ -3,7 +3,7 @@ import { chmodSync, existsSync, mkdirSync, readFileSync, renameSync, writeFileSy
3
3
  import { isIP } from "node:net";
4
4
  import { hostname, networkInterfaces } from "node:os";
5
5
  import { join } from "node:path";
6
- import { getActionDockHome } from "@actiondock/core";
6
+ import { getActionDockHome, } from "@actiondock/core/registry";
7
7
  import { generate } from "selfsigned";
8
8
  /**
9
9
  * 判定字符串是否为有效 IPv4 或 IPv6 地址。
@@ -1 +1 @@
1
- export { parseDuration } from "@actiondock/core";
1
+ export { parseDuration } from "@actiondock/core/project";
@@ -1 +1 @@
1
- export { parseDuration } from "@actiondock/core";
1
+ export { parseDuration } from "@actiondock/core/project";
@@ -1,8 +1,7 @@
1
1
  export * from "./utils.js";
2
- export * from "./bytes.js";
3
2
  export * from "./duration.js";
4
- export * from "./filter.js";
5
3
  export * from "./target.js";
6
4
  export * from "./spawn.js";
7
5
  export * from "./cert.js";
8
6
  export * from "./input.js";
7
+ export * from "./server-launch.js";
@@ -1,8 +1,7 @@
1
1
  export * from "./utils.js";
2
- export * from "./bytes.js";
3
2
  export * from "./duration.js";
4
- export * from "./filter.js";
5
3
  export * from "./target.js";
6
4
  export * from "./spawn.js";
7
5
  export * from "./cert.js";
8
6
  export * from "./input.js";
7
+ export * from "./server-launch.js";
@@ -1 +1,9 @@
1
- export { resolveActionInput, type ResolveActionInputOptions, parseJson, readStdin, stripBom, InputError, FlatInputError, buildActionInputAdvice, formatActionDetail, } from "@actiondock/core";
1
+ import { stripBom } from "@actiondock/core/project";
2
+ export { resolveActionInput, type ResolveActionInputOptions, parseJson, InputError, FlatInputError, buildActionInputAdvice, formatActionDetail, } from "@actiondock/core/project";
3
+ export { stripBom };
4
+ /**
5
+ * 从标准输入流中完整读取全部数据并转换为 UTF-8 字符串。
6
+ * 底层委托 core 的有界读取实现:保持宽松 UTF-8 解码语义与 BOM 剥离行为,
7
+ * 同时获得默认 10MB 输入上限保护,超限时抛出结构化 INPUT_LIMIT_EXCEEDED 异常。
8
+ */
9
+ export declare function readStdin(stream?: NodeJS.ReadableStream): Promise<string>;
@@ -1 +1,12 @@
1
- export { resolveActionInput, parseJson, readStdin, stripBom, InputError, FlatInputError, buildActionInputAdvice, formatActionDetail, } from "@actiondock/core";
1
+ import { readStdinBounded, stripBom } from "@actiondock/core/project";
2
+ export { resolveActionInput, parseJson, InputError, FlatInputError, buildActionInputAdvice, formatActionDetail, } from "@actiondock/core/project";
3
+ // BOM 剥离单一事实源转引:core 已提供逐字一致的实现,此处仅保留导出面兼容。
4
+ export { stripBom };
5
+ /**
6
+ * 从标准输入流中完整读取全部数据并转换为 UTF-8 字符串。
7
+ * 底层委托 core 的有界读取实现:保持宽松 UTF-8 解码语义与 BOM 剥离行为,
8
+ * 同时获得默认 10MB 输入上限保护,超限时抛出结构化 INPUT_LIMIT_EXCEEDED 异常。
9
+ */
10
+ export async function readStdin(stream = process.stdin) {
11
+ return stripBom(await readStdinBounded(stream, { strictUtf8: false }));
12
+ }
@@ -0,0 +1,61 @@
1
+ import type { CliContext } from "../types.js";
2
+ /**
3
+ * 服务类命令(ad serve、ad mcp serve、ad mcp、ad run)的共享启动脚手架(单一事实源)。
4
+ *
5
+ * 收敛端口/主机/token 解析(含 ACTIONDOCK_TOKEN 环境变量回退)、
6
+ * maxBodyBytes 与 timeoutMs 的 try-catch 包装、corsOrigins 归一化、
7
+ * 停止信号注册与横幅打印,消除 serve.ts 与 mcp.ts 的逐行重复。
8
+ */
9
+ /**
10
+ * 解析监听端口:解析失败时回退缺省端口。
11
+ *
12
+ * @param rawPort 命令行原始端口串
13
+ * @param defaultPort 缺省端口(ad serve 为 5177,ad mcp serve 为 5178)
14
+ * @param falsyFallsBack 是否对零值也回退(mcp serve 旧行为为 parseInt || default,
15
+ * 端口 0 会回退缺省;ad serve 为 NaN 判定,端口 0 保留)
16
+ */
17
+ export declare function resolveServerPort(rawPort: string, defaultPort: number, falsyFallsBack?: boolean): number;
18
+ /**
19
+ * 解析监听主机:未指定时回退 127.0.0.1。
20
+ */
21
+ export declare function resolveServerHost(rawHost: string | undefined): string;
22
+ /**
23
+ * 解析鉴权 Token:显式参数优先,其次 --token-env 指定的环境变量,最后 ACTIONDOCK_TOKEN 兜底。
24
+ *
25
+ * @param token 显式 -t/--token 参数
26
+ * @param tokenEnv --token-env 指定的环境变量名
27
+ */
28
+ export declare function resolveServerToken(token?: string, tokenEnv?: string): string | undefined;
29
+ /**
30
+ * 解析请求体大小上限(--max-body):格式非法时抛 ArgumentError。
31
+ */
32
+ export declare function resolveMaxBodyBytes(maxBody: string | undefined): number | undefined;
33
+ /**
34
+ * 解析执行超时(--timeout):格式非法时抛 ArgumentError。
35
+ */
36
+ export declare function resolveTimeoutMs(timeout: string | undefined): number | undefined;
37
+ /**
38
+ * 归一化 CORS 来源列表:空列表归一为 undefined。
39
+ */
40
+ export declare function normalizeCorsOrigins(corsOrigin: string[] | undefined): string[] | undefined;
41
+ /**
42
+ * 注册 SIGINT/SIGTERM 停止信号处理器(serve 与 mcp serve 共享同一语义)。
43
+ *
44
+ * 停止失败必须可见:写入 stderr 一行并标记失败退出码;
45
+ * 无论成功与否最终强制进程退出。
46
+ *
47
+ * @param server 目标服务实例(提供 stop 方法)
48
+ * @param serverName 横幅与停止消息中的服务名(如 ActionDock server / MCP HTTP server)
49
+ */
50
+ export declare function registerStopSignalHandler(server: {
51
+ stop(): Promise<unknown> | unknown;
52
+ }, serverName: string, context?: CliContext): void;
53
+ /**
54
+ * 打印服务就绪横幅(顶部固定段,serve 与 mcp serve 共享排版)。
55
+ *
56
+ * @param title 横幅主体标题(如 ActionDock 2.0 HTTP Runner Server)
57
+ * @param scheme 端点协议(http 或 https)
58
+ * @param displayHost 面向展示的主机地址
59
+ * @param port 实际监听端口
60
+ */
61
+ export declare function printServerBanner(title: string, scheme: string, displayHost: string, port: number, context?: CliContext): void;
@@ -0,0 +1,114 @@
1
+ import { parseDuration, } from "@actiondock/core/project";
2
+ import { ArgumentError } from "../errors.js";
3
+ import { writeStderr, writeStdout } from "../renderer.js";
4
+ import { parseByteSize } from "./utils.js";
5
+ /**
6
+ * 服务类命令(ad serve、ad mcp serve、ad mcp、ad run)的共享启动脚手架(单一事实源)。
7
+ *
8
+ * 收敛端口/主机/token 解析(含 ACTIONDOCK_TOKEN 环境变量回退)、
9
+ * maxBodyBytes 与 timeoutMs 的 try-catch 包装、corsOrigins 归一化、
10
+ * 停止信号注册与横幅打印,消除 serve.ts 与 mcp.ts 的逐行重复。
11
+ */
12
+ /**
13
+ * 解析监听端口:解析失败时回退缺省端口。
14
+ *
15
+ * @param rawPort 命令行原始端口串
16
+ * @param defaultPort 缺省端口(ad serve 为 5177,ad mcp serve 为 5178)
17
+ * @param falsyFallsBack 是否对零值也回退(mcp serve 旧行为为 parseInt || default,
18
+ * 端口 0 会回退缺省;ad serve 为 NaN 判定,端口 0 保留)
19
+ */
20
+ export function resolveServerPort(rawPort, defaultPort, falsyFallsBack) {
21
+ const parsed = parseInt(rawPort, 10);
22
+ if (falsyFallsBack) {
23
+ return parsed || defaultPort;
24
+ }
25
+ return Number.isNaN(parsed) ? defaultPort : parsed;
26
+ }
27
+ /**
28
+ * 解析监听主机:未指定时回退 127.0.0.1。
29
+ */
30
+ export function resolveServerHost(rawHost) {
31
+ return rawHost || "127.0.0.1";
32
+ }
33
+ /**
34
+ * 解析鉴权 Token:显式参数优先,其次 --token-env 指定的环境变量,最后 ACTIONDOCK_TOKEN 兜底。
35
+ *
36
+ * @param token 显式 -t/--token 参数
37
+ * @param tokenEnv --token-env 指定的环境变量名
38
+ */
39
+ export function resolveServerToken(token, tokenEnv) {
40
+ return (token ||
41
+ (tokenEnv && typeof process !== "undefined" ? process.env?.[tokenEnv] : undefined) ||
42
+ (typeof process !== "undefined" ? process.env?.ACTIONDOCK_TOKEN : undefined));
43
+ }
44
+ /**
45
+ * 解析请求体大小上限(--max-body):格式非法时抛 ArgumentError。
46
+ */
47
+ export function resolveMaxBodyBytes(maxBody) {
48
+ if (!maxBody)
49
+ return undefined;
50
+ try {
51
+ return parseByteSize(maxBody);
52
+ }
53
+ catch (err) {
54
+ throw new ArgumentError(`Invalid max-body format: ${err.message}`);
55
+ }
56
+ }
57
+ /**
58
+ * 解析执行超时(--timeout):格式非法时抛 ArgumentError。
59
+ */
60
+ export function resolveTimeoutMs(timeout) {
61
+ if (!timeout)
62
+ return undefined;
63
+ try {
64
+ return parseDuration(timeout);
65
+ }
66
+ catch (err) {
67
+ throw new ArgumentError(`Invalid timeout format: ${err.message}`);
68
+ }
69
+ }
70
+ /**
71
+ * 归一化 CORS 来源列表:空列表归一为 undefined。
72
+ */
73
+ export function normalizeCorsOrigins(corsOrigin) {
74
+ return corsOrigin && corsOrigin.length > 0 ? corsOrigin : undefined;
75
+ }
76
+ /**
77
+ * 注册 SIGINT/SIGTERM 停止信号处理器(serve 与 mcp serve 共享同一语义)。
78
+ *
79
+ * 停止失败必须可见:写入 stderr 一行并标记失败退出码;
80
+ * 无论成功与否最终强制进程退出。
81
+ *
82
+ * @param server 目标服务实例(提供 stop 方法)
83
+ * @param serverName 横幅与停止消息中的服务名(如 ActionDock server / MCP HTTP server)
84
+ */
85
+ export function registerStopSignalHandler(server, serverName, context) {
86
+ const stopSignalHandler = () => {
87
+ writeStdout(`\nStopping ${serverName}...`, context);
88
+ Promise.resolve(server.stop())
89
+ .catch((err) => {
90
+ // 停止失败必须可见:写入 stderr 一行并标记失败退出码
91
+ writeStderr(`[ERROR] Failed to stop ${serverName} gracefully: ${err instanceof Error ? err.message : String(err)}`, context);
92
+ process.exitCode = 1;
93
+ })
94
+ .finally(() => {
95
+ process.exit(typeof process.exitCode === "number" ? process.exitCode : 0);
96
+ });
97
+ };
98
+ process.once("SIGINT", stopSignalHandler);
99
+ process.once("SIGTERM", stopSignalHandler);
100
+ }
101
+ /**
102
+ * 打印服务就绪横幅(顶部固定段,serve 与 mcp serve 共享排版)。
103
+ *
104
+ * @param title 横幅主体标题(如 ActionDock 2.0 HTTP Runner Server)
105
+ * @param scheme 端点协议(http 或 https)
106
+ * @param displayHost 面向展示的主机地址
107
+ * @param port 实际监听端口
108
+ */
109
+ export function printServerBanner(title, scheme, displayHost, port, context) {
110
+ writeStdout(`\n======================================================`, context);
111
+ writeStdout(` ${title}`, context);
112
+ writeStdout(`======================================================`, context);
113
+ writeStdout(` * Listening on: ${scheme}://${displayHost}:${port}`, context);
114
+ }
@@ -1,4 +1,5 @@
1
- import { type ActionDockTarget, type ResolvedTarget } from "@actiondock/core";
1
+ import { type ActionDockService } from "@actiondock/core";
2
+ import { type ResolvedTarget } from "@actiondock/core/profile";
2
3
  import type { Command } from "commander";
3
4
  import type { CliContext } from "../types.js";
4
5
  /**
@@ -10,7 +11,7 @@ import type { CliContext } from "../types.js";
10
11
  */
11
12
  export declare function applyTargetOptions(command: Command): Command;
12
13
  /**
13
- * 目标解析与 Target 创建所需的统一选项视图。
14
+ * 目标解析与 Service 创建所需的统一选项视图。
14
15
  * 与既有命令内联解析逻辑保持逐字段一致,作为唯一事实源供各命令复用。
15
16
  */
16
17
  export interface TargetResolutionOptions {
@@ -37,14 +38,14 @@ export interface TargetResolutionOptions {
37
38
  *
38
39
  * @param options 命令选项视图(支持直接传入 Commander 解析后的 options 对象)
39
40
  * @param context CLI 上下文
40
- * @returns 解析后的目标拓扑信息(仅信息解析,不创建 Target 实例)
41
+ * @returns 解析后的目标拓扑信息(仅信息解析,不创建 Service 实例)
41
42
  */
42
43
  export declare function resolveTargetFromOptions(options: TargetResolutionOptions, context?: CliContext): ResolvedTarget;
43
44
  /**
44
- * 高阶目标执行辅助:统一封装「目标解析 → Target 创建 → 业务回调 → try/finally close」样板。
45
+ * 高阶服务执行辅助:统一封装「目标解析 → Service 创建 → 业务回调 → try/finally close」样板。
45
46
  *
46
- * 回调获得创建好的 target 与解析后的目标拓扑信息;无论回调成功或抛出,
47
- * 都保证 target 资源被正确释放,业务异常原样透传。
47
+ * 回调获得创建好的 service 与解析后的目标拓扑信息;无论回调成功或抛出,
48
+ * 都保证 service 资源被正确释放,业务异常原样透传。
48
49
  *
49
50
  * 默认旁观打开:内部创建的本地 Host 以非收割模式打开存储(不置 recoverOrphans),
50
51
  * 供 ad state / ad runs / ad config 等查询命令与运行中的 serve 进程并发访问同一库;
@@ -52,10 +53,10 @@ export declare function resolveTargetFromOptions(options: TargetResolutionOption
52
53
  *
53
54
  * @param options 命令选项视图(profile/server/token/package/dataDir/insecure/allowInsecureHttp)
54
55
  * @param context CLI 上下文
55
- * @param fn 业务回调(target 为已创建的门面实例,resolved 为拓扑解析结果)
56
+ * @param fn 业务回调(service 为已创建的服务端口实例,resolved 为拓扑解析结果)
56
57
  * @param localOptions 本地分支附加选项(如 scanLinkedPackages)与 localRoot 回退策略
57
58
  */
58
- export declare function withTarget(options: TargetResolutionOptions, context: CliContext | undefined, fn: (target: ActionDockTarget, resolved: ResolvedTarget) => Promise<void>, localOptions?: {
59
+ export declare function withService(options: TargetResolutionOptions, context: CliContext | undefined, fn: (service: ActionDockService, resolved: ResolvedTarget) => Promise<void>, localOptions?: {
59
60
  /** 本地工程根目录(支持惰性工厂,仅在 local 分支求值);未提供时按 findProjectRoot 回退 */
60
61
  localRoot?: string | (() => string | undefined);
61
62
  /** 是否扫描全局链接包(对应 scanLinkedPackages) */
@@ -66,12 +67,12 @@ export declare function withTarget(options: TargetResolutionOptions, context: Cl
66
67
  * 保持缺省 false,避免误收割并发 serve 进程的在途运行记录。
67
68
  */
68
69
  ownDataDir?: boolean;
70
+ /**
71
+ * 是否强制要求远端目标:true 时 local 分支直接抛 ArgumentError(如 ad runs cancel),
72
+ * 替代原 withRemoteService 的专用实现。
73
+ */
74
+ requireRemote?: boolean;
69
75
  }): Promise<void>;
70
- /**
71
- * 仅远端模式目标执行辅助:创建远端 Target 并保证资源释放。
72
- * 适用于 runs cancel 等明确要求远端目标的命令。
73
- */
74
- export declare function withRemoteTarget(options: TargetResolutionOptions, context: CliContext | undefined, fn: (target: ActionDockTarget, resolved: ResolvedTarget) => Promise<void>): Promise<void>;
75
76
  /**
76
77
  * 目标包根目录解析(含 -P 显式寻址与当前工程回退)。
77
78
  * 供命令在创建 Target 前统一完成包寻址,返回 null 表示当前目录无工程。
@@ -1,5 +1,7 @@
1
- import { createActionDockTarget, findProjectRoot, resolvePackageRoot, resolveTarget, } from "@actiondock/core";
2
- import { createNodePlatform } from "@actiondock/runtime-node";
1
+ import { connectActionDock, createActionDock, createNodePlatform, findProjectRoot, } from "@actiondock/core";
2
+ import { resolvePackageRoot, } from "@actiondock/core/registry";
3
+ import { resolveTarget, } from "@actiondock/core/profile";
4
+ import { ArgumentError } from "../errors.js";
3
5
  /**
4
6
  * 统一为 Commander 命令节点挂载目标环境解析相关选项(单一事实源)。
5
7
  * 包括:-p/--profile, -s/--server, -t/--token, -k/--insecure, --allow-insecure-http。
@@ -23,7 +25,7 @@ export function applyTargetOptions(command) {
23
25
  *
24
26
  * @param options 命令选项视图(支持直接传入 Commander 解析后的 options 对象)
25
27
  * @param context CLI 上下文
26
- * @returns 解析后的目标拓扑信息(仅信息解析,不创建 Target 实例)
28
+ * @returns 解析后的目标拓扑信息(仅信息解析,不创建 Service 实例)
27
29
  */
28
30
  export function resolveTargetFromOptions(options, context) {
29
31
  return resolveTarget({
@@ -35,10 +37,10 @@ export function resolveTargetFromOptions(options, context) {
35
37
  }, context?.customHome);
36
38
  }
37
39
  /**
38
- * 高阶目标执行辅助:统一封装「目标解析 → Target 创建 → 业务回调 → try/finally close」样板。
40
+ * 高阶服务执行辅助:统一封装「目标解析 → Service 创建 → 业务回调 → try/finally close」样板。
39
41
  *
40
- * 回调获得创建好的 target 与解析后的目标拓扑信息;无论回调成功或抛出,
41
- * 都保证 target 资源被正确释放,业务异常原样透传。
42
+ * 回调获得创建好的 service 与解析后的目标拓扑信息;无论回调成功或抛出,
43
+ * 都保证 service 资源被正确释放,业务异常原样透传。
42
44
  *
43
45
  * 默认旁观打开:内部创建的本地 Host 以非收割模式打开存储(不置 recoverOrphans),
44
46
  * 供 ad state / ad runs / ad config 等查询命令与运行中的 serve 进程并发访问同一库;
@@ -46,29 +48,28 @@ export function resolveTargetFromOptions(options, context) {
46
48
  *
47
49
  * @param options 命令选项视图(profile/server/token/package/dataDir/insecure/allowInsecureHttp)
48
50
  * @param context CLI 上下文
49
- * @param fn 业务回调(target 为已创建的门面实例,resolved 为拓扑解析结果)
51
+ * @param fn 业务回调(service 为已创建的服务端口实例,resolved 为拓扑解析结果)
50
52
  * @param localOptions 本地分支附加选项(如 scanLinkedPackages)与 localRoot 回退策略
51
53
  */
52
- export async function withTarget(options, context, fn, localOptions) {
54
+ export async function withService(options, context, fn, localOptions) {
53
55
  const resolved = resolveTargetFromOptions(options, context);
56
+ if (localOptions?.requireRemote && resolved.type === "local") {
57
+ throw new ArgumentError("'ad runs cancel' is only supported for remote execution targets. Use --profile <name> or --server <url>.");
58
+ }
54
59
  // localRoot 仅在 local 分支求值,避免远端模式下触发包寻址副作用
55
60
  const localRoot = resolved.type === "local"
56
61
  ? (typeof localOptions?.localRoot === "function" ? localOptions.localRoot() : localOptions?.localRoot) ??
57
62
  findProjectRoot() ??
58
63
  undefined
59
64
  : undefined;
60
- // 本地执行命令声明持有者身份时,向 App 层透传收割开关;
61
- // 查询命令保持缺省不传,存储以旁观模式打开
62
- const appRecoverOrphans = localOptions?.ownDataDir === true ? { recoverOrphans: true } : undefined;
63
- const target = await createActionDockTarget(resolved.type === "remote"
64
- ? {
65
- type: "remote",
65
+ const service = resolved.type === "remote"
66
+ ? await connectActionDock({
66
67
  serverUrl: resolved.serverUrl,
67
68
  token: resolved.token,
68
69
  insecure: resolved.insecure,
69
70
  allowInsecureHttp: resolved.allowInsecureHttp ?? options.allowInsecureHttp,
70
- }
71
- : {
71
+ })
72
+ : await createActionDock({
72
73
  type: "local",
73
74
  projectRoot: localRoot,
74
75
  customHome: context?.customHome,
@@ -81,33 +82,13 @@ export async function withTarget(options, context, fn, localOptions) {
81
82
  ...(localOptions?.scanLinkedPackages !== undefined
82
83
  ? { scanLinkedPackages: localOptions.scanLinkedPackages }
83
84
  : undefined),
84
- ...(appRecoverOrphans ? { recoverOrphans: true } : undefined),
85
+ ...(localOptions?.ownDataDir === true ? { recoverOrphans: true } : undefined),
85
86
  });
86
87
  try {
87
- await fn(target, resolved);
88
- }
89
- finally {
90
- await target.close();
91
- }
92
- }
93
- /**
94
- * 仅远端模式目标执行辅助:创建远端 Target 并保证资源释放。
95
- * 适用于 runs cancel 等明确要求远端目标的命令。
96
- */
97
- export async function withRemoteTarget(options, context, fn) {
98
- const resolved = resolveTargetFromOptions(options, context);
99
- const target = await createActionDockTarget({
100
- type: "remote",
101
- serverUrl: resolved.serverUrl,
102
- token: resolved.token,
103
- insecure: resolved.insecure,
104
- allowInsecureHttp: resolved.allowInsecureHttp ?? options.allowInsecureHttp,
105
- });
106
- try {
107
- await fn(target, resolved);
88
+ await fn(service, resolved);
108
89
  }
109
90
  finally {
110
- await target.close();
91
+ await service.close();
111
92
  }
112
93
  }
113
94
  /**
@@ -1,3 +1,35 @@
1
+ import { loadProjectConfig } from "@actiondock/core";
2
+ import { type ActionDockManifest, type ProjectTransaction } from "@actiondock/core/project";
3
+ /**
4
+ * 「未显式指定包且当前目录无工程」的统一补救提示(单一事实源)。
5
+ */
6
+ export declare const PACKAGE_HINT_MESSAGE = "Please specify -P, --package <id> or cd into a project directory.";
7
+ /**
8
+ * 远端目标拓扑的最小字段视图(与 core 的 ResolvedTarget 远端分支兼容)。
9
+ */
10
+ export interface RemoteTargetLike {
11
+ serverUrl?: string;
12
+ profileName?: string;
13
+ }
14
+ /**
15
+ * 拼接远端目标标题后缀(单一事实源)。
16
+ *
17
+ * 形如 `on remote server <url> (Profile: <name>)`,供列表类命令的
18
+ * 标题拼接复用(如 `Actions ${remoteTargetSuffix(target)}`),
19
+ * 消除五处同构模板漂移。
20
+ *
21
+ * @param resolved 目标拓扑解析结果(远端分支)
22
+ */
23
+ export declare function remoteTargetSuffix(resolved: RemoteTargetLike): string;
24
+ /**
25
+ * 拼接远端目标标题标签(单一事实源)。
26
+ *
27
+ * 形如 `Remote Server <url> (Profile: <name>)`,与 remoteTargetSuffix 共享
28
+ * 同一拼接实现,供 state、config 等直接以远端目标为标题主体的命令复用。
29
+ *
30
+ * @param resolved 目标拓扑解析结果(远端分支)
31
+ */
32
+ export declare function remoteTargetLabel(resolved: RemoteTargetLike): string;
1
33
  /**
2
34
  * 解析意图字符串(从显式 --intent 或位置模式参数聚合)。
3
35
  * 多个关键字使用 '|'(正则逻辑或)连接。
@@ -19,14 +51,82 @@ export declare function getTargetRoot(packageOption?: string, keyHint?: string):
19
51
  root: string;
20
52
  key: string;
21
53
  };
54
+ /**
55
+ * 包根目录寻址脚手架(单一事实源):显式指定包且寻址失败抛 packageNotFoundError,
56
+ * 未指定包且当前目录无工程抛 notInProjectError(附带 -P 补救提示)。
57
+ *
58
+ * 与 getTargetRoot 的差异:不消费 pkg/ 键前缀提示,寻址失败必抛错而非返回 null;
59
+ * 与 resolveLocalPackageRoot 的差异:后者保留 null 返回值供降级视图使用;
60
+ * 与 resolveLocalRunScope 的差异:后者在工程清单损坏时降级为链接包视图而非报错,语义不同不并入。
61
+ */
62
+ /** requirePackageRoot 的返回视图(未请求加载工程配置时仅含根目录)。 */
63
+ export interface PackageRootScope {
64
+ /** 目标包根目录 */
65
+ root: string;
66
+ }
67
+ /** requirePackageRoot 的返回视图(loadConfig 为真时附带非空工程配置)。 */
68
+ export interface PackageRootWithConfigScope {
69
+ /** 目标包根目录 */
70
+ root: string;
71
+ /** 目标工程配置(仅在 loadConfig 为真时返回,值恒存在) */
72
+ projConfig: ReturnType<typeof loadProjectConfig>;
73
+ }
74
+ /**
75
+ * 解析目标包根目录(重载入口:loadConfig 为真时一并返回工程配置)。
76
+ *
77
+ * @param packageOption 显式指定的包标识或路径(对应 -P, --package)
78
+ * @param options 可选项:loadConfig 请求加载工程配置;hint 覆盖无工程时的补救提示行
79
+ */
80
+ export declare function requirePackageRoot(packageOption: string | undefined, options: {
81
+ loadConfig: true;
82
+ hint?: string;
83
+ }): PackageRootWithConfigScope;
84
+ export declare function requirePackageRoot(packageOption: string | undefined, options?: {
85
+ loadConfig?: false;
86
+ hint?: string;
87
+ }): PackageRootScope;
88
+ /**
89
+ * 依赖类命令(ad add / ad remove)的工程根目录与清单解析脚手架(单一事实源)。
90
+ *
91
+ * 与 requirePackageRoot 的差异:-P 语义为工程目录路径而非包标识,
92
+ * 显式路径不做注册表寻址(不抛 packageNotFoundError,缺失清单由后续存在性检查报错)。
93
+ *
94
+ * @param packageOption 显式指定的工程目录路径(对应 -P, --package <path>)
95
+ * @returns 工程根目录与已验存的 actiondock.json 清单
96
+ */
97
+ export declare function requireProjectManifestRoot(packageOption: string | undefined): {
98
+ root: string;
99
+ manifest: ActionDockManifest;
100
+ };
101
+ /**
102
+ * 依赖事务失败回滚辅助(ad add / ad remove 共享):回滚事务后按统一规则透传异常。
103
+ *
104
+ * 回滚与包裹规则:
105
+ * - 先执行事务回滚快照,保留原始磁盘状态;
106
+ * - ActionDockError 与 CliError 原样透传(保留 code 与 details);
107
+ * - 其余包裹为 ExecutionError 并保留原始 code,缺省时回退 fallbackCode。
108
+ *
109
+ * @param tx 已开启的工程事务快照
110
+ * @param err 业务回调抛出的原始异常
111
+ * @param fallbackCode 包裹分支缺省错误码(命令专属,如 ADD_DEPENDENCY_FAILED)
112
+ */
113
+ export declare function rollbackAndRethrow(tx: ProjectTransaction, err: unknown, fallbackCode: string): Promise<never>;
22
114
  /**
23
115
  * 聚合命令自身选项与根程序全局选项(如 --json、--data-dir 等)。
24
116
  */
25
117
  export declare function getEffectiveOptions(rawOptions: any, cmd?: any): any;
26
118
  /**
27
119
  * 解析意图过滤回退策略。
28
- * 机器输出模式(--json)仅在显式传 --fallback 时回退,
120
+ *
121
+ * 统一事实源:机器输出模式(--json)仅在显式传 --fallback 时回退,
29
122
  * 人类交互模式默认回退(可被 --no-fallback 关闭)。
123
+ *
124
+ * 回退标志的显式性判定完全依据 Commander 解析结果(由调用方传入):
125
+ * 同时注册 --fallback 与 --no-fallback 的命令,未指定时 fallback 为
126
+ * undefined、显式 --fallback 为 true、--no-fallback 为 false,
127
+ * 不再直读 process.argv,消除隐藏的全局依赖。
128
+ *
129
+ * @param options 命令选项视图(含 fallback 与 json 字段)
30
130
  */
31
131
  export declare function resolveFallbackStrategy(options: {
32
132
  fallback?: boolean;