terse-cli 0.4.6 → 0.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/commands/deploy.d.ts.map +1 -1
- package/dist/commands/deploy.js +3 -2
- package/dist/commands/deploy.js.map +1 -1
- package/dist/commands/run.d.ts.map +1 -1
- package/dist/commands/run.js +43 -21
- package/dist/commands/run.js.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/providers/LanguageProvider.d.ts +2 -0
- package/dist/providers/LanguageProvider.d.ts.map +1 -1
- package/dist/providers/typescript/TypeScriptProvider.d.ts +2 -0
- package/dist/providers/typescript/TypeScriptProvider.d.ts.map +1 -1
- package/dist/providers/typescript/TypeScriptProvider.js +29 -5
- package/dist/providers/typescript/TypeScriptProvider.js.map +1 -1
- package/dist/providers/typescript/jobMacro.d.ts +1 -2
- package/dist/providers/typescript/jobMacro.d.ts.map +1 -1
- package/dist/providers/typescript/jobMacro.js +69 -111
- package/dist/providers/typescript/jobMacro.js.map +1 -1
- package/dist/providers/typescript/jobSources.d.ts +7 -0
- package/dist/providers/typescript/jobSources.d.ts.map +1 -0
- package/dist/providers/typescript/jobSources.js +46 -0
- package/dist/providers/typescript/jobSources.js.map +1 -0
- package/dist/providers/typescript/runtimes/JobRuntime.d.ts +3 -0
- package/dist/providers/typescript/runtimes/JobRuntime.d.ts.map +1 -1
- package/dist/providers/typescript/runtimes/JobRuntime.js.map +1 -1
- package/dist/providers/typescript/runtimes/directJobRuntime.d.ts.map +1 -1
- package/dist/providers/typescript/runtimes/directJobRuntime.js +1 -1
- package/dist/providers/typescript/runtimes/directJobRuntime.js.map +1 -1
- package/dist/providers/typescript/runtimes/durableJobRuntime.d.ts.map +1 -1
- package/dist/providers/typescript/runtimes/durableJobRuntime.js +99 -55
- package/dist/providers/typescript/runtimes/durableJobRuntime.js.map +1 -1
- package/dist/providers/typescript/runtimes/session.d.ts +3 -1
- package/dist/providers/typescript/runtimes/session.d.ts.map +1 -1
- package/dist/providers/typescript/runtimes/session.js +14 -9
- package/dist/providers/typescript/runtimes/session.js.map +1 -1
- package/dist/providers/typescript/stepMacro.d.ts +2 -29
- package/dist/providers/typescript/stepMacro.d.ts.map +1 -1
- package/dist/providers/typescript/stepMacro.js +29 -120
- package/dist/providers/typescript/stepMacro.js.map +1 -1
- package/dist/providers/typescript/terseWorkflow.d.ts +8 -0
- package/dist/providers/typescript/terseWorkflow.d.ts.map +1 -0
- package/dist/providers/typescript/terseWorkflow.js +8 -0
- package/dist/providers/typescript/terseWorkflow.js.map +1 -0
- package/package.json +6 -8
- package/templates/typescript/init/gitignore.hbs +1 -0
- package/templates/typescript/init/package.json.hbs +0 -1
- package/dist/providers/typescript/durableRuntime.d.ts +0 -21
- package/dist/providers/typescript/durableRuntime.d.ts.map +0 -1
- package/dist/providers/typescript/durableRuntime.js +0 -207
- package/dist/providers/typescript/durableRuntime.js.map +0 -1
- package/dist/providers/typescript/rewindRun.d.ts +0 -9
- package/dist/providers/typescript/rewindRun.d.ts.map +0 -1
- package/dist/providers/typescript/rewindRun.js +0 -111
- package/dist/providers/typescript/rewindRun.js.map +0 -1
- package/dist/providers/typescript/terseWorkflowBuilder.d.ts +0 -8
- package/dist/providers/typescript/terseWorkflowBuilder.d.ts.map +0 -1
- package/dist/providers/typescript/terseWorkflowBuilder.js +0 -66
- package/dist/providers/typescript/terseWorkflowBuilder.js.map +0 -1
- package/dist/providers/typescript/workflowShim.d.ts +0 -2
- package/dist/providers/typescript/workflowShim.d.ts.map +0 -1
- package/dist/providers/typescript/workflowShim.js +0 -51
- package/dist/providers/typescript/workflowShim.js.map +0 -1
- package/dist/terseWorld.d.ts +0 -4
- package/dist/terseWorld.d.ts.map +0 -1
- package/dist/terseWorld.js +0 -46
- package/dist/terseWorld.js.map +0 -1
- package/templates/typescript/workflow-shim/api.js +0 -5
- package/templates/typescript/workflow-shim/index.js +0 -2
- package/templates/typescript/workflow-shim/internal/builtins.js +0 -83
- package/templates/typescript/workflow-shim/internal/class-serialization.js +0 -1
- package/templates/typescript/workflow-shim/runtime.js +0 -1
- package/templates/typescript/workflow-shim/stdlib.js +0 -18
- package/templates/typescript/workflow-shim/workflow.js +0 -2
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
import { getRun, resumeHook, setWorld, start } from "@workflow/core/runtime";
|
|
2
|
-
import crypto from "node:crypto";
|
|
3
|
-
import fs from "node:fs";
|
|
4
|
-
import { createRequire } from "node:module";
|
|
5
|
-
import path from "node:path";
|
|
6
|
-
import { __buildJobStateAccessor, createSDKTrigger, fetchRegisteredJobs } from "terse-sdk";
|
|
7
|
-
import { createTerseWorld } from "../../terseWorld.js";
|
|
8
|
-
import { transformJobSource } from "./jobMacro.js";
|
|
9
|
-
import { TerseWorkflowBuilder } from "./terseWorkflowBuilder.js";
|
|
10
|
-
import { writeWorkflowShim } from "./workflowShim.js";
|
|
11
|
-
let runtimePromise = null;
|
|
12
|
-
export function getDurableRuntime(cwd = process.cwd()) {
|
|
13
|
-
return (runtimePromise ??= startDurableRuntime(cwd));
|
|
14
|
-
}
|
|
15
|
-
export async function closeDurableRuntime() {
|
|
16
|
-
if (!runtimePromise)
|
|
17
|
-
return;
|
|
18
|
-
const runtime = await runtimePromise;
|
|
19
|
-
runtimePromise = null;
|
|
20
|
-
await runtime.close();
|
|
21
|
-
}
|
|
22
|
-
async function startDurableRuntime(cwd) {
|
|
23
|
-
const out = path.join(cwd, ".terse", "wf");
|
|
24
|
-
const workflowFnByJob = isBuildFresh(out, cwd) ? loadWorkflowArtifacts(out) : await buildWorkflowArtifacts(cwd);
|
|
25
|
-
const world = createTerseWorld();
|
|
26
|
-
setWorld(world);
|
|
27
|
-
const require = createRequire(import.meta.url);
|
|
28
|
-
world.registerHandler("__wkf_step_", require(path.join(out, "steps.cjs")).POST);
|
|
29
|
-
world.registerHandler("__wkf_workflow_", require(path.join(out, "workflows.cjs")).POST);
|
|
30
|
-
const manifest = JSON.parse(fs.readFileSync(path.join(out, "manifest.json"), "utf8"));
|
|
31
|
-
const workflowIdByJob = new Map();
|
|
32
|
-
const missing = [];
|
|
33
|
-
for (const [name, { fnName, file }] of workflowFnByJob) {
|
|
34
|
-
const workflowId = lookupWorkflowId(manifest, fnName);
|
|
35
|
-
if (workflowId)
|
|
36
|
-
workflowIdByJob.set(name, workflowId);
|
|
37
|
-
else
|
|
38
|
-
missing.push({ name, file });
|
|
39
|
-
}
|
|
40
|
-
if (missing.length > 0) {
|
|
41
|
-
const lines = missing.map(m => ` - "${m.name}" (${m.file})`).join("\n");
|
|
42
|
-
throw new Error(`The durable build produced no "use workflow" for ${missing.length} job(s):\n${lines}\n\nEach file was transformed but its workflow never reached the manifest, which almost always means the file failed to compile during the bundle. Check that each file builds on its own, then re-run.`);
|
|
43
|
-
}
|
|
44
|
-
// start() re-enqueues recovered (pending/running) runs and begins draining the queue.
|
|
45
|
-
// It is NOT called during construction: a hook-resume must journal its payload first,
|
|
46
|
-
// or the re-enqueued replay races the payload write, re-arms the raced sleep, and
|
|
47
|
-
// fires a spurious suspension for a run that is about to complete.
|
|
48
|
-
let started = false;
|
|
49
|
-
const startWorld = async () => {
|
|
50
|
-
if (started)
|
|
51
|
-
return;
|
|
52
|
-
started = true;
|
|
53
|
-
await world.start?.();
|
|
54
|
-
};
|
|
55
|
-
return {
|
|
56
|
-
start: startWorld,
|
|
57
|
-
dispatchJob: async (jobName, ctx, event) => {
|
|
58
|
-
const workflowId = workflowIdByJob.get(jobName);
|
|
59
|
-
if (!workflowId)
|
|
60
|
-
throw new Error(`No durable workflow was built for job "${jobName}".`);
|
|
61
|
-
const job = fetchRegisteredJobs().get(jobName);
|
|
62
|
-
if (!job)
|
|
63
|
-
throw new Error(`No job was registered with name "${jobName}".`);
|
|
64
|
-
const state = __buildJobStateAccessor(job.states ?? []);
|
|
65
|
-
if (job?.filter && !(await job.filter(createSDKTrigger(event), state)))
|
|
66
|
-
return { filtered: true, awaitResult: async () => ({ status: "ok", filtered: true }) };
|
|
67
|
-
process.env.TERSE_BACKEND_URL ??= ctx.apiBaseUrl;
|
|
68
|
-
const attributes = { sessionId: ctx.sessionId };
|
|
69
|
-
if (ctx.runId) {
|
|
70
|
-
attributes.runId = ctx.runId;
|
|
71
|
-
}
|
|
72
|
-
else {
|
|
73
|
-
attributes.runId = process.env.TERSE_RUN_ID ?? "";
|
|
74
|
-
}
|
|
75
|
-
if (ctx.jobName)
|
|
76
|
-
attributes.jobName = ctx.jobName;
|
|
77
|
-
if (ctx.projectId)
|
|
78
|
-
attributes.projectId = ctx.projectId;
|
|
79
|
-
const run = await start({ workflowId }, [event], { attributes });
|
|
80
|
-
return { filtered: false, awaitResult: () => run.returnValue };
|
|
81
|
-
},
|
|
82
|
-
awaitRunResult: workflowRunId => getRun(workflowRunId).returnValue,
|
|
83
|
-
deliverInput: (token, payload) => resumeHook(token, payload).then(() => undefined),
|
|
84
|
-
close: () => world.close?.() ?? Promise.resolve()
|
|
85
|
-
};
|
|
86
|
-
}
|
|
87
|
-
function lookupWorkflowId(manifest, fnName) {
|
|
88
|
-
for (const fileEntry of Object.values(manifest.workflows ?? {})) {
|
|
89
|
-
const fn = fileEntry[fnName];
|
|
90
|
-
if (fn?.workflowId)
|
|
91
|
-
return fn.workflowId;
|
|
92
|
-
}
|
|
93
|
-
return undefined;
|
|
94
|
-
}
|
|
95
|
-
const JOBS_MAP_FILE = "jobs.json";
|
|
96
|
-
export function expectedWorkflowCoreVersion() {
|
|
97
|
-
const cliPackageJson = new URL("../../../package.json", import.meta.url);
|
|
98
|
-
return JSON.parse(fs.readFileSync(cliPackageJson, "utf8")).dependencies["@workflow/core"];
|
|
99
|
-
}
|
|
100
|
-
function ensureProjectWorkflowDependency(cwd) {
|
|
101
|
-
try {
|
|
102
|
-
createRequire(path.join(cwd, "package.json")).resolve("@workflow/core");
|
|
103
|
-
}
|
|
104
|
-
catch {
|
|
105
|
-
throw new Error(`Durable execution needs the "@workflow/core" package in your project. Run: npm install @workflow/core@${expectedWorkflowCoreVersion()} (the "workflow" package it replaces can be removed).`);
|
|
106
|
-
}
|
|
107
|
-
writeWorkflowShim(cwd, expectedWorkflowCoreVersion());
|
|
108
|
-
}
|
|
109
|
-
export async function buildWorkflowArtifacts(cwd) {
|
|
110
|
-
const out = path.join(cwd, ".terse", "wf");
|
|
111
|
-
ensureProjectWorkflowDependency(cwd);
|
|
112
|
-
const scanDir = path.join(".terse", "macro");
|
|
113
|
-
const workflowFnByJob = await withMacroedSources(cwd, () => new TerseWorkflowBuilder(cwd, scanDir, out).build());
|
|
114
|
-
fs.mkdirSync(out, { recursive: true });
|
|
115
|
-
fs.writeFileSync(path.join(out, JOBS_MAP_FILE), JSON.stringify([...workflowFnByJob]));
|
|
116
|
-
fs.writeFileSync(path.join(out, SOURCES_HASH_FILE), sourcesHash(cwd));
|
|
117
|
-
return workflowFnByJob;
|
|
118
|
-
}
|
|
119
|
-
const SOURCES_HASH_FILE = "sources.hash";
|
|
120
|
-
function isBuildFresh(out, cwd) {
|
|
121
|
-
const hashFile = path.join(out, SOURCES_HASH_FILE);
|
|
122
|
-
if (!fs.existsSync(path.join(out, JOBS_MAP_FILE)) || !fs.existsSync(path.join(out, "manifest.json")) || !fs.existsSync(hashFile))
|
|
123
|
-
return false;
|
|
124
|
-
return fs.readFileSync(hashFile, "utf8") === sourcesHash(cwd);
|
|
125
|
-
}
|
|
126
|
-
function sourcesHash(cwd) {
|
|
127
|
-
const hash = crypto.createHash("sha256");
|
|
128
|
-
for (const file of findSourceFiles(path.join(cwd, "src")).sort()) {
|
|
129
|
-
hash.update(path.relative(cwd, file));
|
|
130
|
-
hash.update(fs.readFileSync(file));
|
|
131
|
-
}
|
|
132
|
-
return hash.digest("hex");
|
|
133
|
-
}
|
|
134
|
-
function findSourceFiles(dir) {
|
|
135
|
-
if (!fs.existsSync(dir))
|
|
136
|
-
return [];
|
|
137
|
-
const out = [];
|
|
138
|
-
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
139
|
-
const p = path.join(dir, entry.name);
|
|
140
|
-
if (entry.isDirectory()) {
|
|
141
|
-
if (entry.name !== "node_modules")
|
|
142
|
-
out.push(...findSourceFiles(p));
|
|
143
|
-
}
|
|
144
|
-
else if (/\.(ts|tsx|mts|cts)$/.test(entry.name)) {
|
|
145
|
-
out.push(p);
|
|
146
|
-
}
|
|
147
|
-
}
|
|
148
|
-
return out;
|
|
149
|
-
}
|
|
150
|
-
function loadWorkflowArtifacts(out) {
|
|
151
|
-
return new Map(JSON.parse(fs.readFileSync(path.join(out, JOBS_MAP_FILE), "utf8")));
|
|
152
|
-
}
|
|
153
|
-
// Macro-transform into a copied dir so the user's `src` is never touched.
|
|
154
|
-
async function withMacroedSources(cwd, build) {
|
|
155
|
-
const ts = loadTypescript(cwd);
|
|
156
|
-
const macroDir = path.join(cwd, ".terse", "macro");
|
|
157
|
-
const workflowFnByJob = new Map();
|
|
158
|
-
fs.rmSync(macroDir, { recursive: true, force: true });
|
|
159
|
-
fs.cpSync(path.join(cwd, "src"), macroDir, { recursive: true });
|
|
160
|
-
for (const file of findJobFiles(macroDir)) {
|
|
161
|
-
const { code, stepsCode, jobs } = transformJobSource(ts, fs.readFileSync(file, "utf8"), file);
|
|
162
|
-
if (jobs.length === 0)
|
|
163
|
-
continue;
|
|
164
|
-
fs.writeFileSync(file, code);
|
|
165
|
-
if (stepsCode)
|
|
166
|
-
fs.writeFileSync(stepsFilePath(file), stepsCode);
|
|
167
|
-
for (const job of jobs)
|
|
168
|
-
workflowFnByJob.set(job.name, { fnName: job.fnName, file: path.relative(cwd, file) });
|
|
169
|
-
}
|
|
170
|
-
if (workflowFnByJob.size > 0)
|
|
171
|
-
await build();
|
|
172
|
-
return workflowFnByJob;
|
|
173
|
-
}
|
|
174
|
-
function stepsFilePath(file) {
|
|
175
|
-
return file.replace(/\.(ts|tsx|mts|cts)$/, ".__terse.steps.$1");
|
|
176
|
-
}
|
|
177
|
-
function findJobFiles(dir) {
|
|
178
|
-
if (!fs.existsSync(dir))
|
|
179
|
-
return [];
|
|
180
|
-
const out = [];
|
|
181
|
-
for (const entry of fs.readdirSync(dir, { withFileTypes: true })) {
|
|
182
|
-
const p = path.join(dir, entry.name);
|
|
183
|
-
if (entry.isDirectory()) {
|
|
184
|
-
if (entry.name !== "node_modules")
|
|
185
|
-
out.push(...findJobFiles(p));
|
|
186
|
-
}
|
|
187
|
-
else if (/\.(ts|tsx|mts|cts)$/.test(entry.name) && fs.readFileSync(p, "utf8").includes("createJob")) {
|
|
188
|
-
out.push(p);
|
|
189
|
-
}
|
|
190
|
-
}
|
|
191
|
-
return out;
|
|
192
|
-
}
|
|
193
|
-
function loadTypescript(cwd) {
|
|
194
|
-
try {
|
|
195
|
-
return createRequire(path.join(cwd, "package.json"))("typescript");
|
|
196
|
-
}
|
|
197
|
-
catch {
|
|
198
|
-
// Sandbox installs are prod-only, so the project's typescript devDependency is absent there; use the CLI's own copy.
|
|
199
|
-
try {
|
|
200
|
-
return createRequire(import.meta.url)("typescript");
|
|
201
|
-
}
|
|
202
|
-
catch {
|
|
203
|
-
throw new Error("Durable execution needs TypeScript in your project. Run: npm install --save-dev typescript");
|
|
204
|
-
}
|
|
205
|
-
}
|
|
206
|
-
}
|
|
207
|
-
//# sourceMappingURL=durableRuntime.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"durableRuntime.js","sourceRoot":"","sources":["../../../src/providers/typescript/durableRuntime.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,9 +0,0 @@
|
|
|
1
|
-
export type RewindResult = {
|
|
2
|
-
workflowRunId: string;
|
|
3
|
-
rewoundStepId: string | null;
|
|
4
|
-
deletedEvents: number;
|
|
5
|
-
};
|
|
6
|
-
export declare function resolveWorkflowRunId(dataDir: string, id: string): string;
|
|
7
|
-
export declare function readRunStatus(dataDir: string, workflowRunId: string): string | null;
|
|
8
|
-
export declare function rewindFailedRun(dataDir: string, workflowRunId: string): RewindResult;
|
|
9
|
-
//# sourceMappingURL=rewindRun.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rewindRun.d.ts","sourceRoot":"","sources":["../../../src/providers/typescript/rewindRun.ts"],"names":[],"mappings":"AAYA,MAAM,MAAM,YAAY,GAAG;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,GAAG,IAAI,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,CAAA;AAIzG,wBAAgB,oBAAoB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,MAAM,GAAG,MAAM,CAWxE;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAEnF;AAED,wBAAgB,eAAe,CAAC,OAAO,EAAE,MAAM,EAAE,aAAa,EAAE,MAAM,GAAG,YAAY,CA8CpF"}
|
|
@@ -1,111 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
const STEP_EVENT_TYPES = new Set(["step_created", "step_started", "step_completed", "step_failed", "step_retrying"]);
|
|
4
|
-
export function resolveWorkflowRunId(dataDir, id) {
|
|
5
|
-
if (id.startsWith("wrun_"))
|
|
6
|
-
return id;
|
|
7
|
-
const runsDir = path.join(dataDir, "runs");
|
|
8
|
-
if (fs.existsSync(runsDir)) {
|
|
9
|
-
for (const file of fs.readdirSync(runsDir)) {
|
|
10
|
-
if (!file.endsWith(".json"))
|
|
11
|
-
continue;
|
|
12
|
-
const run = readJson(path.join(runsDir, file));
|
|
13
|
-
if (run?.attributes?.runId === id)
|
|
14
|
-
return run.runId;
|
|
15
|
-
}
|
|
16
|
-
}
|
|
17
|
-
throw new Error(`No durable run is mapped to Terse run id "${id}". Pass a workflow run id (wrun_...) directly if you have it.`);
|
|
18
|
-
}
|
|
19
|
-
export function readRunStatus(dataDir, workflowRunId) {
|
|
20
|
-
return readJson(path.join(dataDir, "runs", `${workflowRunId}.json`))?.status ?? null;
|
|
21
|
-
}
|
|
22
|
-
export function rewindFailedRun(dataDir, workflowRunId) {
|
|
23
|
-
const runFile = path.join(dataDir, "runs", `${workflowRunId}.json`);
|
|
24
|
-
const run = readJson(runFile);
|
|
25
|
-
if (!run)
|
|
26
|
-
throw new Error(`Run "${workflowRunId}" not found in ${dataDir}.`);
|
|
27
|
-
if (run.status !== "failed")
|
|
28
|
-
throw new Error(`Run "${workflowRunId}" is "${run.status}", not "failed" — nothing to rewind.`);
|
|
29
|
-
const events = listRunEvents(dataDir, workflowRunId);
|
|
30
|
-
// Only operate on journal shapes we can reason about; otherwise the caller
|
|
31
|
-
// should re-run the job fresh instead.
|
|
32
|
-
if (hasUnclosed(events, "wait_created", "wait_completed"))
|
|
33
|
-
throw new Error(`Run "${workflowRunId}" has an open wait; re-drive is not supported. Re-run it fresh instead.`);
|
|
34
|
-
if (hasUnclosed(events, "hook_created", "hook_disposed"))
|
|
35
|
-
throw new Error(`Run "${workflowRunId}" has an open hook; re-drive is not supported. Re-run it fresh instead.`);
|
|
36
|
-
const completed = new Set(events.filter(e => e.eventType === "step_completed").map(e => e.correlationId));
|
|
37
|
-
const touched = new Set(events.filter(e => STEP_EVENT_TYPES.has(e.eventType) && e.correlationId).map(e => e.correlationId));
|
|
38
|
-
const incomplete = [...touched].filter(id => !completed.has(id));
|
|
39
|
-
if (incomplete.length > 1)
|
|
40
|
-
throw new Error(`Run "${workflowRunId}" has ${incomplete.length} incomplete steps; re-drive only supports a single failed step. Re-run it fresh instead.`);
|
|
41
|
-
const rewoundStepId = incomplete[0] ?? null;
|
|
42
|
-
backupRun(dataDir, workflowRunId, runFile, events);
|
|
43
|
-
let deletedEvents = 0;
|
|
44
|
-
for (const e of events) {
|
|
45
|
-
const isFailureMarker = e.eventType === "run_failed";
|
|
46
|
-
const isRewoundStepEvent = rewoundStepId !== null && e.correlationId === rewoundStepId && STEP_EVENT_TYPES.has(e.eventType);
|
|
47
|
-
if (isFailureMarker || isRewoundStepEvent) {
|
|
48
|
-
fs.rmSync(path.join(dataDir, "events", e.file), { force: true });
|
|
49
|
-
deletedEvents++;
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
// Drop any non-completed step entity (covers the failed step regardless of how its
|
|
53
|
-
// composite key is derived) so replay re-executes it rather than seeing it terminal.
|
|
54
|
-
for (const file of listRunStepFiles(dataDir, workflowRunId)) {
|
|
55
|
-
const step = readJson(path.join(dataDir, "steps", file));
|
|
56
|
-
if (step && step.status !== "completed")
|
|
57
|
-
fs.rmSync(path.join(dataDir, "steps", file), { force: true });
|
|
58
|
-
}
|
|
59
|
-
delete run.error;
|
|
60
|
-
delete run.completedAt;
|
|
61
|
-
delete run.output;
|
|
62
|
-
run.status = "running";
|
|
63
|
-
run.updatedAt = new Date().toISOString();
|
|
64
|
-
fs.writeFileSync(runFile, JSON.stringify(run, null, 2));
|
|
65
|
-
return { workflowRunId, rewoundStepId, deletedEvents };
|
|
66
|
-
}
|
|
67
|
-
function listRunEvents(dataDir, workflowRunId) {
|
|
68
|
-
const eventsDir = path.join(dataDir, "events");
|
|
69
|
-
if (!fs.existsSync(eventsDir))
|
|
70
|
-
return [];
|
|
71
|
-
const prefix = `${workflowRunId}-`;
|
|
72
|
-
const out = [];
|
|
73
|
-
for (const file of fs.readdirSync(eventsDir)) {
|
|
74
|
-
if (!file.startsWith(prefix) || !file.endsWith(".json"))
|
|
75
|
-
continue;
|
|
76
|
-
const event = readJson(path.join(eventsDir, file));
|
|
77
|
-
if (event?.eventType)
|
|
78
|
-
out.push({ file, eventType: event.eventType, correlationId: event.correlationId });
|
|
79
|
-
}
|
|
80
|
-
return out;
|
|
81
|
-
}
|
|
82
|
-
function listRunStepFiles(dataDir, workflowRunId) {
|
|
83
|
-
const stepsDir = path.join(dataDir, "steps");
|
|
84
|
-
if (!fs.existsSync(stepsDir))
|
|
85
|
-
return [];
|
|
86
|
-
return fs.readdirSync(stepsDir).filter(file => file.startsWith(`${workflowRunId}-`) && file.endsWith(".json"));
|
|
87
|
-
}
|
|
88
|
-
function hasUnclosed(events, openType, closeType) {
|
|
89
|
-
const closed = new Set(events.filter(e => e.eventType === closeType).map(e => e.correlationId));
|
|
90
|
-
return events.some(e => e.eventType === openType && !closed.has(e.correlationId));
|
|
91
|
-
}
|
|
92
|
-
function backupRun(dataDir, workflowRunId, runFile, events) {
|
|
93
|
-
const dir = path.join(dataDir, ".rewind-backup", `${workflowRunId}-${Date.now()}`);
|
|
94
|
-
fs.mkdirSync(path.join(dir, "events"), { recursive: true });
|
|
95
|
-
fs.mkdirSync(path.join(dir, "steps"), { recursive: true });
|
|
96
|
-
fs.mkdirSync(path.join(dir, "runs"), { recursive: true });
|
|
97
|
-
fs.copyFileSync(runFile, path.join(dir, "runs", `${workflowRunId}.json`));
|
|
98
|
-
for (const e of events)
|
|
99
|
-
fs.copyFileSync(path.join(dataDir, "events", e.file), path.join(dir, "events", e.file));
|
|
100
|
-
for (const file of listRunStepFiles(dataDir, workflowRunId))
|
|
101
|
-
fs.copyFileSync(path.join(dataDir, "steps", file), path.join(dir, "steps", file));
|
|
102
|
-
}
|
|
103
|
-
function readJson(file) {
|
|
104
|
-
try {
|
|
105
|
-
return JSON.parse(fs.readFileSync(file, "utf8"));
|
|
106
|
-
}
|
|
107
|
-
catch {
|
|
108
|
-
return null;
|
|
109
|
-
}
|
|
110
|
-
}
|
|
111
|
-
//# sourceMappingURL=rewindRun.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"rewindRun.js","sourceRoot":"","sources":["../../../src/providers/typescript/rewindRun.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
import { BaseBuilder } from "@workflow/builders";
|
|
2
|
-
export declare class TerseWorkflowBuilder extends BaseBuilder {
|
|
3
|
-
private readonly outDir;
|
|
4
|
-
constructor(workingDir: string, scanDir: string, outDir: string);
|
|
5
|
-
protected get shouldLogBaseBuilderInfo(): boolean;
|
|
6
|
-
build(): Promise<void>;
|
|
7
|
-
}
|
|
8
|
-
//# sourceMappingURL=terseWorkflowBuilder.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terseWorkflowBuilder.d.ts","sourceRoot":"","sources":["../../../src/providers/typescript/terseWorkflowBuilder.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAA2B,MAAM,oBAAoB,CAAA;AAYzE,qBAAa,oBAAqB,SAAQ,WAAW;IACjD,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAQ;gBAEnB,UAAU,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAY/D,SAAS,KAAK,wBAAwB,IAAI,OAAO,CAEhD;IAEK,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAuB/B"}
|
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
import { BaseBuilder, createBaseBuilderConfig } from "@workflow/builders";
|
|
2
|
-
import fs from "node:fs";
|
|
3
|
-
import path from "node:path";
|
|
4
|
-
// Modeled on @workflow/nest's NestLocalBuilder: scan `scanDir` and emit bundles
|
|
5
|
-
// to an out dir OUTSIDE it. The builder globs inputs rooted at `dirs`, so output
|
|
6
|
-
// kept outside `dirs` is never re-globbed as an input — which is what lets
|
|
7
|
-
// re-tests overwrite the bundles cleanly. (StandaloneBuilder forces dirs: ['.'],
|
|
8
|
-
// scanning the whole project, which is why its output collided with itself.)
|
|
9
|
-
// `scanDir` (relative to workingDir) holds the macro-transformed sources, so the
|
|
10
|
-
// builder discovers the `"use workflow"` functions the job macro injected into
|
|
11
|
-
// each createJob's onTrigger.
|
|
12
|
-
export class TerseWorkflowBuilder extends BaseBuilder {
|
|
13
|
-
outDir;
|
|
14
|
-
constructor(workingDir, scanDir, outDir) {
|
|
15
|
-
super({
|
|
16
|
-
...createBaseBuilderConfig({ workingDir, dirs: [scanDir], watch: false }),
|
|
17
|
-
buildTarget: "standalone",
|
|
18
|
-
stepsBundlePath: path.join(outDir, "steps.cjs"),
|
|
19
|
-
workflowsBundlePath: path.join(outDir, "workflows.cjs"),
|
|
20
|
-
webhookBundlePath: path.join(outDir, "webhook.cjs")
|
|
21
|
-
});
|
|
22
|
-
this.outDir = outDir;
|
|
23
|
-
}
|
|
24
|
-
// Raw builder logs would corrupt the CLI's active clack rendering.
|
|
25
|
-
get shouldLogBaseBuilderInfo() {
|
|
26
|
-
return false;
|
|
27
|
-
}
|
|
28
|
-
async build() {
|
|
29
|
-
await withSerdeWarningsSuppressed(async () => {
|
|
30
|
-
const inputFiles = await this.getInputFiles();
|
|
31
|
-
fs.mkdirSync(this.outDir, { recursive: true });
|
|
32
|
-
const { manifest: workflows } = await this.createWorkflowsBundle({ outfile: path.join(this.outDir, "workflows.cjs"), format: "cjs", inputFiles });
|
|
33
|
-
const { manifest: steps } = await this.createStepsBundle({ outfile: path.join(this.outDir, "steps.cjs"), format: "cjs", inputFiles });
|
|
34
|
-
await this.createWebhookBundle({ outfile: path.join(this.outDir, "webhook.cjs"), bundle: false });
|
|
35
|
-
await this.createManifest({
|
|
36
|
-
workflowBundlePath: path.join(this.outDir, "workflows.cjs"),
|
|
37
|
-
manifestDir: this.outDir,
|
|
38
|
-
manifest: {
|
|
39
|
-
steps: { ...steps.steps, ...workflows.steps },
|
|
40
|
-
workflows: { ...steps.workflows, ...workflows.workflows },
|
|
41
|
-
classes: { ...steps.classes, ...workflows.classes }
|
|
42
|
-
}
|
|
43
|
-
});
|
|
44
|
-
// generated build output — keep it out of the user's git
|
|
45
|
-
fs.writeFileSync(path.join(this.outDir, ".gitignore"), "*\n");
|
|
46
|
-
});
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
// False positive: the serde checker scans the pre-tree-shaken bundle and pins
|
|
50
|
-
// @workflow/core's own Node-builtin imports on user classes. The builder's esbuild
|
|
51
|
-
// plugin still fails the build on genuine violations after "use step" stripping.
|
|
52
|
-
async function withSerdeWarningsSuppressed(fn) {
|
|
53
|
-
const originalWarn = console.warn;
|
|
54
|
-
console.warn = (...args) => {
|
|
55
|
-
if (typeof args[0] === "string" && args[0].includes("Serde warning for"))
|
|
56
|
-
return;
|
|
57
|
-
originalWarn(...args);
|
|
58
|
-
};
|
|
59
|
-
try {
|
|
60
|
-
return await fn();
|
|
61
|
-
}
|
|
62
|
-
finally {
|
|
63
|
-
console.warn = originalWarn;
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
//# sourceMappingURL=terseWorkflowBuilder.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terseWorkflowBuilder.js","sourceRoot":"","sources":["../../../src/providers/typescript/terseWorkflowBuilder.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflowShim.d.ts","sourceRoot":"","sources":["../../../src/providers/typescript/workflowShim.ts"],"names":[],"mappings":"AAaA,wBAAgB,iBAAiB,CAAC,GAAG,EAAE,MAAM,EAAE,mBAAmB,EAAE,MAAM,GAAG,IAAI,CAOhF"}
|
|
@@ -1,51 +0,0 @@
|
|
|
1
|
-
import fs from "node:fs";
|
|
2
|
-
import path from "node:path";
|
|
3
|
-
import { readTemplateFile } from "../templateUtils.js";
|
|
4
|
-
const SHIM_DIR = path.join("node_modules", "workflow");
|
|
5
|
-
const SHIM_TEMPLATE_DIR = path.join("typescript", "workflow-shim");
|
|
6
|
-
const SHIM_MARKER = "terseWorkflowShim";
|
|
7
|
-
// @workflow/builders hardcodes two specifiers that it resolves from the project root: `workflow/runtime`
|
|
8
|
-
// (injected into the generated bundle wrapper) and `workflow/internal/builtins`. This shim satisfies both
|
|
9
|
-
// out of `@workflow/core`, which keeps the `workflow` umbrella (CLI, framework adapters, SWC, esbuild,
|
|
10
|
-
// ~150MB) out of every user project and every sandbox image.
|
|
11
|
-
export function writeWorkflowShim(cwd, workflowCoreVersion) {
|
|
12
|
-
const shimRoot = path.join(cwd, SHIM_DIR);
|
|
13
|
-
if (hasRealWorkflowPackage(shimRoot))
|
|
14
|
-
return;
|
|
15
|
-
fs.mkdirSync(path.join(shimRoot, "internal"), { recursive: true });
|
|
16
|
-
fs.writeFileSync(path.join(shimRoot, "package.json"), shimPackageJson(workflowCoreVersion));
|
|
17
|
-
SHIM_FILES.forEach(file => fs.writeFileSync(path.join(shimRoot, file), readTemplateFile(path.join(SHIM_TEMPLATE_DIR, file))));
|
|
18
|
-
}
|
|
19
|
-
// helpers
|
|
20
|
-
const SHIM_FILES = ["index.js", "workflow.js", "runtime.js", "api.js", "stdlib.js", path.join("internal", "builtins.js"), path.join("internal", "class-serialization.js")];
|
|
21
|
-
// A project that depends on `workflow` itself already satisfies the builder, and its copy is the real one.
|
|
22
|
-
function hasRealWorkflowPackage(shimRoot) {
|
|
23
|
-
const manifest = path.join(shimRoot, "package.json");
|
|
24
|
-
if (!fs.existsSync(manifest))
|
|
25
|
-
return false;
|
|
26
|
-
return readShimMarker(manifest) !== true;
|
|
27
|
-
}
|
|
28
|
-
function readShimMarker(manifest) {
|
|
29
|
-
try {
|
|
30
|
-
return JSON.parse(fs.readFileSync(manifest, "utf8"))[SHIM_MARKER];
|
|
31
|
-
}
|
|
32
|
-
catch {
|
|
33
|
-
return undefined;
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
function shimPackageJson(workflowCoreVersion) {
|
|
37
|
-
return `${JSON.stringify({
|
|
38
|
-
name: "workflow",
|
|
39
|
-
version: workflowCoreVersion,
|
|
40
|
-
type: "module",
|
|
41
|
-
[SHIM_MARKER]: true,
|
|
42
|
-
exports: {
|
|
43
|
-
".": { workflow: "./workflow.js", default: "./index.js" },
|
|
44
|
-
"./runtime": "./runtime.js",
|
|
45
|
-
"./api": "./api.js",
|
|
46
|
-
"./internal/builtins": "./internal/builtins.js",
|
|
47
|
-
"./internal/class-serialization": "./internal/class-serialization.js"
|
|
48
|
-
}
|
|
49
|
-
}, null, 2)}\n`;
|
|
50
|
-
}
|
|
51
|
-
//# sourceMappingURL=workflowShim.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"workflowShim.js","sourceRoot":"","sources":["../../../src/providers/typescript/workflowShim.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,MAAM,SAAS,CAAA;AACxB,OAAO,IAAI,MAAM,WAAW,CAAA;AAE5B,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAA;AAEtD,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,cAAc,EAAE,UAAU,CAAC,CAAA;AACtD,MAAM,iBAAiB,GAAG,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,eAAe,CAAC,CAAA;AAClE,MAAM,WAAW,GAAG,mBAAmB,CAAA;AAEvC,yGAAyG;AACzG,0GAA0G;AAC1G,uGAAuG;AACvG,6DAA6D;AAC7D,MAAM,UAAU,iBAAiB,CAAC,GAAW,EAAE,mBAA2B;IACtE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAA;IACzC,IAAI,sBAAsB,CAAC,QAAQ,CAAC;QAAE,OAAM;IAE5C,EAAE,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,UAAU,CAAC,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAA;IAClE,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,EAAE,eAAe,CAAC,mBAAmB,CAAC,CAAC,CAAA;IAC3F,UAAU,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,EAAE,gBAAgB,CAAC,IAAI,CAAC,IAAI,CAAC,iBAAiB,EAAE,IAAI,CAAC,CAAC,CAAC,CAAC,CAAA;AACjI,CAAC;AAED,UAAU;AAEV,MAAM,UAAU,GAAG,CAAC,UAAU,EAAE,aAAa,EAAE,YAAY,EAAE,QAAQ,EAAE,WAAW,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,aAAa,CAAC,EAAE,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,wBAAwB,CAAC,CAAC,CAAA;AAE1K,2GAA2G;AAC3G,SAAS,sBAAsB,CAAC,QAAgB;IAC5C,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,cAAc,CAAC,CAAA;IACpD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,QAAQ,CAAC;QAAE,OAAO,KAAK,CAAA;IAC1C,OAAO,cAAc,CAAC,QAAQ,CAAC,KAAK,IAAI,CAAA;AAC5C,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACpC,IAAI,CAAC;QACD,OAAO,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC,CAAC,WAAW,CAAC,CAAA;IACrE,CAAC;IAAC,MAAM,CAAC;QACL,OAAO,SAAS,CAAA;IACpB,CAAC;AACL,CAAC;AAED,SAAS,eAAe,CAAC,mBAA2B;IAChD,OAAO,GAAG,IAAI,CAAC,SAAS,CACpB;QACI,IAAI,EAAE,UAAU;QAChB,OAAO,EAAE,mBAAmB;QAC5B,IAAI,EAAE,QAAQ;QACd,CAAC,WAAW,CAAC,EAAE,IAAI;QACnB,OAAO,EAAE;YACL,GAAG,EAAE,EAAE,QAAQ,EAAE,eAAe,EAAE,OAAO,EAAE,YAAY,EAAE;YACzD,WAAW,EAAE,cAAc;YAC3B,OAAO,EAAE,UAAU;YACnB,qBAAqB,EAAE,wBAAwB;YAC/C,gCAAgC,EAAE,mCAAmC;SACxE;KACJ,EACD,IAAI,EACJ,CAAC,CACJ,IAAI,CAAA;AACT,CAAC"}
|
package/dist/terseWorld.d.ts
DELETED
package/dist/terseWorld.d.ts.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terseWorld.d.ts","sourceRoot":"","sources":["../src/terseWorld.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAQvD,MAAM,MAAM,UAAU,GAAG,UAAU,CAAA;AAMnC,wBAAgB,gBAAgB,IAAI,UAAU,CAU7C"}
|
package/dist/terseWorld.js
DELETED
|
@@ -1,46 +0,0 @@
|
|
|
1
|
-
import { createLocalWorld } from "@workflow/world-local";
|
|
2
|
-
import path from "path";
|
|
3
|
-
import { ApiRoutes } from "terse-types";
|
|
4
|
-
import { fetchWithAuth, readRuntimeKeyOrBail } from "./api.js";
|
|
5
|
-
// Waits shorter than this stay in-process: tearing down and respawning a sandbox
|
|
6
|
-
// costs more than just waiting, so only longer waits hand off to Terse.
|
|
7
|
-
const SUSPEND_THRESHOLD_SECONDS = Number(process.env.TERSE_SUSPEND_THRESHOLD_SECONDS) || 30;
|
|
8
|
-
export function createTerseWorld() {
|
|
9
|
-
const dataDir = process.env.WORKFLOW_LOCAL_DATA_DIR ?? path.join(process.cwd(), ".terse", "data");
|
|
10
|
-
const base = createLocalWorld({ dataDir });
|
|
11
|
-
const baseQueue = base.queue.bind(base);
|
|
12
|
-
return {
|
|
13
|
-
...base,
|
|
14
|
-
processExitTriggersQueueRedelivery: true,
|
|
15
|
-
queue: terseQueue(baseQueue)
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
// helpers
|
|
19
|
-
function terseQueue(baseQueue) {
|
|
20
|
-
return (name, message, opts) => {
|
|
21
|
-
if (opts?.delaySeconds && opts.delaySeconds > SUSPEND_THRESHOLD_SECONDS) {
|
|
22
|
-
return scheduleTerseTimer(name, opts).then(() => ({ messageId: null }));
|
|
23
|
-
}
|
|
24
|
-
return baseQueue(name, message, opts);
|
|
25
|
-
};
|
|
26
|
-
}
|
|
27
|
-
async function scheduleTerseTimer(name, opts) {
|
|
28
|
-
const runId = process.env.TERSE_RUN_ID;
|
|
29
|
-
if (!runId) {
|
|
30
|
-
throw new Error(`Cannot suspend: TERSE_RUN_ID is not set (queue "${name}").`);
|
|
31
|
-
}
|
|
32
|
-
const delaySeconds = opts.delaySeconds;
|
|
33
|
-
if (!delaySeconds || delaySeconds <= 0) {
|
|
34
|
-
throw new Error(`scheduleTerseTimer requires a positive delaySeconds (queue "${name}").`);
|
|
35
|
-
}
|
|
36
|
-
const apiKey = readRuntimeKeyOrBail();
|
|
37
|
-
const body = {
|
|
38
|
-
runId,
|
|
39
|
-
name,
|
|
40
|
-
delaySeconds,
|
|
41
|
-
...(opts.idempotencyKey ? { idempotencyKey: opts.idempotencyKey } : {})
|
|
42
|
-
};
|
|
43
|
-
await fetchWithAuth(ApiRoutes.SDK.SUSPEND, apiKey, body, "POST");
|
|
44
|
-
return { messageId: null };
|
|
45
|
-
}
|
|
46
|
-
//# sourceMappingURL=terseWorld.js.map
|
package/dist/terseWorld.js.map
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"terseWorld.js","sourceRoot":"","sources":["../src/terseWorld.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AACxD,OAAO,IAAI,MAAM,MAAM,CAAA;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAA;AAGvC,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,UAAU,CAAA;AAI9D,iFAAiF;AACjF,wEAAwE;AACxE,MAAM,yBAAyB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,+BAA+B,CAAC,IAAI,EAAE,CAAA;AAE3F,MAAM,UAAU,gBAAgB;IAC5B,MAAM,OAAO,GAAG,OAAO,CAAC,GAAG,CAAC,uBAAuB,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,MAAM,CAAC,CAAA;IACjG,MAAM,IAAI,GAAG,gBAAgB,CAAC,EAAE,OAAO,EAAE,CAAC,CAAA;IAC1C,MAAM,SAAS,GAAmB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAA;IAEvD,OAAO;QACH,GAAG,IAAI;QACP,kCAAkC,EAAE,IAAI;QACxC,KAAK,EAAE,UAAU,CAAC,SAAS,CAAC;KAC/B,CAAA;AACL,CAAC;AAED,UAAU;AAEV,SAAS,UAAU,CAAC,SAAyB;IACzC,OAAO,CAAC,IAAoB,EAAE,OAAqB,EAAE,IAAmB,EAAE,EAAE;QACxE,IAAI,IAAI,EAAE,YAAY,IAAI,IAAI,CAAC,YAAY,GAAG,yBAAyB,EAAE,CAAC;YACtE,OAAO,kBAAkB,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC,CAAA;QAC3E,CAAC;QACD,OAAO,SAAS,CAAC,IAAI,EAAE,OAAO,EAAE,IAAI,CAAC,CAAA;IACzC,CAAC,CAAA;AACL,CAAC;AAED,KAAK,UAAU,kBAAkB,CAAC,IAAoB,EAAE,IAAkB;IACtE,MAAM,KAAK,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,CAAA;IACtC,IAAI,CAAC,KAAK,EAAE,CAAC;QACT,MAAM,IAAI,KAAK,CAAC,mDAAmD,IAAI,KAAK,CAAC,CAAA;IACjF,CAAC;IAED,MAAM,YAAY,GAAG,IAAI,CAAC,YAAY,CAAA;IACtC,IAAI,CAAC,YAAY,IAAI,YAAY,IAAI,CAAC,EAAE,CAAC;QACrC,MAAM,IAAI,KAAK,CAAC,+DAA+D,IAAI,KAAK,CAAC,CAAA;IAC7F,CAAC;IAED,MAAM,MAAM,GAAG,oBAAoB,EAAE,CAAA;IACrC,MAAM,IAAI,GAA6B;QACnC,KAAK;QACL,IAAI;QACJ,YAAY;QACZ,GAAG,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,cAAc,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KAC1E,CAAA;IACD,MAAM,aAAa,CAA4B,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,CAAC,CAAA;IAE3F,OAAO,EAAE,SAAS,EAAE,IAAI,EAAE,CAAA;AAC9B,CAAC"}
|