@bian-womp/spark-workbench 0.3.88 → 0.3.89

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 (169) hide show
  1. package/lib/src/adapters/cli/index.d.ts +22 -0
  2. package/lib/src/adapters/cli/index.d.ts.map +1 -0
  3. package/lib/src/adapters/cli/index.js +50 -0
  4. package/lib/src/adapters/cli/index.js.map +1 -0
  5. package/lib/src/core/AbstractWorkbench.d.ts +40 -0
  6. package/lib/src/core/AbstractWorkbench.d.ts.map +1 -0
  7. package/lib/src/core/AbstractWorkbench.js +15 -0
  8. package/lib/src/core/AbstractWorkbench.js.map +1 -0
  9. package/lib/src/core/InMemoryWorkbench.d.ts +304 -0
  10. package/lib/src/core/InMemoryWorkbench.d.ts.map +1 -0
  11. package/lib/src/core/InMemoryWorkbench.js +1016 -0
  12. package/lib/src/core/InMemoryWorkbench.js.map +1 -0
  13. package/lib/src/core/contracts.d.ts +172 -0
  14. package/lib/src/core/contracts.d.ts.map +1 -0
  15. package/lib/src/core/contracts.js +2 -0
  16. package/lib/src/core/contracts.js.map +1 -0
  17. package/lib/src/core/ui-extensions.d.ts +85 -0
  18. package/lib/src/core/ui-extensions.d.ts.map +1 -0
  19. package/lib/src/core/ui-extensions.js +111 -0
  20. package/lib/src/core/ui-extensions.js.map +1 -0
  21. package/lib/src/examples/cli.d.ts +2 -0
  22. package/lib/src/examples/cli.d.ts.map +1 -0
  23. package/lib/src/examples/cli.js +244 -0
  24. package/lib/src/examples/cli.js.map +1 -0
  25. package/lib/src/examples/reactflow/App.d.ts +2 -0
  26. package/lib/src/examples/reactflow/App.d.ts.map +1 -0
  27. package/lib/src/examples/reactflow/App.js +20 -0
  28. package/lib/src/examples/reactflow/App.js.map +1 -0
  29. package/lib/src/index.d.ts +30 -0
  30. package/lib/src/index.d.ts.map +1 -0
  31. package/lib/src/index.js +30 -0
  32. package/lib/src/index.js.map +1 -0
  33. package/lib/src/misc/DebugEvents.d.ts +7 -0
  34. package/lib/src/misc/DebugEvents.d.ts.map +1 -0
  35. package/lib/src/misc/DebugEvents.js +51 -0
  36. package/lib/src/misc/DebugEvents.js.map +1 -0
  37. package/lib/src/misc/DefaultEdge.d.ts +5 -0
  38. package/lib/src/misc/DefaultEdge.d.ts.map +1 -0
  39. package/lib/src/misc/DefaultEdge.js +15 -0
  40. package/lib/src/misc/DefaultEdge.js.map +1 -0
  41. package/lib/src/misc/DefaultNode.d.ts +5 -0
  42. package/lib/src/misc/DefaultNode.d.ts.map +1 -0
  43. package/lib/src/misc/DefaultNode.js +25 -0
  44. package/lib/src/misc/DefaultNode.js.map +1 -0
  45. package/lib/src/misc/DefaultNodeContent.d.ts +4 -0
  46. package/lib/src/misc/DefaultNodeContent.d.ts.map +1 -0
  47. package/lib/src/misc/DefaultNodeContent.js +58 -0
  48. package/lib/src/misc/DefaultNodeContent.js.map +1 -0
  49. package/lib/src/misc/DefaultNodeHeader.d.ts +13 -0
  50. package/lib/src/misc/DefaultNodeHeader.d.ts.map +1 -0
  51. package/lib/src/misc/DefaultNodeHeader.js +78 -0
  52. package/lib/src/misc/DefaultNodeHeader.js.map +1 -0
  53. package/lib/src/misc/Inspector.d.ts +12 -0
  54. package/lib/src/misc/Inspector.d.ts.map +1 -0
  55. package/lib/src/misc/Inspector.js +253 -0
  56. package/lib/src/misc/Inspector.js.map +1 -0
  57. package/lib/src/misc/IssueBadge.d.ts +7 -0
  58. package/lib/src/misc/IssueBadge.d.ts.map +1 -0
  59. package/lib/src/misc/IssueBadge.js +7 -0
  60. package/lib/src/misc/IssueBadge.js.map +1 -0
  61. package/lib/src/misc/KeyboardShortcutToast.d.ts +16 -0
  62. package/lib/src/misc/KeyboardShortcutToast.d.ts.map +1 -0
  63. package/lib/src/misc/KeyboardShortcutToast.js +40 -0
  64. package/lib/src/misc/KeyboardShortcutToast.js.map +1 -0
  65. package/lib/src/misc/NodeHandles.d.ts +18 -0
  66. package/lib/src/misc/NodeHandles.d.ts.map +1 -0
  67. package/lib/src/misc/NodeHandles.js +67 -0
  68. package/lib/src/misc/NodeHandles.js.map +1 -0
  69. package/lib/src/misc/SelectionActiveSync.d.ts +10 -0
  70. package/lib/src/misc/SelectionActiveSync.d.ts.map +1 -0
  71. package/lib/src/misc/SelectionActiveSync.js +21 -0
  72. package/lib/src/misc/SelectionActiveSync.js.map +1 -0
  73. package/lib/src/misc/WorkbenchCanvas.d.ts +23 -0
  74. package/lib/src/misc/WorkbenchCanvas.d.ts.map +1 -0
  75. package/lib/src/misc/WorkbenchCanvas.js +669 -0
  76. package/lib/src/misc/WorkbenchCanvas.js.map +1 -0
  77. package/lib/src/misc/WorkbenchStudio.d.ts +43 -0
  78. package/lib/src/misc/WorkbenchStudio.d.ts.map +1 -0
  79. package/lib/src/misc/WorkbenchStudio.js +463 -0
  80. package/lib/src/misc/WorkbenchStudio.js.map +1 -0
  81. package/lib/src/misc/constants.d.ts +4 -0
  82. package/lib/src/misc/constants.d.ts.map +1 -0
  83. package/lib/src/misc/constants.js +5 -0
  84. package/lib/src/misc/constants.js.map +1 -0
  85. package/lib/src/misc/context/WorkbenchContext.d.ts +133 -0
  86. package/lib/src/misc/context/WorkbenchContext.d.ts.map +1 -0
  87. package/lib/src/misc/context/WorkbenchContext.js +9 -0
  88. package/lib/src/misc/context/WorkbenchContext.js.map +1 -0
  89. package/lib/src/misc/context/WorkbenchContext.provider.d.ts +12 -0
  90. package/lib/src/misc/context/WorkbenchContext.provider.d.ts.map +1 -0
  91. package/lib/src/misc/context/WorkbenchContext.provider.js +995 -0
  92. package/lib/src/misc/context/WorkbenchContext.provider.js.map +1 -0
  93. package/lib/src/misc/context-menu/ContextMenuButton.d.ts +8 -0
  94. package/lib/src/misc/context-menu/ContextMenuButton.d.ts.map +1 -0
  95. package/lib/src/misc/context-menu/ContextMenuButton.js +10 -0
  96. package/lib/src/misc/context-menu/ContextMenuButton.js.map +1 -0
  97. package/lib/src/misc/context-menu/ContextMenuHandlers.d.ts +85 -0
  98. package/lib/src/misc/context-menu/ContextMenuHandlers.d.ts.map +1 -0
  99. package/lib/src/misc/context-menu/ContextMenuHandlers.js +2 -0
  100. package/lib/src/misc/context-menu/ContextMenuHandlers.js.map +1 -0
  101. package/lib/src/misc/context-menu/ContextMenuHelpers.d.ts +45 -0
  102. package/lib/src/misc/context-menu/ContextMenuHelpers.d.ts.map +1 -0
  103. package/lib/src/misc/context-menu/ContextMenuHelpers.js +182 -0
  104. package/lib/src/misc/context-menu/ContextMenuHelpers.js.map +1 -0
  105. package/lib/src/misc/context-menu/DefaultContextMenu.d.ts +3 -0
  106. package/lib/src/misc/context-menu/DefaultContextMenu.d.ts.map +1 -0
  107. package/lib/src/misc/context-menu/DefaultContextMenu.js +111 -0
  108. package/lib/src/misc/context-menu/DefaultContextMenu.js.map +1 -0
  109. package/lib/src/misc/context-menu/NodeContextMenu.d.ts +3 -0
  110. package/lib/src/misc/context-menu/NodeContextMenu.d.ts.map +1 -0
  111. package/lib/src/misc/context-menu/NodeContextMenu.js +51 -0
  112. package/lib/src/misc/context-menu/NodeContextMenu.js.map +1 -0
  113. package/lib/src/misc/context-menu/SelectionContextMenu.d.ts +3 -0
  114. package/lib/src/misc/context-menu/SelectionContextMenu.d.ts.map +1 -0
  115. package/lib/src/misc/context-menu/SelectionContextMenu.js +47 -0
  116. package/lib/src/misc/context-menu/SelectionContextMenu.js.map +1 -0
  117. package/lib/src/misc/hooks.d.ts +18 -0
  118. package/lib/src/misc/hooks.d.ts.map +1 -0
  119. package/lib/src/misc/hooks.js +275 -0
  120. package/lib/src/misc/hooks.js.map +1 -0
  121. package/lib/src/misc/layout.d.ts +117 -0
  122. package/lib/src/misc/layout.d.ts.map +1 -0
  123. package/lib/src/misc/layout.js +205 -0
  124. package/lib/src/misc/layout.js.map +1 -0
  125. package/lib/src/misc/load.d.ts +5 -0
  126. package/lib/src/misc/load.d.ts.map +1 -0
  127. package/lib/src/misc/load.js +106 -0
  128. package/lib/src/misc/load.js.map +1 -0
  129. package/lib/src/misc/mapping.d.ts +128 -0
  130. package/lib/src/misc/mapping.d.ts.map +1 -0
  131. package/lib/src/misc/mapping.js +270 -0
  132. package/lib/src/misc/mapping.js.map +1 -0
  133. package/lib/src/misc/merge-utils.d.ts +12 -0
  134. package/lib/src/misc/merge-utils.d.ts.map +1 -0
  135. package/lib/src/misc/merge-utils.js +51 -0
  136. package/lib/src/misc/merge-utils.js.map +1 -0
  137. package/lib/src/misc/thumbnail-utils.d.ts +53 -0
  138. package/lib/src/misc/thumbnail-utils.d.ts.map +1 -0
  139. package/lib/src/misc/thumbnail-utils.js +629 -0
  140. package/lib/src/misc/thumbnail-utils.js.map +1 -0
  141. package/lib/src/misc/types.d.ts +18 -0
  142. package/lib/src/misc/types.d.ts.map +1 -0
  143. package/lib/src/misc/types.js +2 -0
  144. package/lib/src/misc/types.js.map +1 -0
  145. package/lib/src/misc/value.d.ts +16 -0
  146. package/lib/src/misc/value.d.ts.map +1 -0
  147. package/lib/src/misc/value.js +114 -0
  148. package/lib/src/misc/value.js.map +1 -0
  149. package/lib/src/misc/viewport-utils.d.ts +6 -0
  150. package/lib/src/misc/viewport-utils.d.ts.map +1 -0
  151. package/lib/src/misc/viewport-utils.js +18 -0
  152. package/lib/src/misc/viewport-utils.js.map +1 -0
  153. package/lib/src/runtime/AbstractGraphRunner.d.ts +61 -0
  154. package/lib/src/runtime/AbstractGraphRunner.d.ts.map +1 -0
  155. package/lib/src/runtime/AbstractGraphRunner.js +63 -0
  156. package/lib/src/runtime/AbstractGraphRunner.js.map +1 -0
  157. package/lib/src/runtime/IGraphRunner.d.ts +100 -0
  158. package/lib/src/runtime/IGraphRunner.d.ts.map +1 -0
  159. package/lib/src/runtime/IGraphRunner.js +2 -0
  160. package/lib/src/runtime/IGraphRunner.js.map +1 -0
  161. package/lib/src/runtime/LocalGraphRunner.d.ts +60 -0
  162. package/lib/src/runtime/LocalGraphRunner.d.ts.map +1 -0
  163. package/lib/src/runtime/LocalGraphRunner.js +294 -0
  164. package/lib/src/runtime/LocalGraphRunner.js.map +1 -0
  165. package/lib/src/runtime/RemoteGraphRunner.d.ts +109 -0
  166. package/lib/src/runtime/RemoteGraphRunner.d.ts.map +1 -0
  167. package/lib/src/runtime/RemoteGraphRunner.js +696 -0
  168. package/lib/src/runtime/RemoteGraphRunner.js.map +1 -0
  169. package/package.json +4 -4
