@workflow-code/cli 0.1.5-20260825002 → 0.2.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/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workflow-code/cli",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"type": "module",
|
|
5
5
|
"bin": {
|
|
6
6
|
"workflow-code": "./dist/index.js"
|
|
@@ -18,7 +18,7 @@
|
|
|
18
18
|
"tsx": "^4.21.0"
|
|
19
19
|
},
|
|
20
20
|
"peerDependencies": {
|
|
21
|
-
"workflow-code": "0.
|
|
21
|
+
"workflow-code": ">=0.2.0 <0.3.0"
|
|
22
22
|
},
|
|
23
23
|
"devDependencies": {
|
|
24
24
|
"@types/node": "^25.6.0",
|
|
@@ -27,12 +27,13 @@
|
|
|
27
27
|
"tsup": "^8.5.1",
|
|
28
28
|
"typescript": "^6.0.3",
|
|
29
29
|
"vitest": "^4.1.7",
|
|
30
|
-
"workflow-code": "0.
|
|
31
|
-
"@workflow-code/auth-config": "0.1.0",
|
|
32
|
-
"@workflow-code/i18n": "0.1.0",
|
|
33
|
-
"@workflow-code/execution-targets": "0.1.0",
|
|
30
|
+
"workflow-code": "0.2.0",
|
|
34
31
|
"@workflow-code/project-upload": "0.1.0",
|
|
35
|
-
"@workflow-code/
|
|
32
|
+
"@workflow-code/runtime-compatibility": "0.1.0",
|
|
33
|
+
"@workflow-code/workflow-ids": "0.1.0",
|
|
34
|
+
"@workflow-code/i18n": "0.1.0",
|
|
35
|
+
"@workflow-code/auth-config": "0.1.0",
|
|
36
|
+
"@workflow-code/execution-targets": "0.1.0"
|
|
36
37
|
},
|
|
37
38
|
"scripts": {
|
|
38
39
|
"bootstrap": "node scripts/bootstrap.mjs",
|
package/dist/local-IBRGKF3N.js
DELETED
|
@@ -1,353 +0,0 @@
|
|
|
1
|
-
#!/usr/bin/env node
|
|
2
|
-
import {
|
|
3
|
-
i18n,
|
|
4
|
-
prepareCliInvocation,
|
|
5
|
-
translateWorkflowCodeError
|
|
6
|
-
} from "./chunk-2KD6CDRU.js";
|
|
7
|
-
|
|
8
|
-
// src/local.ts
|
|
9
|
-
import path from "path";
|
|
10
|
-
import { readFileSync } from "fs";
|
|
11
|
-
import { pathToFileURL } from "url";
|
|
12
|
-
import {
|
|
13
|
-
createCliOutputStreamHooks,
|
|
14
|
-
createWorkflowFailure,
|
|
15
|
-
formatWorkflowExecutionJson,
|
|
16
|
-
inspectLocalWorkflowStructure,
|
|
17
|
-
parseToolPermissionPoliciesJson,
|
|
18
|
-
resolveLocalWorkflowParams,
|
|
19
|
-
runLocalWorkflowWithReport
|
|
20
|
-
} from "workflow-code";
|
|
21
|
-
var WORKFLOW_DESKTOP_RUNTIME_EVENTS_ENV = "WORKFLOW_DESKTOP_RUNTIME_EVENTS";
|
|
22
|
-
var WORKFLOW_DESKTOP_RUNTIME_EVENT_PREFIX = "__WORKFLOW_CODE_RUNTIME_EVENT__";
|
|
23
|
-
var WORKFLOW_PARAM_ERROR_MARKER = "__WORKFLOW_CODE_PARAM_ERROR__";
|
|
24
|
-
var RESUME_RUNTIME_EVENT_AFTER_REQUEST_ID = "__workflowResumeRuntimeEventAfterRequestId";
|
|
25
|
-
async function main(argv = process.argv.slice(2), options = {}) {
|
|
26
|
-
disableAiSdkWarningLogs();
|
|
27
|
-
if (options.localeInitialized !== true) {
|
|
28
|
-
argv = prepareCliInvocation(argv).argv;
|
|
29
|
-
}
|
|
30
|
-
const abortController = createProcessAbortController();
|
|
31
|
-
const command = parseCommand(argv[0]);
|
|
32
|
-
const args = command === "help" ? argv.slice(1) : argv.slice(1);
|
|
33
|
-
if (command === "help") {
|
|
34
|
-
console.log(formatHelp());
|
|
35
|
-
return 0;
|
|
36
|
-
}
|
|
37
|
-
if (command === "structure") {
|
|
38
|
-
return runStructureCommand(args);
|
|
39
|
-
}
|
|
40
|
-
if (command === "resolve-params") {
|
|
41
|
-
return runResolveParamsCommand(args, abortController.signal);
|
|
42
|
-
}
|
|
43
|
-
const parsed = parseWorkflowArgs(args, {
|
|
44
|
-
json: command === "json"
|
|
45
|
-
});
|
|
46
|
-
const report = await runLocalWorkflowWithReport({
|
|
47
|
-
workflowDir: parsed.workflowDir,
|
|
48
|
-
entrypointId: parsed.entrypointId,
|
|
49
|
-
args: parsed.args,
|
|
50
|
-
runId: parsed.runId,
|
|
51
|
-
conversationId: parsed.conversationId,
|
|
52
|
-
kvStoreDir: process.env.WORKFLOW_KV_STORE_DIR,
|
|
53
|
-
persistentValueStoreDir: process.env.WORKFLOW_PERSISTENT_VALUE_STORE_DIR,
|
|
54
|
-
persistentValueWorkflowName: process.env.WORKFLOW_PERSISTENT_VALUE_WORKFLOW_NAME,
|
|
55
|
-
fileStoreDir: parsed.fileStoreDir ?? process.env.WORKFLOW_FILE_STORE_DIR,
|
|
56
|
-
userInput: createCliUserInputContext(parsed.resolvedUserInputs),
|
|
57
|
-
toolPermissionPolicies: parsed.toolPermissionPolicies,
|
|
58
|
-
fileCreateStoreDir: process.env.WORKFLOW_FILE_CREATE_STORE_DIR,
|
|
59
|
-
nodeHooks: parsed.json ? void 0 : createCliOutputStreamHooks(),
|
|
60
|
-
onRuntimeEvent: parsed.json ? createDesktopRuntimeEventEmitter() : void 0,
|
|
61
|
-
abortSignal: abortController.signal
|
|
62
|
-
});
|
|
63
|
-
if (parsed.json) {
|
|
64
|
-
console.log(formatWorkflowExecutionJson(report));
|
|
65
|
-
} else if (report.status === "failed") {
|
|
66
|
-
console.error(formatWorkflowExecutionJson(report));
|
|
67
|
-
}
|
|
68
|
-
return getReportExitCode(report);
|
|
69
|
-
}
|
|
70
|
-
function createProcessAbortController() {
|
|
71
|
-
const controller = new AbortController();
|
|
72
|
-
let forcedExit;
|
|
73
|
-
const abort = () => {
|
|
74
|
-
if (!controller.signal.aborted) {
|
|
75
|
-
controller.abort(new Error("Workflow CLI process was interrupted."));
|
|
76
|
-
forcedExit = setTimeout(() => {
|
|
77
|
-
process.exit(130);
|
|
78
|
-
}, 5e3);
|
|
79
|
-
forcedExit.unref?.();
|
|
80
|
-
}
|
|
81
|
-
};
|
|
82
|
-
process.once("SIGINT", abort);
|
|
83
|
-
process.once("SIGTERM", abort);
|
|
84
|
-
process.once("beforeExit", () => clearTimeout(forcedExit));
|
|
85
|
-
return controller;
|
|
86
|
-
}
|
|
87
|
-
function parseCommand(value) {
|
|
88
|
-
if (value === void 0 || value === "--help" || value === "-h" || value === "help") {
|
|
89
|
-
return "help";
|
|
90
|
-
}
|
|
91
|
-
if (value === "run" || value === "json" || value === "structure" || value === "resolve-params") {
|
|
92
|
-
return value;
|
|
93
|
-
}
|
|
94
|
-
throw new Error(i18n.t("unknownLocalCommand", { ns: "cli", command: value }));
|
|
95
|
-
}
|
|
96
|
-
async function runResolveParamsCommand(argv, abortSignal) {
|
|
97
|
-
try {
|
|
98
|
-
const parsed = parseWorkflowArgs(argv, { json: true });
|
|
99
|
-
const request = parseParamResolveRequest(readFileSync(0, "utf8"));
|
|
100
|
-
const result = await resolveLocalWorkflowParams({
|
|
101
|
-
workflowDir: parsed.workflowDir,
|
|
102
|
-
entrypointId: parsed.entrypointId,
|
|
103
|
-
request,
|
|
104
|
-
abortSignal
|
|
105
|
-
});
|
|
106
|
-
console.log(JSON.stringify(result));
|
|
107
|
-
return 0;
|
|
108
|
-
} catch (error) {
|
|
109
|
-
console.error(formatParamResolverFailure(error));
|
|
110
|
-
return 1;
|
|
111
|
-
}
|
|
112
|
-
}
|
|
113
|
-
function formatParamResolverFailure(error) {
|
|
114
|
-
return `${WORKFLOW_PARAM_ERROR_MARKER}${JSON.stringify(createWorkflowFailure(error).error)}`;
|
|
115
|
-
}
|
|
116
|
-
function parseParamResolveRequest(value) {
|
|
117
|
-
const parsed = JSON.parse(value);
|
|
118
|
-
if (typeof parsed !== "object" || parsed === null || typeof parsed.draftText !== "string" || !Array.isArray(parsed.args) || !parsed.args.every((arg) => typeof arg === "string") || parsed.inputMode !== "form" && parsed.inputMode !== "raw" || typeof parsed.trigger !== "object" || parsed.trigger === null || parsed.trigger.kind !== "init" && parsed.trigger.kind !== "input" && parsed.trigger.kind !== "param" || parsed.trigger.kind === "param" && typeof parsed.trigger.paramName !== "string") {
|
|
119
|
-
throw new Error(i18n.t("invalidParamResolveRequest", { ns: "cli" }));
|
|
120
|
-
}
|
|
121
|
-
return parsed;
|
|
122
|
-
}
|
|
123
|
-
function parseWorkflowArgs(argv, options) {
|
|
124
|
-
let json = options.json;
|
|
125
|
-
let runId;
|
|
126
|
-
let entrypointId;
|
|
127
|
-
let conversationId;
|
|
128
|
-
let fileStoreDir;
|
|
129
|
-
let resolvedUserInputs = [];
|
|
130
|
-
let toolPermissionPolicies;
|
|
131
|
-
const filteredArgv = [];
|
|
132
|
-
for (let index = 0; index < argv.length; index += 1) {
|
|
133
|
-
const arg = argv[index];
|
|
134
|
-
if (arg === "--") {
|
|
135
|
-
filteredArgv.push(...argv.slice(index));
|
|
136
|
-
break;
|
|
137
|
-
}
|
|
138
|
-
if (arg === "--json") {
|
|
139
|
-
json = true;
|
|
140
|
-
continue;
|
|
141
|
-
}
|
|
142
|
-
if (arg === "--conversation-id") {
|
|
143
|
-
conversationId = readWorkflowArgValue(argv, ++index, "--conversation-id");
|
|
144
|
-
continue;
|
|
145
|
-
}
|
|
146
|
-
if (arg === "--run-id") {
|
|
147
|
-
runId = readWorkflowArgValue(argv, ++index, "--run-id");
|
|
148
|
-
continue;
|
|
149
|
-
}
|
|
150
|
-
if (arg === "--entrypoint") {
|
|
151
|
-
entrypointId = readWorkflowArgValue(argv, ++index, "--entrypoint");
|
|
152
|
-
continue;
|
|
153
|
-
}
|
|
154
|
-
if (arg === "--file-store-dir") {
|
|
155
|
-
fileStoreDir = readWorkflowArgValue(argv, ++index, "--file-store-dir");
|
|
156
|
-
continue;
|
|
157
|
-
}
|
|
158
|
-
if (arg === "--resolved-user-inputs-json") {
|
|
159
|
-
resolvedUserInputs = parseResolvedUserInputs(
|
|
160
|
-
readWorkflowArgValue(argv, ++index, "--resolved-user-inputs-json")
|
|
161
|
-
);
|
|
162
|
-
continue;
|
|
163
|
-
}
|
|
164
|
-
if (arg === "--tool-permissions-json") {
|
|
165
|
-
toolPermissionPolicies = parseToolPermissionPoliciesJson(
|
|
166
|
-
readWorkflowArgValue(argv, ++index, "--tool-permissions-json")
|
|
167
|
-
);
|
|
168
|
-
continue;
|
|
169
|
-
}
|
|
170
|
-
filteredArgv.push(arg);
|
|
171
|
-
}
|
|
172
|
-
const [workflowDirArg, ...rest] = filteredArgv;
|
|
173
|
-
if (workflowDirArg !== void 0 && workflowDirArg !== "--" && !workflowDirArg.startsWith("-")) {
|
|
174
|
-
return {
|
|
175
|
-
workflowDir: path.resolve(process.cwd(), workflowDirArg),
|
|
176
|
-
args: removePnpmRunSeparator(rest),
|
|
177
|
-
json,
|
|
178
|
-
runId,
|
|
179
|
-
entrypointId,
|
|
180
|
-
conversationId,
|
|
181
|
-
fileStoreDir,
|
|
182
|
-
resolvedUserInputs,
|
|
183
|
-
toolPermissionPolicies
|
|
184
|
-
};
|
|
185
|
-
}
|
|
186
|
-
return {
|
|
187
|
-
workflowDir: process.cwd(),
|
|
188
|
-
args: removePnpmRunSeparator(filteredArgv),
|
|
189
|
-
json,
|
|
190
|
-
runId,
|
|
191
|
-
entrypointId,
|
|
192
|
-
conversationId,
|
|
193
|
-
fileStoreDir,
|
|
194
|
-
resolvedUserInputs,
|
|
195
|
-
toolPermissionPolicies
|
|
196
|
-
};
|
|
197
|
-
}
|
|
198
|
-
function createCliUserInputContext(resolvedInputs) {
|
|
199
|
-
return {
|
|
200
|
-
[RESUME_RUNTIME_EVENT_AFTER_REQUEST_ID]: resolvedInputs.at(-1)?.requestId,
|
|
201
|
-
getResolvedInput(requestId) {
|
|
202
|
-
return resolvedInputs.find((input) => input.requestId === requestId);
|
|
203
|
-
},
|
|
204
|
-
requestInput() {
|
|
205
|
-
throw new Error(
|
|
206
|
-
i18n.t("waitingForUserInput", { ns: "cli" })
|
|
207
|
-
);
|
|
208
|
-
}
|
|
209
|
-
};
|
|
210
|
-
}
|
|
211
|
-
function parseResolvedUserInputs(value) {
|
|
212
|
-
const parsed = JSON.parse(value);
|
|
213
|
-
if (!Array.isArray(parsed)) {
|
|
214
|
-
throw new Error(i18n.t("resolvedInputsMustBeArray", { ns: "cli" }));
|
|
215
|
-
}
|
|
216
|
-
return parsed.map((item) => {
|
|
217
|
-
if (typeof item !== "object" || item === null || typeof item.requestId !== "string" || typeof item.nodeName !== "string" || typeof item.values !== "object" || item.values === null || typeof item.submittedAt !== "string") {
|
|
218
|
-
throw new Error(i18n.t("invalidResolvedInput", { ns: "cli" }));
|
|
219
|
-
}
|
|
220
|
-
return {
|
|
221
|
-
requestId: item.requestId,
|
|
222
|
-
nodeName: item.nodeName,
|
|
223
|
-
values: item.values,
|
|
224
|
-
submittedAt: new Date(item.submittedAt)
|
|
225
|
-
};
|
|
226
|
-
});
|
|
227
|
-
}
|
|
228
|
-
function createDesktopRuntimeEventEmitter() {
|
|
229
|
-
if (process.env[WORKFLOW_DESKTOP_RUNTIME_EVENTS_ENV] !== "1") {
|
|
230
|
-
return void 0;
|
|
231
|
-
}
|
|
232
|
-
return (event) => {
|
|
233
|
-
process.stdout.write(
|
|
234
|
-
`${WORKFLOW_DESKTOP_RUNTIME_EVENT_PREFIX}${JSON.stringify(event, createRuntimeEventJsonReplacer())}
|
|
235
|
-
`
|
|
236
|
-
);
|
|
237
|
-
};
|
|
238
|
-
}
|
|
239
|
-
function createRuntimeEventJsonReplacer() {
|
|
240
|
-
const ancestors = [];
|
|
241
|
-
return function replacer(_key, value) {
|
|
242
|
-
if (typeof value === "bigint") {
|
|
243
|
-
return `${value.toString()}n`;
|
|
244
|
-
}
|
|
245
|
-
if (typeof value === "function") {
|
|
246
|
-
return `[Function ${value.name || "anonymous"}]`;
|
|
247
|
-
}
|
|
248
|
-
if (typeof value === "symbol") {
|
|
249
|
-
return value.toString();
|
|
250
|
-
}
|
|
251
|
-
if (typeof value === "object" && value !== null) {
|
|
252
|
-
while (ancestors.length > 0 && ancestors.at(-1) !== this) {
|
|
253
|
-
ancestors.pop();
|
|
254
|
-
}
|
|
255
|
-
if (ancestors.includes(value)) {
|
|
256
|
-
return "[Circular]";
|
|
257
|
-
}
|
|
258
|
-
ancestors.push(value);
|
|
259
|
-
}
|
|
260
|
-
return value;
|
|
261
|
-
};
|
|
262
|
-
}
|
|
263
|
-
function readWorkflowArgValue(argv, index, name) {
|
|
264
|
-
const value = argv[index];
|
|
265
|
-
if (value === void 0) {
|
|
266
|
-
throw new Error(i18n.t("missingOptionValue", { ns: "cli", name }));
|
|
267
|
-
}
|
|
268
|
-
return value;
|
|
269
|
-
}
|
|
270
|
-
function runStructureCommand(argv) {
|
|
271
|
-
const parsed = parseWorkflowArgs(argv, { json: true });
|
|
272
|
-
try {
|
|
273
|
-
const report = inspectLocalWorkflowStructure({
|
|
274
|
-
workflowDir: parsed.workflowDir
|
|
275
|
-
});
|
|
276
|
-
console.log(JSON.stringify(report, null, 2));
|
|
277
|
-
return 0;
|
|
278
|
-
} catch (error) {
|
|
279
|
-
console.log(formatWorkflowStructureError(error));
|
|
280
|
-
return 1;
|
|
281
|
-
}
|
|
282
|
-
}
|
|
283
|
-
function removePnpmRunSeparator(argv) {
|
|
284
|
-
const separatorIndex = argv.indexOf("--");
|
|
285
|
-
if (separatorIndex < 0) {
|
|
286
|
-
return argv;
|
|
287
|
-
}
|
|
288
|
-
return [
|
|
289
|
-
...argv.slice(0, separatorIndex),
|
|
290
|
-
...argv.slice(separatorIndex + 1)
|
|
291
|
-
];
|
|
292
|
-
}
|
|
293
|
-
function getReportExitCode(report) {
|
|
294
|
-
if (report.status === "failed") {
|
|
295
|
-
return 1;
|
|
296
|
-
}
|
|
297
|
-
const result = report.result;
|
|
298
|
-
if (result.ok && typeof result.data === "object" && result.data !== null && "errCode" in result.data && typeof result.data.errCode === "number") {
|
|
299
|
-
return result.data.errCode === 0 ? 0 : 1;
|
|
300
|
-
}
|
|
301
|
-
return 0;
|
|
302
|
-
}
|
|
303
|
-
function formatWorkflowStructureError(error) {
|
|
304
|
-
return JSON.stringify(
|
|
305
|
-
{
|
|
306
|
-
workflow: {
|
|
307
|
-
name: ""
|
|
308
|
-
},
|
|
309
|
-
definitions: {
|
|
310
|
-
nodes: {},
|
|
311
|
-
apiCalls: [],
|
|
312
|
-
variables: {}
|
|
313
|
-
},
|
|
314
|
-
execution: {
|
|
315
|
-
kind: "sequence",
|
|
316
|
-
children: []
|
|
317
|
-
},
|
|
318
|
-
diagnostics: {
|
|
319
|
-
warnings: [],
|
|
320
|
-
violations: [],
|
|
321
|
-
error: createWorkflowFailure(error).error
|
|
322
|
-
}
|
|
323
|
-
},
|
|
324
|
-
null,
|
|
325
|
-
2
|
|
326
|
-
);
|
|
327
|
-
}
|
|
328
|
-
function formatHelp() {
|
|
329
|
-
return i18n.t("localHelp", { ns: "cli" });
|
|
330
|
-
}
|
|
331
|
-
function disableAiSdkWarningLogs() {
|
|
332
|
-
globalThis.AI_SDK_LOG_WARNINGS = false;
|
|
333
|
-
}
|
|
334
|
-
if (isCliEntrypoint()) {
|
|
335
|
-
main().then((exitCode) => {
|
|
336
|
-
process.exitCode = exitCode;
|
|
337
|
-
}).catch((error) => {
|
|
338
|
-
console.error(translateWorkflowCodeError(error));
|
|
339
|
-
process.exitCode = 1;
|
|
340
|
-
});
|
|
341
|
-
}
|
|
342
|
-
function isCliEntrypoint() {
|
|
343
|
-
return process.argv[1] !== void 0 && import.meta.url === pathToFileURL(path.resolve(process.argv[1])).href;
|
|
344
|
-
}
|
|
345
|
-
export {
|
|
346
|
-
WORKFLOW_DESKTOP_RUNTIME_EVENTS_ENV,
|
|
347
|
-
WORKFLOW_DESKTOP_RUNTIME_EVENT_PREFIX,
|
|
348
|
-
WORKFLOW_PARAM_ERROR_MARKER,
|
|
349
|
-
createDesktopRuntimeEventEmitter,
|
|
350
|
-
formatParamResolverFailure,
|
|
351
|
-
main,
|
|
352
|
-
parseWorkflowArgs
|
|
353
|
-
};
|