@tuongaz/seeflow 0.1.83 → 0.1.84

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 (63) hide show
  1. package/dist/web/assets/{architectureDiagram-3BPJPVTR-CHtgIZZ1.js → architectureDiagram-3BPJPVTR-I46aqv2T.js} +1 -1
  2. package/dist/web/assets/{blockDiagram-GPEHLZMM-D4zjpGBX.js → blockDiagram-GPEHLZMM-C08px5xi.js} +1 -1
  3. package/dist/web/assets/{c4Diagram-AAUBKEIU-zSpjD7ZC.js → c4Diagram-AAUBKEIU-iyIMetcW.js} +1 -1
  4. package/dist/web/assets/channel-X0ALvlnb.js +1 -0
  5. package/dist/web/assets/{chart-D6WVIyqJ.js → chart-BGNzA0s8.js} +1 -1
  6. package/dist/web/assets/{chunk-2J33WTMH-Cr7utMp9.js → chunk-2J33WTMH-CQFLt-Og.js} +1 -1
  7. package/dist/web/assets/{chunk-4BX2VUAB-B6PCB6H4.js → chunk-4BX2VUAB-M_HU7fhX.js} +1 -1
  8. package/dist/web/assets/{chunk-55IACEB6-D_PUAOtb.js → chunk-55IACEB6-CZ6tcHFC.js} +1 -1
  9. package/dist/web/assets/{chunk-727SXJPM-DTQLQ_nx.js → chunk-727SXJPM-ZXC_1s3s.js} +1 -1
  10. package/dist/web/assets/{chunk-AQP2D5EJ-OBgrFsDS.js → chunk-AQP2D5EJ-D1nyTSxR.js} +1 -1
  11. package/dist/web/assets/{chunk-FMBD7UC4-Cqo28fuY.js → chunk-FMBD7UC4-D8IemyXd.js} +1 -1
  12. package/dist/web/assets/{chunk-ND2GUHAM-DcquCeO4.js → chunk-ND2GUHAM-aT_PIEvu.js} +1 -1
  13. package/dist/web/assets/{chunk-QZHKN3VN-SKsRSBcC.js → chunk-QZHKN3VN-BKY6KT8K.js} +1 -1
  14. package/dist/web/assets/classDiagram-4FO5ZUOK-mwGbzVrI.js +1 -0
  15. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-mwGbzVrI.js +1 -0
  16. package/dist/web/assets/{code-block-CQcwHam8.js → code-block-CMPt7Auf.js} +1 -1
  17. package/dist/web/assets/{cose-bilkent-S5V4N54A-Ds8DGArP.js → cose-bilkent-S5V4N54A-Cr3EeHXE.js} +1 -1
  18. package/dist/web/assets/{dagre-BM42HDAG-CqMyTq3c.js → dagre-BM42HDAG-BfJiRz9t.js} +1 -1
  19. package/dist/web/assets/{diagram-2AECGRRQ-CWEIApTd.js → diagram-2AECGRRQ-CZ1Rti0o.js} +1 -1
  20. package/dist/web/assets/{diagram-5GNKFQAL-8TEzgir4.js → diagram-5GNKFQAL-COe7jS3C.js} +1 -1
  21. package/dist/web/assets/{diagram-KO2AKTUF-UNKtOw9m.js → diagram-KO2AKTUF-lmIy3eJx.js} +1 -1
  22. package/dist/web/assets/{diagram-LMA3HP47-D6QoRbi6.js → diagram-LMA3HP47-Dv9UOOZz.js} +1 -1
  23. package/dist/web/assets/{diagram-OG6HWLK6-CQqkl0nk.js → diagram-OG6HWLK6-C8HoI5ul.js} +1 -1
  24. package/dist/web/assets/{erDiagram-TEJ5UH35-Clv5A-5B.js → erDiagram-TEJ5UH35-CvqQcwx_.js} +1 -1
  25. package/dist/web/assets/{flowDiagram-I6XJVG4X-4hg7rn9v.js → flowDiagram-I6XJVG4X-B0f8FFr8.js} +1 -1
  26. package/dist/web/assets/{ganttDiagram-6RSMTGT7-3PAgpAEA.js → ganttDiagram-6RSMTGT7-C0FgETUZ.js} +1 -1
  27. package/dist/web/assets/{gitGraphDiagram-PVQCEYII-D5g_5z1o.js → gitGraphDiagram-PVQCEYII-BSUklsqu.js} +1 -1
  28. package/dist/web/assets/{index-CaE1zYAX.js → index-Cnz1Cpa9.js} +5 -5
  29. package/dist/web/assets/{index.es-Cgv8Vcjx.js → index.es-CcTdlE2B.js} +1 -1
  30. package/dist/web/assets/{infoDiagram-5YYISTIA-BuFXAl4D.js → infoDiagram-5YYISTIA-qq3OPeKx.js} +1 -1
  31. package/dist/web/assets/{ishikawaDiagram-YF4QCWOH-DOE-GUy-.js → ishikawaDiagram-YF4QCWOH-BxoH_vWZ.js} +1 -1
  32. package/dist/web/assets/{journeyDiagram-JHISSGLW-B5BXjJgy.js → journeyDiagram-JHISSGLW-ClnMLnWd.js} +1 -1
  33. package/dist/web/assets/{jspdf.es.min-_GQ7N2xd.js → jspdf.es.min-C17Fkx-5.js} +3 -3
  34. package/dist/web/assets/{kanban-definition-UN3LZRKU-DTLQ2kuG.js → kanban-definition-UN3LZRKU-BiBGcvgP.js} +1 -1
  35. package/dist/web/assets/{linear-DCKgJuDe.js → linear-D--UMRYt.js} +1 -1
  36. package/dist/web/assets/{markdown-DQ9_ZAvJ.js → markdown-D-hxiBfP.js} +1 -1
  37. package/dist/web/assets/{mermaid.core-Cf2CUPpR.js → mermaid.core-ClLm1p66.js} +4 -4
  38. package/dist/web/assets/{mindmap-definition-RKZ34NQL-CI-_BCCZ.js → mindmap-definition-RKZ34NQL-CLSXYvAW.js} +1 -1
  39. package/dist/web/assets/{pieDiagram-4H26LBE5-BdTv4DaU.js → pieDiagram-4H26LBE5-CjvKFGOn.js} +1 -1
  40. package/dist/web/assets/{quadrantDiagram-W4KKPZXB-pqQ7pKT1.js → quadrantDiagram-W4KKPZXB-BUYqMtGH.js} +1 -1
  41. package/dist/web/assets/{requirementDiagram-4Y6WPE33-CCP9fYhL.js → requirementDiagram-4Y6WPE33-DNCHy1eI.js} +1 -1
  42. package/dist/web/assets/{sankeyDiagram-5OEKKPKP-CpMAd0Mj.js → sankeyDiagram-5OEKKPKP-zoL2eKAM.js} +1 -1
  43. package/dist/web/assets/{sequenceDiagram-3UESZ5HK-BWg19eGL.js → sequenceDiagram-3UESZ5HK-DePRNn1e.js} +1 -1
  44. package/dist/web/assets/{stateDiagram-AJRCARHV-BliITsKN.js → stateDiagram-AJRCARHV-uLinqFcr.js} +1 -1
  45. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-hyQj-KY3.js +1 -0
  46. package/dist/web/assets/{time-Dqs-aHL0.js → time-C9xT3sm_.js} +1 -1
  47. package/dist/web/assets/{timeline-definition-PNZ67QCA-Bk8P84Jg.js → timeline-definition-PNZ67QCA-BnQVT-CY.js} +1 -1
  48. package/dist/web/assets/{vennDiagram-CIIHVFJN-CMtXVM_H.js → vennDiagram-CIIHVFJN-BUyqbvsU.js} +1 -1
  49. package/dist/web/assets/{wardley-L42UT6IY-CHP-BfXr.js → wardley-L42UT6IY-zz-5TvX0.js} +1 -1
  50. package/dist/web/assets/{wardleyDiagram-YWT4CUSO-DInIu6_2.js → wardleyDiagram-YWT4CUSO-DVnYIARL.js} +1 -1
  51. package/dist/web/assets/{xychartDiagram-2RQKCTM6-B0gobaUy.js → xychartDiagram-2RQKCTM6-BMxn2lA_.js} +1 -1
  52. package/dist/web/index.html +1 -1
  53. package/package.json +1 -1
  54. package/src/api.ts +2 -17
  55. package/src/cli-helpers.ts +3 -0
  56. package/src/cli-manifest.ts +60 -14
  57. package/src/cli.ts +75 -5
  58. package/src/operations.ts +77 -2
  59. package/src/project-scanner.ts +18 -0
  60. package/dist/web/assets/channel-CXa0j4Re.js +0 -1
  61. package/dist/web/assets/classDiagram-4FO5ZUOK-DGPggFxp.js +0 -1
  62. package/dist/web/assets/classDiagram-v2-Q7XG4LA2-DGPggFxp.js +0 -1
  63. package/dist/web/assets/stateDiagram-v2-BHNVJYJU-BCerI8Jf.js +0 -1
