@osolmaz/pi-workflows 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (113) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +182 -0
  3. package/dist/extension/executor.d.ts +58 -0
  4. package/dist/extension/executor.js +201 -0
  5. package/dist/extension/executor.js.map +1 -0
  6. package/dist/extension/index.d.ts +17 -0
  7. package/dist/extension/index.js +504 -0
  8. package/dist/extension/index.js.map +1 -0
  9. package/dist/extension/widget.d.ts +21 -0
  10. package/dist/extension/widget.js +142 -0
  11. package/dist/extension/widget.js.map +1 -0
  12. package/dist/render/ansi.d.ts +16 -0
  13. package/dist/render/ansi.js +42 -0
  14. package/dist/render/ansi.js.map +1 -0
  15. package/dist/render/canvas.d.ts +40 -0
  16. package/dist/render/canvas.js +177 -0
  17. package/dist/render/canvas.js.map +1 -0
  18. package/dist/render/format.d.ts +3 -0
  19. package/dist/render/format.js +17 -0
  20. package/dist/render/format.js.map +1 -0
  21. package/dist/render/graph-render.d.ts +22 -0
  22. package/dist/render/graph-render.js +520 -0
  23. package/dist/render/graph-render.js.map +1 -0
  24. package/dist/render/graph.d.ts +46 -0
  25. package/dist/render/graph.js +272 -0
  26. package/dist/render/graph.js.map +1 -0
  27. package/dist/viewer/cli.d.ts +10 -0
  28. package/dist/viewer/cli.js +132 -0
  29. package/dist/viewer/cli.js.map +1 -0
  30. package/dist/viewer/render.d.ts +19 -0
  31. package/dist/viewer/render.js +162 -0
  32. package/dist/viewer/render.js.map +1 -0
  33. package/dist/viewer/tui.d.ts +11 -0
  34. package/dist/viewer/tui.js +140 -0
  35. package/dist/viewer/tui.js.map +1 -0
  36. package/dist/viewer/watch.d.ts +9 -0
  37. package/dist/viewer/watch.js +46 -0
  38. package/dist/viewer/watch.js.map +1 -0
  39. package/dist/workflows/decision.d.ts +25 -0
  40. package/dist/workflows/decision.js +96 -0
  41. package/dist/workflows/decision.js.map +1 -0
  42. package/dist/workflows/definition.d.ts +9 -0
  43. package/dist/workflows/definition.js +61 -0
  44. package/dist/workflows/definition.js.map +1 -0
  45. package/dist/workflows/engine.d.ts +65 -0
  46. package/dist/workflows/engine.js +574 -0
  47. package/dist/workflows/engine.js.map +1 -0
  48. package/dist/workflows/errors.d.ts +9 -0
  49. package/dist/workflows/errors.js +24 -0
  50. package/dist/workflows/errors.js.map +1 -0
  51. package/dist/workflows/graph.d.ts +17 -0
  52. package/dist/workflows/graph.js +127 -0
  53. package/dist/workflows/graph.js.map +1 -0
  54. package/dist/workflows/index.d.ts +11 -0
  55. package/dist/workflows/index.js +11 -0
  56. package/dist/workflows/index.js.map +1 -0
  57. package/dist/workflows/json.d.ts +14 -0
  58. package/dist/workflows/json.js +134 -0
  59. package/dist/workflows/json.js.map +1 -0
  60. package/dist/workflows/loader.d.ts +28 -0
  61. package/dist/workflows/loader.js +94 -0
  62. package/dist/workflows/loader.js.map +1 -0
  63. package/dist/workflows/schema.d.ts +7 -0
  64. package/dist/workflows/schema.js +176 -0
  65. package/dist/workflows/schema.js.map +1 -0
  66. package/dist/workflows/shell.d.ts +9 -0
  67. package/dist/workflows/shell.js +177 -0
  68. package/dist/workflows/shell.js.map +1 -0
  69. package/dist/workflows/store.d.ts +35 -0
  70. package/dist/workflows/store.js +181 -0
  71. package/dist/workflows/store.js.map +1 -0
  72. package/dist/workflows/text.d.ts +10 -0
  73. package/dist/workflows/text.js +32 -0
  74. package/dist/workflows/text.js.map +1 -0
  75. package/dist/workflows/types.d.ts +280 -0
  76. package/dist/workflows/types.js +2 -0
  77. package/dist/workflows/types.js.map +1 -0
  78. package/docs/development.md +130 -0
  79. package/docs/run-bundles.md +114 -0
  80. package/docs/workflows.md +311 -0
  81. package/examples/workflows/autoimplement.workflow.ts +92 -0
  82. package/examples/workflows/autoresearch.workflow.ts +139 -0
  83. package/examples/workflows/branch.workflow.ts +63 -0
  84. package/examples/workflows/echo.workflow.ts +23 -0
  85. package/examples/workflows/elegant-solution.workflow.ts +95 -0
  86. package/examples/workflows/shell.workflow.ts +31 -0
  87. package/examples/workflows/two-turn.workflow.ts +64 -0
  88. package/package.json +80 -0
  89. package/src/extension/executor.ts +251 -0
  90. package/src/extension/index.ts +627 -0
  91. package/src/extension/widget.ts +183 -0
  92. package/src/render/ansi.ts +47 -0
  93. package/src/render/canvas.ts +196 -0
  94. package/src/render/format.ts +19 -0
  95. package/src/render/graph-render.ts +738 -0
  96. package/src/render/graph.ts +341 -0
  97. package/src/viewer/cli.ts +150 -0
  98. package/src/viewer/render.ts +236 -0
  99. package/src/viewer/tui.ts +159 -0
  100. package/src/viewer/watch.ts +55 -0
  101. package/src/workflows/decision.ts +127 -0
  102. package/src/workflows/definition.ts +104 -0
  103. package/src/workflows/engine.ts +793 -0
  104. package/src/workflows/errors.ts +27 -0
  105. package/src/workflows/graph.ts +161 -0
  106. package/src/workflows/index.ts +76 -0
  107. package/src/workflows/json.ts +155 -0
  108. package/src/workflows/loader.ts +123 -0
  109. package/src/workflows/schema.ts +218 -0
  110. package/src/workflows/shell.ts +199 -0
  111. package/src/workflows/store.ts +234 -0
  112. package/src/workflows/text.ts +34 -0
  113. package/src/workflows/types.ts +318 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/workflows/schema.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,9 @@
