@tuongaz/seeflow 0.1.84 → 0.1.85
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/web/assets/{architectureDiagram-3BPJPVTR-I46aqv2T.js → architectureDiagram-3BPJPVTR-BxjUpYZP.js} +1 -1
- package/dist/web/assets/{blockDiagram-GPEHLZMM-C08px5xi.js → blockDiagram-GPEHLZMM-BwW58gmi.js} +1 -1
- package/dist/web/assets/{c4Diagram-AAUBKEIU-iyIMetcW.js → c4Diagram-AAUBKEIU-Dzt08ghL.js} +1 -1
- package/dist/web/assets/channel-H6DSsj4q.js +1 -0
- package/dist/web/assets/{chart-BGNzA0s8.js → chart-DpfirWPs.js} +1 -1
- package/dist/web/assets/{chunk-2J33WTMH-CQFLt-Og.js → chunk-2J33WTMH-Bxngez4X.js} +1 -1
- package/dist/web/assets/{chunk-4BX2VUAB-M_HU7fhX.js → chunk-4BX2VUAB-BOogOMBc.js} +1 -1
- package/dist/web/assets/{chunk-55IACEB6-CZ6tcHFC.js → chunk-55IACEB6-P8EKMZOA.js} +1 -1
- package/dist/web/assets/{chunk-727SXJPM-ZXC_1s3s.js → chunk-727SXJPM-D2YRvYNf.js} +1 -1
- package/dist/web/assets/{chunk-AQP2D5EJ-D1nyTSxR.js → chunk-AQP2D5EJ-DE2NipXE.js} +1 -1
- package/dist/web/assets/{chunk-FMBD7UC4-D8IemyXd.js → chunk-FMBD7UC4-DDhJtfWk.js} +1 -1
- package/dist/web/assets/{chunk-ND2GUHAM-aT_PIEvu.js → chunk-ND2GUHAM-D3XJtrli.js} +1 -1
- package/dist/web/assets/{chunk-QZHKN3VN-BKY6KT8K.js → chunk-QZHKN3VN-BdMZCj9e.js} +1 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-BAWJcCIq.js +1 -0
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-BAWJcCIq.js +1 -0
- package/dist/web/assets/{code-block-CMPt7Auf.js → code-block-sw_8m1aF.js} +1 -1
- package/dist/web/assets/{cose-bilkent-S5V4N54A-Cr3EeHXE.js → cose-bilkent-S5V4N54A-aEoPvgjp.js} +1 -1
- package/dist/web/assets/{dagre-BM42HDAG-BfJiRz9t.js → dagre-BM42HDAG-p9EyJsU9.js} +1 -1
- package/dist/web/assets/{diagram-2AECGRRQ-CZ1Rti0o.js → diagram-2AECGRRQ-D5JkQMH9.js} +1 -1
- package/dist/web/assets/{diagram-5GNKFQAL-COe7jS3C.js → diagram-5GNKFQAL-N-K8VEKH.js} +1 -1
- package/dist/web/assets/{diagram-KO2AKTUF-lmIy3eJx.js → diagram-KO2AKTUF-YYXTKlRp.js} +1 -1
- package/dist/web/assets/{diagram-LMA3HP47-Dv9UOOZz.js → diagram-LMA3HP47-DB6IV5pI.js} +1 -1
- package/dist/web/assets/{diagram-OG6HWLK6-C8HoI5ul.js → diagram-OG6HWLK6-CYpsa5S_.js} +1 -1
- package/dist/web/assets/{erDiagram-TEJ5UH35-CvqQcwx_.js → erDiagram-TEJ5UH35-DG_ieSJb.js} +1 -1
- package/dist/web/assets/{flowDiagram-I6XJVG4X-B0f8FFr8.js → flowDiagram-I6XJVG4X-DhkYdddf.js} +1 -1
- package/dist/web/assets/{ganttDiagram-6RSMTGT7-C0FgETUZ.js → ganttDiagram-6RSMTGT7-Dch6LnJg.js} +1 -1
- package/dist/web/assets/{gitGraphDiagram-PVQCEYII-BSUklsqu.js → gitGraphDiagram-PVQCEYII-BEdh0-R-.js} +1 -1
- package/dist/web/assets/index-2wkTDsTh.js +8619 -0
- package/dist/web/assets/{index-fl8DS9WO.css → index-DzEkjMbu.css} +1 -1
- package/dist/web/assets/{index.es-CcTdlE2B.js → index.es-BPbregt5.js} +1 -1
- package/dist/web/assets/{infoDiagram-5YYISTIA-qq3OPeKx.js → infoDiagram-5YYISTIA-Bg5TB2bn.js} +1 -1
- package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-BxoH_vWZ.js → ishikawaDiagram-YF4QCWOH-C9wgnFPt.js} +1 -1
- package/dist/web/assets/{journeyDiagram-JHISSGLW-ClnMLnWd.js → journeyDiagram-JHISSGLW-DXoECOxR.js} +1 -1
- package/dist/web/assets/{jspdf.es.min-C17Fkx-5.js → jspdf.es.min-D0_5WkpV.js} +3 -3
- package/dist/web/assets/{kanban-definition-UN3LZRKU-BiBGcvgP.js → kanban-definition-UN3LZRKU-Cul7RbDt.js} +1 -1
- package/dist/web/assets/{linear-D--UMRYt.js → linear-CZ3VwjbT.js} +1 -1
- package/dist/web/assets/{markdown-D-hxiBfP.js → markdown-EWVEPYpm.js} +1 -1
- package/dist/web/assets/{mermaid.core-ClLm1p66.js → mermaid.core-Ceyl9DjX.js} +4 -4
- package/dist/web/assets/{mindmap-definition-RKZ34NQL-CLSXYvAW.js → mindmap-definition-RKZ34NQL-DCBC1TsK.js} +1 -1
- package/dist/web/assets/{pieDiagram-4H26LBE5-CjvKFGOn.js → pieDiagram-4H26LBE5-CqccSO7S.js} +1 -1
- package/dist/web/assets/{quadrantDiagram-W4KKPZXB-BUYqMtGH.js → quadrantDiagram-W4KKPZXB-e7-sWjUK.js} +1 -1
- package/dist/web/assets/{requirementDiagram-4Y6WPE33-DNCHy1eI.js → requirementDiagram-4Y6WPE33-BBwVJS4I.js} +1 -1
- package/dist/web/assets/{sankeyDiagram-5OEKKPKP-zoL2eKAM.js → sankeyDiagram-5OEKKPKP-BCNgzA-3.js} +1 -1
- package/dist/web/assets/{sequenceDiagram-3UESZ5HK-DePRNn1e.js → sequenceDiagram-3UESZ5HK-BjjeSbs9.js} +1 -1
- package/dist/web/assets/{stateDiagram-AJRCARHV-uLinqFcr.js → stateDiagram-AJRCARHV-tl6fq8NN.js} +1 -1
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-7VEgV0SV.js +1 -0
- package/dist/web/assets/{time-C9xT3sm_.js → time-BQz-ZWra.js} +1 -1
- package/dist/web/assets/{timeline-definition-PNZ67QCA-BnQVT-CY.js → timeline-definition-PNZ67QCA-Cc_C7lIC.js} +1 -1
- package/dist/web/assets/{vennDiagram-CIIHVFJN-BUyqbvsU.js → vennDiagram-CIIHVFJN-BwgTN2w7.js} +1 -1
- package/dist/web/assets/{wardley-L42UT6IY-zz-5TvX0.js → wardley-L42UT6IY-CxmFlIp3.js} +1 -1
- package/dist/web/assets/{wardleyDiagram-YWT4CUSO-DVnYIARL.js → wardleyDiagram-YWT4CUSO-DMEdETxd.js} +1 -1
- package/dist/web/assets/{xychartDiagram-2RQKCTM6-BMxn2lA_.js → xychartDiagram-2RQKCTM6-B2xg8rTK.js} +1 -1
- package/dist/web/index.html +2 -2
- package/package.json +1 -1
- package/src/api.ts +5 -95
- package/src/cli-manifest.ts +1 -1
- package/src/cli-ops.ts +2 -2
- package/src/events.ts +0 -1
- package/src/mcp.ts +2 -2
- package/src/merge.ts +0 -3
- package/src/operations.ts +0 -2
- package/src/proxy.ts +1 -193
- package/src/schema-catalog.ts +1 -3
- package/src/schema.ts +0 -10
- package/src/server.ts +1 -2
- package/dist/web/assets/channel-X0ALvlnb.js +0 -1
- package/dist/web/assets/classDiagram-4FO5ZUOK-mwGbzVrI.js +0 -1
- package/dist/web/assets/classDiagram-v2-Q7XG4LA2-mwGbzVrI.js +0 -1
- package/dist/web/assets/index-Cnz1Cpa9.js +0 -8619
- package/dist/web/assets/stateDiagram-v2-BHNVJYJU-hyQj-KY3.js +0 -1
package/src/merge.ts
CHANGED
|
@@ -32,7 +32,6 @@ export function mergeFlowAndStyle(flow: Flow, style: Style): ResolvedFlow {
|
|
|
32
32
|
version: flow.version,
|
|
33
33
|
name: flow.name,
|
|
34
34
|
...(flow.description !== undefined ? { description: flow.description } : {}),
|
|
35
|
-
...(flow.resetAction ? { resetAction: flow.resetAction } : {}),
|
|
36
35
|
nodes: mergedNodes,
|
|
37
36
|
connectors: mergedConnectors,
|
|
38
37
|
} as ResolvedFlow;
|
|
@@ -114,7 +113,6 @@ export function splitFlow(resolved: {
|
|
|
114
113
|
version: number;
|
|
115
114
|
name: string;
|
|
116
115
|
description?: string;
|
|
117
|
-
resetAction?: unknown;
|
|
118
116
|
nodes: Array<Record<string, unknown>>;
|
|
119
117
|
connectors: Array<Record<string, unknown>>;
|
|
120
118
|
}): { flow: Record<string, unknown>; style: Record<string, unknown> } {
|
|
@@ -187,7 +185,6 @@ export function splitFlow(resolved: {
|
|
|
187
185
|
connectors: flowConnectors,
|
|
188
186
|
};
|
|
189
187
|
if (resolved.description !== undefined) flow.description = resolved.description;
|
|
190
|
-
if (resolved.resetAction !== undefined) flow.resetAction = resolved.resetAction;
|
|
191
188
|
|
|
192
189
|
const style: Record<string, unknown> = {};
|
|
193
190
|
if (Object.keys(styleNodes).length > 0) style.nodes = styleNodes;
|
package/src/operations.ts
CHANGED
|
@@ -762,7 +762,6 @@ function readRawFlowAndStyle(flowPath: string): ReadRawResult {
|
|
|
762
762
|
type MutateMergedFlowMutator<E> = (flow: {
|
|
763
763
|
version: number;
|
|
764
764
|
name: string;
|
|
765
|
-
resetAction?: unknown;
|
|
766
765
|
nodes: Array<Record<string, unknown>>;
|
|
767
766
|
connectors: Array<Record<string, unknown>>;
|
|
768
767
|
}) => { kind: 'ok' } | E;
|
|
@@ -808,7 +807,6 @@ export async function mutateMergedFlow<E extends { kind: string }>(
|
|
|
808
807
|
const merged = inlinedFlow as unknown as {
|
|
809
808
|
version: number;
|
|
810
809
|
name: string;
|
|
811
|
-
resetAction?: unknown;
|
|
812
810
|
nodes: Array<Record<string, unknown>>;
|
|
813
811
|
connectors: Array<Record<string, unknown>>;
|
|
814
812
|
};
|
package/src/proxy.ts
CHANGED
|
@@ -16,7 +16,7 @@ import { realpathSync } from 'node:fs';
|
|
|
16
16
|
import { join, resolve, sep } from 'node:path';
|
|
17
17
|
import type { EventBus } from './events.ts';
|
|
18
18
|
import { type ProcessSpawner, type SpawnHandle, defaultProcessSpawner } from './process-spawner.ts';
|
|
19
|
-
import type { PlayAction
|
|
19
|
+
import type { PlayAction } from './schema.ts';
|
|
20
20
|
import { shortId } from './short-id.ts';
|
|
21
21
|
|
|
22
22
|
export interface PlayResult {
|
|
@@ -73,31 +73,6 @@ function resolveScript(cwd: string, nodeId: string, scriptPath: string): Resolve
|
|
|
73
73
|
return { ok: true, absPath: realTarget };
|
|
74
74
|
}
|
|
75
75
|
|
|
76
|
-
// Legacy anchor for resetAction (kept until resetAction gets its own design
|
|
77
|
-
// round). Same realpath escape check as resolveScript, but rooted at the
|
|
78
|
-
// project root rather than a per-node folder.
|
|
79
|
-
function resolveResetScript(cwd: string, scriptPath: string): Resolved {
|
|
80
|
-
const projectRoot = cwd;
|
|
81
|
-
let realRoot: string;
|
|
82
|
-
try {
|
|
83
|
-
realRoot = realpathSync(projectRoot);
|
|
84
|
-
} catch {
|
|
85
|
-
return { ok: false };
|
|
86
|
-
}
|
|
87
|
-
const target = resolve(projectRoot, scriptPath);
|
|
88
|
-
let realTarget: string;
|
|
89
|
-
try {
|
|
90
|
-
realTarget = realpathSync(target);
|
|
91
|
-
} catch {
|
|
92
|
-
return { ok: false };
|
|
93
|
-
}
|
|
94
|
-
const rootWithSep = realRoot.endsWith(sep) ? realRoot : realRoot + sep;
|
|
95
|
-
if (realTarget !== realRoot && !realTarget.startsWith(rootWithSep)) {
|
|
96
|
-
return { ok: false };
|
|
97
|
-
}
|
|
98
|
-
return { ok: true, absPath: realTarget };
|
|
99
|
-
}
|
|
100
|
-
|
|
101
76
|
// Copy `process.env` into a string-only record, then layer the per-run extras.
|
|
102
77
|
// Bun.spawn's env contract is `Record<string, string>` so the undefineds that
|
|
103
78
|
// `process.env` advertises in its type must be filtered out first.
|
|
@@ -130,54 +105,6 @@ async function writeStdinPayload(handle: SpawnHandle, input: unknown): Promise<v
|
|
|
130
105
|
}
|
|
131
106
|
}
|
|
132
107
|
|
|
133
|
-
// Live play-script handles indexed by flowId. Populated by runPlay() on spawn;
|
|
134
|
-
// entries are removed when each handle's `exited` promise resolves (success
|
|
135
|
-
// AND error paths). `stopAllPlays(flowId)` consults this map to terminate
|
|
136
|
-
// every in-flight play for a demo on /reset.
|
|
137
|
-
const livePlayHandles = new Map<string, Set<SpawnHandle>>();
|
|
138
|
-
|
|
139
|
-
function registerLiveHandle(flowId: string, handle: SpawnHandle): void {
|
|
140
|
-
let set = livePlayHandles.get(flowId);
|
|
141
|
-
if (!set) {
|
|
142
|
-
set = new Set();
|
|
143
|
-
livePlayHandles.set(flowId, set);
|
|
144
|
-
}
|
|
145
|
-
set.add(handle);
|
|
146
|
-
handle.exited.finally(() => {
|
|
147
|
-
const current = livePlayHandles.get(flowId);
|
|
148
|
-
if (!current) return;
|
|
149
|
-
current.delete(handle);
|
|
150
|
-
if (current.size === 0) livePlayHandles.delete(flowId);
|
|
151
|
-
});
|
|
152
|
-
}
|
|
153
|
-
|
|
154
|
-
async function killWithGrace(handle: SpawnHandle): Promise<void> {
|
|
155
|
-
handle.kill('SIGTERM');
|
|
156
|
-
let graceTimer: ReturnType<typeof setTimeout> | undefined;
|
|
157
|
-
const gracePromise = new Promise<'grace'>((res) => {
|
|
158
|
-
graceTimer = setTimeout(() => res('grace'), SIGKILL_GRACE_MS);
|
|
159
|
-
});
|
|
160
|
-
const winner = await Promise.race([handle.exited.then(() => 'exited' as const), gracePromise]);
|
|
161
|
-
if (graceTimer) clearTimeout(graceTimer);
|
|
162
|
-
if (winner === 'grace') {
|
|
163
|
-
handle.kill('SIGKILL');
|
|
164
|
-
await handle.exited;
|
|
165
|
-
}
|
|
166
|
-
}
|
|
167
|
-
|
|
168
|
-
// Kill every live play-script for `flowId` (SIGTERM → 2s grace → SIGKILL in
|
|
169
|
-
// parallel) and wait for each to exit. Idempotent on an unknown flowId. The
|
|
170
|
-
// map is keyed by flowId so a stop on demo A never touches demo B.
|
|
171
|
-
export async function stopAllPlays(flowId: string): Promise<void> {
|
|
172
|
-
const set = livePlayHandles.get(flowId);
|
|
173
|
-
if (!set || set.size === 0) return;
|
|
174
|
-
const handles = [...set];
|
|
175
|
-
// Clear eagerly so a parallel runPlay can't double-count an entry we're
|
|
176
|
-
// about to await on. The exited.finally() will no-op the second delete.
|
|
177
|
-
livePlayHandles.delete(flowId);
|
|
178
|
-
await Promise.all(handles.map((h) => killWithGrace(h)));
|
|
179
|
-
}
|
|
180
|
-
|
|
181
108
|
export async function runPlay(options: RunPlayOptions): Promise<PlayResult> {
|
|
182
109
|
const { events, flowId, nodeId, cwd, action } = options;
|
|
183
110
|
const spawner = options.spawner ?? defaultProcessSpawner;
|
|
@@ -229,8 +156,6 @@ export async function runPlay(options: RunPlayOptions): Promise<PlayResult> {
|
|
|
229
156
|
return { runId, error: message };
|
|
230
157
|
}
|
|
231
158
|
|
|
232
|
-
registerLiveHandle(flowId, handle);
|
|
233
|
-
|
|
234
159
|
// Drain stdout AND stderr CONCURRENTLY with the process running so OS pipe
|
|
235
160
|
// buffers (~64 KB) don't fill up and deadlock the child.
|
|
236
161
|
const stdoutPromise = new Response(handle.stdout).text();
|
|
@@ -303,120 +228,3 @@ export async function runPlay(options: RunPlayOptions): Promise<PlayResult> {
|
|
|
303
228
|
});
|
|
304
229
|
return { runId, error: message };
|
|
305
230
|
}
|
|
306
|
-
|
|
307
|
-
export interface RunResetOptions {
|
|
308
|
-
events: EventBus;
|
|
309
|
-
flowId: string;
|
|
310
|
-
/** Project root (`<repoPath>`). Script resolves under `<cwd>/`. */
|
|
311
|
-
cwd: string;
|
|
312
|
-
action: ResetAction;
|
|
313
|
-
/** Injectable for tests; defaults to `defaultProcessSpawner`. */
|
|
314
|
-
spawner?: ProcessSpawner;
|
|
315
|
-
}
|
|
316
|
-
|
|
317
|
-
export interface ResetResult {
|
|
318
|
-
ok: boolean;
|
|
319
|
-
body?: unknown;
|
|
320
|
-
error?: string;
|
|
321
|
-
}
|
|
322
|
-
|
|
323
|
-
// Run the demo's one-shot `resetAction` script. Same spawn discipline as
|
|
324
|
-
// runPlay (realpath-guarded scriptPath, concurrent stdout/stderr drain,
|
|
325
|
-
// optional stdin payload, SIGTERM→2s→SIGKILL escalation on timeout) but the
|
|
326
|
-
// lifecycle SSE event is the single `demo:reset` broadcast that mirrors the
|
|
327
|
-
// returned shape. Callers (the /reset endpoint) decide what HTTP status to
|
|
328
|
-
// surface; this returns `{ ok }` plus body/error so the endpoint can map.
|
|
329
|
-
export async function runReset(options: RunResetOptions): Promise<ResetResult> {
|
|
330
|
-
const { events, flowId, cwd, action } = options;
|
|
331
|
-
const spawner = options.spawner ?? defaultProcessSpawner;
|
|
332
|
-
|
|
333
|
-
// resetAction is anchored at the project root — design defers per-node
|
|
334
|
-
// resetAction to a later round (decision #7).
|
|
335
|
-
const resolved = resolveResetScript(cwd, action.scriptPath);
|
|
336
|
-
if (!resolved.ok) {
|
|
337
|
-
events.broadcast({
|
|
338
|
-
type: 'demo:reset',
|
|
339
|
-
flowId,
|
|
340
|
-
payload: { ok: false, error: SCRIPT_PATH_ESCAPE },
|
|
341
|
-
});
|
|
342
|
-
return { ok: false, error: SCRIPT_PATH_ESCAPE };
|
|
343
|
-
}
|
|
344
|
-
|
|
345
|
-
const wantsStdin = action.input !== undefined;
|
|
346
|
-
const env = buildChildEnv({ SEEFLOW_DEMO_ID: flowId });
|
|
347
|
-
|
|
348
|
-
let handle: SpawnHandle;
|
|
349
|
-
try {
|
|
350
|
-
handle = spawner.spawn({
|
|
351
|
-
cmd: [action.interpreter, ...(action.args ?? []), resolved.absPath],
|
|
352
|
-
cwd,
|
|
353
|
-
env,
|
|
354
|
-
stdin: wantsStdin ? 'pipe' : 'ignore',
|
|
355
|
-
});
|
|
356
|
-
} catch (err) {
|
|
357
|
-
const message = err instanceof Error ? err.message : String(err);
|
|
358
|
-
events.broadcast({
|
|
359
|
-
type: 'demo:reset',
|
|
360
|
-
flowId,
|
|
361
|
-
payload: { ok: false, error: message },
|
|
362
|
-
});
|
|
363
|
-
return { ok: false, error: message };
|
|
364
|
-
}
|
|
365
|
-
|
|
366
|
-
const stdoutPromise = new Response(handle.stdout).text();
|
|
367
|
-
const stderrPromise = new Response(handle.stderr).text();
|
|
368
|
-
|
|
369
|
-
if (wantsStdin) {
|
|
370
|
-
await writeStdinPayload(handle, action.input);
|
|
371
|
-
}
|
|
372
|
-
|
|
373
|
-
const timeoutMs = action.timeoutMs ?? DEFAULT_TIMEOUT_MS;
|
|
374
|
-
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
375
|
-
const timeoutPromise = new Promise<'timeout'>((res) => {
|
|
376
|
-
timer = setTimeout(() => res('timeout'), timeoutMs);
|
|
377
|
-
});
|
|
378
|
-
const exitPromise = handle.exited.then((code) => ({ code }) as const);
|
|
379
|
-
|
|
380
|
-
const race = await Promise.race([exitPromise, timeoutPromise]);
|
|
381
|
-
if (timer) clearTimeout(timer);
|
|
382
|
-
|
|
383
|
-
if (race === 'timeout') {
|
|
384
|
-
await killWithGrace(handle);
|
|
385
|
-
await Promise.allSettled([stdoutPromise, stderrPromise]);
|
|
386
|
-
const message = `reset script timed out after ${timeoutMs}ms`;
|
|
387
|
-
events.broadcast({
|
|
388
|
-
type: 'demo:reset',
|
|
389
|
-
flowId,
|
|
390
|
-
payload: { ok: false, error: message },
|
|
391
|
-
});
|
|
392
|
-
return { ok: false, error: message };
|
|
393
|
-
}
|
|
394
|
-
|
|
395
|
-
const code = race.code;
|
|
396
|
-
const [stdout, stderr] = await Promise.all([stdoutPromise, stderrPromise]);
|
|
397
|
-
|
|
398
|
-
if (code === 0) {
|
|
399
|
-
let body: unknown;
|
|
400
|
-
try {
|
|
401
|
-
body = JSON.parse(stdout);
|
|
402
|
-
} catch {
|
|
403
|
-
body = stdout;
|
|
404
|
-
}
|
|
405
|
-
events.broadcast({
|
|
406
|
-
type: 'demo:reset',
|
|
407
|
-
flowId,
|
|
408
|
-
payload: { ok: true, body },
|
|
409
|
-
});
|
|
410
|
-
return { ok: true, body };
|
|
411
|
-
}
|
|
412
|
-
|
|
413
|
-
const lastLine = lastNonEmptyLine(stderr);
|
|
414
|
-
const truncated = lastLine.slice(0, STDERR_TRUNCATE);
|
|
415
|
-
const message = truncated.length > 0 ? truncated : `reset script exited with code ${code}`;
|
|
416
|
-
events.broadcast({
|
|
417
|
-
type: 'demo:reset',
|
|
418
|
-
flowId,
|
|
419
|
-
payload: { ok: false, error: message },
|
|
420
|
-
});
|
|
421
|
-
return { ok: false, error: message };
|
|
422
|
-
}
|
package/src/schema-catalog.ts
CHANGED
|
@@ -27,7 +27,6 @@ import {
|
|
|
27
27
|
FlowTextNodeSchema,
|
|
28
28
|
FlowUserNodeSchema,
|
|
29
29
|
PlayActionSchema,
|
|
30
|
-
ResetActionSchema,
|
|
31
30
|
StatusActionSchema,
|
|
32
31
|
StatusReportSchema,
|
|
33
32
|
StyleSchema,
|
|
@@ -63,7 +62,7 @@ const CATEGORIES: SchemaCategory[] = [
|
|
|
63
62
|
{
|
|
64
63
|
name: 'action',
|
|
65
64
|
description:
|
|
66
|
-
'playAction, statusAction,
|
|
65
|
+
'playAction, statusAction, statusReport, plus componentAction (the set | script discriminated union dispatched on component-node action handles).',
|
|
67
66
|
},
|
|
68
67
|
{
|
|
69
68
|
name: 'componentSpec',
|
|
@@ -112,7 +111,6 @@ const PAYLOADS: Record<string, SchemaPayload> = {
|
|
|
112
111
|
schemas: {
|
|
113
112
|
playAction: toJsonSchema(PlayActionSchema),
|
|
114
113
|
statusAction: toJsonSchema(StatusActionSchema),
|
|
115
|
-
resetAction: toJsonSchema(ResetActionSchema),
|
|
116
114
|
statusReport: toJsonSchema(StatusReportSchema),
|
|
117
115
|
componentAction: toJsonSchema(ComponentActionSchema),
|
|
118
116
|
},
|
package/src/schema.ts
CHANGED
|
@@ -115,9 +115,6 @@ export const ScriptActionSchema = z.object({
|
|
|
115
115
|
|
|
116
116
|
export const PlayActionSchema = ScriptActionSchema;
|
|
117
117
|
|
|
118
|
-
// resetAction is a one-shot script with the same shape as a play script.
|
|
119
|
-
export const ResetActionSchema = ScriptActionSchema;
|
|
120
|
-
|
|
121
118
|
// Long-running status script. Same spawn shape as ScriptAction (interpreter +
|
|
122
119
|
// args + scriptPath) but no stdin payload and a much longer max lifetime since
|
|
123
120
|
// these processes tick continuously and stream StatusReports to stdout.
|
|
@@ -395,10 +392,6 @@ export const ResolvedFlowSchema = z
|
|
|
395
392
|
description: z.string().optional(),
|
|
396
393
|
nodes: z.array(NodeSchema),
|
|
397
394
|
connectors: z.array(ConnectorSchema),
|
|
398
|
-
// Optional one-shot script the studio runs when the user clicks Restart.
|
|
399
|
-
// The studio kills every live play + status script for the flow BEFORE
|
|
400
|
-
// invoking this script, so the script sees no stragglers.
|
|
401
|
-
resetAction: ResetActionSchema.optional(),
|
|
402
395
|
})
|
|
403
396
|
.superRefine((resolved, ctx) => {
|
|
404
397
|
const nodeIds = new Set(resolved.nodes.map((n) => n.id));
|
|
@@ -476,7 +469,6 @@ export type EdgePinSide = z.infer<typeof EdgePinSideSchema>;
|
|
|
476
469
|
export type PlayAction = z.infer<typeof PlayActionSchema>;
|
|
477
470
|
export type StatusAction = z.infer<typeof StatusActionSchema>;
|
|
478
471
|
export type StatusReport = z.infer<typeof StatusReportSchema>;
|
|
479
|
-
export type ResetAction = z.infer<typeof ResetActionSchema>;
|
|
480
472
|
export type StateSource = z.infer<typeof StateSourceSchema>;
|
|
481
473
|
|
|
482
474
|
// =============================================================================
|
|
@@ -648,7 +640,6 @@ export const FlowSchema = z
|
|
|
648
640
|
version: z.literal(2),
|
|
649
641
|
name: z.string().min(1),
|
|
650
642
|
description: z.string().optional(),
|
|
651
|
-
resetAction: ResetActionSchema.optional(),
|
|
652
643
|
nodes: z.array(FlowNodeSchema),
|
|
653
644
|
connectors: z.array(FlowConnectorSchema),
|
|
654
645
|
})
|
|
@@ -687,7 +678,6 @@ export const FlowEnvelopeSchema = z
|
|
|
687
678
|
version: z.literal(2),
|
|
688
679
|
name: z.string().min(1),
|
|
689
680
|
description: z.string().optional(),
|
|
690
|
-
resetAction: ResetActionSchema.optional(),
|
|
691
681
|
nodes: z.array(z.unknown().describe('See `seeflow schema node`')),
|
|
692
682
|
connectors: z.array(z.unknown().describe('See `seeflow schema connector`')),
|
|
693
683
|
})
|
package/src/server.ts
CHANGED
|
@@ -52,8 +52,7 @@ export interface CreateAppOptions {
|
|
|
52
52
|
* proxy.ts pick `defaultProcessSpawner`. Tests use this to drive runPlay
|
|
53
53
|
* with an in-memory fake spawner. */
|
|
54
54
|
processSpawner?: ProcessSpawner;
|
|
55
|
-
/** Inject a ProxyFacade — tests use this to short-circuit runPlay
|
|
56
|
-
* runReset / stopAllPlays and assert call order. */
|
|
55
|
+
/** Inject a ProxyFacade — tests use this to short-circuit runPlay. */
|
|
57
56
|
proxy?: ProxyFacade;
|
|
58
57
|
/** Per-process token gating `Origin: null` requests (sandboxed MCP App
|
|
59
58
|
* iframe). Generated at studio boot; delivered to the iframe via
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{U as a,C as n}from"./mermaid.core-ClLm1p66.js";const t=(r,o)=>a.lang.round(n.parse(r)[o]);export{t as c};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,a as s,c as e,C as t}from"./chunk-727SXJPM-ZXC_1s3s.js";import{a as i}from"./mermaid.core-ClLm1p66.js";import"./index-Cnz1Cpa9.js";import"./chunk-FMBD7UC4-D8IemyXd.js";import"./chunk-ND2GUHAM-aT_PIEvu.js";import"./chunk-55IACEB6-CZ6tcHFC.js";import"./chunk-2J33WTMH-CQFLt-Og.js";import"./purify.es-CLGrRn1w.js";import"./step-CWvwoXpJ.js";var b={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{b as diagram};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{s as a,a as s,c as e,C as t}from"./chunk-727SXJPM-ZXC_1s3s.js";import{a as i}from"./mermaid.core-ClLm1p66.js";import"./index-Cnz1Cpa9.js";import"./chunk-FMBD7UC4-D8IemyXd.js";import"./chunk-ND2GUHAM-aT_PIEvu.js";import"./chunk-55IACEB6-CZ6tcHFC.js";import"./chunk-2J33WTMH-CQFLt-Og.js";import"./purify.es-CLGrRn1w.js";import"./step-CWvwoXpJ.js";var b={parser:e,get db(){return new t},renderer:s,styles:a,init:i(r=>{r.class||(r.class={}),r.class.arrowMarkerAbsolute=r.arrowMarkerAbsolute},"init")};export{b as diagram};
|