@@ -0,0 +1,51 @@
1
+ import { jsxs as _jsxs, jsx as _jsx, Fragment as _Fragment } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from "react";
3
+ import { ContextMenuButton } from "./ContextMenuButton";
4
+ export function NodeContextMenu({ open, clientPos, nodeId, handlers, bakeableOutputs, runMode, wb, keyboardShortcuts = {
5
+ copy: "⌘/Ctrl + C",
6
+ duplicate: "⌘/Ctrl + E",
7
+ delete: "Delete",
8
+ }, }) {
9
+ const ref = useRef(null);
10
+ // outside click + ESC
11
+ useEffect(() => {
12
+ if (!open)
13
+ return;
14
+ const onDown = (e) => {
15
+ if (!ref.current)
16
+ return;
17
+ if (!ref.current.contains(e.target))
18
+ handlers.onClose();
19
+ };
20
+ const onKey = (e) => {
21
+ if (e.key === "Escape")
22
+ handlers.onClose();
23
+ };
24
+ window.addEventListener("mousedown", onDown, true);
25
+ window.addEventListener("keydown", onKey);
26
+ return () => {
27
+ window.removeEventListener("mousedown", onDown, true);
28
+ window.removeEventListener("keydown", onKey);
29
+ };
30
+ }, [open, handlers]);
31
+ useEffect(() => {
32
+ if (open)
33
+ ref.current?.focus();
34
+ }, [open]);
35
+ if (!open || !clientPos || !nodeId)
36
+ return null;
37
+ // Determine if this is a start node (no inbound edges)
38
+ const isStartNode = wb ? !wb.def.edges.some((e) => e.target.nodeId === nodeId) : false;
39
+ // Check if node has outbound edges (required for "Run workflow" / "Run from here")
40
+ const hasOutboundEdges = wb ? wb.def.edges.some((e) => e.source.nodeId === nodeId) : false;
41
+ // clamp
42
+ const MENU_MIN_WIDTH = 180;
43
+ const PADDING = 16;
44
+ const x = Math.min(clientPos.x, (typeof window !== "undefined" ? window.innerWidth : 0) - (MENU_MIN_WIDTH + PADDING));
45
+ const y = Math.min(clientPos.y, (typeof window !== "undefined" ? window.innerHeight : 0) - 240);
46
+ return (_jsxs("div", { ref: ref, tabIndex: -1, className: "fixed z-[1000] bg-white border border-gray-300 rounded-lg shadow-lg p-1 min-w-[180px] text-sm text-gray-700 select-none", style: { left: x, top: y }, onClick: (e) => e.stopPropagation(), onMouseDown: (e) => e.stopPropagation(), onWheel: (e) => e.stopPropagation(), onContextMenu: (e) => {
47
+ e.preventDefault();
48
+ e.stopPropagation();
49
+ }, children: [_jsxs("div", { className: "px-2 py-1 font-semibold text-gray-700", children: ["Node (", nodeId, ")"] }), _jsx(ContextMenuButton, { label: "Delete", onClick: handlers.onDelete, shortcut: keyboardShortcuts.delete }), _jsx(ContextMenuButton, { label: "Duplicate", onClick: handlers.onDuplicate, shortcut: keyboardShortcuts.duplicate }), handlers.onRunNode && (_jsx("button", { className: "block w-full text-left px-2 py-1 hover:bg-gray-100", onClick: handlers.onRunNode, children: "Run node" })), runMode === "manual" && handlers.onRunFromHere && hasOutboundEdges && (_jsx("button", { className: "block w-full text-left px-2 py-1 hover:bg-gray-100", onClick: handlers.onRunFromHere, children: isStartNode ? "Run workflow" : "Run from here" })), _jsx("div", { className: "h-px bg-gray-200 my-1" }), _jsx(ContextMenuButton, { label: "Copy", onClick: handlers.onCopy, shortcut: keyboardShortcuts.copy }), _jsx("button", { className: "block w-full text-left px-2 py-1 hover:bg-gray-100", onClick: handlers.onCopyId, children: "Copy Node ID" }), bakeableOutputs.length > 0 && (_jsxs(_Fragment, { children: [_jsx("div", { className: "h-px bg-gray-200 my-1" }), _jsx("div", { className: "px-2 py-1 font-semibold text-gray-700", children: "Bake" }), bakeableOutputs.map((h) => (_jsxs("button", { className: "block w-full text-left px-2 py-1 hover:bg-gray-100", onClick: () => handlers.onBake(h), children: ["Bake: ", h] }, h)))] }))] }));
50
+ }
51
+ //# sourceMappingURL=NodeContextMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NodeContextMenu.js","sourceRoot":"","sources":["../../../../src/misc/context-menu/NodeContextMenu.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { SelectionContextMenuProps } from "./ContextMenuHandlers";
2
+ export declare function SelectionContextMenu({ open, clientPos, handlers, keyboardShortcuts, }: SelectionContextMenuProps): import("react/jsx-runtime").JSX.Element | null;
3
+ //# sourceMappingURL=SelectionContextMenu.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionContextMenu.d.ts","sourceRoot":"","sources":["../../../../src/misc/context-menu/SelectionContextMenu.tsx"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,uBAAuB,CAAC;AAGvE,wBAAgB,oBAAoB,CAAC,EACnC,IAAI,EACJ,SAAS,EACT,QAAQ,EACR,iBAIC,GACF,EAAE,yBAAyB,kDAuD3B"}
@@ -0,0 +1,47 @@
1
+ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
2
+ import { useEffect, useRef } from "react";
3
+ import { ContextMenuButton } from "./ContextMenuButton";
4
+ export function SelectionContextMenu({ open, clientPos, handlers, keyboardShortcuts = {
5
+ copy: "⌘/Ctrl + C",
6
+ duplicate: "⌘/Ctrl + E",
7
+ delete: "Delete",
8
+ }, }) {
9
+ const ref = useRef(null);
10
+ // Close on outside click and on ESC
11
+ useEffect(() => {
12
+ if (!open)
13
+ return;
14
+ const onDown = (e) => {
15
+ if (!ref.current)
16
+ return;
17
+ if (!ref.current.contains(e.target))
18
+ handlers.onClose();
19
+ };
20
+ const onKey = (e) => {
21
+ if (e.key === "Escape")
22
+ handlers.onClose();
23
+ };
24
+ window.addEventListener("mousedown", onDown, true);
25
+ window.addEventListener("keydown", onKey);
26
+ return () => {
27
+ window.removeEventListener("mousedown", onDown, true);
28
+ window.removeEventListener("keydown", onKey);
29
+ };
30
+ }, [open, handlers]);
31
+ useEffect(() => {
32
+ if (open)
33
+ ref.current?.focus();
34
+ }, [open]);
35
+ if (!open || !clientPos)
36
+ return null;
37
+ // Clamp menu position to viewport
38
+ const MENU_MIN_WIDTH = 180;
39
+ const PADDING = 16;
40
+ const x = Math.min(clientPos.x, (typeof window !== "undefined" ? window.innerWidth : 0) - (MENU_MIN_WIDTH + PADDING));
41
+ const y = Math.min(clientPos.y, (typeof window !== "undefined" ? window.innerHeight : 0) - 100);
42
+ return (_jsxs("div", { ref: ref, tabIndex: -1, className: "fixed z-[1000] bg-white border border-gray-300 rounded-lg shadow-lg p-1 min-w-[180px] text-sm text-gray-700 select-none", style: { left: x, top: y }, onClick: (e) => e.stopPropagation(), onMouseDown: (e) => e.stopPropagation(), onWheel: (e) => e.stopPropagation(), onContextMenu: (e) => {
43
+ e.preventDefault();
44
+ e.stopPropagation();
45
+ }, children: [_jsx("div", { className: "px-2 py-1 font-semibold text-gray-700", children: "Selection" }), _jsx(ContextMenuButton, { label: "Copy", onClick: handlers.onCopy, shortcut: keyboardShortcuts.copy }), handlers.onDuplicate && (_jsx(ContextMenuButton, { label: "Duplicate", onClick: handlers.onDuplicate, shortcut: keyboardShortcuts.duplicate })), _jsx(ContextMenuButton, { label: "Delete", onClick: handlers.onDelete, shortcut: keyboardShortcuts.delete })] }));
46
+ }
47
+ //# sourceMappingURL=SelectionContextMenu.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"SelectionContextMenu.js","sourceRoot":"","sources":["../../../../src/misc/context-menu/SelectionContextMenu.tsx"],"names":[],"mappings":"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"}
@@ -0,0 +1,18 @@
1
+ import type { OnConnect, OnEdgesChange, OnEdgesDelete, OnNodesChange, OnNodesDelete } from "@xyflow/react";
2
+ import type { ResolvedHandles } from "@bian-womp/spark-protocol";
3
+ import type { InMemoryWorkbench } from "../core/InMemoryWorkbench";
4
+ import { IGraphRunner } from "../runtime/IGraphRunner";
5
+ export declare function useWorkbenchBridge(wb: InMemoryWorkbench, handlesMap?: Record<string, ResolvedHandles>): {
6
+ onConnect: OnConnect;
7
+ onNodesChange: OnNodesChange;
8
+ onEdgesChange: OnEdgesChange;
9
+ onEdgesDelete: OnEdgesDelete;
10
+ onNodesDelete: OnNodesDelete;
11
+ };
12
+ export declare function useWorkbenchGraphTick(wb: InMemoryWorkbench): number;
13
+ export declare function useWorkbenchGraphUiTick(wb: InMemoryWorkbench): number;
14
+ export declare function useWorkbenchVersionTick(runner: IGraphRunner): number;
15
+ export declare function useThrottledValue<T>(value: T, intervalMs: number): T;
16
+ export declare function useQueryParamBoolean(key: string, defaultValue: boolean): [boolean, (v: boolean) => void];
17
+ export declare function useQueryParamString(key: string, defaultValue?: string): [string | undefined, (v: string | undefined) => void];
18
+ //# sourceMappingURL=hooks.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.d.ts","sourceRoot":"","sources":["../../../src/misc/hooks.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAEV,SAAS,EACT,aAAa,EACb,aAAa,EACb,aAAa,EACb,aAAa,EAEd,MAAM,eAAe,CAAC;AACvB,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAEjE,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,2BAA2B,CAAC;AACnE,OAAO,EAAE,YAAY,EAAE,MAAM,yBAAyB,CAAC;AAEvD,wBAAgB,kBAAkB,CAAC,EAAE,EAAE,iBAAiB,EAAE,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,eAAe,CAAC;;;;;;EAoKrG;AAED,wBAAgB,qBAAqB,CAAC,EAAE,EAAE,iBAAiB,UAU1D;AAED,wBAAgB,uBAAuB,CAAC,EAAE,EAAE,iBAAiB,UAW5D;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,YAAY,UAoB3D;AAED,wBAAgB,iBAAiB,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,UAAU,EAAE,MAAM,GAAG,CAAC,CAqCpE;AAWD,wBAAgB,oBAAoB,CAAC,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,OAAO,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,EAAE,OAAO,KAAK,IAAI,CAAC,CA0BxG;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,MAAM,GACpB,CAAC,MAAM,GAAG,SAAS,EAAE,CAAC,CAAC,EAAE,MAAM,GAAG,SAAS,KAAK,IAAI,CAAC,CAyBvD"}
@@ -0,0 +1,275 @@
1
+ import { useCallback, useEffect, useState, useMemo, useRef } from "react";
2
+ import { getInputTypeId } from "@bian-womp/spark-graph";
3
+ export function useWorkbenchBridge(wb, handlesMap) {
4
+ const onConnect = useCallback((params) => {
5
+ if (!params.source || !params.target)
6
+ return;
7
+ if (!params.sourceHandle || !params.targetHandle)
8
+ return;
9
+ // Prevent duplicate edges between the same endpoints
10
+ const exists = wb.def.edges.some((e) => e.source.nodeId === params.source &&
11
+ e.source.handle === params.sourceHandle &&
12
+ e.target.nodeId === params.target &&
13
+ e.target.handle === params.targetHandle);
14
+ if (exists)
15
+ return;
16
+ // Check if target input handle is a non-array type (typeId doesn't end with [])
17
+ // If so, remove any existing connections to that handle before connecting
18
+ const targetHandles = handlesMap?.[params.target];
19
+ const targetTypeId = targetHandles ? getInputTypeId(targetHandles.inputs, params.targetHandle) : undefined;
20
+ const isArrayInput = targetTypeId?.endsWith("[]") ?? false;
21
+ if (!isArrayInput) {
22
+ // Find existing edges to this input handle
23
+ const existingEdges = wb.def.edges.filter((e) => e.target.nodeId === params.target && e.target.handle === params.targetHandle);
24
+ // Remove existing edges (without committing yet)
25
+ for (const edge of existingEdges) {
26
+ wb.disconnect(edge.id, { commit: false });
27
+ }
28
+ }
29
+ wb.connect({
30
+ source: { nodeId: params.source, handle: params.sourceHandle },
31
+ target: { nodeId: params.target, handle: params.targetHandle },
32
+ }, { commit: true });
33
+ }, [wb, handlesMap]);
34
+ const onNodesChange = useCallback((changes) => {
35
+ const positions = {};
36
+ let commit = false;
37
+ changes.forEach((c) => {
38
+ if (c.type === "position" && c.position) {
39
+ positions[c.id] = c.position;
40
+ if (!c.dragging)
41
+ commit = true;
42
+ }
43
+ });
44
+ const sizes = {};
45
+ changes.forEach((c) => {
46
+ if (c.type === "dimensions" && c.dimensions) {
47
+ sizes[c.id] = c.dimensions;
48
+ if (!c.resizing)
49
+ commit = true;
50
+ }
51
+ });
52
+ // Derive next node selection from change set
53
+ const current = wb.getSelection();
54
+ const nextNodeIds = new Set(current.nodes);
55
+ let selectionChanged = false;
56
+ for (const change of changes) {
57
+ const type = change?.type;
58
+ if (type === "select") {
59
+ const id = change.id;
60
+ const selected = change.selected;
61
+ if (typeof selected === "boolean") {
62
+ if (selected) {
63
+ if (!nextNodeIds.has(id)) {
64
+ nextNodeIds.add(id);
65
+ selectionChanged = true;
66
+ }
67
+ }
68
+ else if (nextNodeIds.delete(id)) {
69
+ selectionChanged = true;
70
+ }
71
+ }
72
+ }
73
+ else if (type === "remove") {
74
+ const id = change.id;
75
+ if (nextNodeIds.delete(id))
76
+ selectionChanged = true;
77
+ }
78
+ }
79
+ if (selectionChanged) {
80
+ wb.setSelection({
81
+ nodes: Array.from(nextNodeIds),
82
+ edges: current.edges,
83
+ });
84
+ }
85
+ if (Object.keys(positions).length > 0) {
86
+ wb.setPositions(positions, {
87
+ commit: commit && !Object.keys(sizes).length,
88
+ });
89
+ }
90
+ if (Object.keys(sizes).length > 0) {
91
+ wb.setSizes(sizes, { commit });
92
+ }
93
+ }, [wb]);
94
+ const onEdgesDelete = useCallback((edges) => edges.forEach((e, idx) => wb.disconnect(e.id, { commit: idx === edges.length - 1 })), [wb]);
95
+ const onEdgesChange = useCallback((changes) => {
96
+ const current = wb.getSelection();
97
+ const nextEdgeIds = new Set(current.edges);
98
+ let selectionChanged = false;
99
+ for (const change of changes) {
100
+ const type = change?.type;
101
+ if (type === "select") {
102
+ const id = change.id;
103
+ const selected = change.selected;
104
+ if (typeof selected === "boolean") {
105
+ if (selected) {
106
+ if (!nextEdgeIds.has(id)) {
107
+ nextEdgeIds.add(id);
108
+ selectionChanged = true;
109
+ }
110
+ }
111
+ else if (nextEdgeIds.delete(id)) {
112
+ selectionChanged = true;
113
+ }
114
+ }
115
+ }
116
+ else if (type === "remove") {
117
+ const id = change.id;
118
+ if (nextEdgeIds.delete(id))
119
+ selectionChanged = true;
120
+ }
121
+ }
122
+ if (selectionChanged) {
123
+ wb.setSelection({
124
+ nodes: current.nodes,
125
+ edges: Array.from(nextEdgeIds),
126
+ });
127
+ }
128
+ }, [wb]);
129
+ const onNodesDelete = useCallback((nodes) => {
130
+ nodes.forEach((n, idx) => wb.removeNode(n.id, { commit: idx === nodes.length - 1 }));
131
+ }, [wb]);
132
+ return {
133
+ onConnect,
134
+ onNodesChange,
135
+ onEdgesChange,
136
+ onEdgesDelete,
137
+ onNodesDelete,
138
+ };
139
+ }
140
+ export function useWorkbenchGraphTick(wb) {
141
+ const [tick, setTick] = useState(0);
142
+ useEffect(() => {
143
+ const off = wb.on("graphChanged", () => {
144
+ setTick((t) => t + 1);
145
+ });
146
+ return () => off();
147
+ }, [wb]);
148
+ return tick;
149
+ }
150
+ export function useWorkbenchGraphUiTick(wb) {
151
+ const [tick, setTick] = useState(0);
152
+ useEffect(() => {
153
+ const off = wb.on("graphUiChanged", (evt) => {
154
+ if (evt.change?.type === "viewport")
155
+ return;
156
+ setTick((t) => t + 1);
157
+ });
158
+ return () => off();
159
+ }, [wb]);
160
+ return tick;
161
+ }
162
+ export function useWorkbenchVersionTick(runner) {
163
+ const [version, setVersion] = useState(0);
164
+ useEffect(() => {
165
+ const bump = () => setVersion((v) => v + 1);
166
+ const u1 = runner.on("value", bump);
167
+ const u2 = runner.on("error", bump);
168
+ const u3 = runner.on("invalidate", bump);
169
+ const u4 = runner.on("status", bump);
170
+ const u5 = runner.on("stats", bump);
171
+ return () => {
172
+ u1();
173
+ u2();
174
+ u3();
175
+ u4();
176
+ u5();
177
+ };
178
+ }, [runner]);
179
+ return version;
180
+ }
181
+ export function useThrottledValue(value, intervalMs) {
182
+ const [throttled, setThrottled] = useState(value);
183
+ const lastSetAtRef = useRef(0);
184
+ const timeoutRef = useRef(null);
185
+ useEffect(() => {
186
+ const now = typeof performance !== "undefined" && performance.now ? performance.now() : Date.now();
187
+ const elapsed = now - lastSetAtRef.current;
188
+ if (elapsed >= intervalMs) {
189
+ lastSetAtRef.current = now;
190
+ setThrottled(value);
191
+ }
192
+ else {
193
+ if (timeoutRef.current !== null) {
194
+ window.clearTimeout(timeoutRef.current);
195
+ }
196
+ timeoutRef.current = window.setTimeout(() => {
197
+ lastSetAtRef.current = typeof performance !== "undefined" && performance.now ? performance.now() : Date.now();
198
+ setThrottled(value);
199
+ timeoutRef.current = null;
200
+ }, Math.max(0, intervalMs - elapsed));
201
+ }
202
+ return () => { };
203
+ }, [value, intervalMs]);
204
+ useEffect(() => {
205
+ return () => {
206
+ if (timeoutRef.current !== null) {
207
+ window.clearTimeout(timeoutRef.current);
208
+ timeoutRef.current = null;
209
+ }
210
+ };
211
+ }, []);
212
+ return throttled;
213
+ }
214
+ // Query param helpers
215
+ function setSearchParam(key, val) {
216
+ if (typeof window === "undefined")
217
+ return;
218
+ const url = new URL(window.location.href);
219
+ if (val === undefined || val === "")
220
+ url.searchParams.delete(key);
221
+ else
222
+ url.searchParams.set(key, val);
223
+ window.history.replaceState({}, "", url.toString());
224
+ }
225
+ export function useQueryParamBoolean(key, defaultValue) {
226
+ const initial = useMemo(() => {
227
+ if (typeof window === "undefined")
228
+ return defaultValue;
229
+ const sp = new URLSearchParams(window.location.search);
230
+ const v = sp.get(key);
231
+ if (v === null)
232
+ return defaultValue;
233
+ return v === "1" || v === "true";
234
+ }, [key, defaultValue]);
235
+ const [val, setVal] = useState(initial);
236
+ const set = useCallback((v) => {
237
+ setVal(v);
238
+ setSearchParam(key, v ? "1" : undefined);
239
+ }, [key]);
240
+ useEffect(() => {
241
+ const onPop = () => {
242
+ const sp = new URLSearchParams(window.location.search);
243
+ const v = sp.get(key);
244
+ setVal(v === "1" || v === "true");
245
+ };
246
+ window.addEventListener("popstate", onPop);
247
+ return () => window.removeEventListener("popstate", onPop);
248
+ }, [key]);
249
+ return [val, set];
250
+ }
251
+ export function useQueryParamString(key, defaultValue) {
252
+ const initial = useMemo(() => {
253
+ if (typeof window === "undefined")
254
+ return defaultValue;
255
+ const sp = new URLSearchParams(window.location.search);
256
+ const v = sp.get(key);
257
+ return v ?? defaultValue;
258
+ }, [key, defaultValue]);
259
+ const [val, setVal] = useState(initial);
260
+ const set = useCallback((v) => {
261
+ setVal(v);
262
+ setSearchParam(key, v);
263
+ }, [key]);
264
+ useEffect(() => {
265
+ const onPop = () => {
266
+ const sp = new URLSearchParams(window.location.search);
267
+ const v = sp.get(key) ?? undefined;
268
+ setVal(v);
269
+ };
270
+ window.addEventListener("popstate", onPop);
271
+ return () => window.removeEventListener("popstate", onPop);
272
+ }, [key]);
273
+ return [val, set];
274
+ }
275
+ //# sourceMappingURL=hooks.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"hooks.js","sourceRoot":"","sources":["../../../src/misc/hooks.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,117 @@
1
+ import type { ResolvedHandles, GraphNodeDefinition } from "@bian-womp/spark-protocol";
2
+ import type { Registry } from "@bian-womp/spark-graph";
3
+ import { Position } from "@xyflow/react";
4
+ export type EstimateNodeSizeArgs = {
5
+ node: GraphNodeDefinition;
6
+ registry: Registry;
7
+ showValues?: boolean;
8
+ overrides?: {
9
+ width?: number;
10
+ height?: number;
11
+ };
12
+ };
13
+ export type EstimateNodeSizeResult = {
14
+ width: number;
15
+ height: number;
16
+ };
17
+ export type EstimateNodeSizeFunction = (args: EstimateNodeSizeArgs) => EstimateNodeSizeResult;
18
+ export type CreateHandleBoundsArgs = {
19
+ id: string;
20
+ type: "source" | "target";
21
+ position: Position;
22
+ rowIndex: number;
23
+ nodeWidth: number;
24
+ };
25
+ export type CreateHandleBoundsResult = {
26
+ id: string;
27
+ type: "source" | "target";
28
+ position: Position;
29
+ x: number;
30
+ y: number;
31
+ width: number;
32
+ height: number;
33
+ };
34
+ export type CreateHandleBoundsFunction = (args: CreateHandleBoundsArgs) => CreateHandleBoundsResult;
35
+ export type CreateHandleLayoutArgs = {
36
+ id: string;
37
+ type: "source" | "target";
38
+ position: Position;
39
+ rowIndex: number;
40
+ };
41
+ export type CreateHandleLayoutResult = {
42
+ id: string;
43
+ type: "source" | "target";
44
+ position: Position;
45
+ y: number;
46
+ };
47
+ export type CreateHandleLayoutFunction = (args: CreateHandleLayoutArgs) => CreateHandleLayoutResult;
48
+ export type LayoutNodeArgs = {
49
+ node: GraphNodeDefinition;
50
+ registry: Registry;
51
+ showValues?: boolean;
52
+ overrides?: {
53
+ width?: number;
54
+ height?: number;
55
+ };
56
+ missingInputs?: string[];
57
+ missingOutputs?: string[];
58
+ };
59
+ export type HandleBounds = {
60
+ id: string;
61
+ type: "source" | "target";
62
+ position: Position;
63
+ x: number;
64
+ y: number;
65
+ width?: number;
66
+ height?: number;
67
+ };
68
+ export type HandleLayout = {
69
+ id: string;
70
+ type: "source" | "target";
71
+ position: Position;
72
+ y: number;
73
+ missing?: boolean;
74
+ };
75
+ export type LayoutNodeResult = {
76
+ width: number;
77
+ height: number;
78
+ inputOrder: string[];
79
+ outputOrder: string[];
80
+ handles: HandleBounds[];
81
+ handleLayout: HandleLayout[];
82
+ };
83
+ export type LayoutNodeFunction = (args: LayoutNodeArgs) => LayoutNodeResult;
84
+ export declare function computeEffectiveHandles(node: GraphNodeDefinition, registry: Registry): ResolvedHandles;
85
+ export declare function countVisibleHandles(handles: Omit<ResolvedHandles, "inputDefaults">): {
86
+ inputsCount: number;
87
+ outputsCount: number;
88
+ };
89
+ export declare function estimateNodeSize(args: EstimateNodeSizeArgs): EstimateNodeSizeResult;
90
+ /**
91
+ * Calculate the Y position for handle layout (center of row).
92
+ * Used for positioning handles in React Flow.
93
+ */
94
+ export declare function getHandleLayoutY(rowIndex: number): number;
95
+ /**
96
+ * Calculate the Y position for handle bounds (top + centering offset).
97
+ * Used for hit-testing and edge routing.
98
+ */
99
+ export declare function getHandleBoundsY(rowIndex: number): number;
100
+ /**
101
+ * Calculate the X position for handle bounds based on position and node width.
102
+ */
103
+ export declare function getHandleBoundsX(position: Position, nodeWidth: number): number;
104
+ /**
105
+ * Create handle bounds object for hit-testing/edge routing.
106
+ */
107
+ export declare function createHandleBounds(args: CreateHandleBoundsArgs): CreateHandleBoundsResult;
108
+ /**
109
+ * Create handle layout object for React Flow rendering.
110
+ */
111
+ export declare function createHandleLayout(args: CreateHandleLayoutArgs): CreateHandleLayoutResult;
112
+ export declare function layoutNode(args: LayoutNodeArgs, overrides?: {
113
+ estimateNodeSize?: EstimateNodeSizeFunction;
114
+ createHandleBounds?: CreateHandleBoundsFunction;
115
+ createHandleLayout?: CreateHandleLayoutFunction;
116
+ }): LayoutNodeResult;
117
+ //# sourceMappingURL=layout.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"layout.d.ts","sourceRoot":"","sources":["../../../src/misc/layout.ts"],"names":[],"mappings":"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"}