1
+ import type { ShellActionExecution, ShellActionResult } from "./types.js";
2
+ /**
3
+ * Retrieve the shell result attached to an error thrown by
4
+ * {@link runShellAction}, so callers can persist the action receipt even when
5
+ * the command failed.
6
+ */
7
+ export declare function shellResultFromError(error: unknown): ShellActionResult | null;
8
+ export declare function renderShellCommand(command: string, args: string[]): string;
9
+ export declare function runShellAction(spec: ShellActionExecution, signal?: AbortSignal): Promise<ShellActionResult>;
@@ -0,0 +1,177 @@
1
+ import { spawn } from "node:child_process";
2
+ import { CancelledError, TimeoutError } from "./errors.js";
3
+ /** Default cap on captured stdout/stderr, each. */
4
+ const DEFAULT_MAX_OUTPUT_CHARS = 1_000_000;
5
+ const TRUNCATION_MARKER = "\n…[output truncated]";
6
+ const SHELL_RESULT = Symbol.for("pi-workflows.shell-result");
7
+ /**
8
+ * Retrieve the shell result attached to an error thrown by
9
+ * {@link runShellAction}, so callers can persist the action receipt even when
10
+ * the command failed.
11
+ */
12
+ export function shellResultFromError(error) {
13
+ if (error instanceof Error) {
14
+ const attached = error[SHELL_RESULT];
15
+ return attached ?? null;
16
+ }
17
+ return null;
18
+ }
19
+ export function renderShellCommand(command, args) {
20
+ const renderedArgs = args.map((arg) => JSON.stringify(arg)).join(" ");
21
+ return renderedArgs.length > 0 ? `${command} ${renderedArgs}` : command;
22
+ }
23
+ function shellFailure(spec, args, result, killedBy) {
24
+ if (killedBy === "timeout") {
25
+ return new TimeoutError(spec.timeoutMs ?? 0);
26
+ }
27
+ if (killedBy === "abort") {
28
+ return new CancelledError();
29
+ }
30
+ if (((result.exitCode ?? 0) !== 0 || result.signal != null) && spec.allowNonZeroExit !== true) {
31
+ const status = result.signal ? `signal ${result.signal}` : `exit ${String(result.exitCode)}`;
32
+ const details = result.stderr.length > 0 ? `\n${result.stderr.trim()}` : "";
33
+ return new Error(`Shell action failed (${renderShellCommand(spec.command, args)}): ${status}${details}`);
34
+ }
35
+ return undefined;
36
+ }
37
+ export async function runShellAction(spec, signal) {
38
+ // The node may have been cancelled while an async `exec` callback resolved;
39
+ // never start side effects for an already-abandoned attempt.
40
+ if (signal?.aborted) {
41
+ throw new CancelledError();
42
+ }
43
+ const cwd = spec.cwd ?? process.cwd();
44
+ const args = spec.args ?? [];
45
+ const startMs = Date.now();
46
+ // POSIX: run in its own process group so timeout/abort can kill the whole
47
+ // tree, including descendants that inherited the stdio pipes.
48
+ const useProcessGroup = process.platform !== "win32";
49
+ const child = spawn(spec.command, args, {
50
+ cwd,
51
+ env: { ...process.env, ...spec.env },
52
+ shell: spec.shell,
53
+ stdio: ["pipe", "pipe", "pipe"],
54
+ windowsHide: true,
55
+ detached: useProcessGroup,
56
+ });
57
+ let stdout = "";
58
+ let stderr = "";
59
+ let killedBy = null;
60
+ let timeout;
61
+ // Cap retained output so a verbose or unending command cannot exhaust
62
+ // memory before its timeout fires.
63
+ const maxOutputChars = spec.maxOutputChars ?? DEFAULT_MAX_OUTPUT_CHARS;
64
+ const appendCapped = (current, chunk) => {
65
+ if (current.endsWith(TRUNCATION_MARKER)) {
66
+ return current;
67
+ }
68
+ const room = maxOutputChars - current.length;
69
+ if (chunk.length <= room) {
70
+ return current + chunk;
71
+ }
72
+ return current + chunk.slice(0, Math.max(0, room)) + TRUNCATION_MARKER;
73
+ };
74
+ const signalTree = (killSignal) => {
75
+ if (useProcessGroup && child.pid !== undefined) {
76
+ try {
77
+ process.kill(-child.pid, killSignal);
78
+ return;
79
+ }
80
+ catch {
81
+ // Group already gone; fall back to the direct child.
82
+ }
83
+ }
84
+ child.kill(killSignal);
85
+ };
86
+ let killEscalation;
87
+ const kill = (reason) => {
88
+ killedBy ??= reason;
89
+ signalTree("SIGTERM");
90
+ killEscalation ??= setTimeout(() => {
91
+ signalTree("SIGKILL");
92
+ }, 1_000);
93
+ killEscalation.unref();
94
+ };
95
+ const onAbort = () => kill("abort");
96
+ const finish = new Promise((resolve, reject) => {
97
+ child.stdout.setEncoding("utf8");
98
+ child.stderr.setEncoding("utf8");
99
+ child.stdout.on("data", (chunk) => {
100
+ stdout = appendCapped(stdout, chunk);
101
+ });
102
+ child.stderr.on("data", (chunk) => {
103
+ stderr = appendCapped(stderr, chunk);
104
+ });
105
+ child.once("error", (error) => {
106
+ // Spawn failures (missing executable, EACCES) still get a receipt so
107
+ // failed actions remain auditable.
108
+ const result = {
109
+ command: spec.command,
110
+ args,
111
+ cwd,
112
+ stdout,
113
+ stderr,
114
+ exitCode: null,
115
+ signal: null,
116
+ durationMs: Date.now() - startMs,
117
+ };
118
+ error[SHELL_RESULT] = result;
119
+ reject(error);
120
+ });
121
+ // `close` (unlike `exit`) fires only after stdio has fully closed, so
122
+ // captured output is never truncated.
123
+ child.once("close", (exitCode, signalName) => {
124
+ const result = {
125
+ command: spec.command,
126
+ args,
127
+ cwd,
128
+ stdout,
129
+ stderr,
130
+ exitCode,
131
+ signal: signalName,
132
+ durationMs: Date.now() - startMs,
133
+ };
134
+ const error = shellFailure(spec, args, result, killedBy);
135
+ if (error) {
136
+ // Attach the result so callers can persist the action receipt.
137
+ error[SHELL_RESULT] = result;
138
+ reject(error);
139
+ return;
140
+ }
141
+ resolve(result);
142
+ });
143
+ });
144
+ // A child that exits without consuming stdin emits EPIPE; without a
145
+ // listener that would crash the whole process instead of just this action.
146
+ child.stdin.on("error", () => { });
147
+ if (spec.stdin != null) {
148
+ child.stdin.write(spec.stdin);
149
+ }
150
+ child.stdin.end();
151
+ if (spec.timeoutMs != null && spec.timeoutMs > 0) {
152
+ timeout = setTimeout(() => kill("timeout"), spec.timeoutMs);
153
+ }
154
+ if (signal) {
155
+ if (signal.aborted) {
156
+ onAbort();
157
+ }
158
+ else {
159
+ signal.addEventListener("abort", onAbort, { once: true });
160
+ }
161
+ }
162
+ try {
163
+ return await finish;
164
+ }
165
+ finally {
166
+ if (timeout) {
167
+ clearTimeout(timeout);
168
+ }
169
+ if (killEscalation) {
170
+ // The group pid may be reused after the child exits; never let the
171
+ // delayed SIGKILL fire once the command has fully closed.
172
+ clearTimeout(killEscalation);
173
+ }
174
+ signal?.removeEventListener("abort", onAbort);
175
+ }
176
+ }
177
+ //# sourceMappingURL=shell.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"shell.js","sourceRoot":"","sources":["../../src/workflows/shell.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,35 @@
1
+ import type { WorkflowDefinition, WorkflowDefinitionSnapshot, WorkflowRunManifest, WorkflowRunState, WorkflowTraceEvent, WorkflowTraceEventDraft } from "./types.js";
2
+ export declare const RUN_BUNDLE_SCHEMA: "pi-workflows.run-bundle.v1";
3
+ export declare const TRACE_EVENT_SCHEMA: "pi-workflows.trace-event.v1";
4
+ export declare const DEFINITION_SNAPSHOT_SCHEMA: "pi-workflows.definition-snapshot.v1";
5
+ /** Runs directory: `$PI_WORKFLOWS_RUNS_DIR` or `~/.pi/agent/workflows/runs`. */
6
+ export declare function workflowRunsBaseDir(homeDir?: string): string;
7
+ export declare function createRunId(workflowName: string, now?: Date): string;
8
+ /**
9
+ * Persists run bundles. A bundle directory contains `manifest.json`,
10
+ * `workflow.json` (definition snapshot), `state.json` (full run projection,
11
+ * atomically replaced), and `trace.ndjson` (append-only event log).
12
+ */
13
+ export declare class WorkflowRunStore {
14
+ readonly outputRoot: string;
15
+ private readonly traceSeqByRun;
16
+ private readonly appendChainByPath;
17
+ constructor(outputRoot?: string);
18
+ runDirFor(runId: string): string;
19
+ initializeRunBundle(workflow: WorkflowDefinition, state: WorkflowRunState): Promise<string>;
20
+ writeSnapshot(runDir: string, state: WorkflowRunState, event: WorkflowTraceEventDraft): Promise<WorkflowTraceEvent>;
21
+ appendTrace(runDir: string, state: WorkflowRunState, event: WorkflowTraceEventDraft): Promise<WorkflowTraceEvent>;
22
+ private nextTraceSeq;
23
+ private appendJsonLine;
24
+ }
25
+ export type LoadedRunBundle = {
26
+ runDir: string;
27
+ manifest: WorkflowRunManifest;
28
+ state: WorkflowRunState;
29
+ snapshot: WorkflowDefinitionSnapshot | null;
30
+ };
31
+ /** Read a run bundle from disk. Returns null when the bundle is unreadable. */
32
+ export declare function readRunBundle(runDir: string): Promise<LoadedRunBundle | null>;
33
+ /** List run bundles under `outputRoot`, most recently started first. */
34
+ export declare function listRunBundles(outputRoot: string): Promise<LoadedRunBundle[]>;
35
+ export declare function createDefinitionSnapshot(workflow: WorkflowDefinition): WorkflowDefinitionSnapshot;
@@ -0,0 +1,181 @@
1
+ import { randomUUID } from "node:crypto";
2
+ import fs from "node:fs/promises";
3
+ import os from "node:os";
4
+ import path from "node:path";
5
+ export const RUN_BUNDLE_SCHEMA = "pi-workflows.run-bundle.v1";
6
+ export const TRACE_EVENT_SCHEMA = "pi-workflows.trace-event.v1";
7
+ export const DEFINITION_SNAPSHOT_SCHEMA = "pi-workflows.definition-snapshot.v1";
8
+ const MANIFEST_PATH = "manifest.json";
9
+ const WORKFLOW_SNAPSHOT_PATH = "workflow.json";
10
+ const STATE_PATH = "state.json";
11
+ const TRACE_PATH = "trace.ndjson";
12
+ /** Runs directory: `$PI_WORKFLOWS_RUNS_DIR` or `~/.pi/agent/workflows/runs`. */
13
+ export function workflowRunsBaseDir(homeDir = os.homedir()) {
14
+ const override = process.env.PI_WORKFLOWS_RUNS_DIR;
15
+ if (override !== undefined && override.length > 0) {
16
+ return override;
17
+ }
18
+ return path.join(homeDir, ".pi", "agent", "workflows", "runs");
19
+ }
20
+ export function createRunId(workflowName, now = new Date()) {
21
+ const stamp = now
22
+ .toISOString()
23
+ .replaceAll(/[-:]/g, "")
24
+ .replace(/\.\d+Z$/, "Z");
25
+ const slug = workflowName
26
+ .toLowerCase()
27
+ .replaceAll(/[^a-z0-9]+/g, "-")
28
+ .replaceAll(/(^-|-$)/g, "")
29
+ .slice(0, 40);
30
+ return `${stamp}-${slug || "workflow"}-${randomUUID().slice(0, 8)}`;
31
+ }
32
+ /**
33
+ * Persists run bundles. A bundle directory contains `manifest.json`,
34
+ * `workflow.json` (definition snapshot), `state.json` (full run projection,
35
+ * atomically replaced), and `trace.ndjson` (append-only event log).
36
+ */
37
+ export class WorkflowRunStore {
38
+ outputRoot;
39
+ traceSeqByRun = new Map();
40
+ appendChainByPath = new Map();
41
+ constructor(outputRoot = workflowRunsBaseDir()) {
42
+ this.outputRoot = outputRoot;
43
+ }
44
+ runDirFor(runId) {
45
+ return path.join(this.outputRoot, runId);
46
+ }
47
+ async initializeRunBundle(workflow, state) {
48
+ const runDir = this.runDirFor(state.runId);
49
+ await fs.mkdir(runDir, { recursive: true });
50
+ this.traceSeqByRun.set(runDir, 0);
51
+ await writeJsonAtomic(path.join(runDir, WORKFLOW_SNAPSHOT_PATH), createDefinitionSnapshot(workflow));
52
+ await writeJsonAtomic(path.join(runDir, MANIFEST_PATH), createManifest(state));
53
+ await writeJsonAtomic(path.join(runDir, STATE_PATH), state);
54
+ await this.appendJsonLine(path.join(runDir, TRACE_PATH), null);
55
+ return runDir;
56
+ }
57
+ async writeSnapshot(runDir, state, event) {
58
+ state.updatedAt = new Date().toISOString();
59
+ await writeJsonAtomic(path.join(runDir, STATE_PATH), state);
60
+ await writeJsonAtomic(path.join(runDir, MANIFEST_PATH), createManifest(state));
61
+ return await this.appendTrace(runDir, state, event);
62
+ }
63
+ async appendTrace(runDir, state, event) {
64
+ const traceEvent = {
65
+ seq: this.nextTraceSeq(runDir),
66
+ at: new Date().toISOString(),
67
+ runId: state.runId,
68
+ ...event,
69
+ };
70
+ await this.appendJsonLine(path.join(runDir, TRACE_PATH), traceEvent);
71
+ return traceEvent;
72
+ }
73
+ nextTraceSeq(runDir) {
74
+ const next = (this.traceSeqByRun.get(runDir) ?? 0) + 1;
75
+ this.traceSeqByRun.set(runDir, next);
76
+ return next;
77
+ }
78
+ async appendJsonLine(filePath, value) {
79
+ const prior = this.appendChainByPath.get(filePath) ?? Promise.resolve();
80
+ const nextWrite = prior.then(async () => {
81
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
82
+ await fs.appendFile(filePath, value === null ? "" : `${JSON.stringify(value)}\n`, "utf8");
83
+ });
84
+ const tracked = nextWrite.finally(() => {
85
+ if (this.appendChainByPath.get(filePath) === tracked) {
86
+ this.appendChainByPath.delete(filePath);
87
+ }
88
+ });
89
+ this.appendChainByPath.set(filePath, tracked);
90
+ await tracked;
91
+ }
92
+ }
93
+ /** Read a run bundle from disk. Returns null when the bundle is unreadable. */
94
+ export async function readRunBundle(runDir) {
95
+ const manifest = await readJsonFile(path.join(runDir, MANIFEST_PATH));
96
+ const state = await readJsonFile(path.join(runDir, STATE_PATH));
97
+ if (!manifest || !state || manifest.schema !== RUN_BUNDLE_SCHEMA) {
98
+ return null;
99
+ }
100
+ const snapshot = await readJsonFile(path.join(runDir, WORKFLOW_SNAPSHOT_PATH));
101
+ return { runDir, manifest, state, snapshot };
102
+ }
103
+ /** List run bundles under `outputRoot`, most recently started first. */
104
+ export async function listRunBundles(outputRoot) {
105
+ let entries;
106
+ try {
107
+ entries = await fs.readdir(outputRoot);
108
+ }
109
+ catch {
110
+ return [];
111
+ }
112
+ const bundles = [];
113
+ for (const entry of entries) {
114
+ const bundle = await readRunBundle(path.join(outputRoot, entry));
115
+ if (bundle) {
116
+ bundles.push(bundle);
117
+ }
118
+ }
119
+ bundles.sort((a, b) => b.state.startedAt.localeCompare(a.state.startedAt));
120
+ return bundles;
121
+ }
122
+ async function readJsonFile(filePath) {
123
+ try {
124
+ const raw = await fs.readFile(filePath, "utf8");
125
+ return JSON.parse(raw);
126
+ }
127
+ catch {
128
+ return null;
129
+ }
130
+ }
131
+ function createManifest(state) {
132
+ return {
133
+ schema: RUN_BUNDLE_SCHEMA,
134
+ runId: state.runId,
135
+ workflowName: state.workflowName,
136
+ ...(state.runTitle !== undefined ? { runTitle: state.runTitle } : {}),
137
+ ...(state.workflowPath !== undefined ? { workflowPath: state.workflowPath } : {}),
138
+ startedAt: state.startedAt,
139
+ ...(state.finishedAt !== undefined ? { finishedAt: state.finishedAt } : {}),
140
+ status: state.status,
141
+ traceSchema: TRACE_EVENT_SCHEMA,
142
+ paths: {
143
+ workflow: WORKFLOW_SNAPSHOT_PATH,
144
+ state: STATE_PATH,
145
+ trace: TRACE_PATH,
146
+ },
147
+ };
148
+ }
149
+ export function createDefinitionSnapshot(workflow) {
150
+ return {
151
+ schema: DEFINITION_SNAPSHOT_SCHEMA,
152
+ name: workflow.name,
153
+ startAt: workflow.startAt,
154
+ nodes: Object.fromEntries(Object.entries(workflow.nodes).map(([nodeId, node]) => [nodeId, snapshotNode(node)])),
155
+ edges: structuredClone(workflow.edges),
156
+ };
157
+ }
158
+ function snapshotNode(node) {
159
+ const common = {
160
+ nodeType: node.nodeType,
161
+ ...(node.timeoutMs !== undefined ? { timeoutMs: node.timeoutMs } : {}),
162
+ ...(node.statusDetail !== undefined ? { statusDetail: node.statusDetail } : {}),
163
+ };
164
+ if (node.nodeType === "agent" && node.expectedOutput !== undefined) {
165
+ common.expectedOutput = node.expectedOutput;
166
+ }
167
+ if (node.nodeType === "checkpoint" && node.summary !== undefined) {
168
+ common.summary = node.summary;
169
+ }
170
+ if (node.nodeType === "action") {
171
+ common.actionExecution = "exec" in node ? "shell" : "function";
172
+ }
173
+ return common;
174
+ }
175
+ async function writeJsonAtomic(filePath, value) {
176
+ const tempPath = `${filePath}.${process.pid}.${randomUUID()}.tmp`;
177
+ await fs.mkdir(path.dirname(filePath), { recursive: true });
178
+ await fs.writeFile(tempPath, `${JSON.stringify(value, null, 2)}\n`, "utf8");
179
+ await fs.rename(tempPath, filePath);
180
+ }
181
+ //# sourceMappingURL=store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"store.js","sourceRoot":"","sources":["../../src/workflows/store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /** Remove ANSI escape sequences (CSI style) from a string. */
2
+ export declare function stripAnsi(text: string): string;
3
+ /**
4
+ * Remove ANSI escapes and control characters from untrusted text (model
5
+ * outputs, errors, titles) so rendering it cannot alter terminal state. Line
6
+ * breaks and tabs collapse to single spaces because callers interpolate the
7
+ * result into single terminal lines, where a stray newline would break
8
+ * viewport math and allow fake rows.
9
+ */
10
+ export declare function sanitizeText(text: string): string;
@@ -0,0 +1,32 @@
1
+ /** Remove ANSI escape sequences (CSI style) from a string. */
2
+ export function stripAnsi(text) {
3
+ let result = "";
4
+ let index = 0;
5
+ while (index < text.length) {
6
+ if (text[index] === "\u001b" && text[index + 1] === "[") {
7
+ index += 2;
8
+ while (index < text.length && !/[A-Za-z]/.test(text[index])) {
9
+ index += 1;
10
+ }
11
+ index += 1;
12
+ continue;
13
+ }
14
+ result += text[index];
15
+ index += 1;
16
+ }
17
+ return result;
18
+ }
19
+ /**
20
+ * Remove ANSI escapes and control characters from untrusted text (model
21
+ * outputs, errors, titles) so rendering it cannot alter terminal state. Line
22
+ * breaks and tabs collapse to single spaces because callers interpolate the
23
+ * result into single terminal lines, where a stray newline would break
24
+ * viewport math and allow fake rows.
25
+ */
26
+ export function sanitizeText(text) {
27
+ return (stripAnsi(text)
28
+ .replaceAll(/[\t\n\r]+/g, " ")
29
+ // eslint-disable-next-line no-control-regex
30
+ .replaceAll(/[\u0000-\u001f\u007f]/g, ""));
31
+ }
32
+ //# sourceMappingURL=text.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"text.js","sourceRoot":"","sources":["../../src/workflows/text.ts"],"names":[],"mappings":"AAAA,8DAA8D;AAC9D,MAAM,UAAU,SAAS,CAAC,IAAY;IACpC,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,IAAI,KAAK,GAAG,CAAC,CAAC;IACd,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,KAAK,CAAC,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YACxD,KAAK,IAAI,CAAC,CAAC;YACX,OAAO,KAAK,GAAG,IAAI,CAAC,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAW,CAAC,EAAE,CAAC;gBACtE,KAAK,IAAI,CAAC,CAAC;YACb,CAAC;YACD,KAAK,IAAI,CAAC,CAAC;YACX,SAAS;QACX,CAAC;QACD,MAAM,IAAI,IAAI,CAAC,KAAK,CAAC,CAAC;QACtB,KAAK,IAAI,CAAC,CAAC;IACb,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;GAMG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY;IACvC,OAAO,CACL,SAAS,CAAC,IAAI,CAAC;SACZ,UAAU,CAAC,YAAY,EAAE,GAAG,CAAC;QAC9B,4CAA4C;SAC3C,UAAU,CAAC,wBAAwB,EAAE,EAAE,CAAC,CAC5C,CAAC;AACJ,CAAC"}