@workflow/cli 5.0.0-beta.39 → 5.0.0-beta.40
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/commands/cancel.d.ts.map +1 -1
- package/dist/commands/cancel.js +28 -93
- package/dist/lib/bulk-cancel.d.ts +74 -0
- package/dist/lib/bulk-cancel.d.ts.map +1 -0
- package/dist/lib/bulk-cancel.js +197 -0
- package/dist/lib/bulk-cancel.test.d.ts +2 -0
- package/dist/lib/bulk-cancel.test.d.ts.map +1 -0
- package/dist/lib/bulk-cancel.test.js +366 -0
- package/package.json +8 -8
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cancel.d.ts","sourceRoot":"","sources":["../../src/commands/cancel.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"cancel.d.ts","sourceRoot":"","sources":["../../src/commands/cancel.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAezC,MAAM,CAAC,OAAO,OAAO,MAAO,SAAQ,WAAW;IAC7C,MAAM,CAAC,WAAW,SAC4C;IAE9D,MAAM,CAAC,OAAO,WAAS;IAEvB,MAAM,CAAC,QAAQ,WAKb;IAEI,KAAK,CAAC,KAAK,EAAE,GAAG;IAUtB,MAAM,CAAC,IAAI;;MAKA;IAEX,MAAM,CAAC,KAAK;;;;;;;;;;;;;;;;;;;;MAmCV;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAwDlC"}
|
package/dist/commands/cancel.js
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
1
|
import readline from 'node:readline';
|
|
2
2
|
import { Args, Flags } from '@oclif/core';
|
|
3
3
|
import { cancelRun } from '@workflow/core/runtime';
|
|
4
|
-
import { parseWorkflowName } from '@workflow/utils/parse-name';
|
|
5
4
|
import { WorkflowRunStatusSchema } from '@workflow/world';
|
|
6
5
|
import chalk from 'chalk';
|
|
7
|
-
import Table from 'easy-table';
|
|
8
6
|
import { BaseCommand } from '../base.js';
|
|
7
|
+
import { CANCELLABLE_STATUSES, CLI_CANCEL_REASON, performBulkCancel, validateBulkCancelLimit, } from '../lib/bulk-cancel.js';
|
|
9
8
|
import { LOGGING_CONFIG, logger } from '../lib/config/log.js';
|
|
10
9
|
import { getObservabilityUpgradeRequiredMessage, isObservabilityUpgradeRequiredError, } from '../lib/inspect/errors.js';
|
|
11
10
|
import { cliFlags } from '../lib/inspect/flags.js';
|
|
12
11
|
import { setupCliWorld } from '../lib/inspect/setup.js';
|
|
13
|
-
import { planWindowStartFromResponse } from '../lib/inspect/time-window.js';
|
|
14
12
|
export default class Cancel extends BaseCommand {
|
|
15
13
|
static description = 'Cancel a workflow run, or bulk-cancel runs by status/name';
|
|
16
14
|
static aliases = ['c'];
|
|
@@ -39,9 +37,12 @@ export default class Cancel extends BaseCommand {
|
|
|
39
37
|
static flags = {
|
|
40
38
|
...cliFlags,
|
|
41
39
|
status: Flags.string({
|
|
42
|
-
|
|
40
|
+
// Only cancellable statuses are offered: cancelling a terminal run
|
|
41
|
+
// (completed / failed / cancelled) is a no-op, so pinning one would list
|
|
42
|
+
// the same page on every rerun and never advance.
|
|
43
|
+
description: 'Filter runs by status for bulk cancel (pending or running)',
|
|
43
44
|
required: false,
|
|
44
|
-
options: [...
|
|
45
|
+
options: [...CANCELLABLE_STATUSES],
|
|
45
46
|
helpGroup: 'Bulk Cancel',
|
|
46
47
|
helpLabel: '--status',
|
|
47
48
|
}),
|
|
@@ -53,7 +54,7 @@ export default class Cancel extends BaseCommand {
|
|
|
53
54
|
helpLabel: '-n, --workflowName',
|
|
54
55
|
}),
|
|
55
56
|
limit: Flags.integer({
|
|
56
|
-
description: 'Max runs to cancel in bulk mode',
|
|
57
|
+
description: 'Max runs to cancel in bulk mode (1-500)',
|
|
57
58
|
required: false,
|
|
58
59
|
default: 50,
|
|
59
60
|
helpGroup: 'Bulk Cancel',
|
|
@@ -77,7 +78,9 @@ export default class Cancel extends BaseCommand {
|
|
|
77
78
|
}
|
|
78
79
|
// Single-run cancel (existing behavior)
|
|
79
80
|
if (args.runId) {
|
|
80
|
-
await cancelRun(world, args.runId
|
|
81
|
+
await cancelRun(world, args.runId, {
|
|
82
|
+
cancelReason: CLI_CANCEL_REASON,
|
|
83
|
+
});
|
|
81
84
|
logger.log(chalk.green(`Cancelled run ${args.runId}`));
|
|
82
85
|
return;
|
|
83
86
|
}
|
|
@@ -90,95 +93,27 @@ export default class Cancel extends BaseCommand {
|
|
|
90
93
|
' workflow cancel --status=running --workflowName=myWorkflow');
|
|
91
94
|
process.exit(1);
|
|
92
95
|
}
|
|
93
|
-
|
|
94
|
-
|
|
96
|
+
const limit = flags.limit ?? 50;
|
|
97
|
+
const limitError = validateBulkCancelLimit(limit);
|
|
98
|
+
if (limitError) {
|
|
99
|
+
logger.error(limitError);
|
|
100
|
+
process.exit(1);
|
|
101
|
+
}
|
|
95
102
|
const status = flags.status
|
|
96
103
|
? WorkflowRunStatusSchema.parse(flags.status)
|
|
97
104
|
: undefined;
|
|
98
|
-
const
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
// The analytics backend defaults its listing to a recent window
|
|
110
|
-
// (trailing 24h on the Vercel backend), but bulk cancel must match
|
|
111
|
-
// across the plan's whole observability window — a run can sleep or
|
|
112
|
-
// wait on a hook for days without emitting recent events. Probe for
|
|
113
|
-
// the plan window bounds first, then match across them.
|
|
114
|
-
const probe = await analytics.runs.list({
|
|
115
|
-
status,
|
|
116
|
-
workflowName: flags.workflowName,
|
|
117
|
-
pagination: { limit: 1 },
|
|
118
|
-
});
|
|
119
|
-
const windowStart = planWindowStartFromResponse(probe);
|
|
120
|
-
return analytics.runs.list({
|
|
121
|
-
status,
|
|
122
|
-
workflowName: flags.workflowName,
|
|
123
|
-
...(windowStart
|
|
124
|
-
? { startTime: windowStart, endTime: new Date().toISOString() }
|
|
125
|
-
: {}),
|
|
126
|
-
pagination: { limit },
|
|
127
|
-
});
|
|
128
|
-
};
|
|
129
|
-
const runList = await fetchMatches();
|
|
130
|
-
const runs = {
|
|
131
|
-
data: runList.data.map((run) => ({
|
|
132
|
-
runId: run.runId,
|
|
133
|
-
workflowName: run.workflowName,
|
|
134
|
-
status: run.status,
|
|
135
|
-
startedAt: run.startedAt,
|
|
136
|
-
})),
|
|
137
|
-
hasMore: runList.hasMore,
|
|
138
|
-
};
|
|
139
|
-
if (runs.data.length === 0) {
|
|
140
|
-
logger.warn('No matching runs found.');
|
|
141
|
-
return;
|
|
142
|
-
}
|
|
143
|
-
// Display what will be cancelled
|
|
144
|
-
const table = new Table();
|
|
145
|
-
for (const run of runs.data) {
|
|
146
|
-
const shortName = parseWorkflowName(run.workflowName)?.shortName || run.workflowName;
|
|
147
|
-
table.cell('runId', run.runId);
|
|
148
|
-
table.cell('workflow', chalk.blueBright(shortName));
|
|
149
|
-
table.cell('status', run.status);
|
|
150
|
-
table.cell('startedAt', run.startedAt ? new Date(run.startedAt).toISOString() : '-');
|
|
151
|
-
table.newRow();
|
|
152
|
-
}
|
|
153
|
-
logger.log(`\nFound ${chalk.bold(runs.data.length)} runs to cancel:\n`);
|
|
154
|
-
logger.log(table.toString());
|
|
155
|
-
if (runs.hasMore) {
|
|
156
|
-
logger.warn(`More runs match these filters. Increase --limit (currently ${flags.limit || 50}) or re-run to cancel additional runs.`);
|
|
157
|
-
}
|
|
158
|
-
// Confirm unless --confirm/-y
|
|
159
|
-
if (!flags.confirm) {
|
|
160
|
-
const confirmed = await promptConfirm(`Cancel ${runs.data.length} run${runs.data.length === 1 ? '' : 's'}?`);
|
|
161
|
-
if (!confirmed) {
|
|
162
|
-
logger.log('Aborted.');
|
|
163
|
-
return;
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
// Cancel each run with progress
|
|
167
|
-
let cancelled = 0;
|
|
168
|
-
let failed = 0;
|
|
169
|
-
for (const run of runs.data) {
|
|
170
|
-
try {
|
|
171
|
-
await cancelRun(world, run.runId);
|
|
172
|
-
cancelled++;
|
|
173
|
-
logger.log(chalk.green(` ✓ ${run.runId}`) +
|
|
174
|
-
chalk.gray(` (${cancelled}/${runs.data.length})`));
|
|
175
|
-
}
|
|
176
|
-
catch (err) {
|
|
177
|
-
failed++;
|
|
178
|
-
logger.warn(` ✗ ${run.runId}: ${err.message || String(err)}`);
|
|
179
|
-
}
|
|
105
|
+
const { exitCode } = await performBulkCancel({
|
|
106
|
+
world,
|
|
107
|
+
status,
|
|
108
|
+
workflowName: flags.workflowName,
|
|
109
|
+
limit,
|
|
110
|
+
confirm: flags.confirm,
|
|
111
|
+
logger,
|
|
112
|
+
promptConfirm,
|
|
113
|
+
});
|
|
114
|
+
if (exitCode !== 0) {
|
|
115
|
+
process.exit(exitCode);
|
|
180
116
|
}
|
|
181
|
-
logger.log(`\nDone: ${chalk.green(`${cancelled} cancelled`)}${failed > 0 ? `, ${chalk.red(`${failed} failed`)}` : ''}`);
|
|
182
117
|
}
|
|
183
118
|
}
|
|
184
119
|
async function promptConfirm(message) {
|
|
@@ -197,4 +132,4 @@ async function promptConfirm(message) {
|
|
|
197
132
|
});
|
|
198
133
|
});
|
|
199
134
|
}
|
|
200
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2NhbmNlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFFBQVEsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxpQkFBaUIsRUFBRSxNQUFNLDRCQUE0QixDQUFDO0FBQy9ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEtBQUssTUFBTSxZQUFZLENBQUM7QUFDL0IsT0FBTyxFQUFFLFdBQVcsRUFBRSxNQUFNLFlBQVksQ0FBQztBQUN6QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlELE9BQU8sRUFDTCxzQ0FBc0MsRUFDdEMsbUNBQW1DLEdBQ3BDLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUN4RCxPQUFPLEVBQUUsMkJBQTJCLEVBQUUsTUFBTSwrQkFBK0IsQ0FBQztBQUU1RSxNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU8sU0FBUSxXQUFXO0lBQzdDLE1BQU0sQ0FBQyxXQUFXLEdBQ2hCLDJEQUEyRCxDQUFDO0lBRTlELE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUV2QixNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDRCQUE0QjtRQUM1QixvQ0FBb0M7UUFDcEMsOERBQThEO1FBQzlELHVDQUF1QztLQUN4QyxDQUFDO0lBRUYsS0FBSyxD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S0FBSyxFQUFFLE9BQU8sQ0FBQyxLQUFLO1FBQ3BCLE1BQU0sRUFBRSxPQUFPLENBQUMsTUFBTTtLQUN2QixDQUFDLENBQUM7SUFFSCxPQUFPLElBQUksT0FBTyxDQUFVLENBQUMsT0FBTyxFQUFFLEVBQUU7UUFDdEMsRUFBRSxDQUFDLFFBQVEsQ0FBQyxHQUFHLE9BQU8sU0FBUyxFQUFFLENBQUMsTUFBTSxFQUFFLEVBQUU7WUFDMUMsRUFBRSxDQUFDLEtBQUssRUFBRSxDQUFDO1lBQ1gsT0FBTyxDQUFDLE1BQU0sQ0FBQyxJQUFJLEVBQUUsQ0FBQyxXQUFXLEVBQUUsS0FBSyxHQUFHLENBQUMsQ0FBQztRQUMvQyxDQUFDLENBQUMsQ0FBQztJQUNMLENBQUMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCByZWFkbGluZSBmcm9tICdub2RlOnJlYWRsaW5lJztcbmltcG9ydCB7IEFyZ3MsIEZsYWdzIH0gZnJvbSAnQG9jbGlmL2NvcmUnO1xuaW1wb3J0IHsgY2FuY2VsUnVuIH0gZnJvbSAnQHdvcmtmbG93L2NvcmUvcnVudGltZSc7XG5pbXBvcnQgeyBwYXJzZVdvcmtmbG93TmFtZSB9IGZyb20gJ0B3b3JrZmxvdy91dGlscy9wYXJzZS1uYW1lJztcbmltcG9ydCB7IFdvcmtmbG93UnVuU3RhdHVzU2NoZW1hIH0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgVGFibGUgZnJvbSAnZWFzeS10YWJsZSc7XG5pbXBvcnQgeyBCYXNlQ29tbWFuZCB9IGZyb20gJy4uL2Jhc2UuanMnO1xuaW1wb3J0IHsgTE9HR0lOR19DT05GSUcsIGxvZ2dlciB9IGZyb20gJy4uL2xpYi9jb25maWcvbG9nLmpzJztcbmltcG9ydCB7XG4gIGdldE9ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRNZXNzYWdlLFxuICBpc09ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRFcnJvcixcbn0gZnJvbSAnLi4vbGliL2luc3BlY3QvZXJyb3JzLmpzJztcbmltcG9ydCB7IGNsaUZsYWdzIH0gZnJvbSAnLi4vbGliL2luc3BlY3QvZmxhZ3MuanMnO1xuaW1wb3J0IHsgc2V0dXBDbGlXb3JsZCB9IGZyb20gJy4uL2xpYi9pbnNwZWN0L3NldHVwLmpzJztcbmltcG9ydCB7IHBsYW5XaW5kb3dTdGFydEZyb21SZXNwb25zZSB9IGZyb20gJy4uL2xpYi9pbnNwZWN0L3RpbWUtd2luZG93LmpzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FuY2VsIGV4dGVuZHMgQmFzZUNvbW1hbmQge1xuICBzdGF0aWMgZGVzY3JpcHRpb24gPVxuICAgICdDYW5jZWwgYSB3b3JrZmxvdyBydW4sIG9yIGJ1bGstY2FuY2VsIHJ1bnMgYnkgc3RhdHVzL25hbWUnO1xuXG4gIHN0YXRpYyBhbGlhc2VzID0gWydjJ107XG5cbiAgc3RhdGljIGV4YW1wbGVzID0gW1xuICAgICckIHdvcmtmbG93IGNhbmNlbCA8cnVuLWlkPicsXG4gICAgJyQgd29ya2Zsb3cgY2FuY2VsIC0tc3RhdHVzPXJ1bm5pbmcnLFxuICAgICckIHdvcmtmbG93IGNhbmNlbCAtLXN0YXR1cz1ydW5uaW5nIC0td29ya2Zsb3dOYW1lPW15V29ya2Zsb3cnLFxuICAgICckIHdvcmtmbG93IGNhbmNlbCAtLXN0YXR1cz1ydW5uaW5nIC15JyxcbiAgXTtcblxuICBhc3luYyBjYXRjaChlcnJvcjogYW55KSB7XG4gICAgaWYgKGlzT2JzZXJ2YWJpbGl0eVVwZ3JhZGVSZXF1aXJlZEVycm9yKGVycm9yKSkge1xuICAgICAgbG9nZ2VyLmVycm9yKGdldE9ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRNZXNzYWdlKCkpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH0gZWxzZSBpZiAoTE9HR0lOR19DT05GSUcuVkVSQk9TRV9NT0RFKSB7XG4gICAgICBjb25zb2xlLmVycm9yKGVycm9yKTtcbiAgICB9XG4gICAgdGhyb3cgZXJyb3I7XG4gIH1cblxuICBzdGF0aWMgYXJncyA9IHtcbiAgICBydW5JZDogQXJncy5zdHJpbmcoe1xuICAgICAgZGVzY3JpcHRpb246ICdJRCBvZiB0aGUgcnVuIHRvIGNhbmNlbCAob21pdCBmb3IgYnVsayBtb2RlIHdpdGggZmlsdGVycyknLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgIH0pLFxuICB9IGFzIGNvbnN0O1xuXG4gIHN0YXRpYyBmbGFncyA9IHtcbiAgICAuLi5jbGlGbGFncyxcbiAgICBzdGF0dXM6IEZsYWdzLnN0cmluZyh7XG4gICAgICBkZXNjcmlwdGlvbjogJ0ZpbHRlciBydW5zIGJ5IHN0YXR1cyBmb3IgYnVsayBjYW5jZWwnLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgb3B0aW9uczogWy4uLldvcmtmbG93UnVuU3RhdHVzU2NoZW1hLm9wdGlvbnNdLFxuICAgICAgaGVscEdyb3VwOiAnQnVsayBDYW5jZWwnLFxuICAgICAgaGVscExhYmVsOiAnLS1zdGF0dXMnLFxuICAgIH0pLFxuICAgIHdvcmtmbG93TmFtZTogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRmlsdGVyIHJ1bnMgYnkgd29ya2Zsb3cgbmFtZSBmb3IgYnVsayBjYW5jZWwnLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgY2hhcjogJ24nLFxuICAgICAgaGVscEdyb3VwOiAnQnVsayBDYW5jZWwnLFxuICAgICAgaGVscExhYmVsOiAnLW4sIC0td29ya2Zsb3dOYW1lJyxcbiAgICB9KSxcbiAgICBsaW1pdDogRmxhZ3MuaW50ZWdlcih7XG4gICAgICBkZXNjcmlwdGlvbjogJ01heCBydW5zIHRvIGNhbmNlbCBpbiBidWxrIG1vZGUnLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgZGVmYXVsdDogNTAsXG4gICAgICBoZWxwR3JvdXA6ICdCdWxrIENhbmNlbCcsXG4gICAgICBoZWxwTGFiZWw6ICctLWxpbWl0JyxcbiAgICAgIGhlbHBWYWx1ZTogJ05VTUJFUicsXG4gICAgfSksXG4gICAgY29uZmlybTogRmxhZ3MuYm9vbGVhbih7XG4gICAgICBkZXNjcmlwdGlvbjogJ1NraXAgaW50ZXJhY3RpdmUgY29uZmlybWF0aW9uIHByb21wdCcsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBjaGFyOiAneScsXG4gICAgICBkZWZhdWx0OiBmYWxzZSxcbiAgICAgIGhlbHBHcm91cDogJ0J1bGsgQ2FuY2VsJyxcbiAgICAgIGhlbHBMYWJlbDogJy15LCAtLWNvbmZpcm0nLFxuICAgIH0pLFxuICB9O1xuXG4gIHB1YmxpYyBhc3luYyBydW4oKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgY29uc3QgeyBmbGFncywgYXJncyB9ID0gYXdhaXQgdGhpcy5wYXJzZShDYW5jZWwpO1xuXG4gICAgY29uc3Qgd29ybGQgPSBhd2FpdCBzZXR1cENsaVdvcmxkKGZsYWdzLCB0aGlzLmNvbmZpZy52ZXJzaW9uKTtcbiAgICBpZiAoIXdvcmxkKSB7XG4gICAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAgICdGYWlsZWQgdG8gY29ubmVjdCB0byBiYWNrZW5kLiBDaGVjayB5b3VyIGNvbmZpZ3VyYXRpb24uJ1xuICAgICAgKTtcbiAgICB9XG5cbiAgICAvLyBTaW5nbGUtcnVuIGNhbmNlbCAoZXhpc3RpbmcgYmVoYXZpb3IpXG4gICAgaWYgKGFyZ3MucnVuSWQpIHtcbiAgICAgIGF3YWl0IGNhbmNlbFJ1bih3b3JsZCwgYXJncy5ydW5JZCk7XG4gICAgICBsb2dnZXIubG9nKGNoYWxrLmdyZWVuKGBDYW5jZWxsZWQgcnVuICR7YXJncy5ydW5JZH1gKSk7XG4gICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgLy8gQnVsayBtb2RlIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBmaWx0ZXJcbiAgICBpZiAoIWZsYWdzLnN0YXR1cyAmJiAhZmxhZ3Mud29ya2Zsb3dOYW1lKSB7XG4gICAgICBsb2dnZXIuZXJyb3IoXG4gICAgICAgICdQcm92aWRlIGEgcnVuIElEIG9yIHVzZSAtLXN0YXR1cy8tLXdvcmtmbG93TmFtZSB0byBidWxrIGNhbmNlbC5cXG4nICtcbiAgICAgICAgICAnRXhhbXBsZXM6XFxuJyArXG4gICAgICAgICAgJyAgd29ya2Zsb3cgY2FuY2VsIDxydW4taWQ+XFxuJyArXG4gICAgICAgICAgJyAgd29ya2Zsb3cgY2FuY2VsIC0tc3RhdHVzPXJ1bm5pbmdcXG4nICtcbiAgICAgICAgICAnICB3b3JrZmxvdyBjYW5jZWwgLS1zdGF0dXM9cnVubmluZyAtLXdvcmtmbG93TmFtZT1teVdvcmtmbG93J1xuICAgICAgKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9XG5cbiAgICAvLyBGZXRjaCBtYXRjaGluZyBydW5zLiBPbmx5IG1ldGFkYXRhIGlzIG5lZWRlZCB0byBkaXNwbGF5IGFuZCBjYW5jZWwsIHNvXG4gICAgLy8gcHJlZmVyIHRoZSBhbmFseXRpY3MgcmVhZCBwYXRoIHdoZW4gdGhlIGJhY2tlbmQgcHJvdmlkZXMgb25lLlxuICAgIGNvbnN0IHN0YXR1cyA9IGZsYWdzLnN0YXR1c1xuICAgICAgPyBXb3JrZmxvd1J1blN0YXR1c1NjaGVtYS5wYXJzZShmbGFncy5zdGF0dXMpXG4gICAgICA6IHVuZGVmaW5lZDtcbiAgICBjb25zdCBsaW1pdCA9IGZsYWdzLmxpbWl0IHx8IDUwO1xuICAgIGNvbnN0IGFuYWx5dGljcyA9IHdvcmxkLmFuYWx5dGljcztcbiAgICBjb25zdCBmZXRjaE1hdGNoZXMgPSBhc3luYyAoKSA9PiB7XG4gICAgICBpZiAoIWFuYWx5dGljcykge1xuICAgICAgICByZXR1cm4gd29ybGQucnVucy5saXN0KHtcbiAgICAgICAgICBzdGF0dXMsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiBmbGFncy53b3JrZmxvd05hbWUsXG4gICAgICAgICAgcGFnaW5hdGlvbjogeyBsaW1pdCB9LFxuICAgICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICAgIH0pO1xuICAgICAgfVxuICAgICAgLy8gVGhlIGFuYWx5dGljcyBiYWNrZW5kIGRlZmF1bHRzIGl0cyBsaXN0aW5nIHRvIGEgcmVjZW50IHdpbmRvd1xuICAgICAgLy8gKHRyYWlsaW5nIDI0aCBvbiB0aGUgVmVyY2VsIGJhY2tlbmQpLCBidXQgYnVsayBjYW5jZWwgbXVzdCBtYXRjaFxuICAgICAgLy8gYWNyb3NzIHRoZSBwbGFuJ3Mgd2hvbGUgb2JzZXJ2YWJpbGl0eSB3aW5kb3cg4oCUIGEgcnVuIGNhbiBzbGVlcCBvclxuICAgICAgLy8gd2FpdCBvbiBhIGhvb2sgZm9yIGRheXMgd2l0aG91dCBlbWl0dGluZyByZWNlbnQgZXZlbnRzLiBQcm9iZSBmb3JcbiAgICAgIC8vIHRoZSBwbGFuIHdpbmRvdyBib3VuZHMgZmlyc3QsIHRoZW4gbWF0Y2ggYWNyb3NzIHRoZW0uXG4gICAgICBjb25zdCBwcm9iZSA9IGF3YWl0IGFuYWx5dGljcy5ydW5zLmxpc3Qoe1xuICAgICAgICBzdGF0dXMsXG4gICAgICAgIHdvcmtmbG93TmFtZTogZmxhZ3Mud29ya2Zsb3dOYW1lLFxuICAgICAgICBwYWdpbmF0aW9uOiB7IGxpbWl0OiAxIH0sXG4gICAgICB9KTtcbiAgICAgIGNvbnN0IHdpbmRvd1N0YXJ0ID0gcGxhbldpbmRvd1N0YXJ0RnJvbVJlc3BvbnNlKHByb2JlKTtcbiAgICAgIHJldHVybiBhbmFseXRpY3MucnVucy5saXN0KHtcbiAgICAgICAgc3RhdHVzLFxuICAgICAgICB3b3JrZmxvd05hbWU6IGZsYWdzLndvcmtmbG93TmFtZSxcbiAgICAgICAgLi4uKHdpbmRvd1N0YXJ0XG4gICAgICAgICAgPyB7IHN0YXJ0VGltZTogd2luZG93U3RhcnQsIGVuZFRpbWU6IG5ldyBEYXRlKCkudG9JU09TdHJpbmcoKSB9XG4gICAgICAgICAgOiB7fSksXG4gICAgICAgIHBhZ2luYXRpb246IHsgbGltaXQgfSxcbiAgICAgIH0pO1xuICAgIH07XG4gICAgY29uc3QgcnVuTGlzdCA9IGF3YWl0IGZldGNoTWF0Y2hlcygpO1xuICAgIGNvbnN0IHJ1bnMgPSB7XG4gICAgICBkYXRhOiBydW5MaXN0LmRhdGEubWFwKChydW4pID0+ICh7XG4gICAgICAgIHJ1bklkOiBydW4ucnVuSWQsXG4gICAgICAgIHdvcmtmbG93TmFtZTogcnVuLndvcmtmbG93TmFtZSxcbiAgICAgICAgc3RhdHVzOiBydW4uc3RhdHVzLFxuICAgICAgICBzdGFydGVkQXQ6IHJ1bi5zdGFydGVkQXQsXG4gICAgICB9KSksXG4gICAgICBoYXNNb3JlOiBydW5MaXN0Lmhhc01vcmUsXG4gICAgfTtcblxuICAgIGlmIChydW5zLmRhdGEubGVuZ3RoID09PSAwKSB7XG4gICAgICBsb2dnZXIud2FybignTm8gbWF0Y2hpbmcgcnVucyBmb3VuZC4nKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBEaXNwbGF5IHdoYXQgd2lsbCBiZSBjYW5jZWxsZWRcbiAgICBjb25zdCB0YWJsZSA9IG5ldyBUYWJsZSgpO1xuICAgIGZvciAoY29uc3QgcnVuIG9mIHJ1bnMuZGF0YSkge1xuICAgICAgY29uc3Qgc2hvcnROYW1lID1cbiAgICAgICAgcGFyc2VXb3JrZmxvd05hbWUocnVuLndvcmtmbG93TmFtZSk/LnNob3J0TmFtZSB8fCBydW4ud29ya2Zsb3dOYW1lO1xuICAgICAgdGFibGUuY2VsbCgncnVuSWQnLCBydW4ucnVuSWQpO1xuICAgICAgdGFibGUuY2VsbCgnd29ya2Zsb3cnLCBjaGFsay5ibHVlQnJpZ2h0KHNob3J0TmFtZSkpO1xuICAgICAgdGFibGUuY2VsbCgnc3RhdHVzJywgcnVuLnN0YXR1cyk7XG4gICAgICB0YWJsZS5jZWxsKFxuICAgICAgICAnc3RhcnRlZEF0JyxcbiAgICAgICAgcnVuLnN0YXJ0ZWRBdCA/IG5ldyBEYXRlKHJ1bi5zdGFydGVkQXQpLnRvSVNPU3RyaW5nKCkgOiAnLSdcbiAgICAgICk7XG4gICAgICB0YWJsZS5uZXdSb3coKTtcbiAgICB9XG4gICAgbG9nZ2VyLmxvZyhgXFxuRm91bmQgJHtjaGFsay5ib2xkKHJ1bnMuZGF0YS5sZW5ndGgpfSBydW5zIHRvIGNhbmNlbDpcXG5gKTtcbiAgICBsb2dnZXIubG9nKHRhYmxlLnRvU3RyaW5nKCkpO1xuXG4gICAgaWYgKHJ1bnMuaGFzTW9yZSkge1xuICAgICAgbG9nZ2VyLndhcm4oXG4gICAgICAgIGBNb3JlIHJ1bnMgbWF0Y2ggdGhlc2UgZmlsdGVycy4gSW5jcmVhc2UgLS1saW1pdCAoY3VycmVudGx5ICR7ZmxhZ3MubGltaXQgfHwgNTB9KSBvciByZS1ydW4gdG8gY2FuY2VsIGFkZGl0aW9uYWwgcnVucy5gXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIENvbmZpcm0gdW5sZXNzIC0tY29uZmlybS8teVxuICAgIGlmICghZmxhZ3MuY29uZmlybSkge1xuICAgICAgY29uc3QgY29uZmlybWVkID0gYXdhaXQgcHJvbXB0Q29uZmlybShcbiAgICAgICAgYENhbmNlbCAke3J1bnMuZGF0YS5sZW5ndGh9IHJ1biR7cnVucy5kYXRhLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfT9gXG4gICAgICApO1xuICAgICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgICAgbG9nZ2VyLmxvZygnQWJvcnRlZC4nKTtcbiAgICAgICAgcmV0dXJuO1xuICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhbmNlbCBlYWNoIHJ1biB3aXRoIHByb2dyZXNzXG4gICAgbGV0IGNhbmNlbGxlZCA9IDA7XG4gICAgbGV0IGZhaWxlZCA9IDA7XG4gICAgZm9yIChjb25zdCBydW4gb2YgcnVucy5kYXRhKSB7XG4gICAgICB0cnkge1xuICAgICAgICBhd2FpdCBjYW5jZWxSdW4od29ybGQsIHJ1bi5ydW5JZCk7XG4gICAgICAgIGNhbmNlbGxlZCsrO1xuICAgICAgICBsb2dnZXIubG9nKFxuICAgICAgICAgIGNoYWxrLmdyZWVuKGAgIOKckyAke3J1bi5ydW5JZH1gKSArXG4gICAgICAgICAgICBjaGFsay5ncmF5KGAgKCR7Y2FuY2VsbGVkfS8ke3J1bnMuZGF0YS5sZW5ndGh9KWApXG4gICAgICAgICk7XG4gICAgICB9IGNhdGNoIChlcnI6IGFueSkge1xuICAgICAgICBmYWlsZWQrKztcbiAgICAgICAgbG9nZ2VyLndhcm4oYCAg4pyXICR7cnVuLnJ1bklkfTogJHtlcnIubWVzc2FnZSB8fCBTdHJpbmcoZXJyKX1gKTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBsb2dnZXIubG9nKFxuICAgICAgYFxcbkRvbmU6ICR7Y2hhbGsuZ3JlZW4oYCR7Y2FuY2VsbGVkfSBjYW5jZWxsZWRgKX0ke2ZhaWxlZCA+IDAgPyBgLCAke2NoYWxrLnJlZChgJHtmYWlsZWR9IGZhaWxlZGApfWAgOiAnJ31gXG4gICAgKTtcbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9tcHRDb25maXJtKG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBOb24tVFRZOiBhYm9ydCBzaW5jZSB1c2VyIGNhbm5vdCBjb25maXJtIGludGVyYWN0aXZlbHkgKHVzZSAteS8tLWNvbmZpcm0gdG8gc2tpcCBwcm9tcHQpXG4gIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICBybC5xdWVzdGlvbihgJHttZXNzYWdlfSBbeS9OXSBgLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICd5Jyk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl19
|
|
135
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2FuY2VsLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL2NvbW1hbmRzL2NhbmNlbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLFFBQVEsTUFBTSxlQUFlLENBQUM7QUFDckMsT0FBTyxFQUFFLElBQUksRUFBRSxLQUFLLEVBQUUsTUFBTSxhQUFhLENBQUM7QUFDMUMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLHdCQUF3QixDQUFDO0FBQ25ELE9BQU8sRUFBRSx1QkFBdUIsRUFBRSxNQUFNLGlCQUFpQixDQUFDO0FBQzFELE9BQU8sS0FBSyxNQUFNLE9BQU8sQ0FBQztBQUMxQixPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sWUFBWSxDQUFDO0FBQ3pDLE9BQU8sRUFDTCxvQkFBb0IsRUFDcEIsaUJBQWlCLEVBQ2pCLGlCQUFpQixFQUNqQix1QkFBdUIsR0FDeEIsTUFBTSx1QkFBdUIsQ0FBQztBQUMvQixPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBQzlELE9BQU8sRUFDTCxzQ0FBc0MsRUFDdEMsbUNBQW1DLEdBQ3BDLE1BQU0sMEJBQTBCLENBQUM7QUFDbEMsT0FBTyxFQUFFLFFBQVEsRUFBRSxNQUFNLHlCQUF5QixDQUFDO0FBQ25ELE9BQU8sRUFBRSxhQUFhLEVBQUUsTUFBTSx5QkFBeUIsQ0FBQztBQUV4RCxNQUFNLENBQUMsT0FBTyxPQUFPLE1BQU8sU0FBUSxXQUFXO0lBQzdDLE1BQU0sQ0FBQyxXQUFXLEdBQ2hCLDJEQUEyRCxDQUFDO0lBRTlELE1BQU0sQ0FBQyxPQUFPLEdBQUcsQ0FBQyxHQUFHLENBQUMsQ0FBQztJQUV2QixNQUFNLENBQUMsUUFBUSxHQUFHO1FBQ2hCLDRCQUE0QjtRQUM1QixvQ0FBb0M7UUFDcEMsOERBQThEO1FBQzlELHVDQUF1QztLQUN4QyxDQUFDO0lBRUYsS0FBSyxDQUFDLEtBQUssQ0FBQyxLQUFVO1FBQ3BCLElBQUksbUNBQW1D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Q0FBQyxDQUFDO0lBRUgsT0FBTyxJQUFJLE9BQU8sQ0FBVSxDQUFDLE9BQU8sRUFBRSxFQUFFO1FBQ3RDLEVBQUUsQ0FBQyxRQUFRLENBQUMsR0FBRyxPQUFPLFNBQVMsRUFBRSxDQUFDLE1BQU0sRUFBRSxFQUFFO1lBQzFDLEVBQUUsQ0FBQyxLQUFLLEVBQUUsQ0FBQztZQUNYLE9BQU8sQ0FBQyxNQUFNLENBQUMsSUFBSSxFQUFFLENBQUMsV0FBVyxFQUFFLEtBQUssR0FBRyxDQUFDLENBQUM7UUFDL0MsQ0FBQyxDQUFDLENBQUM7SUFDTCxDQUFDLENBQUMsQ0FBQztBQUNMLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgcmVhZGxpbmUgZnJvbSAnbm9kZTpyZWFkbGluZSc7XG5pbXBvcnQgeyBBcmdzLCBGbGFncyB9IGZyb20gJ0BvY2xpZi9jb3JlJztcbmltcG9ydCB7IGNhbmNlbFJ1biB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuaW1wb3J0IHsgV29ya2Zsb3dSdW5TdGF0dXNTY2hlbWEgfSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IGNoYWxrIGZyb20gJ2NoYWxrJztcbmltcG9ydCB7IEJhc2VDb21tYW5kIH0gZnJvbSAnLi4vYmFzZS5qcyc7XG5pbXBvcnQge1xuICBDQU5DRUxMQUJMRV9TVEFUVVNFUyxcbiAgQ0xJX0NBTkNFTF9SRUFTT04sXG4gIHBlcmZvcm1CdWxrQ2FuY2VsLFxuICB2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCxcbn0gZnJvbSAnLi4vbGliL2J1bGstY2FuY2VsLmpzJztcbmltcG9ydCB7IExPR0dJTkdfQ09ORklHLCBsb2dnZXIgfSBmcm9tICcuLi9saWIvY29uZmlnL2xvZy5qcyc7XG5pbXBvcnQge1xuICBnZXRPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkTWVzc2FnZSxcbiAgaXNPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkRXJyb3IsXG59IGZyb20gJy4uL2xpYi9pbnNwZWN0L2Vycm9ycy5qcyc7XG5pbXBvcnQgeyBjbGlGbGFncyB9IGZyb20gJy4uL2xpYi9pbnNwZWN0L2ZsYWdzLmpzJztcbmltcG9ydCB7IHNldHVwQ2xpV29ybGQgfSBmcm9tICcuLi9saWIvaW5zcGVjdC9zZXR1cC5qcyc7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIENhbmNlbCBleHRlbmRzIEJhc2VDb21tYW5kIHtcbiAgc3RhdGljIGRlc2NyaXB0aW9uID1cbiAgICAnQ2FuY2VsIGEgd29ya2Zsb3cgcnVuLCBvciBidWxrLWNhbmNlbCBydW5zIGJ5IHN0YXR1cy9uYW1lJztcblxuICBzdGF0aWMgYWxpYXNlcyA9IFsnYyddO1xuXG4gIHN0YXRpYyBleGFtcGxlcyA9IFtcbiAgICAnJCB3b3JrZmxvdyBjYW5jZWwgPHJ1bi1pZD4nLFxuICAgICckIHdvcmtmbG93IGNhbmNlbCAtLXN0YXR1cz1ydW5uaW5nJyxcbiAgICAnJCB3b3JrZmxvdyBjYW5jZWwgLS1zdGF0dXM9cnVubmluZyAtLXdvcmtmbG93TmFtZT1teVdvcmtmbG93JyxcbiAgICAnJCB3b3JrZmxvdyBjYW5jZWwgLS1zdGF0dXM9cnVubmluZyAteScsXG4gIF07XG5cbiAgYXN5bmMgY2F0Y2goZXJyb3I6IGFueSkge1xuICAgIGlmIChpc09ic2VydmFiaWxpdHlVcGdyYWRlUmVxdWlyZWRFcnJvcihlcnJvcikpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihnZXRPYnNlcnZhYmlsaXR5VXBncmFkZVJlcXVpcmVkTWVzc2FnZSgpKTtcbiAgICAgIHByb2Nlc3MuZXhpdCgxKTtcbiAgICB9IGVsc2UgaWYgKExPR0dJTkdfQ09ORklHLlZFUkJPU0VfTU9ERSkge1xuICAgICAgY29uc29sZS5lcnJvcihlcnJvcik7XG4gICAgfVxuICAgIHRocm93IGVycm9yO1xuICB9XG5cbiAgc3RhdGljIGFyZ3MgPSB7XG4gICAgcnVuSWQ6IEFyZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnSUQgb2YgdGhlIHJ1biB0byBjYW5jZWwgKG9taXQgZm9yIGJ1bGsgbW9kZSB3aXRoIGZpbHRlcnMpJyxcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICB9KSxcbiAgfSBhcyBjb25zdDtcblxuICBzdGF0aWMgZmxhZ3MgPSB7XG4gICAgLi4uY2xpRmxhZ3MsXG4gICAgc3RhdHVzOiBGbGFncy5zdHJpbmcoe1xuICAgICAgLy8gT25seSBjYW5jZWxsYWJsZSBzdGF0dXNlcyBhcmUgb2ZmZXJlZDogY2FuY2VsbGluZyBhIHRlcm1pbmFsIHJ1blxuICAgICAgLy8gKGNvbXBsZXRlZCAvIGZhaWxlZCAvIGNhbmNlbGxlZCkgaXMgYSBuby1vcCwgc28gcGlubmluZyBvbmUgd291bGQgbGlzdFxuICAgICAgLy8gdGhlIHNhbWUgcGFnZSBvbiBldmVyeSByZXJ1biBhbmQgbmV2ZXIgYWR2YW5jZS5cbiAgICAgIGRlc2NyaXB0aW9uOiAnRmlsdGVyIHJ1bnMgYnkgc3RhdHVzIGZvciBidWxrIGNhbmNlbCAocGVuZGluZyBvciBydW5uaW5nKScsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBvcHRpb25zOiBbLi4uQ0FOQ0VMTEFCTEVfU1RBVFVTRVNdLFxuICAgICAgaGVscEdyb3VwOiAnQnVsayBDYW5jZWwnLFxuICAgICAgaGVscExhYmVsOiAnLS1zdGF0dXMnLFxuICAgIH0pLFxuICAgIHdvcmtmbG93TmFtZTogRmxhZ3Muc3RyaW5nKHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnRmlsdGVyIHJ1bnMgYnkgd29ya2Zsb3cgbmFtZSBmb3IgYnVsayBjYW5jZWwnLFxuICAgICAgcmVxdWlyZWQ6IGZhbHNlLFxuICAgICAgY2hhcjogJ24nLFxuICAgICAgaGVscEdyb3VwOiAnQnVsayBDYW5jZWwnLFxuICAgICAgaGVscExhYmVsOiAnLW4sIC0td29ya2Zsb3dOYW1lJyxcbiAgICB9KSxcbiAgICBsaW1pdDogRmxhZ3MuaW50ZWdlcih7XG4gICAgICBkZXNjcmlwdGlvbjogJ01heCBydW5zIHRvIGNhbmNlbCBpbiBidWxrIG1vZGUgKDEtNTAwKScsXG4gICAgICByZXF1aXJlZDogZmFsc2UsXG4gICAgICBkZWZhdWx0OiA1MCxcbiAgICAgIGhlbHBHcm91cDogJ0J1bGsgQ2FuY2VsJyxcbiAgICAgIGhlbHBMYWJlbDogJy0tbGltaXQnLFxuICAgICAgaGVscFZhbHVlOiAnTlVNQkVSJyxcbiAgICB9KSxcbiAgICBjb25maXJtOiBGbGFncy5ib29sZWFuKHtcbiAgICAgIGRlc2NyaXB0aW9uOiAnU2tpcCBpbnRlcmFjdGl2ZSBjb25maXJtYXRpb24gcHJvbXB0JyxcbiAgICAgIHJlcXVpcmVkOiBmYWxzZSxcbiAgICAgIGNoYXI6ICd5JyxcbiAgICAgIGRlZmF1bHQ6IGZhbHNlLFxuICAgICAgaGVscEdyb3VwOiAnQnVsayBDYW5jZWwnLFxuICAgICAgaGVscExhYmVsOiAnLXksIC0tY29uZmlybScsXG4gICAgfSksXG4gIH07XG5cbiAgcHVibGljIGFzeW5jIHJ1bigpOiBQcm9taXNlPHZvaWQ+IHtcbiAgICBjb25zdCB7IGZsYWdzLCBhcmdzIH0gPSBhd2FpdCB0aGlzLnBhcnNlKENhbmNlbCk7XG5cbiAgICBjb25zdCB3b3JsZCA9IGF3YWl0IHNldHVwQ2xpV29ybGQoZmxhZ3MsIHRoaXMuY29uZmlnLnZlcnNpb24pO1xuICAgIGlmICghd29ybGQpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0ZhaWxlZCB0byBjb25uZWN0IHRvIGJhY2tlbmQuIENoZWNrIHlvdXIgY29uZmlndXJhdGlvbi4nXG4gICAgICApO1xuICAgIH1cblxuICAgIC8vIFNpbmdsZS1ydW4gY2FuY2VsIChleGlzdGluZyBiZWhhdmlvcilcbiAgICBpZiAoYXJncy5ydW5JZCkge1xuICAgICAgYXdhaXQgY2FuY2VsUnVuKHdvcmxkLCBhcmdzLnJ1bklkLCB7XG4gICAgICAgIGNhbmNlbFJlYXNvbjogQ0xJX0NBTkNFTF9SRUFTT04sXG4gICAgICB9KTtcbiAgICAgIGxvZ2dlci5sb2coY2hhbGsuZ3JlZW4oYENhbmNlbGxlZCBydW4gJHthcmdzLnJ1bklkfWApKTtcbiAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBCdWxrIG1vZGUgcmVxdWlyZXMgYXQgbGVhc3Qgb25lIGZpbHRlclxuICAgIGlmICghZmxhZ3Muc3RhdHVzICYmICFmbGFncy53b3JrZmxvd05hbWUpIHtcbiAgICAgIGxvZ2dlci5lcnJvcihcbiAgICAgICAgJ1Byb3ZpZGUgYSBydW4gSUQgb3IgdXNlIC0tc3RhdHVzLy0td29ya2Zsb3dOYW1lIHRvIGJ1bGsgY2FuY2VsLlxcbicgK1xuICAgICAgICAgICdFeGFtcGxlczpcXG4nICtcbiAgICAgICAgICAnICB3b3JrZmxvdyBjYW5jZWwgPHJ1bi1pZD5cXG4nICtcbiAgICAgICAgICAnICB3b3JrZmxvdyBjYW5jZWwgLS1zdGF0dXM9cnVubmluZ1xcbicgK1xuICAgICAgICAgICcgIHdvcmtmbG93IGNhbmNlbCAtLXN0YXR1cz1ydW5uaW5nIC0td29ya2Zsb3dOYW1lPW15V29ya2Zsb3cnXG4gICAgICApO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IGxpbWl0ID0gZmxhZ3MubGltaXQgPz8gNTA7XG4gICAgY29uc3QgbGltaXRFcnJvciA9IHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KGxpbWl0KTtcbiAgICBpZiAobGltaXRFcnJvcikge1xuICAgICAgbG9nZ2VyLmVycm9yKGxpbWl0RXJyb3IpO1xuICAgICAgcHJvY2Vzcy5leGl0KDEpO1xuICAgIH1cblxuICAgIGNvbnN0IHN0YXR1cyA9IGZsYWdzLnN0YXR1c1xuICAgICAgPyBXb3JrZmxvd1J1blN0YXR1c1NjaGVtYS5wYXJzZShmbGFncy5zdGF0dXMpXG4gICAgICA6IHVuZGVmaW5lZDtcblxuICAgIGNvbnN0IHsgZXhpdENvZGUgfSA9IGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgc3RhdHVzLFxuICAgICAgd29ya2Zsb3dOYW1lOiBmbGFncy53b3JrZmxvd05hbWUsXG4gICAgICBsaW1pdCxcbiAgICAgIGNvbmZpcm06IGZsYWdzLmNvbmZpcm0sXG4gICAgICBsb2dnZXIsXG4gICAgICBwcm9tcHRDb25maXJtLFxuICAgIH0pO1xuXG4gICAgaWYgKGV4aXRDb2RlICE9PSAwKSB7XG4gICAgICBwcm9jZXNzLmV4aXQoZXhpdENvZGUpO1xuICAgIH1cbiAgfVxufVxuXG5hc3luYyBmdW5jdGlvbiBwcm9tcHRDb25maXJtKG1lc3NhZ2U6IHN0cmluZyk6IFByb21pc2U8Ym9vbGVhbj4ge1xuICAvLyBOb24tVFRZOiBhYm9ydCBzaW5jZSB1c2VyIGNhbm5vdCBjb25maXJtIGludGVyYWN0aXZlbHkgKHVzZSAteS8tLWNvbmZpcm0gdG8gc2tpcCBwcm9tcHQpXG4gIGlmICghcHJvY2Vzcy5zdGRpbi5pc1RUWSkge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGNvbnN0IHJsID0gcmVhZGxpbmUuY3JlYXRlSW50ZXJmYWNlKHtcbiAgICBpbnB1dDogcHJvY2Vzcy5zdGRpbixcbiAgICBvdXRwdXQ6IHByb2Nlc3Muc3Rkb3V0LFxuICB9KTtcblxuICByZXR1cm4gbmV3IFByb21pc2U8Ym9vbGVhbj4oKHJlc29sdmUpID0+IHtcbiAgICBybC5xdWVzdGlvbihgJHttZXNzYWdlfSBbeS9OXSBgLCAoYW5zd2VyKSA9PiB7XG4gICAgICBybC5jbG9zZSgpO1xuICAgICAgcmVzb2x2ZShhbnN3ZXIudHJpbSgpLnRvTG93ZXJDYXNlKCkgPT09ICd5Jyk7XG4gICAgfSk7XG4gIH0pO1xufVxuIl19
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import type { BulkCancelWorkflowRunsResult, WorkflowRunStatus, World } from '@workflow/world';
|
|
2
|
+
export declare const BULK_CANCEL_MIN_LIMIT = 1;
|
|
3
|
+
export declare const BULK_CANCEL_MAX_LIMIT = 500;
|
|
4
|
+
export declare const CLI_CANCEL_REASON = "Cancelled via Workflow CLI";
|
|
5
|
+
/**
|
|
6
|
+
* Statuses a run can still be cancelled from. When the caller doesn't pin a
|
|
7
|
+
* `--status`, bulk cancel restricts matching to these so terminal runs
|
|
8
|
+
* (including the ones a prior batch just cancelled) don't crowd out reachable
|
|
9
|
+
* active runs. Otherwise, listing every status returns the same newest
|
|
10
|
+
* terminal page on each rerun and older active runs are never reached. The
|
|
11
|
+
* list API filters by a single status, so we fan out across these and merge.
|
|
12
|
+
*/
|
|
13
|
+
export declare const CANCELLABLE_STATUSES: readonly ["pending", "running"];
|
|
14
|
+
/**
|
|
15
|
+
* Guidance printed when more runs match the filters than were fetched. Bulk
|
|
16
|
+
* cancel is deliberately single-batch and user-paced — no cursors or async
|
|
17
|
+
* jobs — so the user re-runs to cancel the next batch.
|
|
18
|
+
*/
|
|
19
|
+
export declare const HAS_MORE_GUIDANCE: string;
|
|
20
|
+
export interface CancelLogger {
|
|
21
|
+
log(message: string): void;
|
|
22
|
+
warn(message: string): void;
|
|
23
|
+
error(message: string): void;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Validate the `--limit` flag. Returns an error message when invalid, or
|
|
27
|
+
* `undefined` when the value is an integer within [1, 500].
|
|
28
|
+
*/
|
|
29
|
+
export declare function validateBulkCancelLimit(limit: number): string | undefined;
|
|
30
|
+
/**
|
|
31
|
+
* Build the compact multi-line "Done:" summary block. Lists every outcome
|
|
32
|
+
* category so the counts add up to the number of runs requested; individual
|
|
33
|
+
* `not_found`, `not_cancellable`, and `failed` runs are additionally surfaced
|
|
34
|
+
* per-run via {@link bulkCancelFailureLines}.
|
|
35
|
+
*/
|
|
36
|
+
export declare function formatBulkCancelSummary(result: BulkCancelWorkflowRunsResult): string;
|
|
37
|
+
/**
|
|
38
|
+
* Per-run lines for outcomes worth calling out individually: `not_found`,
|
|
39
|
+
* `not_cancellable`, and `failed`. Cancelled and already-cancelled runs are
|
|
40
|
+
* left to the summary.
|
|
41
|
+
*/
|
|
42
|
+
export declare function bulkCancelFailureLines(result: BulkCancelWorkflowRunsResult): string[];
|
|
43
|
+
export interface BulkCancelParams {
|
|
44
|
+
world: World;
|
|
45
|
+
status?: WorkflowRunStatus;
|
|
46
|
+
workflowName?: string;
|
|
47
|
+
/** Max runs to fetch and cancel in this batch (already validated). */
|
|
48
|
+
limit: number;
|
|
49
|
+
/** When true, skip the interactive confirmation prompt. */
|
|
50
|
+
confirm: boolean;
|
|
51
|
+
logger: CancelLogger;
|
|
52
|
+
/**
|
|
53
|
+
* Confirmation prompt. Omitted in non-interactive contexts (and tests),
|
|
54
|
+
* in which case an unconfirmed run aborts.
|
|
55
|
+
*/
|
|
56
|
+
promptConfirm?: (message: string) => Promise<boolean>;
|
|
57
|
+
}
|
|
58
|
+
export interface BulkCancelOutcome {
|
|
59
|
+
/** Process exit code: 1 when any run failed, otherwise 0. */
|
|
60
|
+
exitCode: number;
|
|
61
|
+
/** The structured result, or undefined when nothing matched / aborted. */
|
|
62
|
+
result?: BulkCancelWorkflowRunsResult;
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Fetch matching runs (up to `limit`), confirm, and cancel them in a single
|
|
66
|
+
* bulk operation. Prints a table of what will be cancelled, rerun guidance
|
|
67
|
+
* when more runs match than were fetched, a compact summary, and per-run
|
|
68
|
+
* lines for surfaced failures.
|
|
69
|
+
*
|
|
70
|
+
* Does not traverse pages: exactly one page of at most `limit` runs is
|
|
71
|
+
* cancelled per invocation.
|
|
72
|
+
*/
|
|
73
|
+
export declare function performBulkCancel(params: BulkCancelParams): Promise<BulkCancelOutcome>;
|
|
74
|
+
//# sourceMappingURL=bulk-cancel.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-cancel.d.ts","sourceRoot":"","sources":["../../src/lib/bulk-cancel.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EACV,4BAA4B,EAC5B,iBAAiB,EACjB,KAAK,EACN,MAAM,iBAAiB,CAAC;AAKzB,eAAO,MAAM,qBAAqB,IAAI,CAAC;AACvC,eAAO,MAAM,qBAAqB,MAAM,CAAC;AACzC,eAAO,MAAM,iBAAiB,+BAA+B,CAAC;AAE9D;;;;;;;GAOG;AACH,eAAO,MAAM,oBAAoB,iCAGgB,CAAC;AAElD;;;;GAIG;AACH,eAAO,MAAM,iBAAiB,QAED,CAAC;AAE9B,MAAM,WAAW,YAAY;IAC3B,GAAG,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC3B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CASzE;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,MAAM,EAAE,4BAA4B,GACnC,MAAM,CAUR;AAED;;;;GAIG;AACH,wBAAgB,sBAAsB,CACpC,MAAM,EAAE,4BAA4B,GACnC,MAAM,EAAE,CAkBV;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,KAAK,CAAC;IACb,MAAM,CAAC,EAAE,iBAAiB,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,sEAAsE;IACtE,KAAK,EAAE,MAAM,CAAC;IACd,2DAA2D;IAC3D,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,YAAY,CAAC;IACrB;;;OAGG;IACH,aAAa,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;CACvD;AAED,MAAM,WAAW,iBAAiB;IAChC,6DAA6D;IAC7D,QAAQ,EAAE,MAAM,CAAC;IACjB,0EAA0E;IAC1E,MAAM,CAAC,EAAE,4BAA4B,CAAC;CACvC;AAED;;;;;;;;GAQG;AACH,wBAAsB,iBAAiB,CACrC,MAAM,EAAE,gBAAgB,GACvB,OAAO,CAAC,iBAAiB,CAAC,CAuI5B"}
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { cancelRuns } from '@workflow/core/runtime';
|
|
2
|
+
import { parseWorkflowName } from '@workflow/utils/parse-name';
|
|
3
|
+
import chalk from 'chalk';
|
|
4
|
+
import Table from 'easy-table';
|
|
5
|
+
import { planWindowStartFromResponse } from './inspect/time-window.js';
|
|
6
|
+
export const BULK_CANCEL_MIN_LIMIT = 1;
|
|
7
|
+
export const BULK_CANCEL_MAX_LIMIT = 500;
|
|
8
|
+
export const CLI_CANCEL_REASON = 'Cancelled via Workflow CLI';
|
|
9
|
+
/**
|
|
10
|
+
* Statuses a run can still be cancelled from. When the caller doesn't pin a
|
|
11
|
+
* `--status`, bulk cancel restricts matching to these so terminal runs
|
|
12
|
+
* (including the ones a prior batch just cancelled) don't crowd out reachable
|
|
13
|
+
* active runs. Otherwise, listing every status returns the same newest
|
|
14
|
+
* terminal page on each rerun and older active runs are never reached. The
|
|
15
|
+
* list API filters by a single status, so we fan out across these and merge.
|
|
16
|
+
*/
|
|
17
|
+
export const CANCELLABLE_STATUSES = [
|
|
18
|
+
'pending',
|
|
19
|
+
'running',
|
|
20
|
+
];
|
|
21
|
+
/**
|
|
22
|
+
* Guidance printed when more runs match the filters than were fetched. Bulk
|
|
23
|
+
* cancel is deliberately single-batch and user-paced — no cursors or async
|
|
24
|
+
* jobs — so the user re-runs to cancel the next batch.
|
|
25
|
+
*/
|
|
26
|
+
export const HAS_MORE_GUIDANCE = 'More runs match these filters. Re-run this command to cancel the next batch,\n' +
|
|
27
|
+
'or use --limit up to 500.';
|
|
28
|
+
/**
|
|
29
|
+
* Validate the `--limit` flag. Returns an error message when invalid, or
|
|
30
|
+
* `undefined` when the value is an integer within [1, 500].
|
|
31
|
+
*/
|
|
32
|
+
export function validateBulkCancelLimit(limit) {
|
|
33
|
+
if (!Number.isInteger(limit) ||
|
|
34
|
+
limit < BULK_CANCEL_MIN_LIMIT ||
|
|
35
|
+
limit > BULK_CANCEL_MAX_LIMIT) {
|
|
36
|
+
return `--limit must be an integer between ${BULK_CANCEL_MIN_LIMIT} and ${BULK_CANCEL_MAX_LIMIT}.`;
|
|
37
|
+
}
|
|
38
|
+
return undefined;
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Build the compact multi-line "Done:" summary block. Lists every outcome
|
|
42
|
+
* category so the counts add up to the number of runs requested; individual
|
|
43
|
+
* `not_found`, `not_cancellable`, and `failed` runs are additionally surfaced
|
|
44
|
+
* per-run via {@link bulkCancelFailureLines}.
|
|
45
|
+
*/
|
|
46
|
+
export function formatBulkCancelSummary(result) {
|
|
47
|
+
const { summary } = result;
|
|
48
|
+
return [
|
|
49
|
+
'Done:',
|
|
50
|
+
` ${summary.cancelled} cancelled`,
|
|
51
|
+
` ${summary.alreadyCancelled} already cancelled`,
|
|
52
|
+
` ${summary.notCancellable} not cancellable`,
|
|
53
|
+
` ${summary.notFound} not found`,
|
|
54
|
+
` ${summary.failed} failed`,
|
|
55
|
+
].join('\n');
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Per-run lines for outcomes worth calling out individually: `not_found`,
|
|
59
|
+
* `not_cancellable`, and `failed`. Cancelled and already-cancelled runs are
|
|
60
|
+
* left to the summary.
|
|
61
|
+
*/
|
|
62
|
+
export function bulkCancelFailureLines(result) {
|
|
63
|
+
const lines = [];
|
|
64
|
+
for (const r of result.results) {
|
|
65
|
+
switch (r.outcome) {
|
|
66
|
+
case 'not_found':
|
|
67
|
+
lines.push(` ✗ ${r.runId}: not found`);
|
|
68
|
+
break;
|
|
69
|
+
case 'not_cancellable':
|
|
70
|
+
lines.push(` ✗ ${r.runId}: not cancellable (${r.status})`);
|
|
71
|
+
break;
|
|
72
|
+
case 'failed':
|
|
73
|
+
lines.push(` ✗ ${r.runId}: failed (${r.code}${r.retryable ? ', retryable' : ''})`);
|
|
74
|
+
break;
|
|
75
|
+
}
|
|
76
|
+
}
|
|
77
|
+
return lines;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Fetch matching runs (up to `limit`), confirm, and cancel them in a single
|
|
81
|
+
* bulk operation. Prints a table of what will be cancelled, rerun guidance
|
|
82
|
+
* when more runs match than were fetched, a compact summary, and per-run
|
|
83
|
+
* lines for surfaced failures.
|
|
84
|
+
*
|
|
85
|
+
* Does not traverse pages: exactly one page of at most `limit` runs is
|
|
86
|
+
* cancelled per invocation.
|
|
87
|
+
*/
|
|
88
|
+
export async function performBulkCancel(params) {
|
|
89
|
+
const { world, status, workflowName, limit, confirm, logger, promptConfirm } = params;
|
|
90
|
+
// Fetch matching runs. Only metadata is needed to display and cancel, so
|
|
91
|
+
// prefer the analytics read path when the backend provides one.
|
|
92
|
+
//
|
|
93
|
+
// When the caller pins a status, match exactly that. Otherwise restrict to
|
|
94
|
+
// the cancellable statuses so rerunning makes progress instead of returning
|
|
95
|
+
// the same terminal page forever. The list API takes a single status, so
|
|
96
|
+
// fan out across the target statuses and merge the pages below.
|
|
97
|
+
const analytics = world.analytics;
|
|
98
|
+
const targetStatuses = status
|
|
99
|
+
? [status]
|
|
100
|
+
: [...CANCELLABLE_STATUSES];
|
|
101
|
+
const fetchPage = async (pageStatus) => {
|
|
102
|
+
if (!analytics) {
|
|
103
|
+
return world.runs.list({
|
|
104
|
+
status: pageStatus,
|
|
105
|
+
workflowName,
|
|
106
|
+
pagination: { limit },
|
|
107
|
+
resolveData: 'none',
|
|
108
|
+
});
|
|
109
|
+
}
|
|
110
|
+
// The analytics backend defaults its listing to a recent window
|
|
111
|
+
// (trailing 24h on the Vercel backend), but bulk cancel must match
|
|
112
|
+
// across the plan's whole observability window — a run can sleep or
|
|
113
|
+
// wait on a hook for days without emitting recent events. Probe for
|
|
114
|
+
// the plan window bounds first, then match across them.
|
|
115
|
+
const probe = await analytics.runs.list({
|
|
116
|
+
status: pageStatus,
|
|
117
|
+
workflowName,
|
|
118
|
+
pagination: { limit: 1 },
|
|
119
|
+
});
|
|
120
|
+
const windowStart = planWindowStartFromResponse(probe);
|
|
121
|
+
return analytics.runs.list({
|
|
122
|
+
status: pageStatus,
|
|
123
|
+
workflowName,
|
|
124
|
+
...(windowStart
|
|
125
|
+
? { startTime: windowStart, endTime: new Date().toISOString() }
|
|
126
|
+
: {}),
|
|
127
|
+
pagination: { limit },
|
|
128
|
+
});
|
|
129
|
+
};
|
|
130
|
+
const pages = await Promise.all(targetStatuses.map(fetchPage));
|
|
131
|
+
// Merge the per-status pages round-robin so a full page of running runs
|
|
132
|
+
// cannot crowd pending runs (which do not have a startedAt timestamp) out
|
|
133
|
+
// of every batch. Preserve each page's backend order and dedupe by runId in
|
|
134
|
+
// case a run changes status while the pages are fetched.
|
|
135
|
+
const projectedPages = pages.map((page) => page.data.map((run) => ({
|
|
136
|
+
runId: run.runId,
|
|
137
|
+
workflowName: run.workflowName,
|
|
138
|
+
status: run.status,
|
|
139
|
+
startedAt: run.startedAt,
|
|
140
|
+
})));
|
|
141
|
+
const merged = [];
|
|
142
|
+
const seenRunIds = new Set();
|
|
143
|
+
const maxPageLength = Math.max(0, ...projectedPages.map((page) => page.length));
|
|
144
|
+
for (let index = 0; index < maxPageLength; index++) {
|
|
145
|
+
for (const page of projectedPages) {
|
|
146
|
+
const run = page[index];
|
|
147
|
+
if (run && !seenRunIds.has(run.runId)) {
|
|
148
|
+
seenRunIds.add(run.runId);
|
|
149
|
+
merged.push(run);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const runs = {
|
|
154
|
+
data: merged.slice(0, limit),
|
|
155
|
+
hasMore: pages.some((page) => page.hasMore) || merged.length > limit,
|
|
156
|
+
};
|
|
157
|
+
if (runs.data.length === 0) {
|
|
158
|
+
logger.warn('No matching runs found.');
|
|
159
|
+
return { exitCode: 0 };
|
|
160
|
+
}
|
|
161
|
+
// Display what will be cancelled.
|
|
162
|
+
const table = new Table();
|
|
163
|
+
for (const run of runs.data) {
|
|
164
|
+
const shortName = parseWorkflowName(run.workflowName)?.shortName || run.workflowName;
|
|
165
|
+
table.cell('runId', run.runId);
|
|
166
|
+
table.cell('workflow', chalk.blueBright(shortName));
|
|
167
|
+
table.cell('status', run.status);
|
|
168
|
+
table.cell('startedAt', run.startedAt ? new Date(run.startedAt).toISOString() : '-');
|
|
169
|
+
table.newRow();
|
|
170
|
+
}
|
|
171
|
+
logger.log(`\nFound ${chalk.bold(runs.data.length)} runs to cancel:\n`);
|
|
172
|
+
logger.log(table.toString());
|
|
173
|
+
if (runs.hasMore) {
|
|
174
|
+
logger.warn(HAS_MORE_GUIDANCE);
|
|
175
|
+
}
|
|
176
|
+
// Confirm unless --confirm/-y.
|
|
177
|
+
if (!confirm) {
|
|
178
|
+
const confirmed = promptConfirm
|
|
179
|
+
? await promptConfirm(`Cancel ${runs.data.length} run${runs.data.length === 1 ? '' : 's'}?`)
|
|
180
|
+
: false;
|
|
181
|
+
if (!confirmed) {
|
|
182
|
+
logger.log('Aborted.');
|
|
183
|
+
return { exitCode: 0 };
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
// One bulk operation: a single backend request on Vercel, or bounded
|
|
187
|
+
// fallback concurrency on local / community worlds.
|
|
188
|
+
const result = await cancelRuns(world, runs.data.map((run) => run.runId), { cancelReason: CLI_CANCEL_REASON });
|
|
189
|
+
for (const line of bulkCancelFailureLines(result)) {
|
|
190
|
+
logger.warn(line);
|
|
191
|
+
}
|
|
192
|
+
logger.log(`\n${formatBulkCancelSummary(result)}`);
|
|
193
|
+
// Already-cancelled and terminal runs are valid partial outcomes; only a
|
|
194
|
+
// genuine failure is a nonzero exit.
|
|
195
|
+
return { exitCode: result.summary.failed > 0 ? 1 : 0, result };
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay1jYW5jZWwuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbGliL2J1bGstY2FuY2VsLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSx3QkFBd0IsQ0FBQztBQUNwRCxPQUFPLEVBQUUsaUJBQWlCLEVBQUUsTUFBTSw0QkFBNEIsQ0FBQztBQU0vRCxPQUFPLEtBQUssTUFBTSxPQUFPLENBQUM7QUFDMUIsT0FBTyxLQUFLLE1BQU0sWUFBWSxDQUFDO0FBQy9CLE9BQU8sRUFBRSwyQkFBMkIsRUFBRSxNQUFNLDBCQUEwQixDQUFDO0FBRXZFLE1BQU0sQ0FBQyxNQUFNLHFCQUFxQixHQUFHLENBQUMsQ0FBQztBQUN2QyxNQUFNLENBQUMsTUFBTSxxQkFBcUIsR0FBRyxHQUFHLENBQUM7QUFDekMsTUFBTSxDQUFDLE1BQU0saUJBQWlCLEdBQUcsNEJBQTRCLENBQUM7QUFFOUQ7Ozs7Ozs7R0FPRztBQUNILE1BQU0sQ0FBQyxNQUFNLG9CQUFvQixHQUFHO0lBQ2xDLFNBQVM7SUFDVCxTQUFTO0NBQ3NDLENBQUM7QUFFbEQ7Ozs7R0FJRztBQUNILE1BQU0sQ0FBQyxNQUFNLGlCQUFpQixHQUM1QixnRkFBZ0Y7SUFDaEYsMkJBQTJCLENBQUM7QUFROUI7OztHQUdHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUFDLEtBQWE7SUFDbkQsSUFDRSxDQUFDLE1BQU0sQ0FBQyxTQUFTLENBQUMsS0FBSyxDQUFDO1FBQ3hCLEtBQUssR0FBRyxxQkFBcUI7UUFDN0IsS0FBSyxHQUFHLHFCQUFxQixFQUM3QixDQUFDO1FBQ0QsT0FBTyxzQ0FBc0MscUJBQXFCLFFBQVEscUJBQXFCLEdBQUcsQ0FBQztJQUNyRyxDQUFDO0lBQ0QsT0FBTyxTQUFTLENBQUM7QUFDbkIsQ0FBQztBQUVEOzs7OztHQUtHO0FBQ0gsTUFBTSxVQUFVLHVCQUF1QixDQUNyQyxNQUFvQztJQUVwQyxNQUFNLEVBQUUsT0FB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SCxDQUFDO0lBRUQscUVBQXFFO0lBQ3JFLG9EQUFvRDtJQUNwRCxNQUFNLE1BQU0sR0FBRyxNQUFNLFVBQVUsQ0FDN0IsS0FBSyxFQUNMLElBQUksQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLENBQUMsR0FBRyxFQUFFLEVBQUUsQ0FBQyxHQUFHLENBQUMsS0FBSyxDQUFDLEVBQ2pDLEVBQUUsWUFBWSxFQUFFLGlCQUFpQixFQUFFLENBQ3BDLENBQUM7SUFFRixLQUFLLE1BQU0sSUFBSSxJQUFJLHNCQUFzQixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUM7UUFDbEQsTUFBTSxDQUFDLElBQUksQ0FBQyxJQUFJLENBQUMsQ0FBQztJQUNwQixDQUFDO0lBQ0QsTUFBTSxDQUFDLEdBQUcsQ0FBQyxLQUFLLHVCQUF1QixDQUFDLE1BQU0sQ0FBQyxFQUFFLENBQUMsQ0FBQztJQUVuRCx5RUFBeUU7SUFDekUscUNBQXFDO0lBQ3JDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxDQUFDLE9BQU8sQ0FBQyxNQUFNLEdBQUcsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsQ0FBQyxDQUFDLENBQUMsRUFBRSxNQUFNLEVBQUUsQ0FBQztBQUNqRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgY2FuY2VsUnVucyB9IGZyb20gJ0B3b3JrZmxvdy9jb3JlL3J1bnRpbWUnO1xuaW1wb3J0IHsgcGFyc2VXb3JrZmxvd05hbWUgfSBmcm9tICdAd29ya2Zsb3cvdXRpbHMvcGFyc2UtbmFtZSc7XG5pbXBvcnQgdHlwZSB7XG4gIEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQsXG4gIFdvcmtmbG93UnVuU3RhdHVzLFxuICBXb3JsZCxcbn0gZnJvbSAnQHdvcmtmbG93L3dvcmxkJztcbmltcG9ydCBjaGFsayBmcm9tICdjaGFsayc7XG5pbXBvcnQgVGFibGUgZnJvbSAnZWFzeS10YWJsZSc7XG5pbXBvcnQgeyBwbGFuV2luZG93U3RhcnRGcm9tUmVzcG9uc2UgfSBmcm9tICcuL2luc3BlY3QvdGltZS13aW5kb3cuanMnO1xuXG5leHBvcnQgY29uc3QgQlVMS19DQU5DRUxfTUlOX0xJTUlUID0gMTtcbmV4cG9ydCBjb25zdCBCVUxLX0NBTkNFTF9NQVhfTElNSVQgPSA1MDA7XG5leHBvcnQgY29uc3QgQ0xJX0NBTkNFTF9SRUFTT04gPSAnQ2FuY2VsbGVkIHZpYSBXb3JrZmxvdyBDTEknO1xuXG4vKipcbiAqIFN0YXR1c2VzIGEgcnVuIGNhbiBzdGlsbCBiZSBjYW5jZWxsZWQgZnJvbS4gV2hlbiB0aGUgY2FsbGVyIGRvZXNuJ3QgcGluIGFcbiAqIGAtLXN0YXR1c2AsIGJ1bGsgY2FuY2VsIHJlc3RyaWN0cyBtYXRjaGluZyB0byB0aGVzZSBzbyB0ZXJtaW5hbCBydW5zXG4gKiAoaW5jbHVkaW5nIHRoZSBvbmVzIGEgcHJpb3IgYmF0Y2gganVzdCBjYW5jZWxsZWQpIGRvbid0IGNyb3dkIG91dCByZWFjaGFibGVcbiAqIGFjdGl2ZSBydW5zLiBPdGhlcndpc2UsIGxpc3RpbmcgZXZlcnkgc3RhdHVzIHJldHVybnMgdGhlIHNhbWUgbmV3ZXN0XG4gKiB0ZXJtaW5hbCBwYWdlIG9uIGVhY2ggcmVydW4gYW5kIG9sZGVyIGFjdGl2ZSBydW5zIGFyZSBuZXZlciByZWFjaGVkLiBUaGVcbiAqIGxpc3QgQVBJIGZpbHRlcnMgYnkgYSBzaW5nbGUgc3RhdHVzLCBzbyB3ZSBmYW4gb3V0IGFjcm9zcyB0aGVzZSBhbmQgbWVyZ2UuXG4gKi9cbmV4cG9ydCBjb25zdCBDQU5DRUxMQUJMRV9TVEFUVVNFUyA9IFtcbiAgJ3BlbmRpbmcnLFxuICAncnVubmluZycsXG5dIGFzIGNvbnN0IHNhdGlzZmllcyByZWFkb25seSBXb3JrZmxvd1J1blN0YXR1c1tdO1xuXG4vKipcbiAqIEd1aWRhbmNlIHByaW50ZWQgd2hlbiBtb3JlIHJ1bnMgbWF0Y2ggdGhlIGZpbHRlcnMgdGhhbiB3ZXJlIGZldGNoZWQuIEJ1bGtcbiAqIGNhbmNlbCBpcyBkZWxpYmVyYXRlbHkgc2luZ2xlLWJhdGNoIGFuZCB1c2VyLXBhY2VkIOKAlCBubyBjdXJzb3JzIG9yIGFzeW5jXG4gKiBqb2JzIOKAlCBzbyB0aGUgdXNlciByZS1ydW5zIHRvIGNhbmNlbCB0aGUgbmV4dCBiYXRjaC5cbiAqL1xuZXhwb3J0IGNvbnN0IEhBU19NT1JFX0dVSURBTkNFID1cbiAgJ01vcmUgcnVucyBtYXRjaCB0aGVzZSBmaWx0ZXJzLiBSZS1ydW4gdGhpcyBjb21tYW5kIHRvIGNhbmNlbCB0aGUgbmV4dCBiYXRjaCxcXG4nICtcbiAgJ29yIHVzZSAtLWxpbWl0IHVwIHRvIDUwMC4nO1xuXG5leHBvcnQgaW50ZXJmYWNlIENhbmNlbExvZ2dlciB7XG4gIGxvZyhtZXNzYWdlOiBzdHJpbmcpOiB2b2lkO1xuICB3YXJuKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG4gIGVycm9yKG1lc3NhZ2U6IHN0cmluZyk6IHZvaWQ7XG59XG5cbi8qKlxuICogVmFsaWRhdGUgdGhlIGAtLWxpbWl0YCBmbGFnLiBSZXR1cm5zIGFuIGVycm9yIG1lc3NhZ2Ugd2hlbiBpbnZhbGlkLCBvclxuICogYHVuZGVmaW5lZGAgd2hlbiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciB3aXRoaW4gWzEsIDUwMF0uXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiB2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdChsaW1pdDogbnVtYmVyKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgaWYgKFxuICAgICFOdW1iZXIuaXNJbnRlZ2VyKGxpbWl0KSB8fFxuICAgIGxpbWl0IDwgQlVMS19DQU5DRUxfTUlOX0xJTUlUIHx8XG4gICAgbGltaXQgPiBCVUxLX0NBTkNFTF9NQVhfTElNSVRcbiAgKSB7XG4gICAgcmV0dXJuIGAtLWxpbWl0IG11c3QgYmUgYW4gaW50ZWdlciBiZXR3ZWVuICR7QlVMS19DQU5DRUxfTUlOX0xJTUlUfSBhbmQgJHtCVUxLX0NBTkNFTF9NQVhfTElNSVR9LmA7XG4gIH1cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuLyoqXG4gKiBCdWlsZCB0aGUgY29tcGFjdCBtdWx0aS1saW5lIFwiRG9uZTpcIiBzdW1tYXJ5IGJsb2NrLiBMaXN0cyBldmVyeSBvdXRjb21lXG4gKiBjYXRlZ29yeSBzbyB0aGUgY291bnRzIGFkZCB1cCB0byB0aGUgbnVtYmVyIG9mIHJ1bnMgcmVxdWVzdGVkOyBpbmRpdmlkdWFsXG4gKiBgbm90X2ZvdW5kYCwgYG5vdF9jYW5jZWxsYWJsZWAsIGFuZCBgZmFpbGVkYCBydW5zIGFyZSBhZGRpdGlvbmFsbHkgc3VyZmFjZWRcbiAqIHBlci1ydW4gdmlhIHtAbGluayBidWxrQ2FuY2VsRmFpbHVyZUxpbmVzfS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGZvcm1hdEJ1bGtDYW5jZWxTdW1tYXJ5KFxuICByZXN1bHQ6IEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHRcbik6IHN0cmluZyB7XG4gIGNvbnN0IHsgc3VtbWFyeSB9ID0gcmVzdWx0O1xuICByZXR1cm4gW1xuICAgICdEb25lOicsXG4gICAgYCAgJHtzdW1tYXJ5LmNhbmNlbGxlZH0gY2FuY2VsbGVkYCxcbiAgICBgICAke3N1bW1hcnkuYWxyZWFkeUNhbmNlbGxlZH0gYWxyZWFkeSBjYW5jZWxsZWRgLFxuICAgIGAgICR7c3VtbWFyeS5ub3RDYW5jZWxsYWJsZX0gbm90IGNhbmNlbGxhYmxlYCxcbiAgICBgICAke3N1bW1hcnkubm90Rm91bmR9IG5vdCBmb3VuZGAsXG4gICAgYCAgJHtzdW1tYXJ5LmZhaWxlZH0gZmFpbGVkYCxcbiAgXS5qb2luKCdcXG4nKTtcbn1cblxuLyoqXG4gKiBQZXItcnVuIGxpbmVzIGZvciBvdXRjb21lcyB3b3J0aCBjYWxsaW5nIG91dCBpbmRpdmlkdWFsbHk6IGBub3RfZm91bmRgLFxuICogYG5vdF9jYW5jZWxsYWJsZWAsIGFuZCBgZmFpbGVkYC4gQ2FuY2VsbGVkIGFuZCBhbHJlYWR5LWNhbmNlbGxlZCBydW5zIGFyZVxuICogbGVmdCB0byB0aGUgc3VtbWFyeS5cbiAqL1xuZXhwb3J0IGZ1bmN0aW9uIGJ1bGtDYW5jZWxGYWlsdXJlTGluZXMoXG4gIHJlc3VsdDogQnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdFxuKTogc3RyaW5nW10ge1xuICBjb25zdCBsaW5lczogc3RyaW5nW10gPSBbXTtcbiAgZm9yIChjb25zdCByIG9mIHJlc3VsdC5yZXN1bHRzKSB7XG4gICAgc3dpdGNoIChyLm91dGNvbWUpIHtcbiAgICAgIGNhc2UgJ25vdF9mb3VuZCc6XG4gICAgICAgIGxpbmVzLnB1c2goYCAg4pyXICR7ci5ydW5JZH06IG5vdCBmb3VuZGApO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgJ25vdF9jYW5jZWxsYWJsZSc6XG4gICAgICAgIGxpbmVzLnB1c2goYCAg4pyXICR7ci5ydW5JZH06IG5vdCBjYW5jZWxsYWJsZSAoJHtyLnN0YXR1c30pYCk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAnZmFpbGVkJzpcbiAgICAgICAgbGluZXMucHVzaChcbiAgICAgICAgICBgICDinJcgJHtyLnJ1bklkfTogZmFpbGVkICgke3IuY29kZX0ke3IucmV0cnlhYmxlID8gJywgcmV0cnlhYmxlJyA6ICcnfSlgXG4gICAgICAgICk7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbGluZXM7XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgQnVsa0NhbmNlbFBhcmFtcyB7XG4gIHdvcmxkOiBXb3JsZDtcbiAgc3RhdHVzPzogV29ya2Zsb3dSdW5TdGF0dXM7XG4gIHdvcmtmbG93TmFtZT86IHN0cmluZztcbiAgLyoqIE1heCBydW5zIHRvIGZldGNoIGFuZCBjYW5jZWwgaW4gdGhpcyBiYXRjaCAoYWxyZWFkeSB2YWxpZGF0ZWQpLiAqL1xuICBsaW1pdDogbnVtYmVyO1xuICAvKiogV2hlbiB0cnVlLCBza2lwIHRoZSBpbnRlcmFjdGl2ZSBjb25maXJtYXRpb24gcHJvbXB0LiAqL1xuICBjb25maXJtOiBib29sZWFuO1xuICBsb2dnZXI6IENhbmNlbExvZ2dlcjtcbiAgLyoqXG4gICAqIENvbmZpcm1hdGlvbiBwcm9tcHQuIE9taXR0ZWQgaW4gbm9uLWludGVyYWN0aXZlIGNvbnRleHRzIChhbmQgdGVzdHMpLFxuICAgKiBpbiB3aGljaCBjYXNlIGFuIHVuY29uZmlybWVkIHJ1biBhYm9ydHMuXG4gICAqL1xuICBwcm9tcHRDb25maXJtPzogKG1lc3NhZ2U6IHN0cmluZykgPT4gUHJvbWlzZTxib29sZWFuPjtcbn1cblxuZXhwb3J0IGludGVyZmFjZSBCdWxrQ2FuY2VsT3V0Y29tZSB7XG4gIC8qKiBQcm9jZXNzIGV4aXQgY29kZTogMSB3aGVuIGFueSBydW4gZmFpbGVkLCBvdGhlcndpc2UgMC4gKi9cbiAgZXhpdENvZGU6IG51bWJlcjtcbiAgLyoqIFRoZSBzdHJ1Y3R1cmVkIHJlc3VsdCwgb3IgdW5kZWZpbmVkIHdoZW4gbm90aGluZyBtYXRjaGVkIC8gYWJvcnRlZC4gKi9cbiAgcmVzdWx0PzogQnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdDtcbn1cblxuLyoqXG4gKiBGZXRjaCBtYXRjaGluZyBydW5zICh1cCB0byBgbGltaXRgKSwgY29uZmlybSwgYW5kIGNhbmNlbCB0aGVtIGluIGEgc2luZ2xlXG4gKiBidWxrIG9wZXJhdGlvbi4gUHJpbnRzIGEgdGFibGUgb2Ygd2hhdCB3aWxsIGJlIGNhbmNlbGxlZCwgcmVydW4gZ3VpZGFuY2VcbiAqIHdoZW4gbW9yZSBydW5zIG1hdGNoIHRoYW4gd2VyZSBmZXRjaGVkLCBhIGNvbXBhY3Qgc3VtbWFyeSwgYW5kIHBlci1ydW5cbiAqIGxpbmVzIGZvciBzdXJmYWNlZCBmYWlsdXJlcy5cbiAqXG4gKiBEb2VzIG5vdCB0cmF2ZXJzZSBwYWdlczogZXhhY3RseSBvbmUgcGFnZSBvZiBhdCBtb3N0IGBsaW1pdGAgcnVucyBpc1xuICogY2FuY2VsbGVkIHBlciBpbnZvY2F0aW9uLlxuICovXG5leHBvcnQgYXN5bmMgZnVuY3Rpb24gcGVyZm9ybUJ1bGtDYW5jZWwoXG4gIHBhcmFtczogQnVsa0NhbmNlbFBhcmFtc1xuKTogUHJvbWlzZTxCdWxrQ2FuY2VsT3V0Y29tZT4ge1xuICBjb25zdCB7IHdvcmxkLCBzdGF0dXMsIHdvcmtmbG93TmFtZSwgbGltaXQsIGNvbmZpcm0sIGxvZ2dlciwgcHJvbXB0Q29uZmlybSB9ID1cbiAgICBwYXJhbXM7XG5cbiAgLy8gRmV0Y2ggbWF0Y2hpbmcgcnVucy4gT25seSBtZXRhZGF0YSBpcyBuZWVkZWQgdG8gZGlzcGxheSBhbmQgY2FuY2VsLCBzb1xuICAvLyBwcmVmZXIgdGhlIGFuYWx5dGljcyByZWFkIHBhdGggd2hlbiB0aGUgYmFja2VuZCBwcm92aWRlcyBvbmUuXG4gIC8vXG4gIC8vIFdoZW4gdGhlIGNhbGxlciBwaW5zIGEgc3RhdHVzLCBtYXRjaCBleGFjdGx5IHRoYXQuIE90aGVyd2lzZSByZXN0cmljdCB0b1xuICAvLyB0aGUgY2FuY2VsbGFibGUgc3RhdHVzZXMgc28gcmVydW5uaW5nIG1ha2VzIHByb2dyZXNzIGluc3RlYWQgb2YgcmV0dXJuaW5nXG4gIC8vIHRoZSBzYW1lIHRlcm1pbmFsIHBhZ2UgZm9yZXZlci4gVGhlIGxpc3QgQVBJIHRha2VzIGEgc2luZ2xlIHN0YXR1cywgc29cbiAgLy8gZmFuIG91dCBhY3Jvc3MgdGhlIHRhcmdldCBzdGF0dXNlcyBhbmQgbWVyZ2UgdGhlIHBhZ2VzIGJlbG93LlxuICBjb25zdCBhbmFseXRpY3MgPSB3b3JsZC5hbmFseXRpY3M7XG4gIGNvbnN0IHRhcmdldFN0YXR1c2VzOiBXb3JrZmxvd1J1blN0YXR1c1tdID0gc3RhdHVzXG4gICAgPyBbc3RhdHVzXVxuICAgIDogWy4uLkNBTkNFTExBQkxFX1NUQVRVU0VTXTtcblxuICBjb25zdCBmZXRjaFBhZ2UgPSBhc3luYyAocGFnZVN0YXR1czogV29ya2Zsb3dSdW5TdGF0dXMpID0+IHtcbiAgICBpZiAoIWFuYWx5dGljcykge1xuICAgICAgcmV0dXJuIHdvcmxkLnJ1bnMubGlzdCh7XG4gICAgICAgIHN0YXR1czogcGFnZVN0YXR1cyxcbiAgICAgICAgd29ya2Zsb3dOYW1lLFxuICAgICAgICBwYWdpbmF0aW9uOiB7IGxpbWl0IH0sXG4gICAgICAgIHJlc29sdmVEYXRhOiAnbm9uZScsXG4gICAgICB9KTtcbiAgICB9XG4gICAgLy8gVGhlIGFuYWx5dGljcyBiYWNrZW5kIGRlZmF1bHRzIGl0cyBsaXN0aW5nIHRvIGEgcmVjZW50IHdpbmRvd1xuICAgIC8vICh0cmFpbGluZyAyNGggb24gdGhlIFZlcmNlbCBiYWNrZW5kKSwgYnV0IGJ1bGsgY2FuY2VsIG11c3QgbWF0Y2hcbiAgICAvLyBhY3Jvc3MgdGhlIHBsYW4ncyB3aG9sZSBvYnNlcnZhYmlsaXR5IHdpbmRvdyDigJQgYSBydW4gY2FuIHNsZWVwIG9yXG4gICAgLy8gd2FpdCBvbiBhIGhvb2sgZm9yIGRheXMgd2l0aG91dCBlbWl0dGluZyByZWNlbnQgZXZlbnRzLiBQcm9iZSBmb3JcbiAgICAvLyB0aGUgcGxhbiB3aW5kb3cgYm91bmRzIGZpcnN0LCB0aGVuIG1hdGNoIGFjcm9zcyB0aGVtLlxuICAgIGNvbnN0IHByb2JlID0gYXdhaXQgYW5hbHl0aWNzLnJ1bnMubGlzdCh7XG4gICAgICBzdGF0dXM6IHBhZ2VTdGF0dXMsXG4gICAgICB3b3JrZmxvd05hbWUsXG4gICAgICBwYWdpbmF0aW9uOiB7IGxpbWl0OiAxIH0sXG4gICAgfSk7XG4gICAgY29uc3Qgd2luZG93U3RhcnQgPSBwbGFuV2luZG93U3RhcnRGcm9tUmVzcG9uc2UocHJvYmUpO1xuICAgIHJldHVybiBhbmFseXRpY3MucnVucy5saXN0KHtcbiAgICAgIHN0YXR1czogcGFnZVN0YXR1cyxcbiAgICAgIHdvcmtmbG93TmFtZSxcbiAgICAgIC4uLih3aW5kb3dTdGFydFxuICAgICAgICA/IHsgc3RhcnRUaW1lOiB3aW5kb3dTdGFydCwgZW5kVGltZTogbmV3IERhdGUoKS50b0lTT1N0cmluZygpIH1cbiAgICAgICAgOiB7fSksXG4gICAgICBwYWdpbmF0aW9uOiB7IGxpbWl0IH0sXG4gICAgfSk7XG4gIH07XG5cbiAgY29uc3QgcGFnZXMgPSBhd2FpdCBQcm9taXNlLmFsbCh0YXJnZXRTdGF0dXNlcy5tYXAoZmV0Y2hQYWdlKSk7XG5cbiAgLy8gTWVyZ2UgdGhlIHBlci1zdGF0dXMgcGFnZXMgcm91bmQtcm9iaW4gc28gYSBmdWxsIHBhZ2Ugb2YgcnVubmluZyBydW5zXG4gIC8vIGNhbm5vdCBjcm93ZCBwZW5kaW5nIHJ1bnMgKHdoaWNoIGRvIG5vdCBoYXZlIGEgc3RhcnRlZEF0IHRpbWVzdGFtcCkgb3V0XG4gIC8vIG9mIGV2ZXJ5IGJhdGNoLiBQcmVzZXJ2ZSBlYWNoIHBhZ2UncyBiYWNrZW5kIG9yZGVyIGFuZCBkZWR1cGUgYnkgcnVuSWQgaW5cbiAgLy8gY2FzZSBhIHJ1biBjaGFuZ2VzIHN0YXR1cyB3aGlsZSB0aGUgcGFnZXMgYXJlIGZldGNoZWQuXG4gIGNvbnN0IHByb2plY3RlZFBhZ2VzID0gcGFnZXMubWFwKChwYWdlKSA9PlxuICAgIHBhZ2UuZGF0YS5tYXAoKHJ1bikgPT4gKHtcbiAgICAgIHJ1bklkOiBydW4ucnVuSWQsXG4gICAgICB3b3JrZmxvd05hbWU6IHJ1bi53b3JrZmxvd05hbWUsXG4gICAgICBzdGF0dXM6IHJ1bi5zdGF0dXMsXG4gICAgICBzdGFydGVkQXQ6IHJ1bi5zdGFydGVkQXQsXG4gICAgfSkpXG4gICk7XG4gIGNvbnN0IG1lcmdlZDogKHR5cGVvZiBwcm9qZWN0ZWRQYWdlcylbbnVtYmVyXVtudW1iZXJdW10gPSBbXTtcbiAgY29uc3Qgc2VlblJ1bklkcyA9IG5ldyBTZXQ8c3RyaW5nPigpO1xuICBjb25zdCBtYXhQYWdlTGVuZ3RoID0gTWF0aC5tYXgoXG4gICAgMCxcbiAgICAuLi5wcm9qZWN0ZWRQYWdlcy5tYXAoKHBhZ2UpID0+IHBhZ2UubGVuZ3RoKVxuICApO1xuICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgbWF4UGFnZUxlbmd0aDsgaW5kZXgrKykge1xuICAgIGZvciAoY29uc3QgcGFnZSBvZiBwcm9qZWN0ZWRQYWdlcykge1xuICAgICAgY29uc3QgcnVuID0gcGFnZVtpbmRleF07XG4gICAgICBpZiAocnVuICYmICFzZWVuUnVuSWRzLmhhcyhydW4ucnVuSWQpKSB7XG4gICAgICAgIHNlZW5SdW5JZHMuYWRkKHJ1bi5ydW5JZCk7XG4gICAgICAgIG1lcmdlZC5wdXNoKHJ1bik7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIGNvbnN0IHJ1bnMgPSB7XG4gICAgZGF0YTogbWVyZ2VkLnNsaWNlKDAsIGxpbWl0KSxcbiAgICBoYXNNb3JlOiBwYWdlcy5zb21lKChwYWdlKSA9PiBwYWdlLmhhc01vcmUpIHx8IG1lcmdlZC5sZW5ndGggPiBsaW1pdCxcbiAgfTtcblxuICBpZiAocnVucy5kYXRhLmxlbmd0aCA9PT0gMCkge1xuICAgIGxvZ2dlci53YXJuKCdObyBtYXRjaGluZyBydW5zIGZvdW5kLicpO1xuICAgIHJldHVybiB7IGV4aXRDb2RlOiAwIH07XG4gIH1cblxuICAvLyBEaXNwbGF5IHdoYXQgd2lsbCBiZSBjYW5jZWxsZWQuXG4gIGNvbnN0IHRhYmxlID0gbmV3IFRhYmxlKCk7XG4gIGZvciAoY29uc3QgcnVuIG9mIHJ1bnMuZGF0YSkge1xuICAgIGNvbnN0IHNob3J0TmFtZSA9XG4gICAgICBwYXJzZVdvcmtmbG93TmFtZShydW4ud29ya2Zsb3dOYW1lKT8uc2hvcnROYW1lIHx8IHJ1bi53b3JrZmxvd05hbWU7XG4gICAgdGFibGUuY2VsbCgncnVuSWQnLCBydW4ucnVuSWQpO1xuICAgIHRhYmxlLmNlbGwoJ3dvcmtmbG93JywgY2hhbGsuYmx1ZUJyaWdodChzaG9ydE5hbWUpKTtcbiAgICB0YWJsZS5jZWxsKCdzdGF0dXMnLCBydW4uc3RhdHVzKTtcbiAgICB0YWJsZS5jZWxsKFxuICAgICAgJ3N0YXJ0ZWRBdCcsXG4gICAgICBydW4uc3RhcnRlZEF0ID8gbmV3IERhdGUocnVuLnN0YXJ0ZWRBdCkudG9JU09TdHJpbmcoKSA6ICctJ1xuICAgICk7XG4gICAgdGFibGUubmV3Um93KCk7XG4gIH1cbiAgbG9nZ2VyLmxvZyhgXFxuRm91bmQgJHtjaGFsay5ib2xkKHJ1bnMuZGF0YS5sZW5ndGgpfSBydW5zIHRvIGNhbmNlbDpcXG5gKTtcbiAgbG9nZ2VyLmxvZyh0YWJsZS50b1N0cmluZygpKTtcblxuICBpZiAocnVucy5oYXNNb3JlKSB7XG4gICAgbG9nZ2VyLndhcm4oSEFTX01PUkVfR1VJREFOQ0UpO1xuICB9XG5cbiAgLy8gQ29uZmlybSB1bmxlc3MgLS1jb25maXJtLy15LlxuICBpZiAoIWNvbmZpcm0pIHtcbiAgICBjb25zdCBjb25maXJtZWQgPSBwcm9tcHRDb25maXJtXG4gICAgICA/IGF3YWl0IHByb21wdENvbmZpcm0oXG4gICAgICAgICAgYENhbmNlbCAke3J1bnMuZGF0YS5sZW5ndGh9IHJ1biR7cnVucy5kYXRhLmxlbmd0aCA9PT0gMSA/ICcnIDogJ3MnfT9gXG4gICAgICAgIClcbiAgICAgIDogZmFsc2U7XG4gICAgaWYgKCFjb25maXJtZWQpIHtcbiAgICAgIGxvZ2dlci5sb2coJ0Fib3J0ZWQuJyk7XG4gICAgICByZXR1cm4geyBleGl0Q29kZTogMCB9O1xuICAgIH1cbiAgfVxuXG4gIC8vIE9uZSBidWxrIG9wZXJhdGlvbjogYSBzaW5nbGUgYmFja2VuZCByZXF1ZXN0IG9uIFZlcmNlbCwgb3IgYm91bmRlZFxuICAvLyBmYWxsYmFjayBjb25jdXJyZW5jeSBvbiBsb2NhbCAvIGNvbW11bml0eSB3b3JsZHMuXG4gIGNvbnN0IHJlc3VsdCA9IGF3YWl0IGNhbmNlbFJ1bnMoXG4gICAgd29ybGQsXG4gICAgcnVucy5kYXRhLm1hcCgocnVuKSA9PiBydW4ucnVuSWQpLFxuICAgIHsgY2FuY2VsUmVhc29uOiBDTElfQ0FOQ0VMX1JFQVNPTiB9XG4gICk7XG5cbiAgZm9yIChjb25zdCBsaW5lIG9mIGJ1bGtDYW5jZWxGYWlsdXJlTGluZXMocmVzdWx0KSkge1xuICAgIGxvZ2dlci53YXJuKGxpbmUpO1xuICB9XG4gIGxvZ2dlci5sb2coYFxcbiR7Zm9ybWF0QnVsa0NhbmNlbFN1bW1hcnkocmVzdWx0KX1gKTtcblxuICAvLyBBbHJlYWR5LWNhbmNlbGxlZCBhbmQgdGVybWluYWwgcnVucyBhcmUgdmFsaWQgcGFydGlhbCBvdXRjb21lczsgb25seSBhXG4gIC8vIGdlbnVpbmUgZmFpbHVyZSBpcyBhIG5vbnplcm8gZXhpdC5cbiAgcmV0dXJuIHsgZXhpdENvZGU6IHJlc3VsdC5zdW1tYXJ5LmZhaWxlZCA+IDAgPyAxIDogMCwgcmVzdWx0IH07XG59XG4iXX0=
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"bulk-cancel.test.d.ts","sourceRoot":"","sources":["../../src/lib/bulk-cancel.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,366 @@
|
|
|
1
|
+
import { describe, expect, it, vi } from 'vitest';
|
|
2
|
+
import { bulkCancelFailureLines, CLI_CANCEL_REASON, formatBulkCancelSummary, HAS_MORE_GUIDANCE, performBulkCancel, validateBulkCancelLimit, } from './bulk-cancel.js';
|
|
3
|
+
/** Collects logger output so assertions can inspect what the user saw. */
|
|
4
|
+
function makeLogger() {
|
|
5
|
+
const logs = [];
|
|
6
|
+
const warns = [];
|
|
7
|
+
const errors = [];
|
|
8
|
+
return {
|
|
9
|
+
logger: {
|
|
10
|
+
log: (m) => logs.push(m),
|
|
11
|
+
warn: (m) => warns.push(m),
|
|
12
|
+
error: (m) => errors.push(m),
|
|
13
|
+
},
|
|
14
|
+
logs,
|
|
15
|
+
warns,
|
|
16
|
+
errors,
|
|
17
|
+
};
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Build a minimal fake world. `cancelMany` is attached only when provided,
|
|
21
|
+
* which is how {@link performBulkCancel} (via `cancelRuns`) decides between
|
|
22
|
+
* the single-request fast path and the per-run fallback.
|
|
23
|
+
*/
|
|
24
|
+
function makeWorld(opts) {
|
|
25
|
+
const runsById = new Map(opts.runs.map((r) => [r.runId, r]));
|
|
26
|
+
const world = {
|
|
27
|
+
analytics: undefined,
|
|
28
|
+
runs: {
|
|
29
|
+
// Status-aware so tests can seed mixed-status runs and assert that only
|
|
30
|
+
// the requested status is matched. performBulkCancel always passes a
|
|
31
|
+
// concrete status per call (the pinned one, or each cancellable status).
|
|
32
|
+
list: vi.fn(async (params = {}) => ({
|
|
33
|
+
data: params.status
|
|
34
|
+
? opts.runs.filter((r) => r.status === params.status)
|
|
35
|
+
: opts.runs,
|
|
36
|
+
hasMore: opts.hasMore ?? false,
|
|
37
|
+
})),
|
|
38
|
+
get: vi.fn(async (runId) => {
|
|
39
|
+
const run = runsById.get(runId);
|
|
40
|
+
if (!run)
|
|
41
|
+
throw new Error(`run ${runId} not found`);
|
|
42
|
+
return run;
|
|
43
|
+
}),
|
|
44
|
+
},
|
|
45
|
+
events: {
|
|
46
|
+
create: vi.fn(async (runId) => opts.eventsCreate?.(runId)),
|
|
47
|
+
},
|
|
48
|
+
};
|
|
49
|
+
if (opts.cancelMany) {
|
|
50
|
+
world.runs.cancelMany = vi.fn(opts.cancelMany);
|
|
51
|
+
}
|
|
52
|
+
return world;
|
|
53
|
+
}
|
|
54
|
+
describe('validateBulkCancelLimit', () => {
|
|
55
|
+
it('accepts integers within [1, 500]', () => {
|
|
56
|
+
expect(validateBulkCancelLimit(1)).toBeUndefined();
|
|
57
|
+
expect(validateBulkCancelLimit(50)).toBeUndefined();
|
|
58
|
+
expect(validateBulkCancelLimit(500)).toBeUndefined();
|
|
59
|
+
});
|
|
60
|
+
it('rejects out-of-range and non-integer values', () => {
|
|
61
|
+
expect(validateBulkCancelLimit(0)).toMatch(/between 1 and 500/);
|
|
62
|
+
expect(validateBulkCancelLimit(501)).toMatch(/between 1 and 500/);
|
|
63
|
+
expect(validateBulkCancelLimit(-5)).toMatch(/between 1 and 500/);
|
|
64
|
+
expect(validateBulkCancelLimit(1.5)).toMatch(/between 1 and 500/);
|
|
65
|
+
});
|
|
66
|
+
});
|
|
67
|
+
describe('formatBulkCancelSummary', () => {
|
|
68
|
+
it('renders every outcome category so counts add up to requested', () => {
|
|
69
|
+
const summary = formatBulkCancelSummary({
|
|
70
|
+
summary: {
|
|
71
|
+
requested: 7,
|
|
72
|
+
cancelled: 2,
|
|
73
|
+
alreadyCancelled: 1,
|
|
74
|
+
notCancellable: 1,
|
|
75
|
+
notFound: 3,
|
|
76
|
+
failed: 0,
|
|
77
|
+
},
|
|
78
|
+
results: [],
|
|
79
|
+
});
|
|
80
|
+
expect(summary).toBe([
|
|
81
|
+
'Done:',
|
|
82
|
+
' 2 cancelled',
|
|
83
|
+
' 1 already cancelled',
|
|
84
|
+
' 1 not cancellable',
|
|
85
|
+
' 3 not found',
|
|
86
|
+
' 0 failed',
|
|
87
|
+
].join('\n'));
|
|
88
|
+
});
|
|
89
|
+
});
|
|
90
|
+
describe('bulkCancelFailureLines', () => {
|
|
91
|
+
it('surfaces only not_found, not_cancellable, and failed runs', () => {
|
|
92
|
+
const lines = bulkCancelFailureLines({
|
|
93
|
+
summary: {
|
|
94
|
+
requested: 5,
|
|
95
|
+
cancelled: 1,
|
|
96
|
+
alreadyCancelled: 1,
|
|
97
|
+
notCancellable: 1,
|
|
98
|
+
notFound: 1,
|
|
99
|
+
failed: 1,
|
|
100
|
+
},
|
|
101
|
+
results: [
|
|
102
|
+
{ runId: 'a', outcome: 'cancelled' },
|
|
103
|
+
{ runId: 'b', outcome: 'already_cancelled' },
|
|
104
|
+
{ runId: 'c', outcome: 'not_cancellable', status: 'completed' },
|
|
105
|
+
{ runId: 'd', outcome: 'not_found' },
|
|
106
|
+
{
|
|
107
|
+
runId: 'e',
|
|
108
|
+
outcome: 'failed',
|
|
109
|
+
code: 'internal_error',
|
|
110
|
+
retryable: true,
|
|
111
|
+
},
|
|
112
|
+
],
|
|
113
|
+
});
|
|
114
|
+
expect(lines).toEqual([
|
|
115
|
+
' ✗ c: not cancellable (completed)',
|
|
116
|
+
' ✗ d: not found',
|
|
117
|
+
' ✗ e: failed (internal_error, retryable)',
|
|
118
|
+
]);
|
|
119
|
+
});
|
|
120
|
+
});
|
|
121
|
+
describe('performBulkCancel', () => {
|
|
122
|
+
it('warns and exits 0 when no runs match', async () => {
|
|
123
|
+
const { logger, warns } = makeLogger();
|
|
124
|
+
const world = makeWorld({ runs: [] });
|
|
125
|
+
const { exitCode, result } = await performBulkCancel({
|
|
126
|
+
world,
|
|
127
|
+
limit: 50,
|
|
128
|
+
confirm: true,
|
|
129
|
+
logger,
|
|
130
|
+
});
|
|
131
|
+
expect(exitCode).toBe(0);
|
|
132
|
+
expect(result).toBeUndefined();
|
|
133
|
+
expect(warns).toContain('No matching runs found.');
|
|
134
|
+
});
|
|
135
|
+
it('restricts to cancellable statuses and excludes terminal runs when no status is pinned', async () => {
|
|
136
|
+
const { logger } = makeLogger();
|
|
137
|
+
const cancelMany = vi.fn(async (req) => ({
|
|
138
|
+
summary: {
|
|
139
|
+
requested: req.runIds.length,
|
|
140
|
+
cancelled: req.runIds.length,
|
|
141
|
+
alreadyCancelled: 0,
|
|
142
|
+
notCancellable: 0,
|
|
143
|
+
notFound: 0,
|
|
144
|
+
failed: 0,
|
|
145
|
+
},
|
|
146
|
+
results: req.runIds.map((runId) => ({
|
|
147
|
+
runId,
|
|
148
|
+
outcome: 'cancelled',
|
|
149
|
+
})),
|
|
150
|
+
}));
|
|
151
|
+
const world = makeWorld({
|
|
152
|
+
runs: [
|
|
153
|
+
{ runId: 'p1', workflowName: 'wf', status: 'pending' },
|
|
154
|
+
{ runId: 'r1', workflowName: 'wf', status: 'running' },
|
|
155
|
+
// Terminal — must never be fetched or cancelled.
|
|
156
|
+
{ runId: 'done', workflowName: 'wf', status: 'completed' },
|
|
157
|
+
],
|
|
158
|
+
cancelMany,
|
|
159
|
+
});
|
|
160
|
+
const { exitCode } = await performBulkCancel({
|
|
161
|
+
world,
|
|
162
|
+
limit: 50,
|
|
163
|
+
confirm: true,
|
|
164
|
+
logger,
|
|
165
|
+
});
|
|
166
|
+
expect(exitCode).toBe(0);
|
|
167
|
+
const requestedStatuses = world.runs.list.mock.calls.map((c) => c[0]?.status);
|
|
168
|
+
expect(requestedStatuses).toContain('pending');
|
|
169
|
+
expect(requestedStatuses).toContain('running');
|
|
170
|
+
expect(requestedStatuses).not.toContain('completed');
|
|
171
|
+
// Only the cancellable runs reach cancelMany; the completed run is excluded.
|
|
172
|
+
expect(cancelMany).toHaveBeenCalledTimes(1);
|
|
173
|
+
expect([...cancelMany.mock.calls[0][0].runIds].sort()).toEqual([
|
|
174
|
+
'p1',
|
|
175
|
+
'r1',
|
|
176
|
+
]);
|
|
177
|
+
});
|
|
178
|
+
it('round-robins status pages before applying the batch limit', async () => {
|
|
179
|
+
const { logger } = makeLogger();
|
|
180
|
+
const cancelMany = vi.fn(async (req) => ({
|
|
181
|
+
summary: {
|
|
182
|
+
requested: req.runIds.length,
|
|
183
|
+
cancelled: req.runIds.length,
|
|
184
|
+
alreadyCancelled: 0,
|
|
185
|
+
notCancellable: 0,
|
|
186
|
+
notFound: 0,
|
|
187
|
+
failed: 0,
|
|
188
|
+
},
|
|
189
|
+
results: req.runIds.map((runId) => ({
|
|
190
|
+
runId,
|
|
191
|
+
outcome: 'cancelled',
|
|
192
|
+
})),
|
|
193
|
+
}));
|
|
194
|
+
const world = makeWorld({
|
|
195
|
+
runs: [
|
|
196
|
+
...Array.from({ length: 5 }, (_, index) => ({
|
|
197
|
+
runId: `r${index + 1}`,
|
|
198
|
+
workflowName: 'wf',
|
|
199
|
+
status: 'running',
|
|
200
|
+
startedAt: new Date(2026, 0, index + 1).toISOString(),
|
|
201
|
+
})),
|
|
202
|
+
...Array.from({ length: 3 }, (_, index) => ({
|
|
203
|
+
runId: `p${index + 1}`,
|
|
204
|
+
workflowName: 'wf',
|
|
205
|
+
status: 'pending',
|
|
206
|
+
})),
|
|
207
|
+
],
|
|
208
|
+
cancelMany,
|
|
209
|
+
});
|
|
210
|
+
await performBulkCancel({
|
|
211
|
+
world,
|
|
212
|
+
limit: 5,
|
|
213
|
+
confirm: true,
|
|
214
|
+
logger,
|
|
215
|
+
});
|
|
216
|
+
expect(cancelMany).toHaveBeenCalledWith({
|
|
217
|
+
runIds: ['p1', 'r1', 'p2', 'r2', 'p3'],
|
|
218
|
+
cancelReason: CLI_CANCEL_REASON,
|
|
219
|
+
});
|
|
220
|
+
});
|
|
221
|
+
it('uses the cancelMany fast path in a single call and skips per-run events', async () => {
|
|
222
|
+
const { logger } = makeLogger();
|
|
223
|
+
const cancelMany = vi.fn(async () => ({
|
|
224
|
+
summary: {
|
|
225
|
+
requested: 2,
|
|
226
|
+
cancelled: 2,
|
|
227
|
+
alreadyCancelled: 0,
|
|
228
|
+
notCancellable: 0,
|
|
229
|
+
notFound: 0,
|
|
230
|
+
failed: 0,
|
|
231
|
+
},
|
|
232
|
+
results: [
|
|
233
|
+
{ runId: 'r1', outcome: 'cancelled' },
|
|
234
|
+
{ runId: 'r2', outcome: 'cancelled' },
|
|
235
|
+
],
|
|
236
|
+
}));
|
|
237
|
+
const world = makeWorld({
|
|
238
|
+
runs: [
|
|
239
|
+
{ runId: 'r1', workflowName: 'wf', status: 'running' },
|
|
240
|
+
{ runId: 'r2', workflowName: 'wf', status: 'running' },
|
|
241
|
+
],
|
|
242
|
+
cancelMany,
|
|
243
|
+
});
|
|
244
|
+
const { exitCode } = await performBulkCancel({
|
|
245
|
+
world,
|
|
246
|
+
status: 'running',
|
|
247
|
+
limit: 50,
|
|
248
|
+
confirm: true,
|
|
249
|
+
logger,
|
|
250
|
+
});
|
|
251
|
+
expect(exitCode).toBe(0);
|
|
252
|
+
expect(cancelMany).toHaveBeenCalledTimes(1);
|
|
253
|
+
expect(cancelMany).toHaveBeenCalledWith({
|
|
254
|
+
runIds: ['r1', 'r2'],
|
|
255
|
+
cancelReason: CLI_CANCEL_REASON,
|
|
256
|
+
});
|
|
257
|
+
// Fast path must not fall back to per-run event creation.
|
|
258
|
+
expect(world.events.create).not.toHaveBeenCalled();
|
|
259
|
+
});
|
|
260
|
+
it('falls back to per-run cancellation when cancelMany is absent', async () => {
|
|
261
|
+
const { logger, logs } = makeLogger();
|
|
262
|
+
const world = makeWorld({
|
|
263
|
+
runs: [
|
|
264
|
+
{ runId: 'r1', workflowName: 'wf', status: 'running' },
|
|
265
|
+
{ runId: 'r2', workflowName: 'wf', status: 'running' },
|
|
266
|
+
],
|
|
267
|
+
});
|
|
268
|
+
const { exitCode, result } = await performBulkCancel({
|
|
269
|
+
world,
|
|
270
|
+
status: 'running',
|
|
271
|
+
limit: 50,
|
|
272
|
+
confirm: true,
|
|
273
|
+
logger,
|
|
274
|
+
});
|
|
275
|
+
expect(exitCode).toBe(0);
|
|
276
|
+
expect(world.events.create).toHaveBeenCalledTimes(2);
|
|
277
|
+
expect(world.events.create).toHaveBeenCalledWith('r1', expect.objectContaining({
|
|
278
|
+
eventData: { cancelReason: CLI_CANCEL_REASON },
|
|
279
|
+
}), expect.anything());
|
|
280
|
+
expect(result?.summary.cancelled).toBe(2);
|
|
281
|
+
expect(logs.join('\n')).toContain('2 cancelled');
|
|
282
|
+
});
|
|
283
|
+
it('prints rerun guidance when more runs match than were fetched', async () => {
|
|
284
|
+
const { logger, warns } = makeLogger();
|
|
285
|
+
const world = makeWorld({
|
|
286
|
+
runs: [{ runId: 'r1', workflowName: 'wf', status: 'running' }],
|
|
287
|
+
hasMore: true,
|
|
288
|
+
cancelMany: async () => ({
|
|
289
|
+
summary: {
|
|
290
|
+
requested: 1,
|
|
291
|
+
cancelled: 1,
|
|
292
|
+
alreadyCancelled: 0,
|
|
293
|
+
notCancellable: 0,
|
|
294
|
+
notFound: 0,
|
|
295
|
+
failed: 0,
|
|
296
|
+
},
|
|
297
|
+
results: [{ runId: 'r1', outcome: 'cancelled' }],
|
|
298
|
+
}),
|
|
299
|
+
});
|
|
300
|
+
await performBulkCancel({
|
|
301
|
+
world,
|
|
302
|
+
status: 'running',
|
|
303
|
+
limit: 1,
|
|
304
|
+
confirm: true,
|
|
305
|
+
logger,
|
|
306
|
+
});
|
|
307
|
+
expect(warns).toContain(HAS_MORE_GUIDANCE);
|
|
308
|
+
});
|
|
309
|
+
it('exits 1 and surfaces per-run failures when a run fails', async () => {
|
|
310
|
+
const { logger, warns } = makeLogger();
|
|
311
|
+
const world = makeWorld({
|
|
312
|
+
runs: [
|
|
313
|
+
{ runId: 'r1', workflowName: 'wf', status: 'running' },
|
|
314
|
+
{ runId: 'r2', workflowName: 'wf', status: 'running' },
|
|
315
|
+
],
|
|
316
|
+
cancelMany: async () => ({
|
|
317
|
+
summary: {
|
|
318
|
+
requested: 2,
|
|
319
|
+
cancelled: 1,
|
|
320
|
+
alreadyCancelled: 0,
|
|
321
|
+
notCancellable: 0,
|
|
322
|
+
notFound: 0,
|
|
323
|
+
failed: 1,
|
|
324
|
+
},
|
|
325
|
+
results: [
|
|
326
|
+
{ runId: 'r1', outcome: 'cancelled' },
|
|
327
|
+
{
|
|
328
|
+
runId: 'r2',
|
|
329
|
+
outcome: 'failed',
|
|
330
|
+
code: 'internal_error',
|
|
331
|
+
retryable: true,
|
|
332
|
+
},
|
|
333
|
+
],
|
|
334
|
+
}),
|
|
335
|
+
});
|
|
336
|
+
const { exitCode } = await performBulkCancel({
|
|
337
|
+
world,
|
|
338
|
+
status: 'running',
|
|
339
|
+
limit: 50,
|
|
340
|
+
confirm: true,
|
|
341
|
+
logger,
|
|
342
|
+
});
|
|
343
|
+
expect(exitCode).toBe(1);
|
|
344
|
+
expect(warns).toContain(' ✗ r2: failed (internal_error, retryable)');
|
|
345
|
+
});
|
|
346
|
+
it('aborts without cancelling when confirmation is declined', async () => {
|
|
347
|
+
const { logger, logs } = makeLogger();
|
|
348
|
+
const cancelMany = vi.fn();
|
|
349
|
+
const world = makeWorld({
|
|
350
|
+
runs: [{ runId: 'r1', workflowName: 'wf', status: 'running' }],
|
|
351
|
+
cancelMany: cancelMany,
|
|
352
|
+
});
|
|
353
|
+
const { exitCode } = await performBulkCancel({
|
|
354
|
+
world,
|
|
355
|
+
status: 'running',
|
|
356
|
+
limit: 50,
|
|
357
|
+
confirm: false,
|
|
358
|
+
logger,
|
|
359
|
+
promptConfirm: async () => false,
|
|
360
|
+
});
|
|
361
|
+
expect(exitCode).toBe(0);
|
|
362
|
+
expect(logs).toContain('Aborted.');
|
|
363
|
+
expect(cancelMany).not.toHaveBeenCalled();
|
|
364
|
+
});
|
|
365
|
+
});
|
|
366
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYnVsay1jYW5jZWwudGVzdC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9saWIvYnVsay1jYW5jZWwudGVzdC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFLQSxPQUFPLEVBQUUsUUFBUSxFQUFFLE1BQU0sRUFBRSxFQUFFLEVBQUUsRUFBRSxFQUFFLE1BQU0sUUFBUSxDQUFDO0FBQ2xELE9BQU8sRUFDTCxzQkFBc0IsRUFDdEIsaUJBQWlCLEVBQ2pCLHVCQUF1QixFQUN2QixpQkFBaUIsRUFDakIsaUJBQWlCLEVBQ2pCLHVCQUF1QixHQUN4QixNQUFNLGtCQUFrQixDQUFDO0FBUzFCLDBFQUEwRTtBQUMxRSxTQUFTLFVBQVU7SUFDakIsTUFBTSxJQUFJLEdBQWEsRUFBRSxDQUFDO0lBQzFCLE1BQU0sS0FBSyxHQUFhLEVBQUUsQ0FBQztJQUMzQixNQUFNLE1BQU0sR0FBYSxFQUFFLENBQUM7SUFDNUIsT0FBTztRQUNMLE1BQU0sRUFBRTtZQUNOLEdBQUcsRUFBRSxDQUFDLENBQVMsRUFBRSxFQUFFLENBQUMsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUM7WUFDaEMsSUFBSSxFQUFFLENBQUMsQ0FBUyxFQUFFLEVBQUUsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUMsQ0FBQztZQUNsQyxLQUFLLEVBQUUsQ0FBQyxDQUFTLEVBQUUsRUFBRSxDQUFDLE1BQU0sQ0FBQyxJQUFJLENBQUMsQ0FBQyxDQUFDO1NBQ3JDO1FBQ0QsSUFBSTtRQUNKLEtBQUs7UUFDTCxNQUFNO0tBQ1AsQ0FBQztBQUNKLENBQUM7QUFFRDs7OztHQUlHO0FBQ0gsU0FBUyxTQUFTLENBQUMsSUFPbEI7SUFDQyxNQUFNLFFBQVEsR0FBRyxJQUFJLEdBQUcsQ0FBQyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMsS0FBSyxFQUFFLENBQUMsQ0FBQyxDQUFDLENBQUMs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QyIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB0eXBlIHtcbiAgQnVsa0NhbmNlbFdvcmtmbG93UnVuc1JlcXVlc3QsXG4gIEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQsXG4gIFdvcmxkLFxufSBmcm9tICdAd29ya2Zsb3cvd29ybGQnO1xuaW1wb3J0IHsgZGVzY3JpYmUsIGV4cGVjdCwgaXQsIHZpIH0gZnJvbSAndml0ZXN0JztcbmltcG9ydCB7XG4gIGJ1bGtDYW5jZWxGYWlsdXJlTGluZXMsXG4gIENMSV9DQU5DRUxfUkVBU09OLFxuICBmb3JtYXRCdWxrQ2FuY2VsU3VtbWFyeSxcbiAgSEFTX01PUkVfR1VJREFOQ0UsXG4gIHBlcmZvcm1CdWxrQ2FuY2VsLFxuICB2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCxcbn0gZnJvbSAnLi9idWxrLWNhbmNlbC5qcyc7XG5cbmludGVyZmFjZSBGYWtlUnVuIHtcbiAgcnVuSWQ6IHN0cmluZztcbiAgd29ya2Zsb3dOYW1lOiBzdHJpbmc7XG4gIHN0YXR1czogc3RyaW5nO1xuICBzdGFydGVkQXQ/OiBzdHJpbmc7XG59XG5cbi8qKiBDb2xsZWN0cyBsb2dnZXIgb3V0cHV0IHNvIGFzc2VydGlvbnMgY2FuIGluc3BlY3Qgd2hhdCB0aGUgdXNlciBzYXcuICovXG5mdW5jdGlvbiBtYWtlTG9nZ2VyKCkge1xuICBjb25zdCBsb2dzOiBzdHJpbmdbXSA9IFtdO1xuICBjb25zdCB3YXJuczogc3RyaW5nW10gPSBbXTtcbiAgY29uc3QgZXJyb3JzOiBzdHJpbmdbXSA9IFtdO1xuICByZXR1cm4ge1xuICAgIGxvZ2dlcjoge1xuICAgICAgbG9nOiAobTogc3RyaW5nKSA9PiBsb2dzLnB1c2gobSksXG4gICAgICB3YXJuOiAobTogc3RyaW5nKSA9PiB3YXJucy5wdXNoKG0pLFxuICAgICAgZXJyb3I6IChtOiBzdHJpbmcpID0+IGVycm9ycy5wdXNoKG0pLFxuICAgIH0sXG4gICAgbG9ncyxcbiAgICB3YXJucyxcbiAgICBlcnJvcnMsXG4gIH07XG59XG5cbi8qKlxuICogQnVpbGQgYSBtaW5pbWFsIGZha2Ugd29ybGQuIGBjYW5jZWxNYW55YCBpcyBhdHRhY2hlZCBvbmx5IHdoZW4gcHJvdmlkZWQsXG4gKiB3aGljaCBpcyBob3cge0BsaW5rIHBlcmZvcm1CdWxrQ2FuY2VsfSAodmlhIGBjYW5jZWxSdW5zYCkgZGVjaWRlcyBiZXR3ZWVuXG4gKiB0aGUgc2luZ2xlLXJlcXVlc3QgZmFzdCBwYXRoIGFuZCB0aGUgcGVyLXJ1biBmYWxsYmFjay5cbiAqL1xuZnVuY3Rpb24gbWFrZVdvcmxkKG9wdHM6IHtcbiAgcnVuczogRmFrZVJ1bltdO1xuICBoYXNNb3JlPzogYm9vbGVhbjtcbiAgY2FuY2VsTWFueT86IChcbiAgICByZXF1ZXN0OiBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVxdWVzdFxuICApID0+IFByb21pc2U8QnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdD47XG4gIGV2ZW50c0NyZWF0ZT86IChydW5JZDogc3RyaW5nKSA9PiBQcm9taXNlPHVua25vd24+O1xufSk6IFdvcmxkIHtcbiAgY29uc3QgcnVuc0J5SWQgPSBuZXcgTWFwKG9wdHMucnVucy5tYXAoKHIpID0+IFtyLnJ1bklkLCByXSkpO1xuICBjb25zdCB3b3JsZDogYW55ID0ge1xuICAgIGFuYWx5dGljczogdW5kZWZpbmVkLFxuICAgIHJ1bnM6IHtcbiAgICAgIC8vIFN0YXR1cy1hd2FyZSBzbyB0ZXN0cyBjYW4gc2VlZCBtaXhlZC1zdGF0dXMgcnVucyBhbmQgYXNzZXJ0IHRoYXQgb25seVxuICAgICAgLy8gdGhlIHJlcXVlc3RlZCBzdGF0dXMgaXMgbWF0Y2hlZC4gcGVyZm9ybUJ1bGtDYW5jZWwgYWx3YXlzIHBhc3NlcyBhXG4gICAgICAvLyBjb25jcmV0ZSBzdGF0dXMgcGVyIGNhbGwgKHRoZSBwaW5uZWQgb25lLCBvciBlYWNoIGNhbmNlbGxhYmxlIHN0YXR1cykuXG4gICAgICBsaXN0OiB2aS5mbihhc3luYyAocGFyYW1zOiB7IHN0YXR1cz86IHN0cmluZyB9ID0ge30pID0+ICh7XG4gICAgICAgIGRhdGE6IHBhcmFtcy5zdGF0dXNcbiAgICAgICAgICA/IG9wdHMucnVucy5maWx0ZXIoKHIpID0+IHIuc3RhdHVzID09PSBwYXJhbXMuc3RhdHVzKVxuICAgICAgICAgIDogb3B0cy5ydW5zLFxuICAgICAgICBoYXNNb3JlOiBvcHRzLmhhc01vcmUgPz8gZmFsc2UsXG4gICAgICB9KSksXG4gICAgICBnZXQ6IHZpLmZuKGFzeW5jIChydW5JZDogc3RyaW5nKSA9PiB7XG4gICAgICAgIGNvbnN0IHJ1biA9IHJ1bnNCeUlkLmdldChydW5JZCk7XG4gICAgICAgIGlmICghcnVuKSB0aHJvdyBuZXcgRXJyb3IoYHJ1biAke3J1bklkfSBub3QgZm91bmRgKTtcbiAgICAgICAgcmV0dXJuIHJ1bjtcbiAgICAgIH0pLFxuICAgIH0sXG4gICAgZXZlbnRzOiB7XG4gICAgICBjcmVhdGU6IHZpLmZuKGFzeW5jIChydW5JZDogc3RyaW5nKSA9PiBvcHRzLmV2ZW50c0NyZWF0ZT8uKHJ1bklkKSksXG4gICAgfSxcbiAgfTtcbiAgaWYgKG9wdHMuY2FuY2VsTWFueSkge1xuICAgIHdvcmxkLnJ1bnMuY2FuY2VsTWFueSA9IHZpLmZuKG9wdHMuY2FuY2VsTWFueSk7XG4gIH1cbiAgcmV0dXJuIHdvcmxkIGFzIFdvcmxkO1xufVxuXG5kZXNjcmliZSgndmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQnLCAoKSA9PiB7XG4gIGl0KCdhY2NlcHRzIGludGVnZXJzIHdpdGhpbiBbMSwgNTAwXScsICgpID0+IHtcbiAgICBleHBlY3QodmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQoMSkpLnRvQmVVbmRlZmluZWQoKTtcbiAgICBleHBlY3QodmFsaWRhdGVCdWxrQ2FuY2VsTGltaXQoNTApKS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDUwMCkpLnRvQmVVbmRlZmluZWQoKTtcbiAgfSk7XG5cbiAgaXQoJ3JlamVjdHMgb3V0LW9mLXJhbmdlIGFuZCBub24taW50ZWdlciB2YWx1ZXMnLCAoKSA9PiB7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDApKS50b01hdGNoKC9iZXR3ZWVuIDEgYW5kIDUwMC8pO1xuICAgIGV4cGVjdCh2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCg1MDEpKS50b01hdGNoKC9iZXR3ZWVuIDEgYW5kIDUwMC8pO1xuICAgIGV4cGVjdCh2YWxpZGF0ZUJ1bGtDYW5jZWxMaW1pdCgtNSkpLnRvTWF0Y2goL2JldHdlZW4gMSBhbmQgNTAwLyk7XG4gICAgZXhwZWN0KHZhbGlkYXRlQnVsa0NhbmNlbExpbWl0KDEuNSkpLnRvTWF0Y2goL2JldHdlZW4gMSBhbmQgNTAwLyk7XG4gIH0pO1xufSk7XG5cbmRlc2NyaWJlKCdmb3JtYXRCdWxrQ2FuY2VsU3VtbWFyeScsICgpID0+IHtcbiAgaXQoJ3JlbmRlcnMgZXZlcnkgb3V0Y29tZSBjYXRlZ29yeSBzbyBjb3VudHMgYWRkIHVwIHRvIHJlcXVlc3RlZCcsICgpID0+IHtcbiAgICBjb25zdCBzdW1tYXJ5ID0gZm9ybWF0QnVsa0NhbmNlbFN1bW1hcnkoe1xuICAgICAgc3VtbWFyeToge1xuICAgICAgICByZXF1ZXN0ZWQ6IDcsXG4gICAgICAgIGNhbmNlbGxlZDogMixcbiAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMSxcbiAgICAgICAgbm90Q2FuY2VsbGFibGU6IDEsXG4gICAgICAgIG5vdEZvdW5kOiAzLFxuICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICB9LFxuICAgICAgcmVzdWx0czogW10sXG4gICAgfSk7XG4gICAgZXhwZWN0KHN1bW1hcnkpLnRvQmUoXG4gICAgICBbXG4gICAgICAgICdEb25lOicsXG4gICAgICAgICcgIDIgY2FuY2VsbGVkJyxcbiAgICAgICAgJyAgMSBhbHJlYWR5IGNhbmNlbGxlZCcsXG4gICAgICAgICcgIDEgbm90IGNhbmNlbGxhYmxlJyxcbiAgICAgICAgJyAgMyBub3QgZm91bmQnLFxuICAgICAgICAnICAwIGZhaWxlZCcsXG4gICAgICBdLmpvaW4oJ1xcbicpXG4gICAgKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ2J1bGtDYW5jZWxGYWlsdXJlTGluZXMnLCAoKSA9PiB7XG4gIGl0KCdzdXJmYWNlcyBvbmx5IG5vdF9mb3VuZCwgbm90X2NhbmNlbGxhYmxlLCBhbmQgZmFpbGVkIHJ1bnMnLCAoKSA9PiB7XG4gICAgY29uc3QgbGluZXMgPSBidWxrQ2FuY2VsRmFpbHVyZUxpbmVzKHtcbiAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgcmVxdWVzdGVkOiA1LFxuICAgICAgICBjYW5jZWxsZWQ6IDEsXG4gICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDEsXG4gICAgICAgIG5vdENhbmNlbGxhYmxlOiAxLFxuICAgICAgICBub3RGb3VuZDogMSxcbiAgICAgICAgZmFpbGVkOiAxLFxuICAgICAgfSxcbiAgICAgIHJlc3VsdHM6IFtcbiAgICAgICAgeyBydW5JZDogJ2EnLCBvdXRjb21lOiAnY2FuY2VsbGVkJyB9LFxuICAgICAgICB7IHJ1bklkOiAnYicsIG91dGNvbWU6ICdhbHJlYWR5X2NhbmNlbGxlZCcgfSxcbiAgICAgICAgeyBydW5JZDogJ2MnLCBvdXRjb21lOiAnbm90X2NhbmNlbGxhYmxlJywgc3RhdHVzOiAnY29tcGxldGVkJyB9LFxuICAgICAgICB7IHJ1bklkOiAnZCcsIG91dGNvbWU6ICdub3RfZm91bmQnIH0sXG4gICAgICAgIHtcbiAgICAgICAgICBydW5JZDogJ2UnLFxuICAgICAgICAgIG91dGNvbWU6ICdmYWlsZWQnLFxuICAgICAgICAgIGNvZGU6ICdpbnRlcm5hbF9lcnJvcicsXG4gICAgICAgICAgcmV0cnlhYmxlOiB0cnVlLFxuICAgICAgICB9LFxuICAgICAgXSxcbiAgICB9KTtcbiAgICBleHBlY3QobGluZXMpLnRvRXF1YWwoW1xuICAgICAgJyAg4pyXIGM6IG5vdCBjYW5jZWxsYWJsZSAoY29tcGxldGVkKScsXG4gICAgICAnICDinJcgZDogbm90IGZvdW5kJyxcbiAgICAgICcgIOKclyBlOiBmYWlsZWQgKGludGVybmFsX2Vycm9yLCByZXRyeWFibGUpJyxcbiAgICBdKTtcbiAgfSk7XG59KTtcblxuZGVzY3JpYmUoJ3BlcmZvcm1CdWxrQ2FuY2VsJywgKCkgPT4ge1xuICBpdCgnd2FybnMgYW5kIGV4aXRzIDAgd2hlbiBubyBydW5zIG1hdGNoJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCB3YXJucyB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHsgcnVuczogW10gfSk7XG5cbiAgICBjb25zdCB7IGV4aXRDb2RlLCByZXN1bHQgfSA9IGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgbGltaXQ6IDUwLFxuICAgICAgY29uZmlybTogdHJ1ZSxcbiAgICAgIGxvZ2dlcixcbiAgICB9KTtcblxuICAgIGV4cGVjdChleGl0Q29kZSkudG9CZSgwKTtcbiAgICBleHBlY3QocmVzdWx0KS50b0JlVW5kZWZpbmVkKCk7XG4gICAgZXhwZWN0KHdhcm5zKS50b0NvbnRhaW4oJ05vIG1hdGNoaW5nIHJ1bnMgZm91bmQuJyk7XG4gIH0pO1xuXG4gIGl0KCdyZXN0cmljdHMgdG8gY2FuY2VsbGFibGUgc3RhdHVzZXMgYW5kIGV4Y2x1ZGVzIHRlcm1pbmFsIHJ1bnMgd2hlbiBubyBzdGF0dXMgaXMgcGlubmVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKFxuICAgICAgYXN5bmMgKFxuICAgICAgICByZXE6IEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXF1ZXN0XG4gICAgICApOiBQcm9taXNlPEJ1bGtDYW5jZWxXb3JrZmxvd1J1bnNSZXN1bHQ+ID0+ICh7XG4gICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICByZXF1ZXN0ZWQ6IHJlcS5ydW5JZHMubGVuZ3RoLFxuICAgICAgICAgIGNhbmNlbGxlZDogcmVxLnJ1bklkcy5sZW5ndGgsXG4gICAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMCxcbiAgICAgICAgICBub3RDYW5jZWxsYWJsZTogMCxcbiAgICAgICAgICBub3RGb3VuZDogMCxcbiAgICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdHM6IHJlcS5ydW5JZHMubWFwKChydW5JZCkgPT4gKHtcbiAgICAgICAgICBydW5JZCxcbiAgICAgICAgICBvdXRjb21lOiAnY2FuY2VsbGVkJyBhcyBjb25zdCxcbiAgICAgICAgfSkpLFxuICAgICAgfSlcbiAgICApO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHtcbiAgICAgIHJ1bnM6IFtcbiAgICAgICAgeyBydW5JZDogJ3AxJywgd29ya2Zsb3dOYW1lOiAnd2YnLCBzdGF0dXM6ICdwZW5kaW5nJyB9LFxuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIC8vIFRlcm1pbmFsIOKAlCBtdXN0IG5ldmVyIGJlIGZldGNoZWQgb3IgY2FuY2VsbGVkLlxuICAgICAgICB7IHJ1bklkOiAnZG9uZScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAnY29tcGxldGVkJyB9LFxuICAgICAgXSxcbiAgICAgIGNhbmNlbE1hbnksXG4gICAgfSk7XG5cbiAgICBjb25zdCB7IGV4aXRDb2RlIH0gPSBhd2FpdCBwZXJmb3JtQnVsa0NhbmNlbCh7XG4gICAgICB3b3JsZCxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgY29uc3QgcmVxdWVzdGVkU3RhdHVzZXMgPSAod29ybGQucnVucy5saXN0IGFzIGFueSkubW9jay5jYWxscy5tYXAoXG4gICAgICAoYzogW3sgc3RhdHVzPzogc3RyaW5nIH1dKSA9PiBjWzBdPy5zdGF0dXNcbiAgICApO1xuICAgIGV4cGVjdChyZXF1ZXN0ZWRTdGF0dXNlcykudG9Db250YWluKCdwZW5kaW5nJyk7XG4gICAgZXhwZWN0KHJlcXVlc3RlZFN0YXR1c2VzKS50b0NvbnRhaW4oJ3J1bm5pbmcnKTtcbiAgICBleHBlY3QocmVxdWVzdGVkU3RhdHVzZXMpLm5vdC50b0NvbnRhaW4oJ2NvbXBsZXRlZCcpO1xuICAgIC8vIE9ubHkgdGhlIGNhbmNlbGxhYmxlIHJ1bnMgcmVhY2ggY2FuY2VsTWFueTsgdGhlIGNvbXBsZXRlZCBydW4gaXMgZXhjbHVkZWQuXG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoWy4uLmNhbmNlbE1hbnkubW9jay5jYWxsc1swXVswXS5ydW5JZHNdLnNvcnQoKSkudG9FcXVhbChbXG4gICAgICAncDEnLFxuICAgICAgJ3IxJyxcbiAgICBdKTtcbiAgfSk7XG5cbiAgaXQoJ3JvdW5kLXJvYmlucyBzdGF0dXMgcGFnZXMgYmVmb3JlIGFwcGx5aW5nIHRoZSBiYXRjaCBsaW1pdCcsIGFzeW5jICgpID0+IHtcbiAgICBjb25zdCB7IGxvZ2dlciB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IGNhbmNlbE1hbnkgPSB2aS5mbihcbiAgICAgIGFzeW5jIChcbiAgICAgICAgcmVxOiBCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVxdWVzdFxuICAgICAgKTogUHJvbWlzZTxCdWxrQ2FuY2VsV29ya2Zsb3dSdW5zUmVzdWx0PiA9PiAoe1xuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgcmVxdWVzdGVkOiByZXEucnVuSWRzLmxlbmd0aCxcbiAgICAgICAgICBjYW5jZWxsZWQ6IHJlcS5ydW5JZHMubGVuZ3RoLFxuICAgICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDAsXG4gICAgICAgICAgbm90Q2FuY2VsbGFibGU6IDAsXG4gICAgICAgICAgbm90Rm91bmQ6IDAsXG4gICAgICAgICAgZmFpbGVkOiAwLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRzOiByZXEucnVuSWRzLm1hcCgocnVuSWQpID0+ICh7XG4gICAgICAgICAgcnVuSWQsXG4gICAgICAgICAgb3V0Y29tZTogJ2NhbmNlbGxlZCcgYXMgY29uc3QsXG4gICAgICAgIH0pKSxcbiAgICAgIH0pXG4gICAgKTtcbiAgICBjb25zdCB3b3JsZCA9IG1ha2VXb3JsZCh7XG4gICAgICBydW5zOiBbXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDUgfSwgKF8sIGluZGV4KSA9PiAoe1xuICAgICAgICAgIHJ1bklkOiBgciR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiAnd2YnLFxuICAgICAgICAgIHN0YXR1czogJ3J1bm5pbmcnLFxuICAgICAgICAgIHN0YXJ0ZWRBdDogbmV3IERhdGUoMjAyNiwgMCwgaW5kZXggKyAxKS50b0lTT1N0cmluZygpLFxuICAgICAgICB9KSksXG4gICAgICAgIC4uLkFycmF5LmZyb20oeyBsZW5ndGg6IDMgfSwgKF8sIGluZGV4KSA9PiAoe1xuICAgICAgICAgIHJ1bklkOiBgcCR7aW5kZXggKyAxfWAsXG4gICAgICAgICAgd29ya2Zsb3dOYW1lOiAnd2YnLFxuICAgICAgICAgIHN0YXR1czogJ3BlbmRpbmcnLFxuICAgICAgICB9KSksXG4gICAgICBdLFxuICAgICAgY2FuY2VsTWFueSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgbGltaXQ6IDUsXG4gICAgICBjb25maXJtOiB0cnVlLFxuICAgICAgbG9nZ2VyLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRXaXRoKHtcbiAgICAgIHJ1bklkczogWydwMScsICdyMScsICdwMicsICdyMicsICdwMyddLFxuICAgICAgY2FuY2VsUmVhc29uOiBDTElfQ0FOQ0VMX1JFQVNPTixcbiAgICB9KTtcbiAgfSk7XG5cbiAgaXQoJ3VzZXMgdGhlIGNhbmNlbE1hbnkgZmFzdCBwYXRoIGluIGEgc2luZ2xlIGNhbGwgYW5kIHNraXBzIHBlci1ydW4gZXZlbnRzJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKFxuICAgICAgYXN5bmMgKCk6IFByb21pc2U8QnVsa0NhbmNlbFdvcmtmbG93UnVuc1Jlc3VsdD4gPT4gKHtcbiAgICAgICAgc3VtbWFyeToge1xuICAgICAgICAgIHJlcXVlc3RlZDogMixcbiAgICAgICAgICBjYW5jZWxsZWQ6IDIsXG4gICAgICAgICAgYWxyZWFkeUNhbmNlbGxlZDogMCxcbiAgICAgICAgICBub3RDYW5jZWxsYWJsZTogMCxcbiAgICAgICAgICBub3RGb3VuZDogMCxcbiAgICAgICAgICBmYWlsZWQ6IDAsXG4gICAgICAgIH0sXG4gICAgICAgIHJlc3VsdHM6IFtcbiAgICAgICAgICB7IHJ1bklkOiAncjEnLCBvdXRjb21lOiAnY2FuY2VsbGVkJyB9LFxuICAgICAgICAgIHsgcnVuSWQ6ICdyMicsIG91dGNvbWU6ICdjYW5jZWxsZWQnIH0sXG4gICAgICAgIF0sXG4gICAgICB9KVxuICAgICk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW1xuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIHsgcnVuSWQ6ICdyMicsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgIF0sXG4gICAgICBjYW5jZWxNYW55LFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLnRvSGF2ZUJlZW5DYWxsZWRUaW1lcygxKTtcbiAgICBleHBlY3QoY2FuY2VsTWFueSkudG9IYXZlQmVlbkNhbGxlZFdpdGgoe1xuICAgICAgcnVuSWRzOiBbJ3IxJywgJ3IyJ10sXG4gICAgICBjYW5jZWxSZWFzb246IENMSV9DQU5DRUxfUkVBU09OLFxuICAgIH0pO1xuICAgIC8vIEZhc3QgcGF0aCBtdXN0IG5vdCBmYWxsIGJhY2sgdG8gcGVyLXJ1biBldmVudCBjcmVhdGlvbi5cbiAgICBleHBlY3Qod29ybGQuZXZlbnRzLmNyZWF0ZSBhcyBhbnkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xuXG4gIGl0KCdmYWxscyBiYWNrIHRvIHBlci1ydW4gY2FuY2VsbGF0aW9uIHdoZW4gY2FuY2VsTWFueSBpcyBhYnNlbnQnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBsb2dnZXIsIGxvZ3MgfSA9IG1ha2VMb2dnZXIoKTtcbiAgICBjb25zdCB3b3JsZCA9IG1ha2VXb3JsZCh7XG4gICAgICBydW5zOiBbXG4gICAgICAgIHsgcnVuSWQ6ICdyMScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgICAgeyBydW5JZDogJ3IyJywgd29ya2Zsb3dOYW1lOiAnd2YnLCBzdGF0dXM6ICdydW5uaW5nJyB9LFxuICAgICAgXSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZXhpdENvZGUsIHJlc3VsdCB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMCk7XG4gICAgZXhwZWN0KHdvcmxkLmV2ZW50cy5jcmVhdGUgYXMgYW55KS50b0hhdmVCZWVuQ2FsbGVkVGltZXMoMik7XG4gICAgZXhwZWN0KHdvcmxkLmV2ZW50cy5jcmVhdGUgYXMgYW55KS50b0hhdmVCZWVuQ2FsbGVkV2l0aChcbiAgICAgICdyMScsXG4gICAgICBleHBlY3Qub2JqZWN0Q29udGFpbmluZyh7XG4gICAgICAgIGV2ZW50RGF0YTogeyBjYW5jZWxSZWFzb246IENMSV9DQU5DRUxfUkVBU09OIH0sXG4gICAgICB9KSxcbiAgICAgIGV4cGVjdC5hbnl0aGluZygpXG4gICAgKTtcbiAgICBleHBlY3QocmVzdWx0Py5zdW1tYXJ5LmNhbmNlbGxlZCkudG9CZSgyKTtcbiAgICBleHBlY3QobG9ncy5qb2luKCdcXG4nKSkudG9Db250YWluKCcyIGNhbmNlbGxlZCcpO1xuICB9KTtcblxuICBpdCgncHJpbnRzIHJlcnVuIGd1aWRhbmNlIHdoZW4gbW9yZSBydW5zIG1hdGNoIHRoYW4gd2VyZSBmZXRjaGVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCB3YXJucyB9ID0gbWFrZUxvZ2dlcigpO1xuICAgIGNvbnN0IHdvcmxkID0gbWFrZVdvcmxkKHtcbiAgICAgIHJ1bnM6IFt7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH1dLFxuICAgICAgaGFzTW9yZTogdHJ1ZSxcbiAgICAgIGNhbmNlbE1hbnk6IGFzeW5jICgpID0+ICh7XG4gICAgICAgIHN1bW1hcnk6IHtcbiAgICAgICAgICByZXF1ZXN0ZWQ6IDEsXG4gICAgICAgICAgY2FuY2VsbGVkOiAxLFxuICAgICAgICAgIGFscmVhZHlDYW5jZWxsZWQ6IDAsXG4gICAgICAgICAgbm90Q2FuY2VsbGFibGU6IDAsXG4gICAgICAgICAgbm90Rm91bmQ6IDAsXG4gICAgICAgICAgZmFpbGVkOiAwLFxuICAgICAgICB9LFxuICAgICAgICByZXN1bHRzOiBbeyBydW5JZDogJ3IxJywgb3V0Y29tZTogJ2NhbmNlbGxlZCcgfV0sXG4gICAgICB9KSxcbiAgICB9KTtcblxuICAgIGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBsaW1pdDogMSxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3Qod2FybnMpLnRvQ29udGFpbihIQVNfTU9SRV9HVUlEQU5DRSk7XG4gIH0pO1xuXG4gIGl0KCdleGl0cyAxIGFuZCBzdXJmYWNlcyBwZXItcnVuIGZhaWx1cmVzIHdoZW4gYSBydW4gZmFpbHMnLCBhc3luYyAoKSA9PiB7XG4gICAgY29uc3QgeyBsb2dnZXIsIHdhcm5zIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW1xuICAgICAgICB7IHJ1bklkOiAncjEnLCB3b3JrZmxvd05hbWU6ICd3ZicsIHN0YXR1czogJ3J1bm5pbmcnIH0sXG4gICAgICAgIHsgcnVuSWQ6ICdyMicsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfSxcbiAgICAgIF0sXG4gICAgICBjYW5jZWxNYW55OiBhc3luYyAoKSA9PiAoe1xuICAgICAgICBzdW1tYXJ5OiB7XG4gICAgICAgICAgcmVxdWVzdGVkOiAyLFxuICAgICAgICAgIGNhbmNlbGxlZDogMSxcbiAgICAgICAgICBhbHJlYWR5Q2FuY2VsbGVkOiAwLFxuICAgICAgICAgIG5vdENhbmNlbGxhYmxlOiAwLFxuICAgICAgICAgIG5vdEZvdW5kOiAwLFxuICAgICAgICAgIGZhaWxlZDogMSxcbiAgICAgICAgfSxcbiAgICAgICAgcmVzdWx0czogW1xuICAgICAgICAgIHsgcnVuSWQ6ICdyMScsIG91dGNvbWU6ICdjYW5jZWxsZWQnIH0sXG4gICAgICAgICAge1xuICAgICAgICAgICAgcnVuSWQ6ICdyMicsXG4gICAgICAgICAgICBvdXRjb21lOiAnZmFpbGVkJyxcbiAgICAgICAgICAgIGNvZGU6ICdpbnRlcm5hbF9lcnJvcicsXG4gICAgICAgICAgICByZXRyeWFibGU6IHRydWUsXG4gICAgICAgICAgfSxcbiAgICAgICAgXSxcbiAgICAgIH0pLFxuICAgIH0pO1xuXG4gICAgY29uc3QgeyBleGl0Q29kZSB9ID0gYXdhaXQgcGVyZm9ybUJ1bGtDYW5jZWwoe1xuICAgICAgd29ybGQsXG4gICAgICBzdGF0dXM6ICdydW5uaW5nJyxcbiAgICAgIGxpbWl0OiA1MCxcbiAgICAgIGNvbmZpcm06IHRydWUsXG4gICAgICBsb2dnZXIsXG4gICAgfSk7XG5cbiAgICBleHBlY3QoZXhpdENvZGUpLnRvQmUoMSk7XG4gICAgZXhwZWN0KHdhcm5zKS50b0NvbnRhaW4oJyAg4pyXIHIyOiBmYWlsZWQgKGludGVybmFsX2Vycm9yLCByZXRyeWFibGUpJyk7XG4gIH0pO1xuXG4gIGl0KCdhYm9ydHMgd2l0aG91dCBjYW5jZWxsaW5nIHdoZW4gY29uZmlybWF0aW9uIGlzIGRlY2xpbmVkJywgYXN5bmMgKCkgPT4ge1xuICAgIGNvbnN0IHsgbG9nZ2VyLCBsb2dzIH0gPSBtYWtlTG9nZ2VyKCk7XG4gICAgY29uc3QgY2FuY2VsTWFueSA9IHZpLmZuKCk7XG4gICAgY29uc3Qgd29ybGQgPSBtYWtlV29ybGQoe1xuICAgICAgcnVuczogW3sgcnVuSWQ6ICdyMScsIHdvcmtmbG93TmFtZTogJ3dmJywgc3RhdHVzOiAncnVubmluZycgfV0sXG4gICAgICBjYW5jZWxNYW55OiBjYW5jZWxNYW55IGFzIGFueSxcbiAgICB9KTtcblxuICAgIGNvbnN0IHsgZXhpdENvZGUgfSA9IGF3YWl0IHBlcmZvcm1CdWxrQ2FuY2VsKHtcbiAgICAgIHdvcmxkLFxuICAgICAgc3RhdHVzOiAncnVubmluZycsXG4gICAgICBsaW1pdDogNTAsXG4gICAgICBjb25maXJtOiBmYWxzZSxcbiAgICAgIGxvZ2dlcixcbiAgICAgIHByb21wdENvbmZpcm06IGFzeW5jICgpID0+IGZhbHNlLFxuICAgIH0pO1xuXG4gICAgZXhwZWN0KGV4aXRDb2RlKS50b0JlKDApO1xuICAgIGV4cGVjdChsb2dzKS50b0NvbnRhaW4oJ0Fib3J0ZWQuJyk7XG4gICAgZXhwZWN0KGNhbmNlbE1hbnkpLm5vdC50b0hhdmVCZWVuQ2FsbGVkKCk7XG4gIH0pO1xufSk7XG4iXX0=
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@workflow/cli",
|
|
3
|
-
"version": "5.0.0-beta.
|
|
3
|
+
"version": "5.0.0-beta.40",
|
|
4
4
|
"description": "Command-line interface for Workflow SDK",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"bin": {
|
|
@@ -56,15 +56,15 @@
|
|
|
56
56
|
"tinyglobby": "0.2.17",
|
|
57
57
|
"xdg-app-paths": "5.1.0",
|
|
58
58
|
"zod": "~4.3.6",
|
|
59
|
-
"@workflow/builders": "5.0.0-beta.
|
|
60
|
-
"@workflow/core": "5.0.0-beta.
|
|
61
|
-
"@workflow/errors": "5.0.0-beta.
|
|
59
|
+
"@workflow/builders": "5.0.0-beta.40",
|
|
60
|
+
"@workflow/core": "5.0.0-beta.40",
|
|
61
|
+
"@workflow/errors": "5.0.0-beta.16",
|
|
62
62
|
"@workflow/swc-plugin": "5.0.0-beta.5",
|
|
63
63
|
"@workflow/utils": "5.0.0-beta.8",
|
|
64
|
-
"@workflow/web": "5.0.0-beta.
|
|
65
|
-
"@workflow/world": "5.0.0-beta.
|
|
66
|
-
"@workflow/world-local": "5.0.0-beta.
|
|
67
|
-
"@workflow/world-vercel": "5.0.0-beta.
|
|
64
|
+
"@workflow/web": "5.0.0-beta.40",
|
|
65
|
+
"@workflow/world": "5.0.0-beta.25",
|
|
66
|
+
"@workflow/world-local": "5.0.0-beta.34",
|
|
67
|
+
"@workflow/world-vercel": "5.0.0-beta.36"
|
|
68
68
|
},
|
|
69
69
|
"scripts": {
|
|
70
70
|
"build": "tsc && chmod +x bin/run.js",
|