@actiondock/core 2.15.0 → 2.17.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.
- package/dist/catalog/discovery.d.ts +3 -3
- package/dist/catalog/graph.d.ts +8 -6
- package/dist/catalog/graph.js +62 -197
- package/dist/catalog/resolve-playbook.d.ts +2 -2
- package/dist/catalog/resolve-playbook.js +53 -12
- package/dist/execution/service.js +6 -0
- package/dist/execution/types.d.ts +2 -2
- package/dist/host/host.js +16 -5
- package/dist/host/routing.d.ts +1 -1
- package/dist/host/routing.js +1 -1
- package/dist/index.d.ts +2 -4
- package/dist/index.js +0 -1
- package/dist/invocation/types.d.ts +5 -1
- package/dist/invocation/types.js +5 -0
- package/dist/package/runtime.d.ts +2 -2
- package/dist/package/runtime.js +9 -5
- package/dist/package/static-index.d.ts +6 -4
- package/dist/package/static-index.js +60 -12
- package/dist/package/types.d.ts +5 -5
- package/dist/project/index.d.ts +0 -1
- package/dist/project/index.js +0 -1
- package/dist/project/init.js +2 -2
- package/dist/project/loader.d.ts +2 -4
- package/dist/project/loader.js +34 -38
- package/dist/project/manifest.d.ts +0 -2
- package/dist/project/manifest.js +1 -17
- package/dist/project/types.d.ts +0 -31
- package/dist/registry/registry.js +15 -27
- package/dist/runtime/context.d.ts +3 -3
- package/dist/runtime/index.d.ts +1 -0
- package/dist/runtime/index.js +1 -0
- package/dist/runtime/run-origin.d.ts +9 -0
- package/dist/runtime/run-origin.js +33 -0
- package/dist/runtime/run-persistence.d.ts +3 -1
- package/dist/runtime/run-persistence.js +3 -0
- package/dist/runtime/standalone-commands.js +2 -8
- package/dist/runtime/standalone.d.ts +0 -2
- package/dist/server/policy.d.ts +8 -0
- package/dist/server/policy.js +14 -0
- package/dist/server/routes/actions.js +5 -0
- package/dist/service/types.d.ts +3 -1
- package/dist/storage/sqlite-runs.js +9 -3
- package/dist/storage/sqlite-schema.js +5 -1
- package/dist/storage/utils.d.ts +5 -2
- package/dist/storage/utils.js +7 -2
- package/dist/utils/semver.d.ts +1 -2
- package/dist/utils/semver.js +5 -11
- package/dist/version.d.ts +1 -1
- package/dist/version.js +1 -1
- package/package.json +2 -2
- package/dist/project/skill-dir.d.ts +0 -72
- package/dist/project/skill-dir.js +0 -244
package/dist/host/routing.js
CHANGED
|
@@ -83,7 +83,7 @@ function buildFallbackGraph(runtimes) {
|
|
|
83
83
|
])));
|
|
84
84
|
}
|
|
85
85
|
/**
|
|
86
|
-
* 静态查询指定 Playbook
|
|
86
|
+
* 静态查询指定 Playbook 规范:基于 resolvePlaybook 统一纯领域解析。
|
|
87
87
|
*/
|
|
88
88
|
export async function describeVisiblePlaybook(runtimes, id, visibility) {
|
|
89
89
|
const graph = visibility.graph || buildFallbackGraph(runtimes);
|
package/dist/index.d.ts
CHANGED
|
@@ -14,7 +14,7 @@ export type { TerminalRunStatus } from "./storage/types.js";
|
|
|
14
14
|
export { parseDuration } from "./utils/index.js";
|
|
15
15
|
export { toSnakeUpperCase, resolveEnvValue } from "./runtime/env.js";
|
|
16
16
|
export type { ResolvedEnv } from "./runtime/env.js";
|
|
17
|
-
export type { ActionRef, ResolvedActionRef, ExecutionResult, RunRecord, ExecutionEvent, } from "@actiondock/sdk";
|
|
17
|
+
export type { ActionRef, ResolvedActionRef, ExecutionResult, RunRecord, RunOrigin, ExecutionEvent, } from "@actiondock/sdk";
|
|
18
18
|
export type { RunOptions, ExecutionTicket, CancelResult, } from "./execution/types.js";
|
|
19
19
|
export type { ActionSpec, ActionSummary, PlaybookSpec, PlaybookSummary, PackageInfo, ListActionsOptions, } from "./package/types.js";
|
|
20
20
|
export { createNodePlatform, } from "./platform/node.js";
|
|
@@ -22,8 +22,6 @@ export { startActionDockServer, } from "./server/server.js";
|
|
|
22
22
|
export type { ServerOptions, ServerOptions as ActionDockServerOptions, ActionDockServerInstance, } from "./server/types.js";
|
|
23
23
|
export { initProject } from "./project/init.js";
|
|
24
24
|
export { loadProjectConfig, findProjectRoot, } from "./project/loader.js";
|
|
25
|
-
export {
|
|
26
|
-
export type { ProjectConfig, PlaybookSourceManifest, RuntimeProjectConfig, } from "./project/types.js";
|
|
27
|
-
export type { LocalSkillDirectory, LocalPackageEntry, } from "./project/skill-dir.js";
|
|
25
|
+
export type { ProjectConfig, } from "./project/types.js";
|
|
28
26
|
export type { PackageGraph, } from "./catalog/graph.js";
|
|
29
27
|
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, HOST_PROCESS_EXITED, EXECUTION_ABORTED, TIMEOUT, NETWORK_ERROR, CAPABILITY_UNAVAILABLE, STATE_KEY_NOT_FOUND, STORAGE_BUSY, PROJECT_BUSY, PROJECT_RECOVERY_REQUIRED, EVENT_BACKPRESSURE_LIMIT, EVENT_CURSOR_EXPIRED, PROCESS_OUTPUT_LIMIT, PROCESS_SPAWN_ERROR, PROCESS_CANCELLED, PROCESS_TIMEOUT, UNAUTHORIZED, NOT_FOUND, SERVER_ERROR, PACKAGE_FORBIDDEN, ACTION_FORBIDDEN, PLAYBOOK_NOT_FOUND, REQUEST_TOO_LARGE, ACTION_START_FAILED, ACTION_EXECUTION_ERROR, DATA_DIR_IN_USE, DATA_DIR_RECOVERY_REQUIRED, PROCESS_FAILED, MCP_TOOL_NAME_COLLISION, ACCESS_DENIED, 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, PROJECT_ROOT_NOT_FOUND, describeActionLoadFailure, createErrorEnvelope, resolveExecutionHint, } from "./errors.js";
|
package/dist/index.js
CHANGED
|
@@ -19,6 +19,5 @@ export { startActionDockServer, } from "./server/server.js";
|
|
|
19
19
|
// 6. 核心工程辅助
|
|
20
20
|
export { initProject } from "./project/init.js";
|
|
21
21
|
export { loadProjectConfig, findProjectRoot, } from "./project/loader.js";
|
|
22
|
-
export { discoverLocalSkillDirectory, inspectLocalPackageDirectory, queryLocalPackageDirectory, validateLocalSkillPackages, isExplicitPath, } from "./project/skill-dir.js";
|
|
23
22
|
// 8. 统一错误模型与核心标准错误码常量
|
|
24
23
|
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, HOST_PROCESS_EXITED, EXECUTION_ABORTED, TIMEOUT, NETWORK_ERROR, CAPABILITY_UNAVAILABLE, STATE_KEY_NOT_FOUND, STORAGE_BUSY, PROJECT_BUSY, PROJECT_RECOVERY_REQUIRED, EVENT_BACKPRESSURE_LIMIT, EVENT_CURSOR_EXPIRED, PROCESS_OUTPUT_LIMIT, PROCESS_SPAWN_ERROR, PROCESS_CANCELLED, PROCESS_TIMEOUT, UNAUTHORIZED, NOT_FOUND, SERVER_ERROR, PACKAGE_FORBIDDEN, ACTION_FORBIDDEN, PLAYBOOK_NOT_FOUND, REQUEST_TOO_LARGE, ACTION_START_FAILED, ACTION_EXECUTION_ERROR, DATA_DIR_IN_USE, DATA_DIR_RECOVERY_REQUIRED, PROCESS_FAILED, MCP_TOOL_NAME_COLLISION, ACCESS_DENIED, 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, PROJECT_ROOT_NOT_FOUND, describeActionLoadFailure, createErrorEnvelope, resolveExecutionHint, } from "./errors.js";
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import type { ActionDefinition, ActionRef, Logger, ProcessAPI, ProgressReporter } from "@actiondock/sdk";
|
|
1
|
+
import type { ActionDefinition, ActionRef, Logger, ProcessAPI, ProgressReporter, RunOrigin } from "@actiondock/sdk";
|
|
2
2
|
import type { ProcessOwner } from "../process/index.js";
|
|
3
3
|
import { createPackageIdentity, type PackageIdentity } from "../runtime/identity.js";
|
|
4
4
|
export { createPackageIdentity };
|
|
@@ -75,6 +75,8 @@ export interface InvocationContext {
|
|
|
75
75
|
readonly process?: ProcessAPI;
|
|
76
76
|
/** 进程属主身份 */
|
|
77
77
|
readonly owner?: ProcessOwner;
|
|
78
|
+
/** 运行来源追踪快照 */
|
|
79
|
+
readonly origin?: RunOrigin;
|
|
78
80
|
}
|
|
79
81
|
/**
|
|
80
82
|
* 内部调用上下文选项契约。
|
|
@@ -121,6 +123,8 @@ export interface CreateRootInvocationContextOptions {
|
|
|
121
123
|
progress?: ProgressReporter;
|
|
122
124
|
/** 显式执行归属所有者契约 */
|
|
123
125
|
owner?: ProcessOwner;
|
|
126
|
+
/** 运行来源追踪快照 */
|
|
127
|
+
origin?: RunOrigin;
|
|
124
128
|
}
|
|
125
129
|
/**
|
|
126
130
|
* 构造合法的受信任根调用上下文(Root InvocationContext)。
|
package/dist/invocation/types.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { createPackageIdentity } from "../runtime/identity.js";
|
|
2
|
+
import { snapshotRunOrigin } from "../runtime/run-origin.js";
|
|
2
3
|
export { createPackageIdentity };
|
|
3
4
|
/**
|
|
4
5
|
* 构造默认进程归属所有者(ProcessOwner)的单一事实源工厂。
|
|
@@ -23,6 +24,7 @@ export function createInvocationContext(options) {
|
|
|
23
24
|
const runId = options.runId ?? crypto.randomUUID();
|
|
24
25
|
const rootRunId = options.rootRunId ?? runId;
|
|
25
26
|
const pkg = options.package;
|
|
27
|
+
const origin = snapshotRunOrigin(options.origin);
|
|
26
28
|
return {
|
|
27
29
|
runId,
|
|
28
30
|
rootRunId,
|
|
@@ -41,6 +43,7 @@ export function createInvocationContext(options) {
|
|
|
41
43
|
logger: options.logger,
|
|
42
44
|
progress: options.progress,
|
|
43
45
|
process: options.process,
|
|
46
|
+
origin,
|
|
44
47
|
owner: options.owner ??
|
|
45
48
|
createDefaultProcessOwner({
|
|
46
49
|
tenantId: options.tenantId,
|
|
@@ -75,6 +78,7 @@ export function createRootInvocationContext(options) {
|
|
|
75
78
|
owner: options.owner,
|
|
76
79
|
tenantId: options.tenantId,
|
|
77
80
|
principalId: options.principalId,
|
|
81
|
+
origin: options.origin,
|
|
78
82
|
});
|
|
79
83
|
return {
|
|
80
84
|
runId: base.runId,
|
|
@@ -93,5 +97,6 @@ export function createRootInvocationContext(options) {
|
|
|
93
97
|
progress: base.progress,
|
|
94
98
|
process: base.process,
|
|
95
99
|
owner: base.owner,
|
|
100
|
+
origin: base.origin,
|
|
96
101
|
};
|
|
97
102
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ExecutionEvent, ExecutionResult, JsonValue, RunRecord } from "@actiondock/sdk";
|
|
2
2
|
import type { ActionInvoker, CancelResult, ExecutionTicket } from "../execution/types.js";
|
|
3
|
-
import type { ProjectConfig
|
|
3
|
+
import type { ProjectConfig } from "../project/types.js";
|
|
4
4
|
import { type PackageIdentity } from "../runtime/identity.js";
|
|
5
5
|
import { type InvocationContext, type RunOptions } from "../invocation/types.js";
|
|
6
6
|
import type { ActionSpec, ActionSummary, ConfigValueView, HostManagedPackageRuntime, ListActionsOptions, ListRunsOptions, PackageInfo, PackageRuntime, PackageRuntimeOptions, PackageRuntimeInternalOptions, PlaybookSpec, PlaybookSummary, StateScopeOptions } from "./types.js";
|
|
@@ -21,7 +21,7 @@ export declare class DefaultPackageRuntime implements HostManagedPackageRuntime
|
|
|
21
21
|
readonly packageInstanceId: string;
|
|
22
22
|
readonly generationId: string;
|
|
23
23
|
readonly packageRoot?: string;
|
|
24
|
-
readonly projectConfig: ProjectConfig
|
|
24
|
+
readonly projectConfig: ProjectConfig;
|
|
25
25
|
readonly inMemory: boolean;
|
|
26
26
|
private readonly platform;
|
|
27
27
|
private readonly actionsMap;
|
package/dist/package/runtime.js
CHANGED
|
@@ -2,7 +2,7 @@ import { existsSync } from "node:fs";
|
|
|
2
2
|
import { join } from "node:path";
|
|
3
3
|
import { DefaultExecutionService } from "../execution/service.js";
|
|
4
4
|
import { createNodePlatform } from "../platform/index.js";
|
|
5
|
-
import {
|
|
5
|
+
import { findProjectRoot, loadProjectConfig } from "../project/loader.js";
|
|
6
6
|
import { RuntimeConfig } from "../runtime/context.js";
|
|
7
7
|
import { normalizeActionCollection } from "../runtime/action-collection.js";
|
|
8
8
|
import { isSecretConfigKey, sanitizeConfigDefinitions } from "../storage/mask.js";
|
|
@@ -11,6 +11,7 @@ import { createPackageIdentity } from "../runtime/identity.js";
|
|
|
11
11
|
import { ACTION_NOT_FOUND, ActionDockError, CAPABILITY_UNAVAILABLE, INVALID_ARGUMENT, INVOCATION_UNSUPPORTED, NOT_FOUND, SERVICE_CLOSED, } from "../errors.js";
|
|
12
12
|
import { createAbortError } from "../ipc/service.js";
|
|
13
13
|
import { createRootInvocationContext } from "../invocation/types.js";
|
|
14
|
+
import { snapshotRunOrigin } from "../runtime/run-origin.js";
|
|
14
15
|
import { buildStaticActionMap, buildStaticPlaybookMap } from "./static-index.js";
|
|
15
16
|
import { applyActionSummaryFilters } from "./types.js";
|
|
16
17
|
function normalizeStateReadArgs(arg1, arg2, arg3) {
|
|
@@ -125,8 +126,6 @@ export class DefaultPackageRuntime {
|
|
|
125
126
|
version: "0.1.0",
|
|
126
127
|
};
|
|
127
128
|
}
|
|
128
|
-
// 在唯一装配边界确定规程来源,索引与包图共享同一份完整配置快照。
|
|
129
|
-
projectConfig = completeRuntimeProjectConfig(packageRoot, projectConfig);
|
|
130
129
|
this.packageRoot = packageRoot;
|
|
131
130
|
this.projectConfig = projectConfig;
|
|
132
131
|
// 兼容未在公开选项契约中显式声明的包实例标识与代系标识内部参数透传
|
|
@@ -552,9 +551,12 @@ export class DefaultPackageRuntime {
|
|
|
552
551
|
maxCallDepth: this.options.maxCallDepth,
|
|
553
552
|
logger: this.options.logger,
|
|
554
553
|
process: this.options.process ?? this.platform.process,
|
|
554
|
+
origin: options?.origin,
|
|
555
555
|
});
|
|
556
556
|
}
|
|
557
557
|
async runAction(id, input, options) {
|
|
558
|
+
const origin = snapshotRunOrigin(options?.origin);
|
|
559
|
+
const effectiveOptions = { ...options, origin };
|
|
558
560
|
const service = await this.prepareExecution();
|
|
559
561
|
let actionId = id;
|
|
560
562
|
if (actionId.includes("/")) {
|
|
@@ -565,10 +567,12 @@ export class DefaultPackageRuntime {
|
|
|
565
567
|
throw new ActionDockError(INVOCATION_UNSUPPORTED, `PackageRuntime only accepts local action short ID '${id}'. Cross-package invocations must be dispatched via Host invoker.`);
|
|
566
568
|
}
|
|
567
569
|
}
|
|
568
|
-
const context = this.buildRootInvocationContext(actionId,
|
|
570
|
+
const context = this.buildRootInvocationContext(actionId, effectiveOptions);
|
|
569
571
|
return service.execute(actionId, input, context);
|
|
570
572
|
}
|
|
571
573
|
async startAction(id, input, options) {
|
|
574
|
+
const origin = snapshotRunOrigin(options?.origin);
|
|
575
|
+
const effectiveOptions = { ...options, origin };
|
|
572
576
|
const service = await this.prepareExecution();
|
|
573
577
|
let actionId = id;
|
|
574
578
|
if (actionId.includes("/")) {
|
|
@@ -579,7 +583,7 @@ export class DefaultPackageRuntime {
|
|
|
579
583
|
throw new ActionDockError(INVOCATION_UNSUPPORTED, `PackageRuntime only accepts local action short ID '${id}'. Cross-package invocations must be dispatched via Host invoker.`);
|
|
580
584
|
}
|
|
581
585
|
}
|
|
582
|
-
const context = this.buildRootInvocationContext(actionId,
|
|
586
|
+
const context = this.buildRootInvocationContext(actionId, effectiveOptions);
|
|
583
587
|
return service.start(actionId, input, context);
|
|
584
588
|
}
|
|
585
589
|
async startInvocation(actionId, input, context) {
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import type { ActionDefinition } from "@actiondock/sdk";
|
|
2
|
-
import type { ProjectConfig
|
|
2
|
+
import type { ProjectConfig } from "../project/types.js";
|
|
3
3
|
import type { ActionSpec, PlaybookSpec } from "./types.js";
|
|
4
4
|
/**
|
|
5
5
|
* 静态清单索引构建入参:同一包的全部静态事实来源。
|
|
@@ -10,8 +10,8 @@ export interface StaticIndexInput {
|
|
|
10
10
|
packageRoot?: string;
|
|
11
11
|
/** 包唯一标识 */
|
|
12
12
|
packageId: string;
|
|
13
|
-
/**
|
|
14
|
-
projectConfig: ProjectConfig
|
|
13
|
+
/** 项目配置(规范化清单配置快照,单一事实源) */
|
|
14
|
+
projectConfig: ProjectConfig;
|
|
15
15
|
}
|
|
16
16
|
/** Action 索引构建入参:静态事实来源之上叠加内存注入的 Action 定义集合 */
|
|
17
17
|
export interface StaticActionIndexInput extends StaticIndexInput {
|
|
@@ -29,6 +29,8 @@ export interface StaticActionIndexInput extends StaticIndexInput {
|
|
|
29
29
|
export declare function buildStaticActionMap(input: StaticActionIndexInput): Map<string, ActionSpec>;
|
|
30
30
|
/**
|
|
31
31
|
* 静态读取并聚合指定包的 Playbook 规范索引。
|
|
32
|
-
*
|
|
32
|
+
*
|
|
33
|
+
* 聚合来源:磁盘规程目录扫描(以 actiondock.json 声明为事实源)与
|
|
34
|
+
* 项目配置中声明的 playbooks;同键时配置声明覆盖磁盘扫描结果。
|
|
33
35
|
*/
|
|
34
36
|
export declare function buildStaticPlaybookMap(input: StaticIndexInput): Map<string, PlaybookSpec>;
|
|
@@ -1,5 +1,7 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { join, resolve } from "node:path";
|
|
2
3
|
import { loadPlaybooks } from "../project/loader.js";
|
|
4
|
+
import { MANIFEST_FILE_NAME } from "../project/manifest.js";
|
|
3
5
|
/**
|
|
4
6
|
* 将增量声明合并到既有 Action 规范之上(纯函数,单一事实源)。
|
|
5
7
|
*
|
|
@@ -84,21 +86,67 @@ export function buildStaticActionMap(input) {
|
|
|
84
86
|
}
|
|
85
87
|
/**
|
|
86
88
|
* 静态读取并聚合指定包的 Playbook 规范索引。
|
|
87
|
-
*
|
|
89
|
+
*
|
|
90
|
+
* 聚合来源:磁盘规程目录扫描(以 actiondock.json 声明为事实源)与
|
|
91
|
+
* 项目配置中声明的 playbooks;同键时配置声明覆盖磁盘扫描结果。
|
|
88
92
|
*/
|
|
89
93
|
export function buildStaticPlaybookMap(input) {
|
|
90
94
|
const { packageRoot, packageId, projectConfig } = input;
|
|
91
95
|
const map = new Map();
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
96
|
+
// 扫描磁盘规程文件
|
|
97
|
+
if (packageRoot) {
|
|
98
|
+
const playbooksDir = projectConfig?.playbooksDir || "playbooks";
|
|
99
|
+
const dirPath = join(packageRoot, playbooksDir);
|
|
100
|
+
const manifestPath = join(packageRoot, MANIFEST_FILE_NAME);
|
|
101
|
+
if (existsSync(manifestPath) || existsSync(dirPath)) {
|
|
102
|
+
try {
|
|
103
|
+
const loaded = loadPlaybooks(packageRoot, playbooksDir);
|
|
104
|
+
for (const [id, def] of loaded) {
|
|
105
|
+
map.set(id, {
|
|
106
|
+
id: def.id,
|
|
107
|
+
packageId,
|
|
108
|
+
description: def.description,
|
|
109
|
+
actions: def.actions,
|
|
110
|
+
content: def.content,
|
|
111
|
+
filePath: def.filePath,
|
|
112
|
+
});
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
catch (err) {
|
|
116
|
+
// 规程加载失败(清单声明非法、规程文件损坏等)输出告警并跳过磁盘部分,保持返回可用列表
|
|
117
|
+
console.warn(`[App] Failed to load playbooks for package '${packageId}' from '${dirPath}': ${err?.message || String(err)}`);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
// 读取项目配置文件中的 playbooks
|
|
122
|
+
if (projectConfig && projectConfig.playbooks) {
|
|
123
|
+
const rawPlaybooks = projectConfig.playbooks;
|
|
124
|
+
if (typeof rawPlaybooks === "object" && rawPlaybooks !== null) {
|
|
125
|
+
for (const [id, item] of Object.entries(rawPlaybooks)) {
|
|
126
|
+
const existing = map.get(id);
|
|
127
|
+
let content = item.content ?? existing?.content ?? "";
|
|
128
|
+
let filePath = item.entry && packageRoot
|
|
129
|
+
? resolve(packageRoot, item.entry)
|
|
130
|
+
: existing?.filePath;
|
|
131
|
+
if (!content && filePath && existsSync(filePath)) {
|
|
132
|
+
try {
|
|
133
|
+
content = readFileSync(filePath, "utf-8");
|
|
134
|
+
}
|
|
135
|
+
catch (err) {
|
|
136
|
+
// 读取失败(权限、IO 错误等)输出告警并保持空正文,不再无声吞没
|
|
137
|
+
console.warn(`[App] Failed to read playbook '${id}' content from '${filePath}' in package '${packageId}': ${err?.message || String(err)}`);
|
|
138
|
+
}
|
|
139
|
+
}
|
|
140
|
+
map.set(id, {
|
|
141
|
+
id,
|
|
142
|
+
packageId,
|
|
143
|
+
description: item.description ?? existing?.description,
|
|
144
|
+
actions: item.actions ?? existing?.actions,
|
|
145
|
+
content,
|
|
146
|
+
filePath,
|
|
147
|
+
});
|
|
148
|
+
}
|
|
149
|
+
}
|
|
102
150
|
}
|
|
103
151
|
return map;
|
|
104
152
|
}
|
package/dist/package/types.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import type { ActionDefinition, ExecutionEvent, ExecutionResult, JsonValue, Logger, ProcessAPI, RunRecord } from "@actiondock/sdk";
|
|
2
2
|
import type { ActionInvoker, CancelResult, ExecutionTicket, LocalActionResolver } from "../execution/types.js";
|
|
3
3
|
import type { InvocationContext, RunOptions } from "../invocation/types.js";
|
|
4
|
-
import type { ConfigItemDefinition, ProjectConfig
|
|
4
|
+
import type { ConfigItemDefinition, ProjectConfig } from "../project/types.js";
|
|
5
5
|
import type { EventSink } from "../runtime/events.js";
|
|
6
6
|
import type { RuntimePlatform, StorageFactory, StorageFactoryOptions } from "../platform/types.js";
|
|
7
7
|
import type { RuntimeStorage, StateEntry } from "../storage/types.js";
|
|
@@ -156,8 +156,8 @@ export interface StateOptions {
|
|
|
156
156
|
export interface PackageRuntimeOptions {
|
|
157
157
|
/** 项目根目录绝对物理路径 */
|
|
158
158
|
packageRoot?: string;
|
|
159
|
-
/** 项目配置文件 (actiondock.json)
|
|
160
|
-
projectConfig?: ProjectConfig
|
|
159
|
+
/** 项目配置文件 (actiondock.json) 对象 */
|
|
160
|
+
projectConfig?: ProjectConfig;
|
|
161
161
|
/** 数据持久化存储目录 */
|
|
162
162
|
dataDir?: string;
|
|
163
163
|
/** 自定义家目录绝对路径 */
|
|
@@ -241,8 +241,8 @@ export interface PackageRuntime {
|
|
|
241
241
|
readonly generationId?: string;
|
|
242
242
|
/** 包根目录绝对物理路径 */
|
|
243
243
|
readonly packageRoot?: string;
|
|
244
|
-
/** 项目配置对象(actiondock.json
|
|
245
|
-
readonly projectConfig: ProjectConfig
|
|
244
|
+
/** 项目配置对象(actiondock.json 解析结果) */
|
|
245
|
+
readonly projectConfig: ProjectConfig;
|
|
246
246
|
/** 是否采用纯内存运行模式 */
|
|
247
247
|
readonly inMemory?: boolean;
|
|
248
248
|
/**
|
package/dist/project/index.d.ts
CHANGED
|
@@ -3,7 +3,6 @@ export * from "./init.js";
|
|
|
3
3
|
export * from "./loader.js";
|
|
4
4
|
export * from "./lockfile.js";
|
|
5
5
|
export * from "./manifest.js";
|
|
6
|
-
export * from "./skill-dir.js";
|
|
7
6
|
export { SNAPSHOT_TRACKED_FILES, type TransactionFileRecord, type TransactionMetadata, type ProjectTransaction, isProjectLockHeld, acquireProjectLock, runFrozenInstall, hasPendingTransactions, beginTransaction, recoverPendingTransactions, } from "./transactions.js";
|
|
8
7
|
export * from "./types.js";
|
|
9
8
|
export * from "./types-generator.js";
|
package/dist/project/index.js
CHANGED
|
@@ -3,7 +3,6 @@ export * from "./init.js";
|
|
|
3
3
|
export * from "./loader.js";
|
|
4
4
|
export * from "./lockfile.js";
|
|
5
5
|
export * from "./manifest.js";
|
|
6
|
-
export * from "./skill-dir.js";
|
|
7
6
|
export { SNAPSHOT_TRACKED_FILES, isProjectLockHeld, acquireProjectLock, runFrozenInstall, hasPendingTransactions, beginTransaction, recoverPendingTransactions, } from "./transactions.js";
|
|
8
7
|
export * from "./types.js";
|
|
9
8
|
export * from "./types-generator.js";
|
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.17.0",
|
|
90
90
|
},
|
|
91
91
|
devDependencies: {
|
|
92
|
-
"@actiondock/testing": "^2.
|
|
92
|
+
"@actiondock/testing": "^2.17.0",
|
|
93
93
|
"@types/node": "^22.13.0",
|
|
94
94
|
"tsx": "^4.19.0",
|
|
95
95
|
"typescript": "^5.7.0",
|
package/dist/project/loader.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import type { ActionDefinition } from "@actiondock/sdk";
|
|
2
2
|
import { type ModuleLoader } from "../platform/module-loader.js";
|
|
3
|
-
import type { ActionDockManifest, PlaybookDefinition, PlaybookManifestEntry,
|
|
3
|
+
import type { ActionDockManifest, PlaybookDefinition, PlaybookManifestEntry, ProjectConfig } from "./types.js";
|
|
4
4
|
/**
|
|
5
5
|
* 从指定目录开始向上逐级递归查找包含 `actiondock.json` 的项目根目录。
|
|
6
6
|
*
|
|
@@ -16,8 +16,6 @@ export declare function findProjectRoot(cwd?: string): string | null;
|
|
|
16
16
|
* @throws {Error} 若文件不存在或 JSON 格式错误、缺失必要字段
|
|
17
17
|
*/
|
|
18
18
|
export declare function loadProjectConfig(projectRoot: string): ProjectConfig;
|
|
19
|
-
/** 在运行时装配边界补全未声明的磁盘规程;显式规程来源(包括空集合)始终优先。 */
|
|
20
|
-
export declare function completeRuntimeProjectConfig(projectRoot: string | undefined, config: RuntimeProjectConfig): RuntimeProjectConfig;
|
|
21
19
|
export declare const ALLOWED_INSTALLERS: Set<string>;
|
|
22
20
|
/**
|
|
23
21
|
* 探测宿主系统中可用的包管理工具。
|
|
@@ -73,4 +71,4 @@ export declare function parsePlaybookContent(content: string, filePath: string,
|
|
|
73
71
|
* @param customManifest 可选的显式清单对象(若未提供则从磁盘加载)
|
|
74
72
|
* @returns Map<PlaybookId, PlaybookDefinition> 映射
|
|
75
73
|
*/
|
|
76
|
-
export declare function loadPlaybooks(projectRoot: string, _playbooksDir?: string, customManifest?: ActionDockManifest |
|
|
74
|
+
export declare function loadPlaybooks(projectRoot: string, _playbooksDir?: string, customManifest?: ActionDockManifest | null): Map<string, PlaybookDefinition>;
|
package/dist/project/loader.js
CHANGED
|
@@ -3,7 +3,7 @@ import { existsSync, readFileSync } from "node:fs";
|
|
|
3
3
|
import { basename, dirname, join, resolve } from "node:path";
|
|
4
4
|
import { NodeModuleLoader, unwrapDefaultExport } from "../platform/module-loader.js";
|
|
5
5
|
import { ActionDockError, ACTION_LOAD_FAILED, describeActionLoadFailure, INVALID_ACTION_ID, INVALID_JSON, INVALID_PACKAGE_ID, INVALID_PLAYBOOK_ID, MANIFEST_LOAD_FAILED, PLAYBOOK_NOT_FOUND, PROJECT_CONFIG_NOT_FOUND, } from "../errors.js";
|
|
6
|
-
import { loadManifest,
|
|
6
|
+
import { loadManifest, ACTION_ID_REGEX, PLAYBOOK_ID_REGEX } from "./manifest.js";
|
|
7
7
|
/**
|
|
8
8
|
* 从指定目录开始向上逐级递归查找包含 `actiondock.json` 的项目根目录。
|
|
9
9
|
*
|
|
@@ -68,7 +68,7 @@ export function loadProjectConfig(projectRoot) {
|
|
|
68
68
|
if (parsed.playbooksDir) {
|
|
69
69
|
assertWithinProjectRoot(projectRoot, parsed.playbooksDir, "playbooksDir");
|
|
70
70
|
}
|
|
71
|
-
return
|
|
71
|
+
return parsed;
|
|
72
72
|
}
|
|
73
73
|
catch (err) {
|
|
74
74
|
if (err instanceof ActionDockError) {
|
|
@@ -77,15 +77,6 @@ export function loadProjectConfig(projectRoot) {
|
|
|
77
77
|
throw new ActionDockError(INVALID_JSON, `Failed to parse actiondock.json: ${err.message}`);
|
|
78
78
|
}
|
|
79
79
|
}
|
|
80
|
-
/** 在运行时装配边界补全未声明的磁盘规程;显式规程来源(包括空集合)始终优先。 */
|
|
81
|
-
export function completeRuntimeProjectConfig(projectRoot, config) {
|
|
82
|
-
if (!projectRoot || config.playbooks !== undefined)
|
|
83
|
-
return config;
|
|
84
|
-
const diskManifest = loadManifest(projectRoot);
|
|
85
|
-
return diskManifest?.playbooks === undefined
|
|
86
|
-
? config
|
|
87
|
-
: { ...config, playbooks: diskManifest.playbooks };
|
|
88
|
-
}
|
|
89
80
|
export const ALLOWED_INSTALLERS = new Set(["npm", "bun"]);
|
|
90
81
|
/**
|
|
91
82
|
* 异步探测包管理器可用性(通过执行 --version 并检查退出码)。
|
|
@@ -317,38 +308,43 @@ export function parsePlaybookContent(content, filePath, metadata) {
|
|
|
317
308
|
*/
|
|
318
309
|
export function loadPlaybooks(projectRoot, _playbooksDir = "playbooks", customManifest) {
|
|
319
310
|
const playbooks = new Map();
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
311
|
+
let manifest = null;
|
|
312
|
+
if (customManifest !== undefined) {
|
|
313
|
+
manifest = customManifest;
|
|
314
|
+
}
|
|
315
|
+
else {
|
|
316
|
+
try {
|
|
317
|
+
manifest = loadManifest(projectRoot);
|
|
327
318
|
}
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
//
|
|
332
|
-
|
|
333
|
-
|
|
319
|
+
catch (err) {
|
|
320
|
+
// 容错与可观测性取舍说明:
|
|
321
|
+
// - 工程无清单时 loadManifest 返回 null,按空规程集处理属正常场景;
|
|
322
|
+
// - 清单文件存在但内容损坏或解析失败时,记录可观测警告后安全降级,避免静默吞没异常。
|
|
323
|
+
const reason = err instanceof Error ? err.message : String(err ?? "Unknown error");
|
|
324
|
+
process.stderr.write(`[actiondock] Warning: Failed to load manifest in ${projectRoot}: ${reason}\n`);
|
|
325
|
+
return playbooks;
|
|
334
326
|
}
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
327
|
+
}
|
|
328
|
+
// 以 actiondock.json 为唯一事实源
|
|
329
|
+
if (manifest?.playbooks && Object.keys(manifest.playbooks).length > 0) {
|
|
330
|
+
for (const [playbookId, pbEntry] of Object.entries(manifest.playbooks)) {
|
|
331
|
+
if (!PLAYBOOK_ID_REGEX.test(playbookId)) {
|
|
332
|
+
throw new ActionDockError(INVALID_PLAYBOOK_ID, `Invalid playbook ID '${playbookId}' in actiondock.json. Playbook IDs must match ${PLAYBOOK_ID_REGEX}`);
|
|
338
333
|
}
|
|
339
|
-
|
|
340
|
-
assertPathWithinRoot(projectRoot,
|
|
341
|
-
if (!existsSync(
|
|
342
|
-
throw new ActionDockError(PLAYBOOK_NOT_FOUND, `Playbook file '${
|
|
334
|
+
const fullPath = resolve(projectRoot, pbEntry.entry);
|
|
335
|
+
assertPathWithinRoot(projectRoot, fullPath, `playbook entry '${pbEntry.entry}'`);
|
|
336
|
+
if (!existsSync(fullPath)) {
|
|
337
|
+
throw new ActionDockError(PLAYBOOK_NOT_FOUND, `Playbook file '${pbEntry.entry}' for '${playbookId}' not found in ${projectRoot}`);
|
|
343
338
|
}
|
|
344
|
-
content = readFileSync(
|
|
339
|
+
const content = readFileSync(fullPath, "utf-8");
|
|
340
|
+
const def = parsePlaybookContent(content, fullPath, {
|
|
341
|
+
id: playbookId,
|
|
342
|
+
name: pbEntry?.name,
|
|
343
|
+
description: pbEntry.description,
|
|
344
|
+
actions: pbEntry.actions,
|
|
345
|
+
});
|
|
346
|
+
playbooks.set(playbookId, def);
|
|
345
347
|
}
|
|
346
|
-
playbooks.set(playbookId, parsePlaybookContent(content, filePath, {
|
|
347
|
-
id: playbookId,
|
|
348
|
-
name: entry.name,
|
|
349
|
-
description: entry.description,
|
|
350
|
-
actions: entry.actions,
|
|
351
|
-
}));
|
|
352
348
|
}
|
|
353
349
|
return playbooks;
|
|
354
350
|
}
|
|
@@ -2,8 +2,6 @@ import type { ActionDockManifest } from "./types.js";
|
|
|
2
2
|
export declare const MANIFEST_FILE_NAME = "actiondock.json";
|
|
3
3
|
export declare const ACTION_ID_REGEX: RegExp;
|
|
4
4
|
export declare const PLAYBOOK_ID_REGEX: RegExp;
|
|
5
|
-
/** 磁盘规程始终采用文件声明,不能把非契约 content 字段带入运行时内联来源。 */
|
|
6
|
-
export declare function normalizeFilePlaybookEntries(manifest: ActionDockManifest): ActionDockManifest;
|
|
7
5
|
/**
|
|
8
6
|
* 读取并解析项目的声明式清单文件(actiondock.json 为唯一事实源)。
|
|
9
7
|
* 若文件不存在则返回 null。
|
package/dist/project/manifest.js
CHANGED
|
@@ -5,22 +5,6 @@ import { ActionDockError, MANIFEST_CORRUPTED, MANIFEST_INVALID, MANIFEST_READ_FA
|
|
|
5
5
|
export const MANIFEST_FILE_NAME = "actiondock.json";
|
|
6
6
|
export const ACTION_ID_REGEX = /^[a-z0-9][a-z0-9._-]*$/;
|
|
7
7
|
export const PLAYBOOK_ID_REGEX = /^[a-z0-9][a-z0-9._-]*$/;
|
|
8
|
-
/** 磁盘规程始终采用文件声明,不能把非契约 content 字段带入运行时内联来源。 */
|
|
9
|
-
export function normalizeFilePlaybookEntries(manifest) {
|
|
10
|
-
if (!manifest.playbooks || typeof manifest.playbooks !== "object" || Array.isArray(manifest.playbooks)) {
|
|
11
|
-
return manifest;
|
|
12
|
-
}
|
|
13
|
-
let changed = false;
|
|
14
|
-
const playbooks = Object.fromEntries(Object.entries(manifest.playbooks).map(([id, entry]) => {
|
|
15
|
-
if (entry && typeof entry === "object" && "content" in entry) {
|
|
16
|
-
const { content: _inlineContent, ...fileEntry } = entry;
|
|
17
|
-
changed = true;
|
|
18
|
-
return [id, fileEntry];
|
|
19
|
-
}
|
|
20
|
-
return [id, entry];
|
|
21
|
-
}));
|
|
22
|
-
return changed ? { ...manifest, playbooks } : manifest;
|
|
23
|
-
}
|
|
24
8
|
/**
|
|
25
9
|
* 读取并解析项目的声明式清单文件(actiondock.json 为唯一事实源)。
|
|
26
10
|
* 若文件不存在则返回 null。
|
|
@@ -54,7 +38,7 @@ export function loadManifest(projectRoot) {
|
|
|
54
38
|
if (!parsed.id) {
|
|
55
39
|
parsed.id = basename(projectRoot);
|
|
56
40
|
}
|
|
57
|
-
return
|
|
41
|
+
return parsed;
|
|
58
42
|
}
|
|
59
43
|
/**
|
|
60
44
|
* 保存声明式清单文件至项目根目录(actiondock.json)。
|
package/dist/project/types.d.ts
CHANGED
|
@@ -53,25 +53,6 @@ export interface PlaybookManifestEntry {
|
|
|
53
53
|
/** 该 Playbook 所依赖/调用的 Action ID 列表 */
|
|
54
54
|
actions?: string[];
|
|
55
55
|
}
|
|
56
|
-
/**
|
|
57
|
-
* 内存运行时或测试中使用的内联 Playbook 声明项。
|
|
58
|
-
*/
|
|
59
|
-
export interface InlinePlaybookSourceEntry {
|
|
60
|
-
/** Playbook Markdown 正文内容(纯 Markdown 规程内容,含空字符串) */
|
|
61
|
-
content: string;
|
|
62
|
-
/** 可选的虚拟入口相对路径(如 "playbooks/calc-sop.md") */
|
|
63
|
-
entry?: string;
|
|
64
|
-
/** Playbook 展示名称,缺省回落文件名派生 */
|
|
65
|
-
name?: string;
|
|
66
|
-
/** Playbook 任务描述 */
|
|
67
|
-
description?: string;
|
|
68
|
-
/** 该 Playbook 所依赖/调用的 Action ID 列表 */
|
|
69
|
-
actions?: string[];
|
|
70
|
-
}
|
|
71
|
-
/**
|
|
72
|
-
* Playbook 来源定义条目(支持磁盘清单声明项与内存内联正文声明项)。
|
|
73
|
-
*/
|
|
74
|
-
export type PlaybookSourceEntry = PlaybookManifestEntry | InlinePlaybookSourceEntry;
|
|
75
56
|
/**
|
|
76
57
|
* ActionDock 声明式元数据清单契约(actiondock.json 为唯一事实源)。
|
|
77
58
|
*/
|
|
@@ -94,8 +75,6 @@ export interface ActionDockManifest {
|
|
|
94
75
|
actions?: Record<string, ActionManifestEntry>;
|
|
95
76
|
/** 声明的 Playbooks 集合(唯一事实源) */
|
|
96
77
|
playbooks?: Record<string, PlaybookManifestEntry>;
|
|
97
|
-
/** 包级静态依赖引用,与 Action 的 uses 共用引用语义。 */
|
|
98
|
-
uses?: string[];
|
|
99
78
|
/** 跨包外部依赖映射(逻辑包 ID 到 npm 包名) */
|
|
100
79
|
dependencies?: Record<string, string>;
|
|
101
80
|
/** 框架导出与分发边界文件列表 */
|
|
@@ -112,20 +91,10 @@ export interface ActionDockManifest {
|
|
|
112
91
|
[key: string]: unknown;
|
|
113
92
|
};
|
|
114
93
|
}
|
|
115
|
-
/**
|
|
116
|
-
* 内存运行时或图模型中支持内联正文的规程来源清单契约。
|
|
117
|
-
*/
|
|
118
|
-
export type PlaybookSourceManifest = Omit<ActionDockManifest, "playbooks"> & {
|
|
119
|
-
playbooks?: Record<string, PlaybookSourceEntry>;
|
|
120
|
-
};
|
|
121
94
|
/**
|
|
122
95
|
* ActionDock 项目根配置文件契约(等同于 ActionDockManifest,actiondock.json 为单一事实源)。
|
|
123
96
|
*/
|
|
124
97
|
export type ProjectConfig = ActionDockManifest;
|
|
125
|
-
/**
|
|
126
|
-
* 内存运行时或图模型中支持内联正文的项目配置契约。
|
|
127
|
-
*/
|
|
128
|
-
export type RuntimeProjectConfig = PlaybookSourceManifest;
|
|
129
98
|
/**
|
|
130
99
|
* 解析后的完整 Playbook 定义对象。
|
|
131
100
|
*/
|