@automatalabs/workflows 0.30.1 → 0.31.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/README.md +32 -6
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -23
- package/dist/isolation.d.ts +24 -0
- package/dist/isolation.d.ts.map +1 -0
- package/dist/isolation.js +54 -0
- package/dist/script-backends.d.ts +7 -0
- package/dist/script-backends.d.ts.map +1 -0
- package/dist/script-backends.js +20 -0
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -15,10 +15,10 @@ If you want to expose a `workflow` tool to an MCP host (Claude Code, Zed, …),
|
|
|
15
15
|
you want to embed the runner in your own program, use this one.
|
|
16
16
|
|
|
17
17
|
It is a **programmatic library**, not an MCP stdio server. It is a thin facade over the engine +
|
|
18
|
-
ACP packages and adds
|
|
19
|
-
|
|
20
|
-
optional StructuredOutput tool for eligible agents; consumers still interact
|
|
21
|
-
workflow/runner APIs rather than MCP server schemas.
|
|
18
|
+
ACP packages and adds ACP-defaulted helpers for ordinary runs (`runDynamicWorkflow`) and
|
|
19
|
+
substitution tests (`runIsolation`). The ACP layer does use `@modelcontextprotocol/sdk` internally
|
|
20
|
+
when it hosts the optional StructuredOutput tool for eligible agents; consumers still interact
|
|
21
|
+
through this SDK's workflow/runner APIs rather than MCP server schemas.
|
|
22
22
|
|
|
23
23
|
---
|
|
24
24
|
|
|
@@ -116,6 +116,27 @@ Every script **must** begin with `export const meta = { name, description, phase
|
|
|
116
116
|
statement, and must be **deterministic** — `Date.now()`, `Math.random()`, and `new Date()` are
|
|
117
117
|
unavailable inside the realm (they would break journal replay on resume).
|
|
118
118
|
|
|
119
|
+
### Substitution testing (isolation mode)
|
|
120
|
+
|
|
121
|
+
Record a normal managed run, then re-run its recorded script with one selected step live while all
|
|
122
|
+
other calls are served from the recording:
|
|
123
|
+
|
|
124
|
+
```ts
|
|
125
|
+
import { runIsolation } from "@automatalabs/workflows";
|
|
126
|
+
|
|
127
|
+
const isolated = await runIsolation({
|
|
128
|
+
baselineRunId: recorded.runId,
|
|
129
|
+
live: [{ label: "step-2", model: "codex/gpt-5.3-codex" }],
|
|
130
|
+
});
|
|
131
|
+
|
|
132
|
+
const target = isolated.report.calls.find((call) => call.mode === "live-target");
|
|
133
|
+
console.log(isolated.status, target?.recordedUsage, target?.liveUsage);
|
|
134
|
+
```
|
|
135
|
+
|
|
136
|
+
The SDK defaults the live runner to ACP and disposes it; pass `runner` to inject and retain your own.
|
|
137
|
+
See the [Isolation mode API](../../docs/api.md#isolation-mode) for baseline admissibility, target
|
|
138
|
+
selection, typed refusals, report semantics, and the lower-level `createReplayRunner` composition.
|
|
139
|
+
|
|
119
140
|
### b) `createAcpRunner().run(...)` — drive a single agent
|
|
120
141
|
|
|
121
142
|
Skip the script realm entirely and call one agent directly. The runner is the default ACP
|
|
@@ -612,6 +633,8 @@ size is `AGENTPRISM_ACP_POOL_SIZE` (or `AcpPoolOptions.size`).
|
|
|
612
633
|
```ts
|
|
613
634
|
// ── Run entry & helper ──
|
|
614
635
|
runDynamicWorkflow, // (script, { args?, runner?, exec? }) => Promise<WorkflowRunResult>
|
|
636
|
+
runIsolation, // ACP-defaulted single-target substitution over a recorded run
|
|
637
|
+
createReplayRunner, // backend-neutral in-memory replay composition primitive
|
|
615
638
|
runWorkflow, // the bare engine run (no status trio)
|
|
616
639
|
parseWorkflowScript, // parse a script's meta + body
|
|
617
640
|
validateWorkflowScript, // token-free parse + mock-runner dry run (the `validate` CLI's core)
|
|
@@ -639,7 +662,10 @@ WorkflowError, WorkflowErrorCode, isWorkflowError, isProviderUsageLimit, isAuthR
|
|
|
639
662
|
AGENTPRISM_PERSISTENCE_ROOT_ENV,
|
|
640
663
|
|
|
641
664
|
// ── Types ──
|
|
642
|
-
RunDynamicWorkflowOptions,
|
|
665
|
+
RunDynamicWorkflowOptions, RunIsolationSdkOptions, RunIsolationOptions, IsolationRunResult,
|
|
666
|
+
IsolationTarget, ReplayRunnerOptions, ReplayRunner, ReplayObservation, ReplayReport,
|
|
667
|
+
ReplayCallReport, ReplayDivergenceEvent, ResolvedIsolationTarget,
|
|
668
|
+
WorkflowRunOptions, AgentOptions, ExecOptions, CheckpointCallContext,
|
|
643
669
|
MockAnswerJson, MockAnswerSequence, MockAnswerRule, MockAnswers,
|
|
644
670
|
ValidatedMockAnswerUse, ValidatedMockAnswerRule, UnusedMockAnswer, ValidatedMockAnswers,
|
|
645
671
|
ValidateWorkflowOptions, ValidateWorkflowReport, ValidatedAgentCall, ValidatedCheckpoint,
|
|
@@ -647,7 +673,7 @@ WorkflowManagerOptions, CheckpointOptions, WorkflowRunResult, WorkflowRunFallbac
|
|
|
647
673
|
WorkflowCheckpointTaken, WorkflowCheckpointSource, WorkflowSnapshot,
|
|
648
674
|
WorkflowPathOptions, RunPersistence, RunPersistenceOptions,
|
|
649
675
|
AcpPoolOptions, AcpRunnerOptions, AgentRunner, RunOptions, AgentResult, AgentUsage, JournalEntry,
|
|
650
|
-
AgentSessionRef, AgentSessionRecord, WorkflowBackendConfig,
|
|
676
|
+
AgentSessionRef, AgentSessionRecord, WorkflowBackendConfig, WorkflowCallRecord, WorkflowRecordedError,
|
|
651
677
|
InteractiveSessionOptions, InteractiveTurn, PermissionResolver,
|
|
652
678
|
AuthResolver, AuthContext, AuthResolution, AuthMethodDescriptor, AuthCapableRunner,
|
|
653
679
|
ProviderCapableRunner, // duck-type gate for the MCP provider tools (providers/list|set|disable)
|
package/dist/index.d.ts
CHANGED
|
@@ -1,8 +1,11 @@
|
|
|
1
1
|
import { WorkflowManager as EngineWorkflowManager } from "@automatalabs/workflow-engine";
|
|
2
2
|
import type { AcpEventName, AcpRunnerEventMap } from "@automatalabs/acp-agents";
|
|
3
3
|
import type { ExecOptions, WorkflowDir, WorkflowManagerOptions } from "@automatalabs/workflow-engine";
|
|
4
|
-
import type { AgentRunner,
|
|
4
|
+
import type { AgentRunner, WorkflowRunResult } from "@automatalabs/shared-types";
|
|
5
|
+
import { type ScriptBackendApproval } from "./script-backends.js";
|
|
5
6
|
export { runWorkflow, parseWorkflowScript, redactText, truncateUtf8 } from "@automatalabs/workflow-engine";
|
|
7
|
+
export { runIsolation, createReplayRunner, type RunIsolationSdkOptions } from "./isolation.js";
|
|
8
|
+
export type { RunIsolationOptions, IsolationRunResult, ReplayRunnerOptions, ResolvedIsolationTarget, IsolationTarget, ReplayRunner, ReplayObservation, ReplayReport, ReplayCallReport, ReplayDivergenceEvent, CheckpointCallContext, WorkflowCallRecord, WorkflowRecordedError, } from "./isolation.js";
|
|
6
9
|
export { openWorkflowDir, type WorkflowDir, type WorkflowDirEntry, type OpenWorkflowDirOptions, } from "@automatalabs/workflow-engine";
|
|
7
10
|
export { validateWorkflowScript, fabricateFromSchema, formatValidateReport, MOCK_TOKENS_PER_AGENT } from "./validate.js";
|
|
8
11
|
export type { MockAnswerJson, MockAnswerRule, MockAnswers, MockAnswerSequence, UnusedMockAnswer, ValidateWorkflowOptions, ValidateWorkflowReport, ValidatedAgentCall, ValidatedCheckpoint, ValidatedMockAnswerRule, ValidatedMockAnswers, ValidatedMockAnswerUse, } from "./validate.js";
|
|
@@ -78,9 +81,7 @@ export declare class WorkflowManager extends EngineWorkflowManager {
|
|
|
78
81
|
* runDynamicWorkflow THROWS with guidance rather than running a script whose declared
|
|
79
82
|
* dependencies were dropped.
|
|
80
83
|
*/
|
|
81
|
-
export type ScriptBackendApproval
|
|
82
|
-
name: string;
|
|
83
|
-
} & WorkflowBackendConfig) => boolean | Promise<boolean>);
|
|
84
|
+
export type { ScriptBackendApproval } from "./script-backends.js";
|
|
84
85
|
/** Options for {@link runDynamicWorkflow}. */
|
|
85
86
|
export interface RunDynamicWorkflowOptions {
|
|
86
87
|
/**
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAaA,OAAO,EAKL,eAAe,IAAI,qBAAqB,EACzC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAoB,YAAY,EAAE,iBAAiB,EAAiB,MAAM,0BAA0B,CAAC;AACjH,OAAO,KAAK,EAAE,WAAW,EAAE,WAAW,EAAE,sBAAsB,EAAE,MAAM,+BAA+B,CAAC;AACtG,OAAO,KAAK,EAAE,WAAW,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
package/dist/index.js
CHANGED
|
@@ -2,18 +2,22 @@
|
|
|
2
2
|
// @automatalabs/workflows — the importable SDK for the AgentPrism dynamic-workflow
|
|
3
3
|
// orchestrator. A FACADE re-export barrel: it re-exports the clean public surface of
|
|
4
4
|
// the three engine packages, adds the SDK-level WorkflowManager ACP-event bridge, and
|
|
5
|
-
// adds
|
|
6
|
-
//
|
|
5
|
+
// adds ACP-defaulted convenience helpers for ordinary and isolation runs. It is
|
|
6
|
+
// SEPARATE from @automatalabs/mcp-server (the stdio MCP server)
|
|
7
7
|
// and stays a PURE library — it pulls in neither @modelcontextprotocol/sdk nor zod.
|
|
8
8
|
//
|
|
9
9
|
// The DSL globals available INSIDE a workflow script (agent, parallel, pipeline, …) are
|
|
10
10
|
// vm-realm globals, NOT importable symbols; they are documented for author IntelliSense
|
|
11
11
|
// in ./dsl.d.ts (referenced above), not exported here.
|
|
12
12
|
import { ACP_CROSS_CUTTING_EVENT_NAMES, createAcpRunner } from "@automatalabs/acp-agents";
|
|
13
|
-
import { openWorkflowDir, parseWorkflowScript,
|
|
13
|
+
import { openWorkflowDir, parseWorkflowScript, WorkflowManager as EngineWorkflowManager, } from "@automatalabs/workflow-engine";
|
|
14
|
+
import { approveScriptBackends } from "./script-backends.js";
|
|
14
15
|
// ── Engine: run entry, script parsing, the managed-run lifecycle, and the
|
|
15
16
|
// option/result + error types the host composes against. ──
|
|
16
17
|
export { runWorkflow, parseWorkflowScript, redactText, truncateUtf8 } from "@automatalabs/workflow-engine";
|
|
18
|
+
// ── Isolation mode: deterministic substitution testing over a recorded run. The SDK
|
|
19
|
+
// wrapper defaults the live target runner to ACP and owns that runner's disposal. ──
|
|
20
|
+
export { runIsolation, createReplayRunner } from "./isolation.js";
|
|
17
21
|
// ── Workflow directory view: openWorkflowDir("./workflows") binds a read-only,
|
|
18
22
|
// per-call-fresh view over folders of versioned workflow scripts (name = filename
|
|
19
23
|
// stem). `view.resolve` IS a loadSavedWorkflow resolver; runDynamicWorkflow accepts
|
|
@@ -200,7 +204,10 @@ export async function runDynamicWorkflow(script, opts = {}) {
|
|
|
200
204
|
}
|
|
201
205
|
let exec = opts.exec;
|
|
202
206
|
if (declared && Object.keys(declared).length > 0) {
|
|
203
|
-
exec = {
|
|
207
|
+
exec = {
|
|
208
|
+
...(exec ?? {}),
|
|
209
|
+
scriptBackends: await approveScriptBackends(declared, opts.allowScriptBackends, "runDynamicWorkflow"),
|
|
210
|
+
};
|
|
204
211
|
}
|
|
205
212
|
const owned = opts.runner === undefined;
|
|
206
213
|
const runner = opts.runner ?? createAcpRunner();
|
|
@@ -214,22 +221,3 @@ export async function runDynamicWorkflow(script, opts = {}) {
|
|
|
214
221
|
await runner.dispose();
|
|
215
222
|
}
|
|
216
223
|
}
|
|
217
|
-
/** Resolve the embedder's approval policy over the declared backends; throw with guidance when
|
|
218
|
-
* approval is missing or any backend is declined (an unapproved dependency must abort, never
|
|
219
|
-
* silently reroute). */
|
|
220
|
-
async function approveScriptBackends(declared, approval) {
|
|
221
|
-
const names = Object.keys(declared).join(", ");
|
|
222
|
-
if (approval === undefined || approval === false) {
|
|
223
|
-
throw new WorkflowError(`script declares custom ACP backends (meta.backends: ${names}) — these spawn commands on this machine and require explicit approval. ` +
|
|
224
|
-
`Pass allowScriptBackends: true (or a per-backend approval callback) to runDynamicWorkflow, ` +
|
|
225
|
-
`or thread an approved registry yourself via exec.scriptBackends.`, WorkflowErrorCode.SCRIPT_VALIDATION_ERROR, { recoverable: false });
|
|
226
|
-
}
|
|
227
|
-
if (approval === true)
|
|
228
|
-
return declared;
|
|
229
|
-
for (const [name, config] of Object.entries(declared)) {
|
|
230
|
-
if (!(await approval({ name, ...config }))) {
|
|
231
|
-
throw new WorkflowError(`script backend "${name}" (command: ${config.command}) was declined by the allowScriptBackends callback — aborting the run`, WorkflowErrorCode.SCRIPT_VALIDATION_ERROR, { recoverable: false });
|
|
232
|
-
}
|
|
233
|
-
}
|
|
234
|
-
return declared;
|
|
235
|
-
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createReplayRunner } from "@automatalabs/workflow-engine";
|
|
2
|
+
import type { CheckpointCallContext, IsolationRunResult, IsolationTarget, ReplayCallReport, ReplayDivergenceEvent, ReplayObservation, ReplayReport, ReplayRunner, ReplayRunnerOptions, ResolvedIsolationTarget, RunIsolationOptions } from "@automatalabs/workflow-engine";
|
|
3
|
+
import type { AgentRunner, WorkflowCallRecord, WorkflowRecordedError } from "@automatalabs/shared-types";
|
|
4
|
+
import { type ScriptBackendApproval } from "./script-backends.js";
|
|
5
|
+
type OwnedRunner = AgentRunner & {
|
|
6
|
+
dispose: () => Promise<void>;
|
|
7
|
+
};
|
|
8
|
+
type DefaultRunnerFactory = () => OwnedRunner;
|
|
9
|
+
/** Test-only injection point for the owned default runner. Deliberately absent from the package barrel. */
|
|
10
|
+
export declare function __setDefaultRunnerFactoryForTests(factory: DefaultRunnerFactory | undefined): void;
|
|
11
|
+
export interface RunIsolationSdkOptions extends Omit<RunIsolationOptions, "runner" | "scriptBackends"> {
|
|
12
|
+
/** Omitted => createAcpRunner(), disposed after the run. */
|
|
13
|
+
runner?: AgentRunner;
|
|
14
|
+
/** Approval policy for the recording script's declared meta.backends. */
|
|
15
|
+
allowScriptBackends?: ScriptBackendApproval;
|
|
16
|
+
}
|
|
17
|
+
/**
|
|
18
|
+
* Execute an isolation run with the SDK's ACP-defaulted runner and script-backend
|
|
19
|
+
* approval policy. Caller-supplied runners remain caller-owned.
|
|
20
|
+
*/
|
|
21
|
+
export declare function runIsolation<T = unknown>(opts: RunIsolationSdkOptions): Promise<IsolationRunResult<T>>;
|
|
22
|
+
export { createReplayRunner };
|
|
23
|
+
export type { CheckpointCallContext, IsolationRunResult, IsolationTarget, ReplayCallReport, ReplayDivergenceEvent, ReplayObservation, ReplayReport, ReplayRunner, ReplayRunnerOptions, ResolvedIsolationTarget, RunIsolationOptions, WorkflowCallRecord, WorkflowRecordedError, };
|
|
24
|
+
//# sourceMappingURL=isolation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"isolation.d.ts","sourceRoot":"","sources":["../src/isolation.ts"],"names":[],"mappings":"AACA,OAAO,EACL,kBAAkB,EAMnB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EACV,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACpB,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EACV,WAAW,EACX,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,4BAA4B,CAAC;AACpC,OAAO,EAAyB,KAAK,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAEzF,KAAK,WAAW,GAAG,WAAW,GAAG;IAAE,OAAO,EAAE,MAAM,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAC;AAClE,KAAK,oBAAoB,GAAG,MAAM,WAAW,CAAC;AAI9C,2GAA2G;AAC3G,wBAAgB,iCAAiC,CAAC,OAAO,EAAE,oBAAoB,GAAG,SAAS,GAAG,IAAI,CAEjG;AAED,MAAM,WAAW,sBACf,SAAQ,IAAI,CAAC,mBAAmB,EAAE,QAAQ,GAAG,gBAAgB,CAAC;IAC9D,4DAA4D;IAC5D,MAAM,CAAC,EAAE,WAAW,CAAC;IACrB,yEAAyE;IACzE,mBAAmB,CAAC,EAAE,qBAAqB,CAAC;CAC7C;AAED;;;GAGG;AACH,wBAAsB,YAAY,CAAC,CAAC,GAAG,OAAO,EAC5C,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,CA0ChC;AAED,OAAO,EAAE,kBAAkB,EAAE,CAAC;AAC9B,YAAY,EACV,qBAAqB,EACrB,kBAAkB,EAClB,eAAe,EACf,gBAAgB,EAChB,qBAAqB,EACrB,iBAAiB,EACjB,YAAY,EACZ,YAAY,EACZ,mBAAmB,EACnB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,GACtB,CAAC"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { createAcpRunner } from "@automatalabs/acp-agents";
|
|
2
|
+
import { createReplayRunner, createRunPersistence, parseWorkflowScript, runIsolation as runEngineIsolation, WorkflowError, WorkflowErrorCode, } from "@automatalabs/workflow-engine";
|
|
3
|
+
import { approveScriptBackends } from "./script-backends.js";
|
|
4
|
+
let defaultRunnerFactory = createAcpRunner;
|
|
5
|
+
/** Test-only injection point for the owned default runner. Deliberately absent from the package barrel. */
|
|
6
|
+
export function __setDefaultRunnerFactoryForTests(factory) {
|
|
7
|
+
defaultRunnerFactory = factory ?? createAcpRunner;
|
|
8
|
+
}
|
|
9
|
+
/**
|
|
10
|
+
* Execute an isolation run with the SDK's ACP-defaulted runner and script-backend
|
|
11
|
+
* approval policy. Caller-supplied runners remain caller-owned.
|
|
12
|
+
*/
|
|
13
|
+
export async function runIsolation(opts) {
|
|
14
|
+
let recording;
|
|
15
|
+
try {
|
|
16
|
+
const persistence = createRunPersistence(opts.cwd ?? process.cwd(), undefined, {
|
|
17
|
+
persistenceRoot: opts.persistenceRoot,
|
|
18
|
+
});
|
|
19
|
+
recording = persistence.load(opts.baselineRunId);
|
|
20
|
+
}
|
|
21
|
+
catch (error) {
|
|
22
|
+
if (error instanceof WorkflowError)
|
|
23
|
+
throw error;
|
|
24
|
+
throw new WorkflowError(error instanceof Error ? error.message : String(error), WorkflowErrorCode.PERSISTENCE_ERROR, { recoverable: false });
|
|
25
|
+
}
|
|
26
|
+
let declared;
|
|
27
|
+
if (recording && typeof recording.script === "string") {
|
|
28
|
+
try {
|
|
29
|
+
declared = parseWorkflowScript(recording.script).meta.backends;
|
|
30
|
+
}
|
|
31
|
+
catch {
|
|
32
|
+
// The engine owns malformed-recording diagnosis and will reject it with its
|
|
33
|
+
// typed preflight error after reloading the same persisted bytes.
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
const scriptBackends = declared && Object.keys(declared).length > 0
|
|
37
|
+
? await approveScriptBackends(declared, opts.allowScriptBackends, "runIsolation")
|
|
38
|
+
: undefined;
|
|
39
|
+
const owned = opts.runner === undefined;
|
|
40
|
+
const runner = opts.runner ?? defaultRunnerFactory();
|
|
41
|
+
try {
|
|
42
|
+
const { allowScriptBackends: _approval, ...engineOptions } = opts;
|
|
43
|
+
return await runEngineIsolation({
|
|
44
|
+
...engineOptions,
|
|
45
|
+
runner,
|
|
46
|
+
...(scriptBackends === undefined ? {} : { scriptBackends }),
|
|
47
|
+
});
|
|
48
|
+
}
|
|
49
|
+
finally {
|
|
50
|
+
if (owned)
|
|
51
|
+
await runner.dispose();
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
export { createReplayRunner };
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { WorkflowBackendConfig } from "@automatalabs/shared-types";
|
|
2
|
+
export type ScriptBackendApproval = boolean | ((backend: {
|
|
3
|
+
name: string;
|
|
4
|
+
} & WorkflowBackendConfig) => boolean | Promise<boolean>);
|
|
5
|
+
/** Resolve explicit host approval for script-declared command-spawning backends. */
|
|
6
|
+
export declare function approveScriptBackends(declared: Record<string, WorkflowBackendConfig>, approval: ScriptBackendApproval | undefined, helperName: "runDynamicWorkflow" | "runIsolation"): Promise<Record<string, WorkflowBackendConfig>>;
|
|
7
|
+
//# sourceMappingURL=script-backends.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"script-backends.d.ts","sourceRoot":"","sources":["../src/script-backends.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AAExE,MAAM,MAAM,qBAAqB,GAC7B,OAAO,GACP,CAAC,CAAC,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAA;CAAE,GAAG,qBAAqB,KAAK,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,CAAC,CAAC;AAExF,oFAAoF;AACpF,wBAAsB,qBAAqB,CACzC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,EAC/C,QAAQ,EAAE,qBAAqB,GAAG,SAAS,EAC3C,UAAU,EAAE,oBAAoB,GAAG,cAAc,GAChD,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,qBAAqB,CAAC,CAAC,CAyBhD"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { WorkflowError, WorkflowErrorCode } from "@automatalabs/workflow-engine";
|
|
2
|
+
/** Resolve explicit host approval for script-declared command-spawning backends. */
|
|
3
|
+
export async function approveScriptBackends(declared, approval, helperName) {
|
|
4
|
+
const names = Object.keys(declared).join(", ");
|
|
5
|
+
if (approval === undefined || approval === false) {
|
|
6
|
+
const guidance = helperName === "runDynamicWorkflow"
|
|
7
|
+
? "Pass allowScriptBackends: true (or a per-backend approval callback) to runDynamicWorkflow, or thread an approved registry yourself via exec.scriptBackends."
|
|
8
|
+
: "Pass allowScriptBackends: true (or a per-backend approval callback) to runIsolation.";
|
|
9
|
+
throw new WorkflowError(`script declares custom ACP backends (meta.backends: ${names}) — these spawn commands on this machine and require explicit approval. ` +
|
|
10
|
+
guidance, WorkflowErrorCode.SCRIPT_VALIDATION_ERROR, { recoverable: false });
|
|
11
|
+
}
|
|
12
|
+
if (approval === true)
|
|
13
|
+
return declared;
|
|
14
|
+
for (const [name, config] of Object.entries(declared)) {
|
|
15
|
+
if (!(await approval({ name, ...config }))) {
|
|
16
|
+
throw new WorkflowError(`script backend "${name}" (command: ${config.command}) was declined by the allowScriptBackends callback — aborting the run`, WorkflowErrorCode.SCRIPT_VALIDATION_ERROR, { recoverable: false });
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
return declared;
|
|
20
|
+
}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@automatalabs/workflows",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.31.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=22"
|
|
@@ -31,9 +31,9 @@
|
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"typebox": "1.3.2",
|
|
34
|
-
"@automatalabs/shared-types": "0.
|
|
35
|
-
"@automatalabs/workflow-engine": "0.
|
|
36
|
-
"@automatalabs/acp-agents": "0.25.
|
|
34
|
+
"@automatalabs/shared-types": "0.19.0",
|
|
35
|
+
"@automatalabs/workflow-engine": "0.20.0",
|
|
36
|
+
"@automatalabs/acp-agents": "0.25.1"
|
|
37
37
|
},
|
|
38
38
|
"scripts": {
|
|
39
39
|
"build": "tsc -b",
|