package/src/cli.ts CHANGED
@@ -178,6 +178,8 @@ if (argv.includes('--version') || argv.includes('-v')) {
178
178
  await runRegister();
179
179
  } else if (sub === 'projects:create') {
180
180
  await runProjectsCreate();
181
+ } else if (sub === 'projects:list') {
182
+ await runProjectsList();
181
183
  } else if (sub === 'flows:list') {
182
184
  await runFlowsList();
183
185
  } else if (sub === 'flows:summary') {
@@ -243,10 +245,11 @@ Usage:
243
245
  Commands (work without a running studio):
244
246
  start Start the SeeFlow Studio server (default port 4321) — default when no command is given
245
247
  stop Stop a background studio instance
246
- register Register a demo repo, writing to ~/.seeflow/registry.json (alias of flows:register)
247
- flows:register Register a demo repo
248
+ register Register a demo repo. Manifest-aware: when <repoPath>/seeflow.json exists, re-scans every declared flow; otherwise reads <repoPath>/<flow> (defaults to flow.json) as a single-flow project (alias of flows:register)
249
+ flows:register Register a demo repo (manifest-aware — same behaviour as register)
248
250
  projects:create Scaffold a new project (writes <path>/seeflow.json + <path>/flows/main/flow.json) — (--path <dir> --name <name> [--description <text>])
249
- flows:list List registered flows
251
+ projects:list List every registered project with projectSlug, name, defaultFlow, flowCount
252
+ flows:list List registered flows. With --project <p>, filters to one project (returns flowSlug, name, icon?, isDefault per flow)
250
253
  flows:summary List registered flows (id + name + description only)
251
254
  flows:get Get flow details (--project <p> --flow <f>)
252
255
  flows:graph List nodes + connectors without inlined file content (--project <p> --flow <f>)
@@ -594,12 +597,24 @@ function isEsrch(err: unknown): boolean {
594
597
 
595
598
  async function runRegister() {
596
599
  const repoPath = resolve(flagValue('path') ?? '.');
597
- const demoPathArg = flagValue('flow') ?? DEFAULT_FLOW_PATH;
598
600
 
601
+ // Manifest-aware path: if <repoPath>/seeflow.json is on disk, scan and
602
+ // upsert every declared flow in one shot.
603
+ if (existsSync(join(repoPath, 'seeflow.json'))) {
604
+ await runRegisterManifest(repoPath);
605
+ return;
606
+ }
607
+
608
+ // Legacy single-flow path: pre-manifest projects (and skill tests that
609
+ // exercise registerFlow directly) still pass a bare flow.json at the
610
+ // root. Read it, schema-validate, upsert one entry.
611
+ const demoPathArg = flagValue('flow') ?? DEFAULT_FLOW_PATH;
599
612
  const fullPath = isAbsolute(demoPathArg) ? demoPathArg : join(repoPath, demoPathArg);
600
613
  if (!existsSync(fullPath)) {
601
614
  console.error(`No demo file at ${fullPath}`);
602
- console.error(`Create ${DEFAULT_FLOW_PATH} in your repo, or pass --flow <path>.`);
615
+ console.error(
616
+ `Create ${DEFAULT_FLOW_PATH} in your repo, or pass --flow <path>. For manifest-driven projects, place a seeflow.json at the repo root.`,
617
+ );
603
618
  process.exit(1);
604
619
  }
605
620
 
@@ -643,6 +658,48 @@ async function runRegister() {
643
658
  }
644
659
  }
645
660
 
661
+ async function runRegisterManifest(repoPath: string) {
662
+ const outcome = registerProject({ repoPath });
663
+ if (outcome.kind !== 'ok') {
664
+ switch (outcome.kind) {
665
+ case 'manifest-invalid':
666
+ console.error(`${join(repoPath, 'seeflow.json')} is invalid: ${outcome.message}`);
667
+ process.exit(2);
668
+ break;
669
+ case 'manifest-missing':
670
+ // Defensive — runRegister gated on existsSync, so this should not fire.
671
+ console.error(`No seeflow.json at ${repoPath}`);
672
+ process.exit(3);
673
+ break;
674
+ case 'legacy-root-flow':
675
+ console.error(
676
+ `${repoPath} has a legacy root flow.json but no seeflow.json. Migrate it into the new flows/<id>/ layout before re-registering.`,
677
+ );
678
+ process.exit(3);
679
+ break;
680
+ case 'flow-json-missing':
681
+ console.error(
682
+ `Manifest declares flow "${outcome.flowId}" but ${outcome.flowPath} is missing.`,
683
+ );
684
+ process.exit(3);
685
+ break;
686
+ }
687
+ process.exit(1);
688
+ }
689
+
690
+ const pid = readPid();
691
+ const live = pid !== undefined && isPidAlive(pid);
692
+ const overrideUrl = process.env.SEEFLOW_STUDIO_URL?.replace(/\/+$/, '');
693
+ const baseUrl = live ? (overrideUrl ?? studioUrl(readConfig())) : null;
694
+
695
+ for (const entry of outcome.entries) {
696
+ const tail = baseUrl
697
+ ? ` → ${baseUrl}/projects/${outcome.projectSlug}/flows/${entry.flowSlug}`
698
+ : ` (slug: ${entry.slug})`;
699
+ console.log(`Registered "${entry.name}"${tail}`);
700
+ }
701
+ }
702
+
646
703
  async function ensureStudioRunning(url: string, port: number, noStart: boolean) {
647
704
  if (await healthOk(url)) return;
648
705
 
@@ -709,10 +766,23 @@ async function runProjectsCreate() {
709
766
 
710
767
  async function runFlowsList() {
711
768
  const ops = createCliOperations();
769
+ const project = flagValue('project');
770
+ if (project) {
771
+ const result = ops.listFlowsByProject(project);
772
+ if (result.kind !== 'ok') printOutcome(result);
773
+ printOk({ projectSlug: result.data.projectSlug, flows: result.data.flows });
774
+ return;
775
+ }
712
776
  const result = ops.listFlows();
713
777
  printOk({ flows: result.data });
714
778
  }
715
779
 
780
+ function runProjectsList() {
781
+ const ops = createCliOperations();
782
+ const result = ops.listProjects();
783
+ printOk({ projects: result.data });
784
+ }
785
+
716
786
  async function runFlowsSummary() {
717
787
  const ops = createCliOperations();
718
788
  const result = ops.listFlowsSummary();
package/src/operations.ts CHANGED
@@ -22,8 +22,8 @@ import {
22
22
  removeNodeDir,
23
23
  writeNodeFile,
24
24
  } from './node-files.ts';
25
- import { scanProject } from './project-scanner.ts';
26
- import { type Registry, slugify } from './registry.ts';
25
+ import { readProjectManifest, scanProject } from './project-scanner.ts';
26
+ import { type FlowEntry, type Registry, slugify } from './registry.ts';
27
27
  import {
28
28
  ColorTokenSchema,
29
29
  ComponentSpecSchema,
@@ -404,6 +404,31 @@ export interface CreateProjectSuccess {
404
404
 
405
405
  export type ListFlowsOutcome = { kind: 'ok'; data: FlowListItem[] };
406
406
 
407
+ export interface ProjectListItem {
408
+ projectSlug: string;
409
+ name: string;
410
+ description?: string;
411
+ defaultFlow: string;
412
+ flowCount: number;
413
+ repoPath: string;
414
+ }
415
+
416
+ export type ListProjectsOutcome = { kind: 'ok'; data: ProjectListItem[] };
417
+
418
+ export interface ProjectFlowListItem {
419
+ id: string;
420
+ slug: string;
421
+ flowSlug: string;
422
+ name: string;
423
+ icon?: string;
424
+ isDefault: boolean;
425
+ valid: boolean;
426
+ }
427
+
428
+ export type ListFlowsByProjectOutcome =
429
+ | { kind: 'ok'; data: { projectSlug: string; flows: ProjectFlowListItem[] } }
430
+ | { kind: 'projectNotFound'; projectSlug: string };
431
+
407
432
  // Minimal projection for agent/CLI discovery — `description` and `name` come
408
433
  // from the live watcher snapshot when available so author edits to flow.json
409
434
  // surface immediately; fall back to the registry value at startup before
@@ -951,6 +976,52 @@ export function listDemosImpl(deps: OperationsDeps): ListFlowsOutcome {
951
976
  return { kind: 'ok', data };
952
977
  }
953
978
 
979
+ export function listProjectsImpl(deps: OperationsDeps): ListProjectsOutcome {
980
+ const grouped = new Map<string, FlowEntry[]>();
981
+ for (const entry of deps.registry.list()) {
982
+ const existing = grouped.get(entry.projectSlug);
983
+ if (existing) existing.push(entry);
984
+ else grouped.set(entry.projectSlug, [entry]);
985
+ }
986
+ const data: ProjectListItem[] = [];
987
+ for (const [projectSlug, entries] of grouped) {
988
+ const head = entries[0];
989
+ if (!head) continue;
990
+ const manifest = readProjectManifest(head.repoPath);
991
+ const defaultEntry = entries.find((e) => e.isDefault) ?? head;
992
+ data.push({
993
+ projectSlug,
994
+ name: manifest?.name ?? projectSlug,
995
+ ...(manifest?.description !== undefined ? { description: manifest.description } : {}),
996
+ defaultFlow: manifest?.defaultFlow ?? defaultEntry.flowSlug,
997
+ flowCount: entries.length,
998
+ repoPath: head.repoPath,
999
+ });
1000
+ }
1001
+ return { kind: 'ok', data };
1002
+ }
1003
+
1004
+ export function listFlowsByProjectImpl(
1005
+ deps: OperationsDeps,
1006
+ projectSlug: string,
1007
+ ): ListFlowsByProjectOutcome {
1008
+ const entries = deps.registry.list().filter((e) => e.projectSlug === projectSlug);
1009
+ if (entries.length === 0) return { kind: 'projectNotFound', projectSlug };
1010
+ const flows: ProjectFlowListItem[] = entries.map((e) => {
1011
+ const fileExists = existsSync(resolveFilePath(e.repoPath, e.flowPath));
1012
+ return {
1013
+ id: e.id,
1014
+ slug: e.slug,
1015
+ flowSlug: e.flowSlug,
1016
+ name: e.name,
1017
+ ...(e.icon !== undefined ? { icon: e.icon } : {}),
1018
+ isDefault: e.isDefault,
1019
+ valid: e.valid && fileExists,
1020
+ };
1021
+ });
1022
+ return { kind: 'ok', data: { projectSlug, flows } };
1023
+ }
1024
+
954
1025
  export function listFlowsSummaryImpl(deps: OperationsDeps): ListFlowsSummaryOutcome {
955
1026
  const { registry, watcher } = deps;
956
1027
  const data = registry.list().map((e) => {
@@ -1899,6 +1970,8 @@ export async function applyLayoutImpl(
1899
1970
  export interface Operations {
1900
1971
  listFlows(): ReturnType<typeof listDemosImpl>;
1901
1972
  listFlowsSummary(): ReturnType<typeof listFlowsSummaryImpl>;
1973
+ listProjects(): ReturnType<typeof listProjectsImpl>;
1974
+ listFlowsByProject(projectSlug: string): ReturnType<typeof listFlowsByProjectImpl>;
1902
1975
  getFlow(id: string): ReturnType<typeof getFlowImpl>;
1903
1976
  getFlowGraph(id: string): ReturnType<typeof getFlowGraphImpl>;
1904
1977
  getNode(flowId: string, nodeId: string): ReturnType<typeof getNodeImpl>;
@@ -1946,6 +2019,8 @@ export function createOperations(deps: OperationsDeps): Operations {
1946
2019
  return {
1947
2020
  listFlows: () => listDemosImpl(deps),
1948
2021
  listFlowsSummary: () => listFlowsSummaryImpl(deps),
2022
+ listProjects: () => listProjectsImpl(deps),
2023
+ listFlowsByProject: (projectSlug) => listFlowsByProjectImpl(deps, projectSlug),
1949
2024
  getFlow: (id) => getFlowImpl(deps, id),
1950
2025
  getFlowGraph: (id) => getFlowGraphImpl(deps, id),
1951
2026
  getNode: (flowId, nodeId) => getNodeImpl(deps, flowId, nodeId),
@@ -47,6 +47,24 @@ export type ScanResult =
47
47
  const MANIFEST_FILENAME = 'seeflow.json';
48
48
  const LEGACY_FLOW_FILENAME = 'flow.json';
49
49
 
50
+ /**
51
+ * Best-effort manifest read for listing routes / CLI listing verbs.
52
+ * Returns `null` when the manifest is missing or malformed — callers fall
53
+ * back to derived defaults (projectSlug, isDefault entry) so one broken
54
+ * project does not collapse the whole listing.
55
+ */
56
+ export function readProjectManifest(repoPath: string): SeeflowManifest | null {
57
+ const manifestPath = join(repoPath, MANIFEST_FILENAME);
58
+ if (!existsSync(manifestPath)) return null;
59
+ try {
60
+ const raw = JSON.parse(readFileSync(manifestPath, 'utf8'));
61
+ const parsed = SeeflowManifestSchema.safeParse(raw);
62
+ return parsed.success ? parsed.data : null;
63
+ } catch {
64
+ return null;
65
+ }
66
+ }
67
+
50
68
  export function scanProject(repoPath: string): ScanResult {
51
69
  const manifestPath = join(repoPath, MANIFEST_FILENAME);
52
70
  if (!existsSync(manifestPath)) {
@@ -1 +0,0 @@
1
- import{U as a,C as n}from"./mermaid.core-Cf2CUPpR.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-DTQLQ_nx.js";import{a as i}from"./mermaid.core-Cf2CUPpR.js";import"./index-CaE1zYAX.js";import"./chunk-FMBD7UC4-Cqo28fuY.js";import"./chunk-ND2GUHAM-DcquCeO4.js";import"./chunk-55IACEB6-D_PUAOtb.js";import"./chunk-2J33WTMH-Cr7utMp9.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-DTQLQ_nx.js";import{a as i}from"./mermaid.core-Cf2CUPpR.js";import"./index-CaE1zYAX.js";import"./chunk-FMBD7UC4-Cqo28fuY.js";import"./chunk-ND2GUHAM-DcquCeO4.js";import"./chunk-55IACEB6-D_PUAOtb.js";import"./chunk-2J33WTMH-Cr7utMp9.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{b as r,a as e,s as a,S as s}from"./chunk-AQP2D5EJ-OBgrFsDS.js";import{a as i}from"./mermaid.core-Cf2CUPpR.js";import"./index-CaE1zYAX.js";import"./chunk-55IACEB6-D_PUAOtb.js";import"./chunk-2J33WTMH-Cr7utMp9.js";import"./purify.es-CLGrRn1w.js";import"./step-CWvwoXpJ.js";var n={parser:a,get db(){return new s(2)},renderer:e,styles:r,init:i(t=>{t.state||(t.state={}),t.state.arrowMarkerAbsolute=t.arrowMarkerAbsolute},"init")};export{n as diagram};