@automatalabs/workflows 1.0.0 → 1.1.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/config.d.ts.map +1 -1
- package/dist/config.js +6 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +16 -0
- package/dist/mcp-server.js +1126 -1096
- package/dist/validate.d.ts +9 -0
- package/dist/validate.d.ts.map +1 -1
- package/dist/validate.js +25 -26
- package/package.json +5 -5
package/dist/validate.d.ts
CHANGED
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { type WorkflowAgentConfiguration } from "@automatalabs/workflow-engine";
|
|
1
2
|
import type { SessionConfigOption, SessionModeState } from "@automatalabs/acp-agents";
|
|
2
3
|
import type { WorkflowDir } from "@automatalabs/workflow-engine";
|
|
3
4
|
import type { WorkflowMeta } from "@automatalabs/shared-types";
|
|
@@ -31,6 +32,10 @@ export interface ValidateWorkflowOptions {
|
|
|
31
32
|
* or phase/meta route. The dry run resolves and reports it like live execution.
|
|
32
33
|
*/
|
|
33
34
|
defaultModel?: string;
|
|
35
|
+
/** Host-selected configuration keyed by the dry run's zero-based agent occurrence ordinal. */
|
|
36
|
+
agentConfigurations?: Readonly<Record<number, WorkflowAgentConfiguration>>;
|
|
37
|
+
/** Refuse any live occurrence not covered by agentConfigurations. */
|
|
38
|
+
requireAgentConfiguration?: boolean;
|
|
34
39
|
/** Run routed no-prompt config probes after the mock dry run. Default true. */
|
|
35
40
|
probeConfig?: boolean;
|
|
36
41
|
/** Host-owned no-prompt probe runner. When supplied it is reused and never disposed. */
|
|
@@ -68,7 +73,11 @@ export interface ValidatedMockAnswers {
|
|
|
68
73
|
}
|
|
69
74
|
/** One agent() call observed during the dry run, with its backend attribution. */
|
|
70
75
|
export interface ValidatedAgentCall {
|
|
76
|
+
/** Zero-based occurrence ordinal shared with WorkflowAgentConfiguration selection. */
|
|
77
|
+
index: number;
|
|
71
78
|
label: string;
|
|
79
|
+
/** Credential-redacted, UTF-8-bounded task preview for host configuration UI. */
|
|
80
|
+
promptPreview: string;
|
|
72
81
|
phase?: string;
|
|
73
82
|
/** The verbatim model spec the call requested (undefined = the run/session default). */
|
|
74
83
|
model?: string;
|
package/dist/validate.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate.d.ts","sourceRoot":"","sources":["../src/validate.ts"],"names":[],"mappings":"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"}
|
package/dist/validate.js
CHANGED
|
@@ -14,6 +14,19 @@ import { openWorkflowDir, WorkflowError, WorkflowErrorCode, WorkflowManager, par
|
|
|
14
14
|
import { BUILTIN_BACKEND_IDS, builtinThoughtLevelDomainSemantics, registryWithRunBackends, resolveBackendRegistry, selectBackend, } from "@automatalabs/acp-agents";
|
|
15
15
|
import { Check, Errors } from "typebox/value";
|
|
16
16
|
import { createValidateProbeRunner } from "./validate-internal.js";
|
|
17
|
+
const AGENT_TASK_PREVIEW_BYTES = 384;
|
|
18
|
+
function boundedPromptPreview(prompt) {
|
|
19
|
+
const redacted = redactText(prompt).value.replace(/\s+/g, " ").trim();
|
|
20
|
+
if (Buffer.byteLength(redacted, "utf8") <= AGENT_TASK_PREVIEW_BYTES)
|
|
21
|
+
return redacted;
|
|
22
|
+
let preview = "";
|
|
23
|
+
for (const character of redacted) {
|
|
24
|
+
if (Buffer.byteLength(preview + character + "…", "utf8") > AGENT_TASK_PREVIEW_BYTES)
|
|
25
|
+
break;
|
|
26
|
+
preview += character;
|
|
27
|
+
}
|
|
28
|
+
return `${preview}…`;
|
|
29
|
+
}
|
|
17
30
|
const MAX_MOCK_ANSWERS_BYTES = 256 * 1024;
|
|
18
31
|
const MAX_MOCK_ANSWER_RULES = 256;
|
|
19
32
|
const MAX_MOCK_ANSWER_GLOB_LENGTH = 256;
|
|
@@ -1170,7 +1183,6 @@ export async function validateWorkflowScript(script, options = {}) {
|
|
|
1170
1183
|
const agentCalls = [];
|
|
1171
1184
|
const pendingAgentCalls = [];
|
|
1172
1185
|
const checkpoints = [];
|
|
1173
|
-
const mockMeta = new Map();
|
|
1174
1186
|
const runner = {
|
|
1175
1187
|
async run(_prompt, runOptions = {}) {
|
|
1176
1188
|
const label = runOptions.label ?? "";
|
|
@@ -1180,8 +1192,7 @@ export async function validateWorkflowScript(script, options = {}) {
|
|
|
1180
1192
|
configOptions: runOptions.configOptions,
|
|
1181
1193
|
schema: runOptions.schema !== undefined,
|
|
1182
1194
|
};
|
|
1183
|
-
|
|
1184
|
-
const pendingCall = mockAnswerState ? pendingAgentCalls.shift() : undefined;
|
|
1195
|
+
const pendingCall = pendingAgentCalls.shift();
|
|
1185
1196
|
if (pendingCall) {
|
|
1186
1197
|
pendingCall.tier = metadata.tier;
|
|
1187
1198
|
pendingCall.mode = metadata.mode;
|
|
@@ -1227,26 +1238,26 @@ export async function validateWorkflowScript(script, options = {}) {
|
|
|
1227
1238
|
const manager = new WorkflowManager({
|
|
1228
1239
|
agent: runner,
|
|
1229
1240
|
cwd: baseCwd,
|
|
1230
|
-
|
|
1241
|
+
// Serial dry-run dispatch makes agentStart -> mock runner correlation deterministic,
|
|
1242
|
+
// including worktree setup and duplicate labels. It does not affect authored semantics.
|
|
1243
|
+
concurrency: 1,
|
|
1231
1244
|
journaling: false,
|
|
1232
1245
|
persistenceRoot,
|
|
1233
1246
|
loadSavedWorkflow: options.loadSavedWorkflow ?? flows?.resolve,
|
|
1234
1247
|
});
|
|
1235
1248
|
manager.on("agentStart", (event) => {
|
|
1236
|
-
const extra = mockMeta.get(event.label) ?? mockMeta.get("") ?? { schema: false };
|
|
1237
1249
|
const call = {
|
|
1250
|
+
index: agentCalls.length,
|
|
1238
1251
|
label: event.label,
|
|
1252
|
+
promptPreview: boundedPromptPreview(event.prompt),
|
|
1239
1253
|
phase: event.phase,
|
|
1240
1254
|
model: event.model,
|
|
1241
|
-
|
|
1242
|
-
|
|
1243
|
-
|
|
1244
|
-
backend: routeBackend(event.model, extra.tier, backendRegistry, hostRegistry, declaredBackends).display,
|
|
1245
|
-
schema: extra.schema,
|
|
1255
|
+
configOptions: event.configOptions,
|
|
1256
|
+
backend: routeBackend(event.model, undefined, backendRegistry, hostRegistry, declaredBackends).display,
|
|
1257
|
+
schema: false,
|
|
1246
1258
|
};
|
|
1247
1259
|
agentCalls.push(call);
|
|
1248
|
-
|
|
1249
|
-
pendingAgentCalls.push(call);
|
|
1260
|
+
pendingAgentCalls.push(call);
|
|
1250
1261
|
});
|
|
1251
1262
|
try {
|
|
1252
1263
|
const run = await manager.runSync(script, options.args, {
|
|
@@ -1254,6 +1265,8 @@ export async function validateWorkflowScript(script, options = {}) {
|
|
|
1254
1265
|
signal: controller.signal,
|
|
1255
1266
|
maxAgents: options.maxAgents,
|
|
1256
1267
|
defaultModel: options.defaultModel,
|
|
1268
|
+
agentConfigurations: options.agentConfigurations,
|
|
1269
|
+
requireAgentConfiguration: options.requireAgentConfiguration,
|
|
1257
1270
|
scriptBackends: declaredBackends,
|
|
1258
1271
|
confirm: async (promptText, checkpointOptions) => {
|
|
1259
1272
|
const opts = (checkpointOptions ?? {});
|
|
@@ -1266,20 +1279,6 @@ export async function validateWorkflowScript(script, options = {}) {
|
|
|
1266
1279
|
return reply;
|
|
1267
1280
|
},
|
|
1268
1281
|
});
|
|
1269
|
-
// agentStart fires BEFORE the mock records its options, so backfill attribution for
|
|
1270
|
-
// any call whose mock metadata arrived after the event (same tick ordering).
|
|
1271
|
-
if (!mockAnswerState) {
|
|
1272
|
-
for (const call of agentCalls) {
|
|
1273
|
-
const extra = mockMeta.get(call.label);
|
|
1274
|
-
if (extra) {
|
|
1275
|
-
call.tier = extra.tier;
|
|
1276
|
-
call.mode = extra.mode;
|
|
1277
|
-
call.configOptions = extra.configOptions;
|
|
1278
|
-
call.schema = extra.schema;
|
|
1279
|
-
call.backend = routeBackend(call.model, extra.tier, backendRegistry, hostRegistry, declaredBackends).display;
|
|
1280
|
-
}
|
|
1281
|
-
}
|
|
1282
|
-
}
|
|
1283
1282
|
const runOk = run.status === "completed";
|
|
1284
1283
|
if (!runOk && flows === undefined && run.reason?.includes("must be the first statement") && /\bworkflow\s*\(/.test(script)) {
|
|
1285
1284
|
warnings.push('the failure looks like a nested workflow("<name>") call on a bare name — provide workflow dirs ' +
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@automatalabs/workflows",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"engines": {
|
|
6
6
|
"node": ">=22"
|
|
@@ -31,10 +31,10 @@
|
|
|
31
31
|
},
|
|
32
32
|
"dependencies": {
|
|
33
33
|
"typebox": "1.3.2",
|
|
34
|
-
"@automatalabs/
|
|
35
|
-
"@automatalabs/
|
|
36
|
-
"@automatalabs/workflow-engine": "1.
|
|
37
|
-
"@automatalabs/
|
|
34
|
+
"@automatalabs/shared-types": "1.1.0",
|
|
35
|
+
"@automatalabs/acp-agents": "1.0.1",
|
|
36
|
+
"@automatalabs/workflow-engine": "1.1.0",
|
|
37
|
+
"@automatalabs/repl-engine": "0.4.15"
|
|
38
38
|
},
|
|
39
39
|
"devDependencies": {
|
|
40
40
|
"esbuild": "^0.28.1"
|