@actiondock/core 2.8.0 → 2.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +21 -1
- package/dist/errors.d.ts +5 -1
- package/dist/errors.js +2 -0
- package/dist/host/host.d.ts +2 -0
- package/dist/host/host.js +10 -0
- package/dist/host/types.d.ts +3 -0
- package/dist/index.d.ts +3 -1
- package/dist/index.js +3 -1
- package/dist/ipc/host.js +1 -0
- package/dist/ipc/service.js +3 -0
- package/dist/package/runtime.d.ts +3 -0
- package/dist/package/runtime.js +8 -0
- package/dist/package/types.d.ts +4 -0
- package/dist/platform/node.js +1 -0
- package/dist/platform/types.d.ts +3 -1
- package/dist/profile/client-runs.d.ts +10 -1
- package/dist/profile/client-runs.js +14 -1
- package/dist/profile/client.d.ts +1 -1
- package/dist/profile/client.js +1 -1
- package/dist/project/init.js +2 -2
- package/dist/project/types.d.ts +5 -0
- package/dist/server/index.d.ts +1 -0
- package/dist/server/index.js +1 -0
- package/dist/server/policy.d.ts +138 -0
- package/dist/server/policy.js +368 -0
- package/dist/server/routes/actions.js +86 -42
- package/dist/server/routes/common.d.ts +14 -25
- package/dist/server/routes/common.js +25 -21
- package/dist/server/routes/config.d.ts +1 -1
- package/dist/server/routes/config.js +8 -8
- package/dist/server/routes/doctor.js +4 -4
- package/dist/server/routes/health.js +2 -2
- package/dist/server/routes/info.js +6 -12
- package/dist/server/routes/playbooks.js +8 -8
- package/dist/server/routes/runs.js +111 -30
- package/dist/server/routes/state.d.ts +1 -1
- package/dist/server/routes/state.js +7 -7
- package/dist/server/security.d.ts +11 -0
- package/dist/server/security.js +36 -19
- package/dist/server/server.js +215 -30
- package/dist/server/types.d.ts +60 -2
- package/dist/service/local.js +3 -0
- package/dist/service/remote.js +16 -1
- package/dist/service/types.d.ts +4 -0
- package/dist/storage/index.d.ts +1 -0
- package/dist/storage/index.js +6 -1
- package/dist/storage/sqlite.d.ts +18 -1
- package/dist/storage/sqlite.js +159 -2
- package/dist/storage/types.d.ts +29 -0
- package/dist/storage/types.js +12 -0
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -56,7 +56,7 @@ Service -> Resolution -> PackageRuntime -> ExecutionService -> ActionRunner -> A
|
|
|
56
56
|
|
|
57
57
|
- 发现端口 `DiscoveryPort`:负责包与动作的元数据发现、清单检索、全文过滤与规程查询。
|
|
58
58
|
- 执行端口 `ExecutionPort`:负责动作的同步阻塞执行(`run`)与异步启动执行(`start`)。
|
|
59
|
-
- 运行端口 `RunsPort
|
|
59
|
+
- 运行端口 `RunsPort`:负责任务运行历史列表、单次详情查询、协同取消(`cancel`)以及历史记录清理与保留策略淘汰(`clearRuns`、`cleanExpiredRuns`)。
|
|
60
60
|
- 事件端口 `EventsPort`:负责任务执行实时事件流订阅。
|
|
61
61
|
- 配置端口 `ConfigPort`:负责运行时分层配置读取、持久化配置管理与环境变量满足度体检。
|
|
62
62
|
- 状态端口 `StatePort`:负责包级与动作级持久化键值存取、前缀列举与过期清理。
|
|
@@ -87,6 +87,26 @@ ActionDock 2.x 全面贯彻单一事实源设计,彻底杜绝各模块私自
|
|
|
87
87
|
|
|
88
88
|
---
|
|
89
89
|
|
|
90
|
+
## 微服务启动与访问控制
|
|
91
|
+
|
|
92
|
+
通过 `startActionDockServer` 启动 Node.js 原生 HTTP/HTTPS 微服务,提供标准 RESTful API 与统一内嵌 `/mcp` 端点:
|
|
93
|
+
|
|
94
|
+
- 服务配置参数(`ServerOptions`):
|
|
95
|
+
- `port`:监听端口(默认 5177)。
|
|
96
|
+
- `host`:监听地址(默认 127.0.0.1,监听非回环地址时强制要求配置 token)。
|
|
97
|
+
- `token`:服务访问鉴权令牌。
|
|
98
|
+
- `packageAllowlist`:允许访问执行的包标识白名单列表(为空允许全部)。
|
|
99
|
+
- `actionAllowlist`:允许访问执行的动作标识白名单列表(为空允许全部,支持短名 actionId 与全限定名 packageId/actionId)。
|
|
100
|
+
- `tls`:HTTPS 证书与私钥配置。
|
|
101
|
+
- `corsOrigins`:允许的跨域来源白名单。
|
|
102
|
+
- 权限交集与安全拦截:
|
|
103
|
+
- 同时配置 `packageAllowlist` 与 `actionAllowlist` 时取两者交集。
|
|
104
|
+
- 未在白名单中的动作详情调阅与执行请求均被严格拦截,返回 HTTP 403 状态码与 `ACTION_FORBIDDEN` 结构化错误。
|
|
105
|
+
- 历史运行记录查询、单次详情与取消操作同步实施白名单校验。
|
|
106
|
+
- 统一内嵌的 MCP 协议端点工具注册与任务扩展同样受白名单联动过滤。
|
|
107
|
+
|
|
108
|
+
---
|
|
109
|
+
|
|
90
110
|
## 数据目录锁与故障自愈
|
|
91
111
|
|
|
92
112
|
通过 `DataDirLock` 在数据目录下维护 `.actiondock.data.lock` 排他文件锁,记录宿主进程与受管子进程状态:
|
package/dist/errors.d.ts
CHANGED
|
@@ -98,6 +98,8 @@ export declare const SERVER_ERROR = "SERVER_ERROR";
|
|
|
98
98
|
export declare const BAD_REQUEST = "BAD_REQUEST";
|
|
99
99
|
/** 目标包未列入允许白名单(403 禁止访问) */
|
|
100
100
|
export declare const PACKAGE_FORBIDDEN = "PACKAGE_FORBIDDEN";
|
|
101
|
+
/** 目标动作未列入允许白名单(403 禁止访问) */
|
|
102
|
+
export declare const ACTION_FORBIDDEN = "ACTION_FORBIDDEN";
|
|
101
103
|
/** 目标规程未找到 */
|
|
102
104
|
export declare const PLAYBOOK_NOT_FOUND = "PLAYBOOK_NOT_FOUND";
|
|
103
105
|
/** 请求体体积超出安全限制 */
|
|
@@ -265,7 +267,9 @@ export declare class ActionDockError<T = any> extends Error {
|
|
|
265
267
|
/**
|
|
266
268
|
* 集中定义的标准结构化错误码联合类型。
|
|
267
269
|
*/
|
|
268
|
-
export type ErrorCode = typeof PACKAGE_NOT_FOUND | typeof ACTION_PACKAGE_VERSION_CONFLICT | typeof ACTION_NOT_FOUND | typeof ACTION_LOAD_FAILED | typeof ACTION_FAILED | typeof ACTION_TIMEOUT | typeof ACTION_CANCELLED | typeof INPUT_VALIDATION_FAILED | typeof OUTPUT_VALIDATION_FAILED | typeof INPUT_NOT_JSON | typeof OUTPUT_NOT_JSON | typeof ACTION_SUBRUN_LIMIT | typeof ACTION_CALL_CYCLE | typeof UNDECLARED_ACTION_DEPENDENCY | typeof INVALID_ACTION_REF | typeof IDEMPOTENCY_CONFLICT | typeof EXECUTION_FAILED | typeof UNHANDLED_EXECUTION_ERROR | typeof RUN_REPOSITORY_UNAVAILABLE | typeof RUN_PERSISTENCE_FAILED | typeof STANDALONE_ASYNC_UNSUPPORTED | typeof INVOCATION_UNSUPPORTED | typeof HOST_PROCESS_EXITED | typeof EXECUTION_ABORTED | typeof TIMEOUT | typeof SERVICE_CLOSED | typeof NETWORK_ERROR | typeof INSECURE_TRANSPORT | typeof REMOTE_REQUEST_FAILED | typeof REMOTE_STREAM_UNAVAILABLE | typeof CAPABILITY_UNAVAILABLE | typeof STATE_KEY_NOT_FOUND | typeof STORAGE_BUSY | typeof PROJECT_BUSY | typeof PROJECT_RECOVERY_REQUIRED | typeof STORAGE_WORKER_EXITED | typeof EVENT_BACKPRESSURE_LIMIT | typeof EVENT_CURSOR_EXPIRED | typeof PROCESS_OUTPUT_LIMIT | typeof PROCESS_SPAWN_ERROR | typeof PROCESS_CANCELLED | typeof PROCESS_TIMEOUT | typeof UNAUTHORIZED | typeof NOT_FOUND | typeof SERVER_ERROR | typeof BAD_REQUEST | typeof PACKAGE_FORBIDDEN | typeof PLAYBOOK_NOT_FOUND | typeof REQUEST_TOO_LARGE | typeof ACTION_START_FAILED | typeof ACTION_EXECUTION_ERROR | typeof ACTIONS_LIST_ERROR | typeof PLAYBOOKS_LIST_ERROR | typeof RUNS_LIST_ERROR | typeof RUNS_CLEAR_ERROR | typeof INFO_ERROR | typeof PACKAGES_INFO_ERROR | typeof DOCTOR_ERROR | typeof RUN_INTERRUPTED | typeof CONFIG_ENV_ERROR | typeof CONFIG_LIST_ERROR | typeof CONFIG_SET_ERROR | typeof CONFIG_DELETE_ERROR | typeof STATE_LIST_ERROR | typeof STATE_CLEAR_ERROR | typeof STATE_KEY_ERROR | typeof DATA_DIR_IN_USE | typeof DATA_DIR_RECOVERY_REQUIRED | typeof UNSUPPORTED_STORAGE_SCHEMA | typeof STORED_ERROR_DECODE_FAILED | typeof PROCESS_FAILED | typeof GENERATED_TYPES_OUTDATED | typeof PROTOCOL_UNSUPPORTED | typeof SERVICE_RESULT_UNKNOWN | typeof MCP_TOOL_NAME_COLLISION | typeof ACCESS_DENIED | typeof UNSUPPORTED_CAPABILITY | typeof CONTROL_BUSY | typeof CONTROL_EXPIRED | typeof CONTROL_REVOKED | typeof PROCESS_QUARANTINED | typeof PROCESS_LOST | typeof REQUEST_CONFLICT | typeof INPUT_OUTCOME_UNKNOWN | typeof OUTPUT_GAP | typeof OUTPUT_UNAVAILABLE | typeof INVALID_CURSOR | typeof QUEUE_FULL | typeof QUOTA_EXCEEDED | typeof INPUT_CLOSED | typeof INVALID_FLAT_ARGUMENT | typeof INVALID_JSON | typeof INVALID_JSON_LITERAL | typeof INPUT_PATH_CONFLICT | typeof FLAT_INPUT_LIMIT_EXCEEDED | typeof INPUT_LIMIT_EXCEEDED | typeof INPUT_POLICY_VIOLATION | typeof INPUT_CONFLICT | typeof INPUT_FILE_NOT_FOUND | typeof INPUT_FILE_READ_FAILED | typeof INVALID_ARGUMENT | typeof PACKAGE_NOT_ALLOWED | typeof INVALID_PACKAGE_ID | typeof PATH_TRAVERSAL | typeof AMBIGUOUS_STATE_KEY | typeof RUN_NOT_FOUND | typeof RUN_ALREADY_FINISHED | typeof IPC_ERROR | typeof SERVICE_ERROR;
|
|
270
|
+
export type ErrorCode = typeof PACKAGE_NOT_FOUND | typeof ACTION_PACKAGE_VERSION_CONFLICT | typeof ACTION_NOT_FOUND | typeof ACTION_LOAD_FAILED | typeof ACTION_FAILED | typeof ACTION_TIMEOUT | typeof ACTION_CANCELLED | typeof INPUT_VALIDATION_FAILED | typeof OUTPUT_VALIDATION_FAILED | typeof INPUT_NOT_JSON | typeof OUTPUT_NOT_JSON | typeof ACTION_SUBRUN_LIMIT | typeof ACTION_CALL_CYCLE | typeof UNDECLARED_ACTION_DEPENDENCY | typeof INVALID_ACTION_REF | typeof IDEMPOTENCY_CONFLICT | typeof EXECUTION_FAILED | typeof UNHANDLED_EXECUTION_ERROR | typeof RUN_REPOSITORY_UNAVAILABLE | typeof RUN_PERSISTENCE_FAILED | typeof STANDALONE_ASYNC_UNSUPPORTED | typeof INVOCATION_UNSUPPORTED | typeof HOST_PROCESS_EXITED | typeof EXECUTION_ABORTED | typeof TIMEOUT | typeof SERVICE_CLOSED | typeof NETWORK_ERROR | typeof INSECURE_TRANSPORT | typeof REMOTE_REQUEST_FAILED | typeof REMOTE_STREAM_UNAVAILABLE | typeof CAPABILITY_UNAVAILABLE | typeof STATE_KEY_NOT_FOUND | typeof STORAGE_BUSY | typeof PROJECT_BUSY | typeof PROJECT_RECOVERY_REQUIRED | typeof STORAGE_WORKER_EXITED | typeof EVENT_BACKPRESSURE_LIMIT | typeof EVENT_CURSOR_EXPIRED | typeof PROCESS_OUTPUT_LIMIT | typeof PROCESS_SPAWN_ERROR | typeof PROCESS_CANCELLED | typeof PROCESS_TIMEOUT | typeof UNAUTHORIZED | typeof NOT_FOUND | typeof SERVER_ERROR | typeof BAD_REQUEST | typeof PACKAGE_FORBIDDEN | typeof ACTION_FORBIDDEN | typeof PLAYBOOK_NOT_FOUND | typeof REQUEST_TOO_LARGE | typeof ACTION_START_FAILED | typeof ACTION_EXECUTION_ERROR | typeof ACTIONS_LIST_ERROR | typeof PLAYBOOKS_LIST_ERROR | typeof RUNS_LIST_ERROR | typeof RUNS_CLEAR_ERROR | typeof INFO_ERROR | typeof PACKAGES_INFO_ERROR | typeof DOCTOR_ERROR | typeof RUN_INTERRUPTED | typeof CONFIG_ENV_ERROR | typeof CONFIG_LIST_ERROR | typeof CONFIG_SET_ERROR | typeof CONFIG_DELETE_ERROR | typeof STATE_LIST_ERROR | typeof STATE_CLEAR_ERROR | typeof STATE_KEY_ERROR | typeof DATA_DIR_IN_USE | typeof DATA_DIR_RECOVERY_REQUIRED | typeof UNSUPPORTED_STORAGE_SCHEMA | typeof STORED_ERROR_DECODE_FAILED | typeof PROCESS_FAILED | typeof GENERATED_TYPES_OUTDATED | typeof PROTOCOL_UNSUPPORTED | typeof SERVICE_RESULT_UNKNOWN | typeof MCP_TOOL_NAME_COLLISION | typeof ACCESS_DENIED | typeof UNSUPPORTED_CAPABILITY | typeof CONTROL_BUSY | typeof CONTROL_EXPIRED | typeof CONTROL_REVOKED | typeof PROCESS_QUARANTINED | typeof PROCESS_LOST | typeof REQUEST_CONFLICT | typeof INPUT_OUTCOME_UNKNOWN | typeof OUTPUT_GAP | typeof OUTPUT_UNAVAILABLE | typeof INVALID_CURSOR | typeof QUEUE_FULL | typeof QUOTA_EXCEEDED | typeof INPUT_CLOSED | typeof INVALID_FLAT_ARGUMENT | typeof INVALID_JSON | typeof INVALID_JSON_LITERAL | typeof INPUT_PATH_CONFLICT | typeof FLAT_INPUT_LIMIT_EXCEEDED | typeof INPUT_LIMIT_EXCEEDED | typeof INPUT_POLICY_VIOLATION | typeof INPUT_CONFLICT | typeof INPUT_FILE_NOT_FOUND | typeof INPUT_FILE_READ_FAILED | typeof INVALID_ARGUMENT | typeof PACKAGE_NOT_ALLOWED | typeof INVALID_PACKAGE_ID | typeof PATH_TRAVERSAL | typeof AMBIGUOUS_STATE_KEY | typeof RUN_NOT_FOUND | typeof RUN_ALREADY_FINISHED | typeof IPC_ERROR | typeof SERVICE_ERROR;
|
|
271
|
+
/** 全仓统一错误码类型别名 */
|
|
272
|
+
export type ActionDockErrorCode = ErrorCode;
|
|
269
273
|
/**
|
|
270
274
|
* 进程领域结构化异常类。
|
|
271
275
|
*/
|
package/dist/errors.js
CHANGED
|
@@ -98,6 +98,8 @@ export const SERVER_ERROR = "SERVER_ERROR";
|
|
|
98
98
|
export const BAD_REQUEST = "BAD_REQUEST";
|
|
99
99
|
/** 目标包未列入允许白名单(403 禁止访问) */
|
|
100
100
|
export const PACKAGE_FORBIDDEN = "PACKAGE_FORBIDDEN";
|
|
101
|
+
/** 目标动作未列入允许白名单(403 禁止访问) */
|
|
102
|
+
export const ACTION_FORBIDDEN = "ACTION_FORBIDDEN";
|
|
101
103
|
/** 目标规程未找到 */
|
|
102
104
|
export const PLAYBOOK_NOT_FOUND = "PLAYBOOK_NOT_FOUND";
|
|
103
105
|
/** 请求体体积超出安全限制 */
|
package/dist/host/host.d.ts
CHANGED
|
@@ -91,7 +91,9 @@ export declare class DefaultActionDockHost implements ActionDockHost {
|
|
|
91
91
|
actionId?: string;
|
|
92
92
|
status?: string;
|
|
93
93
|
olderThanMs?: number;
|
|
94
|
+
keep?: number;
|
|
94
95
|
}): Promise<number>;
|
|
96
|
+
cleanExpiredRuns(policy?: import("../storage/types.js").RunsRetentionPolicy): Promise<number>;
|
|
95
97
|
cancelRun(runId: string, reason?: string): Promise<CancelResult>;
|
|
96
98
|
events(runId: string, options?: {
|
|
97
99
|
after?: number | string;
|
package/dist/host/host.js
CHANGED
|
@@ -684,6 +684,16 @@ export class DefaultActionDockHost {
|
|
|
684
684
|
}
|
|
685
685
|
return total;
|
|
686
686
|
}
|
|
687
|
+
async cleanExpiredRuns(policy) {
|
|
688
|
+
let total = 0;
|
|
689
|
+
for (const runtime of this.listRuntimes()) {
|
|
690
|
+
if (typeof runtime.cleanExpiredRuns === "function") {
|
|
691
|
+
const res = await runtime.cleanExpiredRuns(policy);
|
|
692
|
+
total += res;
|
|
693
|
+
}
|
|
694
|
+
}
|
|
695
|
+
return total;
|
|
696
|
+
}
|
|
687
697
|
async cancelRun(runId, reason) {
|
|
688
698
|
for (const runtime of this.listRuntimes()) {
|
|
689
699
|
const res = await runtime.cancelRun(runId, reason);
|
package/dist/host/types.d.ts
CHANGED
|
@@ -80,7 +80,10 @@ export interface ActionDockHost {
|
|
|
80
80
|
actionId?: string;
|
|
81
81
|
status?: string;
|
|
82
82
|
olderThanMs?: number;
|
|
83
|
+
keep?: number;
|
|
83
84
|
}): Promise<number>;
|
|
85
|
+
/** 按保留策略清理所有运行时中的过期及超额终态运行记录 */
|
|
86
|
+
cleanExpiredRuns(policy?: import("../storage/types.js").RunsRetentionPolicy): Promise<number>;
|
|
84
87
|
/** 取消指定在运行的任务 */
|
|
85
88
|
cancelRun(runId: string, reason?: string): Promise<CancelResult>;
|
|
86
89
|
/** 订阅指定运行的事件流 */
|
package/dist/index.d.ts
CHANGED
|
@@ -8,6 +8,8 @@
|
|
|
8
8
|
export { ACTIONDOCK_VERSION } from "./version.js";
|
|
9
9
|
export { createActionDock, connectActionDock, } from "./service/factory.js";
|
|
10
10
|
export type { ActionDockService, ActionDockService as ActionDock, DiscoveryPort, ExecutionPort, RunsPort, EventsPort, RunEventSubscriptionOptions, ConfigPort, StatePort, CreateActionDockOptions, ConnectActionDockOptions, RemoteServiceOptions, ConfigValueView, ListRunsOptions, StateScopeOptions, } from "./service/types.js";
|
|
11
|
+
export { DEFAULT_RUNS_RETENTION_MS, DEFAULT_MAX_RUNS_PER_PACKAGE, DEFAULT_MIN_RETAIN_RUNS, type RunsRetentionPolicy, } from "./storage/types.js";
|
|
12
|
+
export { parseDuration } from "./utils/index.js";
|
|
11
13
|
export type { ActionRef, ResolvedActionRef, ExecutionResult, RunRecord, ExecutionEvent, } from "@actiondock/sdk";
|
|
12
14
|
export type { RunOptions, ExecutionTicket, CancelResult, } from "./execution/types.js";
|
|
13
15
|
export type { ActionSpec, ActionSummary, PlaybookSpec, PlaybookSummary, PackageInfo, ListActionsOptions, } from "./package/types.js";
|
|
@@ -18,4 +20,4 @@ export { initProject } from "./project/init.js";
|
|
|
18
20
|
export { loadProjectConfig, findProjectRoot, } from "./project/loader.js";
|
|
19
21
|
export type { ProjectConfig, } from "./project/types.js";
|
|
20
22
|
export type { PackageGraph, } from "./catalog/graph.js";
|
|
21
|
-
export { ActionDockError, ProcessError, type ErrorCode, PACKAGE_NOT_FOUND, ACTION_PACKAGE_VERSION_CONFLICT, ACTION_NOT_FOUND, ACTION_LOAD_FAILED, ACTION_FAILED, ACTION_TIMEOUT, ACTION_CANCELLED, INPUT_VALIDATION_FAILED, OUTPUT_VALIDATION_FAILED, INPUT_NOT_JSON, OUTPUT_NOT_JSON, ACTION_SUBRUN_LIMIT, ACTION_CALL_CYCLE, UNDECLARED_ACTION_DEPENDENCY, INVALID_ACTION_REF, IDEMPOTENCY_CONFLICT, EXECUTION_FAILED, UNHANDLED_EXECUTION_ERROR, RUN_REPOSITORY_UNAVAILABLE, RUN_PERSISTENCE_FAILED, STANDALONE_ASYNC_UNSUPPORTED, INVOCATION_UNSUPPORTED, HOST_PROCESS_EXITED, EXECUTION_ABORTED, TIMEOUT, NETWORK_ERROR, REMOTE_STREAM_UNAVAILABLE, CAPABILITY_UNAVAILABLE, STATE_KEY_NOT_FOUND, STORAGE_BUSY, PROJECT_BUSY, PROJECT_RECOVERY_REQUIRED, STORAGE_WORKER_EXITED, EVENT_BACKPRESSURE_LIMIT, EVENT_CURSOR_EXPIRED, PROCESS_OUTPUT_LIMIT, PROCESS_SPAWN_ERROR, PROCESS_CANCELLED, PROCESS_TIMEOUT, UNAUTHORIZED, NOT_FOUND, SERVER_ERROR, BAD_REQUEST, PACKAGE_FORBIDDEN, PLAYBOOK_NOT_FOUND, REQUEST_TOO_LARGE, ACTION_START_FAILED, ACTION_EXECUTION_ERROR, ACTIONS_LIST_ERROR, PLAYBOOKS_LIST_ERROR, RUNS_LIST_ERROR, RUNS_CLEAR_ERROR, INFO_ERROR, PACKAGES_INFO_ERROR, DOCTOR_ERROR, RUN_INTERRUPTED, CONFIG_ENV_ERROR, CONFIG_LIST_ERROR, CONFIG_SET_ERROR, CONFIG_DELETE_ERROR, STATE_LIST_ERROR, STATE_CLEAR_ERROR, STATE_KEY_ERROR, DATA_DIR_IN_USE, DATA_DIR_RECOVERY_REQUIRED, UNSUPPORTED_STORAGE_SCHEMA, STORED_ERROR_DECODE_FAILED, PROCESS_FAILED, GENERATED_TYPES_OUTDATED, PROTOCOL_UNSUPPORTED, SERVICE_RESULT_UNKNOWN, MCP_TOOL_NAME_COLLISION, ACCESS_DENIED, UNSUPPORTED_CAPABILITY, CONTROL_BUSY, CONTROL_EXPIRED, CONTROL_REVOKED, PROCESS_QUARANTINED, PROCESS_LOST, REQUEST_CONFLICT, INPUT_OUTCOME_UNKNOWN, OUTPUT_GAP, OUTPUT_UNAVAILABLE, INVALID_CURSOR, QUEUE_FULL, QUOTA_EXCEEDED, INPUT_CLOSED, INVALID_FLAT_ARGUMENT, INVALID_JSON, INVALID_JSON_LITERAL, INPUT_PATH_CONFLICT, FLAT_INPUT_LIMIT_EXCEEDED, INPUT_LIMIT_EXCEEDED, INPUT_POLICY_VIOLATION, INPUT_CONFLICT, INPUT_FILE_NOT_FOUND, INPUT_FILE_READ_FAILED, INVALID_ARGUMENT, PACKAGE_NOT_ALLOWED, INVALID_PACKAGE_ID, PATH_TRAVERSAL, AMBIGUOUS_STATE_KEY, RUN_NOT_FOUND, RUN_ALREADY_FINISHED, IPC_ERROR, } from "./errors.js";
|
|
23
|
+
export { ActionDockError, ProcessError, type ErrorCode, type ActionDockErrorCode, PACKAGE_NOT_FOUND, ACTION_PACKAGE_VERSION_CONFLICT, ACTION_NOT_FOUND, ACTION_LOAD_FAILED, ACTION_FAILED, ACTION_TIMEOUT, ACTION_CANCELLED, INPUT_VALIDATION_FAILED, OUTPUT_VALIDATION_FAILED, INPUT_NOT_JSON, OUTPUT_NOT_JSON, ACTION_SUBRUN_LIMIT, ACTION_CALL_CYCLE, UNDECLARED_ACTION_DEPENDENCY, INVALID_ACTION_REF, IDEMPOTENCY_CONFLICT, EXECUTION_FAILED, UNHANDLED_EXECUTION_ERROR, RUN_REPOSITORY_UNAVAILABLE, RUN_PERSISTENCE_FAILED, STANDALONE_ASYNC_UNSUPPORTED, INVOCATION_UNSUPPORTED, HOST_PROCESS_EXITED, EXECUTION_ABORTED, TIMEOUT, NETWORK_ERROR, REMOTE_STREAM_UNAVAILABLE, CAPABILITY_UNAVAILABLE, STATE_KEY_NOT_FOUND, STORAGE_BUSY, PROJECT_BUSY, PROJECT_RECOVERY_REQUIRED, STORAGE_WORKER_EXITED, EVENT_BACKPRESSURE_LIMIT, EVENT_CURSOR_EXPIRED, PROCESS_OUTPUT_LIMIT, PROCESS_SPAWN_ERROR, PROCESS_CANCELLED, PROCESS_TIMEOUT, UNAUTHORIZED, NOT_FOUND, SERVER_ERROR, BAD_REQUEST, PACKAGE_FORBIDDEN, ACTION_FORBIDDEN, PLAYBOOK_NOT_FOUND, REQUEST_TOO_LARGE, ACTION_START_FAILED, ACTION_EXECUTION_ERROR, ACTIONS_LIST_ERROR, PLAYBOOKS_LIST_ERROR, RUNS_LIST_ERROR, RUNS_CLEAR_ERROR, INFO_ERROR, PACKAGES_INFO_ERROR, DOCTOR_ERROR, RUN_INTERRUPTED, CONFIG_ENV_ERROR, CONFIG_LIST_ERROR, CONFIG_SET_ERROR, CONFIG_DELETE_ERROR, STATE_LIST_ERROR, STATE_CLEAR_ERROR, STATE_KEY_ERROR, DATA_DIR_IN_USE, DATA_DIR_RECOVERY_REQUIRED, UNSUPPORTED_STORAGE_SCHEMA, STORED_ERROR_DECODE_FAILED, PROCESS_FAILED, GENERATED_TYPES_OUTDATED, PROTOCOL_UNSUPPORTED, SERVICE_RESULT_UNKNOWN, MCP_TOOL_NAME_COLLISION, ACCESS_DENIED, UNSUPPORTED_CAPABILITY, CONTROL_BUSY, CONTROL_EXPIRED, CONTROL_REVOKED, PROCESS_QUARANTINED, PROCESS_LOST, REQUEST_CONFLICT, INPUT_OUTCOME_UNKNOWN, OUTPUT_GAP, OUTPUT_UNAVAILABLE, INVALID_CURSOR, QUEUE_FULL, QUOTA_EXCEEDED, INPUT_CLOSED, INVALID_FLAT_ARGUMENT, INVALID_JSON, INVALID_JSON_LITERAL, INPUT_PATH_CONFLICT, FLAT_INPUT_LIMIT_EXCEEDED, INPUT_LIMIT_EXCEEDED, INPUT_POLICY_VIOLATION, INPUT_CONFLICT, INPUT_FILE_NOT_FOUND, INPUT_FILE_READ_FAILED, INVALID_ARGUMENT, PACKAGE_NOT_ALLOWED, INVALID_PACKAGE_ID, PATH_TRAVERSAL, AMBIGUOUS_STATE_KEY, RUN_NOT_FOUND, RUN_ALREADY_FINISHED, IPC_ERROR, } from "./errors.js";
|
package/dist/index.js
CHANGED
|
@@ -9,6 +9,8 @@
|
|
|
9
9
|
export { ACTIONDOCK_VERSION } from "./version.js";
|
|
10
10
|
// 2. 统一服务门面与聚合契约接口
|
|
11
11
|
export { createActionDock, connectActionDock, } from "./service/factory.js";
|
|
12
|
+
export { DEFAULT_RUNS_RETENTION_MS, DEFAULT_MAX_RUNS_PER_PACKAGE, DEFAULT_MIN_RETAIN_RUNS, } from "./storage/types.js";
|
|
13
|
+
export { parseDuration } from "./utils/index.js";
|
|
12
14
|
// 5. 原生平台装配与服务启动
|
|
13
15
|
export { createNodePlatform, } from "./platform/node.js";
|
|
14
16
|
export { startActionDockServer, } from "./server/server.js";
|
|
@@ -16,4 +18,4 @@ export { startActionDockServer, } from "./server/server.js";
|
|
|
16
18
|
export { initProject } from "./project/init.js";
|
|
17
19
|
export { loadProjectConfig, findProjectRoot, } from "./project/loader.js";
|
|
18
20
|
// 8. 统一错误模型与核心标准错误码常量
|
|
19
|
-
export { ActionDockError, ProcessError, PACKAGE_NOT_FOUND, ACTION_PACKAGE_VERSION_CONFLICT, ACTION_NOT_FOUND, ACTION_LOAD_FAILED, ACTION_FAILED, ACTION_TIMEOUT, ACTION_CANCELLED, INPUT_VALIDATION_FAILED, OUTPUT_VALIDATION_FAILED, INPUT_NOT_JSON, OUTPUT_NOT_JSON, ACTION_SUBRUN_LIMIT, ACTION_CALL_CYCLE, UNDECLARED_ACTION_DEPENDENCY, INVALID_ACTION_REF, IDEMPOTENCY_CONFLICT, EXECUTION_FAILED, UNHANDLED_EXECUTION_ERROR, RUN_REPOSITORY_UNAVAILABLE, RUN_PERSISTENCE_FAILED, STANDALONE_ASYNC_UNSUPPORTED, INVOCATION_UNSUPPORTED, HOST_PROCESS_EXITED, EXECUTION_ABORTED, TIMEOUT, NETWORK_ERROR, REMOTE_STREAM_UNAVAILABLE, CAPABILITY_UNAVAILABLE, STATE_KEY_NOT_FOUND, STORAGE_BUSY, PROJECT_BUSY, PROJECT_RECOVERY_REQUIRED, STORAGE_WORKER_EXITED, EVENT_BACKPRESSURE_LIMIT, EVENT_CURSOR_EXPIRED, PROCESS_OUTPUT_LIMIT, PROCESS_SPAWN_ERROR, PROCESS_CANCELLED, PROCESS_TIMEOUT, UNAUTHORIZED, NOT_FOUND, SERVER_ERROR, BAD_REQUEST, PACKAGE_FORBIDDEN, PLAYBOOK_NOT_FOUND, REQUEST_TOO_LARGE, ACTION_START_FAILED, ACTION_EXECUTION_ERROR, ACTIONS_LIST_ERROR, PLAYBOOKS_LIST_ERROR, RUNS_LIST_ERROR, RUNS_CLEAR_ERROR, INFO_ERROR, PACKAGES_INFO_ERROR, DOCTOR_ERROR, RUN_INTERRUPTED, CONFIG_ENV_ERROR, CONFIG_LIST_ERROR, CONFIG_SET_ERROR, CONFIG_DELETE_ERROR, STATE_LIST_ERROR, STATE_CLEAR_ERROR, STATE_KEY_ERROR, DATA_DIR_IN_USE, DATA_DIR_RECOVERY_REQUIRED, UNSUPPORTED_STORAGE_SCHEMA, STORED_ERROR_DECODE_FAILED, PROCESS_FAILED, GENERATED_TYPES_OUTDATED, PROTOCOL_UNSUPPORTED, SERVICE_RESULT_UNKNOWN, MCP_TOOL_NAME_COLLISION, ACCESS_DENIED, UNSUPPORTED_CAPABILITY, CONTROL_BUSY, CONTROL_EXPIRED, CONTROL_REVOKED, PROCESS_QUARANTINED, PROCESS_LOST, REQUEST_CONFLICT, INPUT_OUTCOME_UNKNOWN, OUTPUT_GAP, OUTPUT_UNAVAILABLE, INVALID_CURSOR, QUEUE_FULL, QUOTA_EXCEEDED, INPUT_CLOSED, INVALID_FLAT_ARGUMENT, INVALID_JSON, INVALID_JSON_LITERAL, INPUT_PATH_CONFLICT, FLAT_INPUT_LIMIT_EXCEEDED, INPUT_LIMIT_EXCEEDED, INPUT_POLICY_VIOLATION, INPUT_CONFLICT, INPUT_FILE_NOT_FOUND, INPUT_FILE_READ_FAILED, INVALID_ARGUMENT, PACKAGE_NOT_ALLOWED, INVALID_PACKAGE_ID, PATH_TRAVERSAL, AMBIGUOUS_STATE_KEY, RUN_NOT_FOUND, RUN_ALREADY_FINISHED, IPC_ERROR, } from "./errors.js";
|
|
21
|
+
export { ActionDockError, ProcessError, PACKAGE_NOT_FOUND, ACTION_PACKAGE_VERSION_CONFLICT, ACTION_NOT_FOUND, ACTION_LOAD_FAILED, ACTION_FAILED, ACTION_TIMEOUT, ACTION_CANCELLED, INPUT_VALIDATION_FAILED, OUTPUT_VALIDATION_FAILED, INPUT_NOT_JSON, OUTPUT_NOT_JSON, ACTION_SUBRUN_LIMIT, ACTION_CALL_CYCLE, UNDECLARED_ACTION_DEPENDENCY, INVALID_ACTION_REF, IDEMPOTENCY_CONFLICT, EXECUTION_FAILED, UNHANDLED_EXECUTION_ERROR, RUN_REPOSITORY_UNAVAILABLE, RUN_PERSISTENCE_FAILED, STANDALONE_ASYNC_UNSUPPORTED, INVOCATION_UNSUPPORTED, HOST_PROCESS_EXITED, EXECUTION_ABORTED, TIMEOUT, NETWORK_ERROR, REMOTE_STREAM_UNAVAILABLE, CAPABILITY_UNAVAILABLE, STATE_KEY_NOT_FOUND, STORAGE_BUSY, PROJECT_BUSY, PROJECT_RECOVERY_REQUIRED, STORAGE_WORKER_EXITED, EVENT_BACKPRESSURE_LIMIT, EVENT_CURSOR_EXPIRED, PROCESS_OUTPUT_LIMIT, PROCESS_SPAWN_ERROR, PROCESS_CANCELLED, PROCESS_TIMEOUT, UNAUTHORIZED, NOT_FOUND, SERVER_ERROR, BAD_REQUEST, PACKAGE_FORBIDDEN, ACTION_FORBIDDEN, PLAYBOOK_NOT_FOUND, REQUEST_TOO_LARGE, ACTION_START_FAILED, ACTION_EXECUTION_ERROR, ACTIONS_LIST_ERROR, PLAYBOOKS_LIST_ERROR, RUNS_LIST_ERROR, RUNS_CLEAR_ERROR, INFO_ERROR, PACKAGES_INFO_ERROR, DOCTOR_ERROR, RUN_INTERRUPTED, CONFIG_ENV_ERROR, CONFIG_LIST_ERROR, CONFIG_SET_ERROR, CONFIG_DELETE_ERROR, STATE_LIST_ERROR, STATE_CLEAR_ERROR, STATE_KEY_ERROR, DATA_DIR_IN_USE, DATA_DIR_RECOVERY_REQUIRED, UNSUPPORTED_STORAGE_SCHEMA, STORED_ERROR_DECODE_FAILED, PROCESS_FAILED, GENERATED_TYPES_OUTDATED, PROTOCOL_UNSUPPORTED, SERVICE_RESULT_UNKNOWN, MCP_TOOL_NAME_COLLISION, ACCESS_DENIED, UNSUPPORTED_CAPABILITY, CONTROL_BUSY, CONTROL_EXPIRED, CONTROL_REVOKED, PROCESS_QUARANTINED, PROCESS_LOST, REQUEST_CONFLICT, INPUT_OUTCOME_UNKNOWN, OUTPUT_GAP, OUTPUT_UNAVAILABLE, INVALID_CURSOR, QUEUE_FULL, QUOTA_EXCEEDED, INPUT_CLOSED, INVALID_FLAT_ARGUMENT, INVALID_JSON, INVALID_JSON_LITERAL, INPUT_PATH_CONFLICT, FLAT_INPUT_LIMIT_EXCEEDED, INPUT_LIMIT_EXCEEDED, INPUT_POLICY_VIOLATION, INPUT_CONFLICT, INPUT_FILE_NOT_FOUND, INPUT_FILE_READ_FAILED, INVALID_ARGUMENT, PACKAGE_NOT_ALLOWED, INVALID_PACKAGE_ID, PATH_TRAVERSAL, AMBIGUOUS_STATE_KEY, RUN_NOT_FOUND, RUN_ALREADY_FINISHED, IPC_ERROR, } from "./errors.js";
|
package/dist/ipc/host.js
CHANGED
|
@@ -20,6 +20,7 @@ const IPC_METHOD_HANDLERS = {
|
|
|
20
20
|
getRun: async (service, a) => service.runs.get(a[0]),
|
|
21
21
|
cancelRun: async (service, a) => service.runs.cancel(a[0], a[1]),
|
|
22
22
|
clearRuns: async (service, a) => service.runs.clear ? await service.runs.clear(a[0]) : 0,
|
|
23
|
+
cleanExpiredRuns: async (service, a) => service.runs.cleanExpired ? await service.runs.cleanExpired(a[0]) : 0,
|
|
23
24
|
getConfig: async (service, a) => service.management?.config.get(a[0], a[1]),
|
|
24
25
|
setConfig: async (service, a) => service.management?.config.set(a[0], a[1], a[2]),
|
|
25
26
|
deleteConfig: async (service, a) => service.management?.config.delete(a[0], a[1]),
|
package/dist/ipc/service.js
CHANGED
|
@@ -184,6 +184,9 @@ export class IpcActionDockService {
|
|
|
184
184
|
async clear(opts) {
|
|
185
185
|
return forward("clearRuns", [opts]);
|
|
186
186
|
},
|
|
187
|
+
async cleanExpired(policy) {
|
|
188
|
+
return forward("cleanExpiredRuns", [policy]);
|
|
189
|
+
},
|
|
187
190
|
};
|
|
188
191
|
if (options.enableManagement !== false) {
|
|
189
192
|
this.management = {
|
|
@@ -97,7 +97,10 @@ export declare class DefaultPackageRuntime implements HostManagedPackageRuntime
|
|
|
97
97
|
clearRuns(options?: {
|
|
98
98
|
actionId?: string;
|
|
99
99
|
status?: string;
|
|
100
|
+
olderThanMs?: number;
|
|
101
|
+
keep?: number;
|
|
100
102
|
}): Promise<number>;
|
|
103
|
+
cleanExpiredRuns(policy?: import("../storage/types.js").RunsRetentionPolicy): Promise<number>;
|
|
101
104
|
listStateEntries(options?: any): Promise<import("../storage/types.js").StateEntry[]>;
|
|
102
105
|
close(options?: {
|
|
103
106
|
graceMs?: number;
|
package/dist/package/runtime.js
CHANGED
|
@@ -581,8 +581,16 @@ export class DefaultPackageRuntime {
|
|
|
581
581
|
return this.storage.clearRuns({
|
|
582
582
|
actionId: options?.actionId,
|
|
583
583
|
status: options?.status,
|
|
584
|
+
olderThanMs: options?.olderThanMs,
|
|
585
|
+
keep: options?.keep,
|
|
584
586
|
});
|
|
585
587
|
}
|
|
588
|
+
async cleanExpiredRuns(policy) {
|
|
589
|
+
if (typeof this.storage.cleanExpiredRuns === "function") {
|
|
590
|
+
return this.storage.cleanExpiredRuns(policy);
|
|
591
|
+
}
|
|
592
|
+
return 0;
|
|
593
|
+
}
|
|
586
594
|
async listStateEntries(options) {
|
|
587
595
|
if (typeof this.storage.listStateEntries === "function") {
|
|
588
596
|
return this.storage.listStateEntries(options);
|
package/dist/package/types.d.ts
CHANGED
|
@@ -268,7 +268,11 @@ export interface PackageRuntime {
|
|
|
268
268
|
clearRuns(options?: {
|
|
269
269
|
actionId?: string;
|
|
270
270
|
status?: string;
|
|
271
|
+
olderThanMs?: number;
|
|
272
|
+
keep?: number;
|
|
271
273
|
}): Promise<number>;
|
|
274
|
+
/** 按保留策略清理过期及超额的终态运行记录(基于时间与数量策略) */
|
|
275
|
+
cleanExpiredRuns?(policy?: import("../storage/types.js").RunsRetentionPolicy): Promise<number>;
|
|
272
276
|
/** 订阅指定运行的事件流 */
|
|
273
277
|
events(runId: string, options?: {
|
|
274
278
|
after?: number | string;
|
package/dist/platform/node.js
CHANGED
package/dist/platform/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ProcessAPI } from "@actiondock/sdk";
|
|
2
2
|
import type { Clock } from "../runtime/clock.js";
|
|
3
3
|
import type { ModuleLoader } from "../runtime/module-loader.js";
|
|
4
|
-
import type { RuntimeStorage } from "../storage/types.js";
|
|
4
|
+
import type { RunsRetentionPolicy, RuntimeStorage } from "../storage/types.js";
|
|
5
5
|
/**
|
|
6
6
|
* 文件元数据信息契约。
|
|
7
7
|
*/
|
|
@@ -58,6 +58,8 @@ export interface StorageFactoryOptions {
|
|
|
58
58
|
* 默认 false(旁观查询打开,不触碰在途记录),供 CLI 查询命令与执行宿主并发共存。
|
|
59
59
|
*/
|
|
60
60
|
recoverOrphans?: boolean;
|
|
61
|
+
/** 运行记录保留策略配置 */
|
|
62
|
+
retentionPolicy?: RunsRetentionPolicy;
|
|
61
63
|
}
|
|
62
64
|
/**
|
|
63
65
|
* 跨运行时全局存储工厂配置选项。
|
|
@@ -30,13 +30,22 @@ export declare function fetchRemoteRuns(serverUrl: string, token?: string, optio
|
|
|
30
30
|
items: RunRecord[];
|
|
31
31
|
}>;
|
|
32
32
|
/**
|
|
33
|
-
* 清空远端运行记录(可按包、Action
|
|
33
|
+
* 清空远端运行记录(可按包、Action、状态、保留时长、保留数量过滤清除范围)。
|
|
34
34
|
*/
|
|
35
35
|
export declare function clearRemoteRuns(serverUrl: string, token?: string, options?: {
|
|
36
36
|
packageId?: string;
|
|
37
37
|
actionId?: string;
|
|
38
38
|
status?: string;
|
|
39
|
+
olderThanMs?: number;
|
|
40
|
+
keep?: number;
|
|
39
41
|
} & RemoteClientRequestOptions): Promise<{
|
|
40
42
|
ok: boolean;
|
|
41
43
|
clearedCount: number;
|
|
42
44
|
}>;
|
|
45
|
+
/**
|
|
46
|
+
* 按保留策略清理远端过期及超额运行记录。
|
|
47
|
+
*/
|
|
48
|
+
export declare function cleanExpiredRemoteRuns(serverUrl: string, token?: string, options?: import("../storage/types.js").RunsRetentionPolicy & RemoteClientRequestOptions): Promise<{
|
|
49
|
+
ok: boolean;
|
|
50
|
+
cleanedCount: number;
|
|
51
|
+
}>;
|
|
@@ -44,7 +44,7 @@ export async function fetchRemoteRuns(serverUrl, token, options) {
|
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
46
|
/**
|
|
47
|
-
* 清空远端运行记录(可按包、Action
|
|
47
|
+
* 清空远端运行记录(可按包、Action、状态、保留时长、保留数量过滤清除范围)。
|
|
48
48
|
*/
|
|
49
49
|
export async function clearRemoteRuns(serverUrl, token, options) {
|
|
50
50
|
return fetchRemoteJson(serverUrl, "/api/v2/runs/clear", token, {
|
|
@@ -56,3 +56,16 @@ export async function clearRemoteRuns(serverUrl, token, options) {
|
|
|
56
56
|
dispatcher: options?.dispatcher,
|
|
57
57
|
});
|
|
58
58
|
}
|
|
59
|
+
/**
|
|
60
|
+
* 按保留策略清理远端过期及超额运行记录。
|
|
61
|
+
*/
|
|
62
|
+
export async function cleanExpiredRemoteRuns(serverUrl, token, options) {
|
|
63
|
+
return fetchRemoteJson(serverUrl, "/api/v2/runs/clean-expired", token, {
|
|
64
|
+
method: "POST",
|
|
65
|
+
body: options || {},
|
|
66
|
+
errorPrefix: "Failed to clean expired remote runs",
|
|
67
|
+
allowInsecureHttp: options?.allowInsecureHttp,
|
|
68
|
+
insecure: options?.insecure,
|
|
69
|
+
dispatcher: options?.dispatcher,
|
|
70
|
+
});
|
|
71
|
+
}
|
package/dist/profile/client.d.ts
CHANGED
|
@@ -21,6 +21,6 @@ export { checkRemoteHealth } from "./client-health.js";
|
|
|
21
21
|
export { executeRemoteAction, fetchRemoteActionShow, fetchRemoteActions, fetchRemoteDoctor, fetchRemoteInfo, } from "./client-actions.js";
|
|
22
22
|
export type { RemoteExecuteOptions, RemoteExecutionResult } from "./client-actions.js";
|
|
23
23
|
export { fetchRemotePlaybookShow, fetchRemotePlaybooks } from "./client-playbooks.js";
|
|
24
|
-
export { cancelRemoteRun, clearRemoteRuns, fetchRemoteRun, fetchRemoteRuns, } from "./client-runs.js";
|
|
24
|
+
export { cancelRemoteRun, clearRemoteRuns, cleanExpiredRemoteRuns, fetchRemoteRun, fetchRemoteRuns, } from "./client-runs.js";
|
|
25
25
|
export { clearRemoteState, deleteRemoteStateKey, fetchRemoteStateList, getRemoteStateKey, setRemoteStateKey, } from "./client-state.js";
|
|
26
26
|
export { deleteRemoteConfig, fetchRemoteConfig, fetchRemoteConfigEnv, setRemoteConfig, } from "./client-config.js";
|
package/dist/profile/client.js
CHANGED
|
@@ -24,7 +24,7 @@ export { executeRemoteAction, fetchRemoteActionShow, fetchRemoteActions, fetchRe
|
|
|
24
24
|
// Playbook 规程查询
|
|
25
25
|
export { fetchRemotePlaybookShow, fetchRemotePlaybooks } from "./client-playbooks.js";
|
|
26
26
|
// 运行记录管理
|
|
27
|
-
export { cancelRemoteRun, clearRemoteRuns, fetchRemoteRun, fetchRemoteRuns, } from "./client-runs.js";
|
|
27
|
+
export { cancelRemoteRun, clearRemoteRuns, cleanExpiredRemoteRuns, fetchRemoteRun, fetchRemoteRuns, } from "./client-runs.js";
|
|
28
28
|
// 状态存储管理
|
|
29
29
|
export { clearRemoteState, deleteRemoteStateKey, fetchRemoteStateList, getRemoteStateKey, setRemoteStateKey, } from "./client-state.js";
|
|
30
30
|
// 配置管理
|
package/dist/project/init.js
CHANGED
|
@@ -86,10 +86,10 @@ export function initProject(targetDir, options = {}) {
|
|
|
86
86
|
node: ">=24.12.0",
|
|
87
87
|
},
|
|
88
88
|
dependencies: {
|
|
89
|
-
"@actiondock/sdk": "^2.
|
|
89
|
+
"@actiondock/sdk": "^2.9.1",
|
|
90
90
|
},
|
|
91
91
|
devDependencies: {
|
|
92
|
-
"@actiondock/testing": "^2.
|
|
92
|
+
"@actiondock/testing": "^2.9.1",
|
|
93
93
|
"@types/node": "^22.13.0",
|
|
94
94
|
"tsx": "^4.19.0",
|
|
95
95
|
"typescript": "^5.7.0",
|
package/dist/project/types.d.ts
CHANGED
|
@@ -83,6 +83,11 @@ export interface ActionDockManifest {
|
|
|
83
83
|
actionsDir?: string;
|
|
84
84
|
/** Playbook 规程文档存放目录(向后兼容过渡配置) */
|
|
85
85
|
playbooksDir?: string;
|
|
86
|
+
/** 服务端高级配置(如虚拟投影视图 views 等) */
|
|
87
|
+
server?: {
|
|
88
|
+
views?: Record<string, import("../server/types.js").ServerViewOptions> | import("../server/types.js").ServerViewOptions[];
|
|
89
|
+
[key: string]: unknown;
|
|
90
|
+
};
|
|
86
91
|
}
|
|
87
92
|
/**
|
|
88
93
|
* ActionDock 项目根配置文件契约(等同于 ActionDockManifest,actiondock.json 为单一事实源)。
|
package/dist/server/index.d.ts
CHANGED
package/dist/server/index.js
CHANGED
|
@@ -0,0 +1,138 @@
|
|
|
1
|
+
import { ActionDockError } from "../errors.js";
|
|
2
|
+
import type { McpEndpointHandler } from "./mcp-endpoint.js";
|
|
3
|
+
import type { EffectiveServerPolicy, ServerOptions, ServerViewOptions } from "./types.js";
|
|
4
|
+
export { extractBearerToken } from "./security.js";
|
|
5
|
+
/**
|
|
6
|
+
* 动作未列入白名单拒绝访问异常。
|
|
7
|
+
*/
|
|
8
|
+
export declare class ActionForbiddenError extends ActionDockError {
|
|
9
|
+
status: number;
|
|
10
|
+
statusCode: number;
|
|
11
|
+
constructor(actionRef: string);
|
|
12
|
+
}
|
|
13
|
+
/**
|
|
14
|
+
* 包未列入白名单拒绝访问异常。
|
|
15
|
+
*/
|
|
16
|
+
export declare class PackageNotAllowedError extends ActionDockError {
|
|
17
|
+
status: number;
|
|
18
|
+
statusCode: number;
|
|
19
|
+
constructor(packageId: string);
|
|
20
|
+
}
|
|
21
|
+
/**
|
|
22
|
+
* 归一化后的单个服务视图结构。
|
|
23
|
+
*/
|
|
24
|
+
export interface NormalizedServerView {
|
|
25
|
+
/** 视图唯一标识名称 */
|
|
26
|
+
name: string;
|
|
27
|
+
/** 该视图生效的统一安全策略 */
|
|
28
|
+
policy: EffectiveServerPolicy;
|
|
29
|
+
/** 该视图是否启用 MCP 端点 */
|
|
30
|
+
enableMcp: boolean;
|
|
31
|
+
/** 原始配置选项 */
|
|
32
|
+
rawOptions: ServerViewOptions;
|
|
33
|
+
/** 为该视图独立装配的 MCP 端点处理器 */
|
|
34
|
+
mcpEndpointHandler?: McpEndpointHandler;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* 根据客户端携带的 Token 智能匹配已注册的视图。
|
|
38
|
+
* 使用 safeEqual 进行恒定时间比较以防范时序攻击。
|
|
39
|
+
*
|
|
40
|
+
* @param token 客户端提供的 Bearer Token
|
|
41
|
+
* @param views 可遍历的视图集合
|
|
42
|
+
* @returns 匹配成功的视图对象,未命中返回 undefined
|
|
43
|
+
*/
|
|
44
|
+
export declare function matchViewByToken(token: string, views: Iterable<NormalizedServerView>): NormalizedServerView | undefined;
|
|
45
|
+
/**
|
|
46
|
+
* 归一化解析服务端配置的所有视图集合。
|
|
47
|
+
* 保证默认视图与显式自定义视图具有统一的数据结构。
|
|
48
|
+
*
|
|
49
|
+
* @param options 服务端配置选项
|
|
50
|
+
* @returns 默认视图与全部视图 Map 映射
|
|
51
|
+
*/
|
|
52
|
+
export declare function normalizeServerViews(options: ServerOptions): {
|
|
53
|
+
defaultView: NormalizedServerView;
|
|
54
|
+
views: Map<string, NormalizedServerView>;
|
|
55
|
+
};
|
|
56
|
+
/**
|
|
57
|
+
* 校验目标动作是否在 actionAllowlist 允许白名单中。
|
|
58
|
+
* 支持短名 actionId 与全限定名 packageId/actionId 匹配:
|
|
59
|
+
* - 白名单项若含 '/'(如 pkg/act),则必须 packageId 与 actionId 同时精确匹配。
|
|
60
|
+
* - 白名单项若不含 '/'(如 act),则只需 actionId 匹配(不限包)。
|
|
61
|
+
*
|
|
62
|
+
* @param action 目标动作对象或引用字符串
|
|
63
|
+
* @param allowlist 允许动作白名单列表
|
|
64
|
+
* @returns 是否允许访问
|
|
65
|
+
*/
|
|
66
|
+
export declare function isActionAllowed(action: {
|
|
67
|
+
actionId?: string;
|
|
68
|
+
id?: string;
|
|
69
|
+
packageId?: string;
|
|
70
|
+
} | string | null | undefined, allowlist?: string[]): boolean;
|
|
71
|
+
/**
|
|
72
|
+
* 根据生效策略统一判定目标动作是否允许访问。
|
|
73
|
+
* 同时综合校验策略中的 packageAllowlist 与 actionAllowlist 约束。
|
|
74
|
+
*
|
|
75
|
+
* @param action 目标动作对象或引用字符串
|
|
76
|
+
* @param policy 当前生效的服务端策略
|
|
77
|
+
* @returns 是否允许访问
|
|
78
|
+
*/
|
|
79
|
+
export declare function isActionAllowedByPolicy(action: {
|
|
80
|
+
actionId?: string;
|
|
81
|
+
id?: string;
|
|
82
|
+
packageId?: string;
|
|
83
|
+
} | string | null | undefined, policy?: EffectiveServerPolicy): boolean;
|
|
84
|
+
/**
|
|
85
|
+
* 根据生效策略统一判定目标包标识是否允许访问。
|
|
86
|
+
*
|
|
87
|
+
* @param packageId 目标包 ID
|
|
88
|
+
* @param policy 当前生效的服务端策略
|
|
89
|
+
* @returns 是否允许访问
|
|
90
|
+
*/
|
|
91
|
+
export declare function isPackageAllowedByPolicy(packageId?: string | null, policy?: EffectiveServerPolicy): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* 根据生效策略统一判定配置与状态管理路由是否开启。
|
|
94
|
+
*
|
|
95
|
+
* @param policy 当前生效的服务端策略
|
|
96
|
+
* @returns 是否允许管理操作
|
|
97
|
+
*/
|
|
98
|
+
export declare function isManagementAllowedByPolicy(policy?: EffectiveServerPolicy): boolean;
|
|
99
|
+
/**
|
|
100
|
+
* 根据生效策略对动作列表进行统一过滤。
|
|
101
|
+
*
|
|
102
|
+
* @param actions 待过滤的动作列表
|
|
103
|
+
* @param policy 当前生效的服务端策略
|
|
104
|
+
* @returns 过滤后允许访问的动作列表
|
|
105
|
+
*/
|
|
106
|
+
export declare function filterActionsByPolicy<T extends {
|
|
107
|
+
id: string;
|
|
108
|
+
packageId?: string;
|
|
109
|
+
actionId?: string;
|
|
110
|
+
}>(actions: T[], policy?: EffectiveServerPolicy): T[];
|
|
111
|
+
/**
|
|
112
|
+
* 根据生效策略对包列表进行统一过滤。
|
|
113
|
+
*
|
|
114
|
+
* @param packages 待过滤的包列表
|
|
115
|
+
* @param policy 当前生效的服务端策略
|
|
116
|
+
* @returns 过滤后允许访问的包列表
|
|
117
|
+
*/
|
|
118
|
+
export declare function filterPackagesByPolicy<T extends {
|
|
119
|
+
id: string;
|
|
120
|
+
}>(packages: T[], policy?: EffectiveServerPolicy): T[];
|
|
121
|
+
/**
|
|
122
|
+
* 校验目标动作是否属于允许白名单,不符合则抛出 403 异常。
|
|
123
|
+
*
|
|
124
|
+
* @param action 目标动作对象或引用
|
|
125
|
+
* @param policy 当前生效的服务端策略
|
|
126
|
+
*/
|
|
127
|
+
export declare function assertActionAllowedByPolicy(action: {
|
|
128
|
+
actionId?: string;
|
|
129
|
+
id?: string;
|
|
130
|
+
packageId?: string;
|
|
131
|
+
} | string, policy?: EffectiveServerPolicy): void;
|
|
132
|
+
/**
|
|
133
|
+
* 校验目标包是否属于允许白名单,不符合则抛出 403 异常。
|
|
134
|
+
*
|
|
135
|
+
* @param packageId 目标包 ID
|
|
136
|
+
* @param policy 当前生效的服务端策略
|
|
137
|
+
*/
|
|
138
|
+
export declare function assertPackageAllowedByPolicy(packageId: string, policy?: EffectiveServerPolicy): void;
|