@lokvis/ui-react 0.1.0 → 0.1.1-beta.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/components/AssetPanel.d.ts.map +1 -1
- package/dist/components/AssetPanel.js +3 -2
- package/dist/components/AssetPanel.js.map +1 -1
- package/dist/components/Canvas.d.ts.map +1 -1
- package/dist/components/Canvas.js +3 -2
- package/dist/components/Canvas.js.map +1 -1
- package/dist/components/Inspector.d.ts.map +1 -1
- package/dist/components/Inspector.js +2 -1
- package/dist/components/Inspector.js.map +1 -1
- package/dist/components/PipelineBar.d.ts.map +1 -1
- package/dist/components/PipelineBar.js +4 -3
- package/dist/components/PipelineBar.js.map +1 -1
- package/dist/components/Workspace.d.ts.map +1 -1
- package/dist/components/Workspace.js +2 -1
- package/dist/components/Workspace.js.map +1 -1
- package/dist/store/assets-slice.d.ts.map +1 -1
- package/dist/store/assets-slice.js +17 -0
- package/dist/store/assets-slice.js.map +1 -1
- package/dist/store/workflow-slice.d.ts.map +1 -1
- package/dist/store/workflow-slice.js +39 -11
- package/dist/store/workflow-slice.js.map +1 -1
- package/dist/store.d.ts +76 -0
- package/dist/store.d.ts.map +1 -0
- package/dist/store.js +217 -0
- package/dist/store.js.map +1 -0
- package/package.json +6 -6
- package/src/components/AssetPanel.tsx +5 -4
- package/src/components/Canvas.tsx +6 -5
- package/src/components/Inspector.tsx +3 -2
- package/src/components/PipelineBar.tsx +13 -12
- package/src/components/Workspace.tsx +2 -1
- package/src/store/assets-slice.ts +17 -0
- package/src/store/workflow-slice.ts +39 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetPanel.d.ts","sourceRoot":"","sources":["../../src/components/AssetPanel.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"AssetPanel.d.ts","sourceRoot":"","sources":["../../src/components/AssetPanel.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,eAAe;IAC9B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,UAAU,CAAC,EAAE,SAAc,EAAE,EAAE,eAAe,qBAwI7D"}
|
|
@@ -6,6 +6,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
6
6
|
* 支持拖拽导入、点击选择、缩略图预览。
|
|
7
7
|
*/
|
|
8
8
|
import * as React from 'react';
|
|
9
|
+
import { Icon } from '@lokvis/ui-core';
|
|
9
10
|
import { useWorkspaceStore } from '../store/index.js';
|
|
10
11
|
export function AssetPanel({ className = '' }) {
|
|
11
12
|
const assets = useWorkspaceStore((s) => s.assets);
|
|
@@ -55,7 +56,7 @@ export function AssetPanel({ className = '' }) {
|
|
|
55
56
|
void handleFiles(e.dataTransfer.files);
|
|
56
57
|
}, children: [_jsxs("div", { className: "flex items-center justify-between px-3 h-10 shrink-0 border-b border-zinc-200 dark:border-zinc-800", children: [_jsx("span", { className: "text-[11px] font-semibold uppercase tracking-wider text-zinc-400", children: "Assets" }), _jsx("span", { className: "text-[11px] tabular-nums text-zinc-400", children: assets.length })] }), _jsxs("label", { className: `m-2 block cursor-pointer rounded-lg border border-dashed px-2 py-3 text-center transition-all ${dragging
|
|
57
58
|
? 'border-indigo-400 bg-indigo-50 text-indigo-600 dark:bg-indigo-950/30'
|
|
58
|
-
: 'border-zinc-200 text-zinc-400 hover:border-indigo-300 hover:bg-indigo-50/50 hover:text-indigo-500 dark:border-zinc-700 dark:hover:border-indigo-800 dark:hover:bg-indigo-950/20'}`, children: [_jsx("input", { type: "file", multiple: true, className: "hidden", onChange: (e) => handleFiles(e.target.files) }), _jsx(
|
|
59
|
+
: 'border-zinc-200 text-zinc-400 hover:border-indigo-300 hover:bg-indigo-50/50 hover:text-indigo-500 dark:border-zinc-700 dark:hover:border-indigo-800 dark:hover:bg-indigo-950/20'}`, children: [_jsx("input", { type: "file", multiple: true, className: "hidden", onChange: (e) => handleFiles(e.target.files) }), _jsx(Icon, { size: 16, className: "mx-auto", children: _jsx("path", { d: "M12 4.5v15m7.5-7.5h-15" }) }), _jsx("span", { className: "mt-1 block text-[10px] font-medium", children: dragging ? 'Drop here' : 'Add files' })] }), _jsx("div", { className: "flex-1 overflow-y-auto px-2 pb-2", children: assets.length === 0 ? (_jsx("p", { className: "px-1 py-4 text-center text-[10px] text-zinc-400", children: "No assets imported" })) : (_jsx("ul", { className: "space-y-1", children: assets.map((asset) => {
|
|
59
60
|
const selected = asset.id === selectedAssetId;
|
|
60
61
|
const thumb = thumbnails[asset.id];
|
|
61
62
|
return (_jsxs("li", { onClick: () => selectAsset(asset.id), className: `group flex cursor-pointer items-center gap-2 rounded-md px-2 py-1.5 text-xs transition-all ${selected
|
|
@@ -63,7 +64,7 @@ export function AssetPanel({ className = '' }) {
|
|
|
63
64
|
: 'hover:bg-zinc-50 dark:hover:bg-zinc-800'}`, children: [_jsx("div", { className: "flex h-8 w-8 shrink-0 items-center justify-center overflow-hidden rounded bg-zinc-100 dark:bg-zinc-800", children: thumb ? (_jsx("img", { src: thumb, alt: "", className: "h-full w-full object-cover" })) : (_jsx("span", { className: "text-[10px] font-medium text-zinc-400", children: asset.metadata.format.slice(0, 3).toUpperCase() })) }), _jsxs("div", { className: "min-w-0 flex-1", children: [_jsx("div", { className: "truncate text-[11px] font-medium", children: asset.metadata.format }), _jsxs("div", { className: "text-[10px] text-zinc-400", children: [(asset.metadata.size / 1024).toFixed(1), " KB"] })] }), _jsx("button", { type: "button", onClick: (e) => {
|
|
64
65
|
e.stopPropagation();
|
|
65
66
|
void removeAsset(asset.id);
|
|
66
|
-
}, className: "shrink-0 rounded p-0.5 text-zinc-300 opacity-0 transition-all hover:bg-red-50 hover:text-red-500 group-hover:opacity-100 dark:text-zinc-600 dark:hover:bg-red-950/30", "aria-label": "Remove asset", children: _jsx(
|
|
67
|
+
}, className: "shrink-0 rounded p-0.5 text-zinc-300 opacity-0 transition-all hover:bg-red-50 hover:text-red-500 group-hover:opacity-100 dark:text-zinc-600 dark:hover:bg-red-950/30", "aria-label": "Remove asset", children: _jsx(Icon, { size: 12, children: _jsx("path", { d: "M6 18L18 6M6 6l12 12" }) }) })] }, asset.id));
|
|
67
68
|
}) })) })] }));
|
|
68
69
|
}
|
|
69
70
|
//# sourceMappingURL=AssetPanel.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"AssetPanel.js","sourceRoot":"","sources":["../../src/components/AssetPanel.tsx"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"AssetPanel.js","sourceRoot":"","sources":["../../src/components/AssetPanel.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Canvas.d.ts","sourceRoot":"","sources":["../../src/components/Canvas.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Canvas.d.ts","sourceRoot":"","sources":["../../src/components/Canvas.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,WAAW;IAC1B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,MAAM,CAAC,EAAE,SAAc,EAAE,EAAE,WAAW,qBA4GrD"}
|
|
@@ -6,6 +6,7 @@ import { jsx as _jsx, jsxs as _jsxs, Fragment as _Fragment } from "react/jsx-run
|
|
|
6
6
|
* 工作流节点链已移至独立的 PipelineBar 组件。
|
|
7
7
|
*/
|
|
8
8
|
import * as React from 'react';
|
|
9
|
+
import { Icon } from '@lokvis/ui-core';
|
|
9
10
|
import { useWorkspaceStore } from '../store/index.js';
|
|
10
11
|
export function Canvas({ className = '' }) {
|
|
11
12
|
const selectedAssetId = useWorkspaceStore((s) => s.selectedAssetId);
|
|
@@ -25,9 +26,9 @@ export function Canvas({ className = '' }) {
|
|
|
25
26
|
}, children: _jsxs("div", { className: "relative flex flex-1 items-center justify-center bg-zinc-50 dark:bg-zinc-950", children: [_jsx("div", { className: "absolute inset-0 opacity-[0.35]", style: {
|
|
26
27
|
backgroundImage: 'radial-gradient(circle, #d4d4d8 1px, transparent 1px)',
|
|
27
28
|
backgroundSize: '20px 20px',
|
|
28
|
-
} }), dragOver && (_jsx("div", { className: "absolute inset-4 z-10 rounded-xl border-2 border-dashed border-indigo-400 bg-indigo-50/80 flex items-center justify-center dark:border-indigo-600 dark:bg-indigo-950/60", children: _jsxs("div", { className: "text-center", children: [_jsx(
|
|
29
|
+
} }), dragOver && (_jsx("div", { className: "absolute inset-4 z-10 rounded-xl border-2 border-dashed border-indigo-400 bg-indigo-50/80 flex items-center justify-center dark:border-indigo-600 dark:bg-indigo-950/60", children: _jsxs("div", { className: "text-center", children: [_jsx(Icon, { size: 32, className: "mx-auto text-indigo-500", strokeWidth: 1.5, children: _jsx("path", { d: "M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5m-13.5-9L12 3m0 0 4.5 4.5M12 3v13.5" }) }), _jsx("p", { className: "mt-2 text-sm font-medium text-indigo-600 dark:text-indigo-400", children: "Drop files to import" })] }) })), selected ? (preview ? (_jsxs("div", { className: "relative", children: [_jsx("img", { src: preview, alt: selected.metadata.format, className: "max-h-[calc(100%-4rem)] max-w-[calc(100%-4rem)] rounded-lg object-contain shadow-2xl shadow-black/10 ring-1 ring-black/5 dark:shadow-black/30" }), _jsx("div", { className: "absolute bottom-2 left-2 rounded-lg bg-white/90 px-2.5 py-1 text-[11px] text-zinc-600 shadow-sm backdrop-blur-sm dark:bg-zinc-900/90 dark:text-zinc-300", children: _jsxs("div", { className: "flex items-center gap-2", children: [_jsx("span", { className: "font-medium", children: selected.metadata.format.toUpperCase() }), selected.metadata.dimensions && (_jsxs(_Fragment, { children: [_jsx("span", { className: "text-zinc-300", children: "\u00B7" }), _jsxs("span", { children: [selected.metadata.dimensions.width, " x ", selected.metadata.dimensions.height] })] })), _jsx("span", { className: "text-zinc-300", children: "\u00B7" }), _jsxs("span", { children: [(selected.metadata.size / 1024).toFixed(1), " KB"] })] }) })] })) : (_jsxs("div", { className: "flex flex-col items-center gap-3", children: [_jsx("div", { className: "h-28 w-28 animate-pulse rounded-xl bg-zinc-200 dark:bg-zinc-800" }), _jsx("span", { className: "text-xs text-zinc-400", children: "Loading preview..." })] }))) : (_jsxs("div", { className: "relative flex flex-col items-center gap-5 px-6 text-center", children: [_jsx("div", { className: "flex h-20 w-20 items-center justify-center rounded-2xl bg-white shadow-sm ring-1 ring-zinc-200/80 dark:bg-zinc-800 dark:ring-zinc-700", children: _jsx(Icon, { size: 36, className: "text-zinc-300 dark:text-zinc-600", strokeWidth: 1.5, children: _jsx("path", { d: "m2.25 15.75 5.159-5.159a2.25 2.25 0 0 1 3.182 0l5.159 5.159m-1.5-1.5 1.409-1.409a2.25 2.25 0 0 1 3.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 0 0 1.5-1.5V6a1.5 1.5 0 0 0-1.5-1.5H3.75A1.5 1.5 0 0 0 2.25 6v12a1.5 1.5 0 0 0 1.5 1.5Zm10.5-11.25h.008v.008h-.008V8.25Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z" }) }) }), _jsxs("div", { children: [_jsx("p", { className: "text-sm font-medium text-zinc-500 dark:text-zinc-400", children: "No asset selected" }), _jsx("p", { className: "mt-1.5 text-xs text-zinc-400 dark:text-zinc-500", children: assets.length === 0
|
|
29
30
|
? 'Import files to get started, or drag them here'
|
|
30
|
-
: 'Select an asset from the left panel' })] }), assets.length === 0 && (_jsxs("label", { className: "mt-2 inline-flex items-center gap-1.5 rounded-lg bg-indigo-600 px-4 py-2 text-xs font-medium text-white shadow-sm cursor-pointer transition-colors hover:bg-indigo-500", children: [_jsx(
|
|
31
|
+
: 'Select an asset from the left panel' })] }), assets.length === 0 && (_jsxs("label", { className: "mt-2 inline-flex items-center gap-1.5 rounded-lg bg-indigo-600 px-4 py-2 text-xs font-medium text-white shadow-sm cursor-pointer transition-colors hover:bg-indigo-500", children: [_jsx(Icon, { size: 14, children: _jsx("path", { d: "M12 4.5v15m7.5-7.5h-15" }) }), "Import Files", _jsx("input", { type: "file", multiple: true, className: "hidden", onChange: (e) => {
|
|
31
32
|
if (e.target.files)
|
|
32
33
|
void importFiles(Array.from(e.target.files));
|
|
33
34
|
} })] }))] }))] }) }));
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Canvas.js","sourceRoot":"","sources":["../../src/components/Canvas.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAMtD,MAAM,UAAU,MAAM,CAAC,EAAE,SAAS,GAAG,EAAE,EAAe;IACpD,MAAM,eAAe,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE/D,kBAAkB;IAClB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,OAAO,CACL,eACE,SAAS,EAAE,iDAAiD,SAAS,EAAE,EACvE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAC7D,WAAW,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EACrC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;YACZ,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,WAAW,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,KAAK,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC,YAGD,eAAK,SAAS,EAAC,8EAA8E,aAE3F,cACE,SAAS,EAAC,iCAAiC,EAC3C,KAAK,EAAE;wBACL,eAAe,EAAE,uDAAuD;wBACxE,cAAc,EAAE,WAAW;qBAC5B,GACD,EAED,QAAQ,IAAI,CACX,cAAK,SAAS,EAAC,yKAAyK,YACtL,eAAK,SAAS,EAAC,aAAa,aAC1B,
|
|
1
|
+
{"version":3,"file":"Canvas.js","sourceRoot":"","sources":["../../src/components/Canvas.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAMtD,MAAM,UAAU,MAAM,CAAC,EAAE,SAAS,GAAG,EAAE,EAAe;IACpD,MAAM,eAAe,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,eAAe,CAAC,CAAC;IACpE,MAAM,MAAM,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC;IAClD,MAAM,UAAU,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,WAAW,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC;IAE5D,MAAM,QAAQ,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,eAAe,CAAC,CAAC;IAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;IAE/D,kBAAkB;IAClB,MAAM,CAAC,QAAQ,EAAE,WAAW,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC;IAEtD,OAAO,CACL,eACE,SAAS,EAAE,iDAAiD,SAAS,EAAE,EACvE,UAAU,EAAE,CAAC,CAAC,EAAE,EAAE,GAAG,CAAC,CAAC,cAAc,EAAE,CAAC,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAC7D,WAAW,EAAE,GAAG,EAAE,CAAC,WAAW,CAAC,KAAK,CAAC,EACrC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE;YACZ,CAAC,CAAC,cAAc,EAAE,CAAC;YACnB,WAAW,CAAC,KAAK,CAAC,CAAC;YACnB,IAAI,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACpC,KAAK,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,YAAY,CAAC,KAAK,CAAC,CAAC,CAAC;YACrD,CAAC;QACH,CAAC,YAGD,eAAK,SAAS,EAAC,8EAA8E,aAE3F,cACE,SAAS,EAAC,iCAAiC,EAC3C,KAAK,EAAE;wBACL,eAAe,EAAE,uDAAuD;wBACxE,cAAc,EAAE,WAAW;qBAC5B,GACD,EAED,QAAQ,IAAI,CACX,cAAK,SAAS,EAAC,yKAAyK,YACtL,eAAK,SAAS,EAAC,aAAa,aAC1B,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,yBAAyB,EAAC,WAAW,EAAE,GAAG,YAAE,eAAM,CAAC,EAAC,4GAA4G,GAAG,GAAO,EACpM,YAAG,SAAS,EAAC,+DAA+D,qCAAyB,IACjG,GACF,CACP,EAEA,QAAQ,CAAC,CAAC,CAAC,CACV,OAAO,CAAC,CAAC,CAAC,CACR,eAAK,SAAS,EAAC,UAAU,aACvB,cACE,GAAG,EAAE,OAAO,EACZ,GAAG,EAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,EAC7B,SAAS,EAAC,+IAA+I,GACzJ,EAEF,cAAK,SAAS,EAAC,yJAAyJ,YACtK,eAAK,SAAS,EAAC,yBAAyB,aACtC,eAAM,SAAS,EAAC,aAAa,YAAE,QAAQ,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,GAAQ,EAC5E,QAAQ,CAAC,QAAQ,CAAC,UAAU,IAAI,CAC/B,8BACE,eAAM,SAAS,EAAC,eAAe,uBAAS,EACxC,2BAAO,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,SAAK,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,MAAM,IAAQ,IACxF,CACJ,EACD,eAAM,SAAS,EAAC,eAAe,uBAAS,EACxC,2BAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,WAAW,IACxD,GACF,IACF,CACP,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,kCAAkC,aAC/C,cAAK,SAAS,EAAC,iEAAiE,GAAG,EACnF,eAAM,SAAS,EAAC,uBAAuB,mCAA0B,IAC7D,CACP,CACF,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,4DAA4D,aACzE,cAAK,SAAS,EAAC,uIAAuI,YACpJ,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,kCAAkC,EAAC,WAAW,EAAE,GAAG,YAC3E,eAAM,CAAC,EAAC,yTAAyT,GAAG,GAC/T,GACH,EACN,0BACE,YAAG,SAAS,EAAC,sDAAsD,kCAAsB,EACzF,YAAG,SAAS,EAAC,iDAAiD,YAC3D,MAAM,CAAC,MAAM,KAAK,CAAC;wCAClB,CAAC,CAAC,gDAAgD;wCAClD,CAAC,CAAC,qCAAqC,GACvC,IACA,EACL,MAAM,CAAC,MAAM,KAAK,CAAC,IAAI,CACtB,iBAAO,SAAS,EAAC,wKAAwK,aACvL,KAAC,IAAI,IAAC,IAAI,EAAE,EAAE,YAAE,eAAM,CAAC,EAAC,wBAAwB,GAAG,GAAO,kBAE1D,gBACE,IAAI,EAAC,MAAM,EACX,QAAQ,QACR,SAAS,EAAC,QAAQ,EAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,EAAE;wCACd,IAAI,CAAC,CAAC,MAAM,CAAC,KAAK;4CAAE,KAAK,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;oCACnE,CAAC,GACD,IACI,CACT,IACG,CACP,IACG,GACD,CACR,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Inspector.d.ts","sourceRoot":"","sources":["../../src/components/Inspector.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"Inspector.d.ts","sourceRoot":"","sources":["../../src/components/Inspector.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAK/B,MAAM,WAAW,cAAc;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,EAAE,SAAc,EAAE,EAAE,cAAc,qBA8I3D"}
|
|
@@ -6,6 +6,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
6
6
|
* 下半部分:可用 Capabilities 列表(点击添加到工作流)
|
|
7
7
|
*/
|
|
8
8
|
import * as React from 'react';
|
|
9
|
+
import { Icon } from '@lokvis/ui-core';
|
|
9
10
|
import { useWorkspaceStore } from '../store/index.js';
|
|
10
11
|
import { ParamForm } from './ParamForm.js';
|
|
11
12
|
export function Inspector({ className = '' }) {
|
|
@@ -32,7 +33,7 @@ export function Inspector({ className = '' }) {
|
|
|
32
33
|
return map;
|
|
33
34
|
}, [filtered]);
|
|
34
35
|
const showConfigure = selectedNode && capabilityMap[selectedNode.capability];
|
|
35
|
-
return (_jsxs("aside", { className: `flex w-72 shrink-0 flex-col border-l border-zinc-200 dark:border-zinc-800 ${className}`, children: [showConfigure && (_jsxs("div", { className: "shrink-0 border-b border-zinc-200 dark:border-zinc-800", children: [_jsxs("button", { type: "button", onClick: () => setConfigureOpen(!configureOpen), className: "flex w-full items-center justify-between px-3 h-10 text-left transition-colors hover:bg-zinc-50 dark:hover:bg-zinc-800/50", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(
|
|
36
|
+
return (_jsxs("aside", { className: `flex w-72 shrink-0 flex-col border-l border-zinc-200 dark:border-zinc-800 ${className}`, children: [showConfigure && (_jsxs("div", { className: "shrink-0 border-b border-zinc-200 dark:border-zinc-800", children: [_jsxs("button", { type: "button", onClick: () => setConfigureOpen(!configureOpen), className: "flex w-full items-center justify-between px-3 h-10 text-left transition-colors hover:bg-zinc-50 dark:hover:bg-zinc-800/50", children: [_jsxs("div", { className: "flex items-center gap-2", children: [_jsx(Icon, { size: 12, className: `text-zinc-400 transition-transform ${configureOpen ? 'rotate-90' : ''}`, children: _jsx("path", { d: "m9 5 7 7-7 7" }) }), _jsx("span", { className: "text-[11px] font-semibold uppercase tracking-wider text-zinc-400", children: "Configure" })] }), _jsx("span", { className: "font-mono text-[10px] text-indigo-500 bg-indigo-50 dark:bg-indigo-950/30 px-1.5 py-0.5 rounded", children: selectedNode.capability })] }), configureOpen && (_jsx("div", { className: "px-3 pb-3 max-h-60 overflow-y-auto", children: _jsx(ParamForm, { capability: capabilityMap[selectedNode.capability], values: selectedNode.params, onChange: (params) => updateNodeParams(selectedNode.id, params) }) }))] })), _jsxs("div", { className: "flex flex-1 flex-col overflow-hidden", children: [_jsxs("div", { className: "flex items-center justify-between px-3 h-10 shrink-0 border-b border-zinc-200 dark:border-zinc-800", children: [_jsx("span", { className: "text-[11px] font-semibold uppercase tracking-wider text-zinc-400", children: "Capabilities" }), _jsx("span", { className: "text-[11px] tabular-nums text-zinc-400", children: filtered.length })] }), _jsx("div", { className: "px-2 py-2 border-b border-zinc-100 dark:border-zinc-800/50", children: _jsxs("div", { className: "relative", children: [_jsxs(Icon, { size: 12, className: "absolute left-2 top-1/2 -translate-y-1/2 text-zinc-400", children: [_jsx("circle", { cx: "11", cy: "11", r: "8" }), _jsx("path", { d: "m21 21-4.3-4.3" })] }), _jsx("input", { type: "text", placeholder: "Search capabilities...", value: filter, onChange: (e) => setFilter(e.target.value), className: "w-full rounded-md border border-zinc-200 bg-white py-1 pl-7 pr-2 text-[11px] placeholder-zinc-400 focus:border-indigo-400 focus:outline-none focus:ring-1 focus:ring-indigo-400 dark:border-zinc-700 dark:bg-zinc-900" })] }) }), _jsx("div", { className: "flex-1 overflow-y-auto p-2", children: capabilities.length === 0 ? (_jsxs("div", { className: "px-2 py-8 text-center", children: [_jsx("p", { className: "text-[11px] text-zinc-400", children: "No capabilities loaded" }), _jsx("p", { className: "mt-1 text-[10px] text-zinc-500", children: "Load a plugin to get started" })] })) : filtered.length === 0 ? (_jsx("p", { className: "px-2 py-4 text-[11px] text-zinc-400", children: "No matching capabilities" })) : (_jsx("div", { className: "space-y-3", children: Array.from(grouped.entries()).map(([domain, caps]) => (_jsxs("div", { children: [_jsx("div", { className: "px-2 py-1 text-[10px] font-semibold uppercase tracking-wider text-zinc-400", children: domain }), _jsx("ul", { className: "space-y-0.5", children: caps.map((cap) => {
|
|
36
37
|
const isInPipeline = nodes.some((n) => n.capability === cap.name);
|
|
37
38
|
return (_jsx("li", { children: _jsxs("button", { type: "button", onClick: () => addNode(cap.name), className: `group w-full rounded-md px-2 py-1.5 text-left transition-all ${isInPipeline
|
|
38
39
|
? 'bg-indigo-50/50 ring-1 ring-indigo-200 dark:bg-indigo-950/20 dark:ring-indigo-800'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Inspector.js","sourceRoot":"","sources":["../../src/components/Inspector.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAM3C,MAAM,UAAU,SAAS,CAAC,EAAE,SAAS,GAAG,EAAE,EAAkB;IAC1D,MAAM,YAAY,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,YAAY,CAAC,CAAC;IAC9D,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAClE,MAAM,aAAa,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAChE,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC;IACpD,MAAM,gBAAgB,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAC;IAEtE,MAAM,YAAY,GAAG,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,cAAc,CAAC,CAAC;IAChE,MAAM,CAAC,MAAM,EAAE,SAAS,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAC;IAC/C,MAAM,CAAC,aAAa,EAAE,gBAAgB,CAAC,GAAG,KAAK,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IAE/D,MAAM,QAAQ,GAAG,YAAY,CAAC,MAAM,CAClC,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC;QACnD,CAAC,CAAC,WAAW,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,WAAW,EAAE,CAAC,CAC7D,CAAC;IAEF,OAAO;IACP,MAAM,OAAO,GAAG,KAAK,CAAC,OAAO,CAAC,GAAG,EAAE;QACjC,MAAM,GAAG,GAAG,IAAI,GAAG,EAA2B,CAAC;QAC/C,KAAK,MAAM,GAAG,IAAI,QAAQ,EAAE,CAAC;YAC3B,MAAM,MAAM,GAAG,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,OAAO,CAAC;YACjD,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,MAAM,CAAC;gBAAE,GAAG,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;YAC1C,GAAG,CAAC,GAAG,CAAC,MAAM,CAAE,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAC7B,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC;IAEf,MAAM,aAAa,GAAG,YAAY,IAAI,aAAa,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC;IAE7E,OAAO,CACL,iBACE,SAAS,EAAE,6EAA6E,SAAS,EAAE,aAGlG,aAAa,IAAI,CAChB,eAAK,SAAS,EAAC,wDAAwD,aACrE,kBACE,IAAI,EAAC,QAAQ,EACb,OAAO,EAAE,GAAG,EAAE,CAAC,gBAAgB,CAAC,CAAC,aAAa,CAAC,EAC/C,SAAS,EAAC,2HAA2H,aAErI,eAAK,SAAS,EAAC,yBAAyB,aACtC,
|
|
1
|
+
{"version":3,"file":"Inspector.js","sourceRoot":"","sources":["../../src/components/Inspector.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PipelineBar.d.ts","sourceRoot":"","sources":["../../src/components/PipelineBar.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"PipelineBar.d.ts","sourceRoot":"","sources":["../../src/components/PipelineBar.tsx"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAI/B,MAAM,WAAW,gBAAgB;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,WAAW,CAAC,EAAE,SAAc,EAAE,EAAE,gBAAgB,qBA6F/D"}
|
|
@@ -6,13 +6,14 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
6
6
|
* 位于 Canvas 下方、StatusBar 上方。
|
|
7
7
|
*/
|
|
8
8
|
import * as React from 'react';
|
|
9
|
+
import { Icon } from '@lokvis/ui-core';
|
|
9
10
|
import { useWorkspaceStore } from '../store/index.js';
|
|
10
11
|
export function PipelineBar({ className = '' }) {
|
|
11
12
|
const nodes = useWorkspaceStore((s) => s.nodes);
|
|
12
13
|
const selectedNodeId = useWorkspaceStore((s) => s.selectedNodeId);
|
|
13
14
|
const selectNode = useWorkspaceStore((s) => s.selectNode);
|
|
14
15
|
const removeNode = useWorkspaceStore((s) => s.removeNode);
|
|
15
|
-
return (_jsxs("div", { className: `flex h-10 shrink-0 items-center gap-2 border-t border-zinc-200 bg-white px-3 dark:border-zinc-800 dark:bg-zinc-900 ${className}`, children: [_jsx("span", { className: "text-[10px] font-semibold uppercase tracking-wider text-zinc-400 shrink-0", children: "Pipeline" }), nodes.length === 0 ? (_jsx("span", { className: "text-[11px] text-zinc-400", children: "Empty \u2014 add capabilities from the right panel" })) : (_jsxs("div", { className: "flex flex-1 items-center gap-1 overflow-x-auto min-w-0", children: [_jsxs("div", { className: "flex items-center gap-1 rounded-md bg-zinc-100 px-2 py-1 text-[10px] font-medium text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400 shrink-0", children: [_jsx(
|
|
16
|
+
return (_jsxs("div", { className: `flex h-10 shrink-0 items-center gap-2 border-t border-zinc-200 bg-white px-3 dark:border-zinc-800 dark:bg-zinc-900 ${className}`, children: [_jsx("span", { className: "text-[10px] font-semibold uppercase tracking-wider text-zinc-400 shrink-0", children: "Pipeline" }), nodes.length === 0 ? (_jsx("span", { className: "text-[11px] text-zinc-400", children: "Empty \u2014 add capabilities from the right panel" })) : (_jsxs("div", { className: "flex flex-1 items-center gap-1 overflow-x-auto min-w-0", children: [_jsxs("div", { className: "flex items-center gap-1 rounded-md bg-zinc-100 px-2 py-1 text-[10px] font-medium text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400 shrink-0", children: [_jsx(Icon, { size: 12, children: _jsx("path", { d: "M12 4.5v15m7.5-7.5h-15" }) }), "Source"] }), _jsx(Icon, { size: 12, className: "shrink-0 text-zinc-300 dark:text-zinc-600", children: _jsx("path", { d: "m9 5 7 7-7 7" }) }), nodes.map((node, i) => {
|
|
16
17
|
const selected = node.id === selectedNodeId;
|
|
17
18
|
return (_jsxs(React.Fragment, { children: [_jsxs("button", { type: "button", onClick: () => selectNode(node.id), className: `group flex shrink-0 items-center gap-1.5 rounded-md px-2.5 py-1 text-[11px] font-medium transition-all ${selected
|
|
18
19
|
? 'bg-indigo-100 text-indigo-700 ring-1 ring-indigo-300 dark:bg-indigo-950/50 dark:text-indigo-300 dark:ring-indigo-700'
|
|
@@ -25,8 +26,8 @@ export function PipelineBar({ className = '' }) {
|
|
|
25
26
|
: 'bg-zinc-100 text-zinc-700 hover:bg-zinc-200 dark:bg-zinc-800 dark:text-zinc-300 dark:hover:bg-zinc-700'}`, children: [_jsx("span", { className: "font-mono", children: node.capability }), _jsx(StatusDot, { status: node.status }), _jsx("span", { onClick: (e) => {
|
|
26
27
|
e.stopPropagation();
|
|
27
28
|
removeNode(node.id);
|
|
28
|
-
}, className: "ml-0.5 rounded p-0.5 opacity-0 transition-opacity group-hover:opacity-100 hover:bg-red-100 hover:text-red-600 dark:hover:bg-red-900/40", role: "button", "aria-label": "Remove step", children: _jsx(
|
|
29
|
-
}), _jsx(
|
|
29
|
+
}, className: "ml-0.5 rounded p-0.5 opacity-0 transition-opacity group-hover:opacity-100 hover:bg-red-100 hover:text-red-600 dark:hover:bg-red-900/40", role: "button", "aria-label": "Remove step", children: _jsx(Icon, { size: 10, strokeWidth: 3, children: _jsx("path", { d: "M6 18L18 6M6 6l12 12" }) }) })] }), i < nodes.length - 1 && (_jsx(Icon, { size: 12, className: "shrink-0 text-zinc-300 dark:text-zinc-600", children: _jsx("path", { d: "m9 5 7 7-7 7" }) }))] }, node.id));
|
|
30
|
+
}), _jsx(Icon, { size: 12, className: "shrink-0 text-zinc-300 dark:text-zinc-600", children: _jsx("path", { d: "m9 5 7 7-7 7" }) }), _jsxs("div", { className: "flex items-center gap-1 rounded-md bg-zinc-100 px-2 py-1 text-[10px] font-medium text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400 shrink-0", children: [_jsx(Icon, { size: 12, children: _jsx("path", { d: "M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3" }) }), "Output"] })] })), nodes.length > 0 && (_jsxs("span", { className: "shrink-0 text-[10px] tabular-nums text-zinc-400", children: [nodes.length, " step", nodes.length !== 1 ? 's' : ''] }))] }));
|
|
30
31
|
}
|
|
31
32
|
function StatusDot({ status }) {
|
|
32
33
|
const color = status === 'running'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PipelineBar.js","sourceRoot":"","sources":["../../src/components/PipelineBar.tsx"],"names":[],"mappings":";AAAA;;;;;GAKG;AAEH,OAAO,KAAK,KAAK,MAAM,OAAO,CAAC;AAC/B,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AAMtD,MAAM,UAAU,WAAW,CAAC,EAAE,SAAS,GAAG,EAAE,EAAoB;IAC9D,MAAM,KAAK,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAChD,MAAM,cAAc,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC;IAClE,MAAM,UAAU,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAC1D,MAAM,UAAU,GAAG,iBAAiB,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC;IAE1D,OAAO,CACL,eAAK,SAAS,EAAE,sHAAsH,SAAS,EAAE,aAC/I,eAAM,SAAS,EAAC,2EAA2E,yBAEpF,EAEN,KAAK,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC,CAAC,CACpB,eAAM,SAAS,EAAC,2BAA2B,mEAEpC,CACR,CAAC,CAAC,CAAC,CACF,eAAK,SAAS,EAAC,wDAAwD,aAErE,eAAK,SAAS,EAAC,6IAA6I,aAC1J,
|
|
1
|
+
{"version":3,"file":"PipelineBar.js","sourceRoot":"","sources":["../../src/components/PipelineBar.tsx"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Workspace.d.ts","sourceRoot":"","sources":["../../src/components/Workspace.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;
|
|
1
|
+
{"version":3,"file":"Workspace.d.ts","sourceRoot":"","sources":["../../src/components/Workspace.tsx"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AAGH,OAAO,EAAa,KAAK,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAQzE,MAAM,WAAW,cAAe,SAAQ,gBAAgB;IACtD,WAAW;IACX,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,uBAAuB;IACvB,aAAa,CAAC,EAAE,OAAO,CAAC;IACxB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,wBAAgB,SAAS,CAAC,EACxB,KAAK,EACL,aAAoB,EACpB,SAAc,EACd,GAAG,aAAa,EACjB,EAAE,cAAc,+BAqDhB"}
|
|
@@ -13,6 +13,7 @@ import { jsx as _jsx, jsxs as _jsxs } from "react/jsx-runtime";
|
|
|
13
13
|
* <Workspace plugins={[imageToolsPlugin()]} />
|
|
14
14
|
* ```
|
|
15
15
|
*/
|
|
16
|
+
import { Icon } from '@lokvis/ui-core';
|
|
16
17
|
import { useLokvis } from '../hooks/useLokvis.js';
|
|
17
18
|
import { Toolbar } from './Toolbar.js';
|
|
18
19
|
import { AssetPanel } from './AssetPanel.js';
|
|
@@ -26,7 +27,7 @@ export function Workspace({ title, showStatusBar = true, className = '', ...lokv
|
|
|
26
27
|
return (_jsx("div", { className: "flex h-full items-center justify-center", children: _jsxs("div", { className: "flex flex-col items-center gap-4", children: [_jsxs("div", { className: "relative flex h-12 w-12 items-center justify-center", children: [_jsx("div", { className: "absolute inset-0 rounded-full border-2 border-indigo-200 dark:border-indigo-800" }), _jsx("div", { className: "h-8 w-8 animate-spin rounded-full border-2 border-transparent border-t-indigo-500" })] }), _jsxs("div", { className: "text-center", children: [_jsx("p", { className: "text-sm font-medium text-zinc-700 dark:text-zinc-300", children: "Initializing Runtime" }), _jsx("p", { className: "mt-1 text-xs text-zinc-400", children: "Loading plugins and capabilities..." })] })] }) }));
|
|
27
28
|
}
|
|
28
29
|
if (status === 'error') {
|
|
29
|
-
return (_jsx("div", { className: "flex h-full items-center justify-center px-6", children: _jsxs("div", { className: "max-w-md rounded-xl border border-red-200 bg-red-50 p-6 text-center dark:border-red-800/50 dark:bg-red-950/20", children: [_jsx("div", { className: "mb-3 flex h-10 w-10 mx-auto items-center justify-center rounded-full bg-red-100 dark:bg-red-900/40", children: _jsxs(
|
|
30
|
+
return (_jsx("div", { className: "flex h-full items-center justify-center px-6", children: _jsxs("div", { className: "max-w-md rounded-xl border border-red-200 bg-red-50 p-6 text-center dark:border-red-800/50 dark:bg-red-950/20", children: [_jsx("div", { className: "mb-3 flex h-10 w-10 mx-auto items-center justify-center rounded-full bg-red-100 dark:bg-red-900/40", children: _jsxs(Icon, { size: 20, className: "text-red-500", children: [_jsx("circle", { cx: "12", cy: "12", r: "10" }), _jsx("line", { x1: "12", y1: "8", x2: "12", y2: "12" }), _jsx("line", { x1: "12", y1: "16", x2: "12.01", y2: "16" })] }) }), _jsx("p", { className: "font-semibold text-red-700 dark:text-red-400", children: "Failed to initialize" }), _jsx("p", { className: "mt-1.5 text-sm text-red-600/80 dark:text-red-400/70", children: error })] }) }));
|
|
30
31
|
}
|
|
31
32
|
return (_jsxs("div", { className: `flex h-full flex-col bg-white dark:bg-zinc-900 ${className}`, children: [_jsx(Toolbar, { title: title }), _jsxs("div", { className: "flex flex-1 overflow-hidden", children: [_jsx(AssetPanel, {}), _jsx(Canvas, {}), _jsx(Inspector, {})] }), _jsx(PipelineBar, {}), showStatusBar && _jsx(StatusBar, {})] }));
|
|
32
33
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Workspace.js","sourceRoot":"","sources":["../../src/components/Workspace.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,SAAS,EAAyB,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAU3C,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,aAAa,GAAG,IAAI,EACpB,SAAS,GAAG,EAAE,EACd,GAAG,aAAa,EACD;IACf,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;IAEnD,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;QAC9B,OAAO,CACL,cAAK,SAAS,EAAC,yCAAyC,YACtD,eAAK,SAAS,EAAC,kCAAkC,aAC/C,eAAK,SAAS,EAAC,qDAAqD,aAClE,cAAK,SAAS,EAAC,iFAAiF,GAAG,EACnG,cAAK,SAAS,EAAC,mFAAmF,GAAG,IACjG,EACN,eAAK,SAAS,EAAC,aAAa,aAC1B,YAAG,SAAS,EAAC,sDAAsD,qCAAyB,EAC5F,YAAG,SAAS,EAAC,4BAA4B,oDAAwC,IAC7E,IACF,GACF,CACP,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,CACL,cAAK,SAAS,EAAC,8CAA8C,YAC3D,eAAK,SAAS,EAAC,+GAA+G,aAC5H,cAAK,SAAS,EAAC,oGAAoG,YACjH,
|
|
1
|
+
{"version":3,"file":"Workspace.js","sourceRoot":"","sources":["../../src/components/Workspace.tsx"],"names":[],"mappings":";AAAA;;;;;;;;;;;;;GAaG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,iBAAiB,CAAC;AACvC,OAAO,EAAE,SAAS,EAAyB,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AACrC,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAU3C,MAAM,UAAU,SAAS,CAAC,EACxB,KAAK,EACL,aAAa,GAAG,IAAI,EACpB,SAAS,GAAG,EAAE,EACd,GAAG,aAAa,EACD;IACf,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,SAAS,CAAC,aAAa,CAAC,CAAC;IAEnD,IAAI,MAAM,KAAK,cAAc,EAAE,CAAC;QAC9B,OAAO,CACL,cAAK,SAAS,EAAC,yCAAyC,YACtD,eAAK,SAAS,EAAC,kCAAkC,aAC/C,eAAK,SAAS,EAAC,qDAAqD,aAClE,cAAK,SAAS,EAAC,iFAAiF,GAAG,EACnG,cAAK,SAAS,EAAC,mFAAmF,GAAG,IACjG,EACN,eAAK,SAAS,EAAC,aAAa,aAC1B,YAAG,SAAS,EAAC,sDAAsD,qCAAyB,EAC5F,YAAG,SAAS,EAAC,4BAA4B,oDAAwC,IAC7E,IACF,GACF,CACP,CAAC;IACJ,CAAC;IAED,IAAI,MAAM,KAAK,OAAO,EAAE,CAAC;QACvB,OAAO,CACL,cAAK,SAAS,EAAC,8CAA8C,YAC3D,eAAK,SAAS,EAAC,+GAA+G,aAC5H,cAAK,SAAS,EAAC,oGAAoG,YACjH,MAAC,IAAI,IAAC,IAAI,EAAE,EAAE,EAAE,SAAS,EAAC,cAAc,aAAC,iBAAQ,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,CAAC,EAAC,IAAI,GAAG,EAAA,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,GAAG,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,GAAG,EAAA,eAAM,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,IAAI,EAAC,EAAE,EAAC,OAAO,EAAC,EAAE,EAAC,IAAI,GAAG,IAAO,GAC/J,EACN,YAAG,SAAS,EAAC,8CAA8C,qCAAyB,EACpF,YAAG,SAAS,EAAC,qDAAqD,YAAE,KAAK,GAAK,IAC1E,GACF,CACP,CAAC;IACJ,CAAC;IAED,OAAO,CACL,eAAK,SAAS,EAAE,kDAAkD,SAAS,EAAE,aAE3E,KAAC,OAAO,IAAC,KAAK,EAAE,KAAK,GAAI,EAGzB,eAAK,SAAS,EAAC,6BAA6B,aAC1C,KAAC,UAAU,KAAG,EACd,KAAC,MAAM,KAAG,EACV,KAAC,SAAS,KAAG,IACT,EAGN,KAAC,WAAW,KAAG,EAGd,aAAa,IAAI,KAAC,SAAS,KAAG,IAC3B,CACP,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets-slice.d.ts","sourceRoot":"","sources":["../../src/store/assets-slice.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnF,MAAM,WAAW,WACf,SAAQ,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,iBAAiB,GAAG,YAAY,CAAC,EACvE,IAAI,CACF,gBAAgB,EAChB,eAAe,GAAG,aAAa,GAAG,aAAa,GAAG,cAAc,GAAG,aAAa,CACjF;CAAG;AAER,eAAO,MAAM,iBAAiB,EAAE,YAAY,CAC1C,cAAc,EACd;CAAE,EACF;CAAE,EACF,WAAW,
|
|
1
|
+
{"version":3,"file":"assets-slice.d.ts","sourceRoot":"","sources":["../../src/store/assets-slice.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAC5C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnF,MAAM,WAAW,WACf,SAAQ,IAAI,CAAC,cAAc,EAAE,QAAQ,GAAG,iBAAiB,GAAG,YAAY,CAAC,EACvE,IAAI,CACF,gBAAgB,EAChB,eAAe,GAAG,aAAa,GAAG,aAAa,GAAG,cAAc,GAAG,aAAa,CACjF;CAAG;AAER,eAAO,MAAM,iBAAiB,EAAE,YAAY,CAC1C,cAAc,EACd;CAAE,EACF;CAAE,EACF,WAAW,CAwDX,CAAC"}
|
|
@@ -34,6 +34,23 @@ export const createAssetsSlice = (set, get) => ({
|
|
|
34
34
|
await get().refreshAssets();
|
|
35
35
|
if (get().selectedAssetId === id)
|
|
36
36
|
set({ selectedAssetId: null });
|
|
37
|
+
// 修复 review 报告:原实现删除 asset 后未 revoke 缩略图 ObjectURL,导致
|
|
38
|
+
// 浏览器 Blob 引用泄漏(每删一张图就漏一个 blob 内存)。
|
|
39
|
+
// 同时从 thumbnails map 中删除该 entry,避免 stale ref
|
|
40
|
+
const oldUrl = get().thumbnails[id];
|
|
41
|
+
if (oldUrl) {
|
|
42
|
+
try {
|
|
43
|
+
URL.revokeObjectURL(oldUrl);
|
|
44
|
+
}
|
|
45
|
+
catch {
|
|
46
|
+
/* URL 已失效或非 ObjectURL,忽略 */
|
|
47
|
+
}
|
|
48
|
+
set((state) => {
|
|
49
|
+
const next = { ...state.thumbnails };
|
|
50
|
+
delete next[id];
|
|
51
|
+
return { thumbnails: next };
|
|
52
|
+
});
|
|
53
|
+
}
|
|
37
54
|
},
|
|
38
55
|
});
|
|
39
56
|
//# sourceMappingURL=assets-slice.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets-slice.js","sourceRoot":"","sources":["../../src/store/assets-slice.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,iBAAiB,GAK1B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,EAAE;IACV,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,EAAE;IAEd,KAAK,CAAC,aAAa;QACjB,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC1C,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAK;QACrB,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,GAAG,CAAC,EAAE,aAAa,EAAE,aAAa,KAAK,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC;QAC/D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,aAAa,EAAE,YAAY,KAAK,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,WAAW,CAAC,EAAE;QACZ,GAAG,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,YAAY,CAAC,EAAE,EAAE,GAAG;QAClB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAE;QAClB,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QAC5B,IAAI,GAAG,EAAE,CAAC,eAAe,KAAK,EAAE;YAAE,GAAG,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"assets-slice.js","sourceRoot":"","sources":["../../src/store/assets-slice.ts"],"names":[],"mappings":"AAaA,MAAM,CAAC,MAAM,iBAAiB,GAK1B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACjB,MAAM,EAAE,EAAE;IACV,eAAe,EAAE,IAAI;IACrB,UAAU,EAAE,EAAE;IAEd,KAAK,CAAC,aAAa;QACjB,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,UAAU,EAAE,CAAC;QAC1C,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC;IAClB,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,KAAK;QACrB,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,GAAG,CAAC,EAAE,aAAa,EAAE,aAAa,KAAK,CAAC,MAAM,aAAa,EAAE,CAAC,CAAC;QAC/D,KAAK,MAAM,IAAI,IAAI,KAAK,EAAE,CAAC;YACzB,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;QACpD,CAAC;QACD,MAAM,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QAC5B,GAAG,CAAC,EAAE,aAAa,EAAE,YAAY,KAAK,CAAC,MAAM,UAAU,EAAE,CAAC,CAAC;IAC7D,CAAC;IAED,WAAW,CAAC,EAAE;QACZ,GAAG,CAAC,EAAE,eAAe,EAAE,EAAE,EAAE,CAAC,CAAC;IAC/B,CAAC;IAED,YAAY,CAAC,EAAE,EAAE,GAAG;QAClB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC,EAAE,UAAU,EAAE,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC,EAAE,CAAC,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC,CAAC;IACvE,CAAC;IAED,KAAK,CAAC,WAAW,CAAC,EAAE;QAClB,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,MAAM,OAAO,CAAC,WAAW,CAAC,EAAE,CAAC,CAAC;QAC9B,MAAM,GAAG,EAAE,CAAC,aAAa,EAAE,CAAC;QAC5B,IAAI,GAAG,EAAE,CAAC,eAAe,KAAK,EAAE;YAAE,GAAG,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,CAAC,CAAC;QAEjE,sDAAsD;QACtD,oCAAoC;QACpC,6CAA6C;QAC7C,MAAM,MAAM,GAAG,GAAG,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC;QACpC,IAAI,MAAM,EAAE,CAAC;YACX,IAAI,CAAC;gBACH,GAAG,CAAC,eAAe,CAAC,MAAM,CAAC,CAAC;YAC9B,CAAC;YAAC,MAAM,CAAC;gBACP,4BAA4B;YAC9B,CAAC;YACD,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE;gBACZ,MAAM,IAAI,GAAG,EAAE,GAAG,KAAK,CAAC,UAAU,EAAE,CAAC;gBACrC,OAAO,IAAI,CAAC,EAAE,CAAC,CAAC;gBAChB,OAAO,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC;YAC9B,CAAC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;CACF,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-slice.d.ts","sourceRoot":"","sources":["../../src/store/workflow-slice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnF,MAAM,WAAW,aACf,SAAQ,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,gBAAgB,CAAC,EACtD,IAAI,CACF,gBAAgB,EACd,SAAS,GACT,kBAAkB,GAClB,YAAY,GACZ,YAAY,GACZ,eAAe,GACf,KAAK,GACL,eAAe,CAClB;CAAG;AAER,eAAO,MAAM,mBAAmB,EAAE,YAAY,CAC5C,cAAc,EACd;CAAE,EACF;CAAE,EACF,aAAa,
|
|
1
|
+
{"version":3,"file":"workflow-slice.d.ts","sourceRoot":"","sources":["../../src/store/workflow-slice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAG5C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGnF,MAAM,WAAW,aACf,SAAQ,IAAI,CAAC,cAAc,EAAE,OAAO,GAAG,gBAAgB,CAAC,EACtD,IAAI,CACF,gBAAgB,EACd,SAAS,GACT,kBAAkB,GAClB,YAAY,GACZ,YAAY,GACZ,eAAe,GACf,KAAK,GACL,eAAe,CAClB;CAAG;AAER,eAAO,MAAM,mBAAmB,EAAE,YAAY,CAC5C,cAAc,EACd;CAAE,EACF;CAAE,EACF,aAAa,CA6Ib,CAAC"}
|
|
@@ -44,24 +44,41 @@ export const createWorkflowSlice = (set, get) => ({
|
|
|
44
44
|
set({ running: true, error: null, statusMessage: 'Running...' });
|
|
45
45
|
// 重置所有节点状态
|
|
46
46
|
set((state) => ({
|
|
47
|
-
nodes: state.nodes.map((n) => ({ ...n, status: 'pending', error: undefined })),
|
|
47
|
+
nodes: state.nodes.map((n) => ({ ...n, status: 'pending', error: undefined, duration: undefined })),
|
|
48
48
|
}));
|
|
49
|
+
// 修复 review 报告:原实现节点状态粒度不足
|
|
50
|
+
// - completed: 全部节点设 success(OK,但无耗时)
|
|
51
|
+
// - failed: 仅把仍为 pending 的节点设 failed,但 executor 在抛错前已 emit
|
|
52
|
+
// node:finished 给前面成功的节点(这些 status 仍是 pending)→ 这些节点
|
|
53
|
+
// 也被标 failed,UI 误显示前面成功的步骤都失败了
|
|
54
|
+
// - cancelled: 完全未处理
|
|
55
|
+
//
|
|
56
|
+
// 修复:订阅 node:started / node:finished / node:failed 事件实时更新节点状态,
|
|
57
|
+
// 这样 completed/failed/cancelled 三种情况下节点状态都精确
|
|
58
|
+
const offStarted = runtime.eventBus.on('node:started', (e) => {
|
|
59
|
+
get().setNodeStatus(e.nodeId, 'running');
|
|
60
|
+
});
|
|
61
|
+
const offFinished = runtime.eventBus.on('node:finished', (e) => {
|
|
62
|
+
get().setNodeStatus(e.nodeId, 'success', undefined, e.duration);
|
|
63
|
+
});
|
|
64
|
+
const offNodeFailed = runtime.eventBus.on('node:failed', (e) => {
|
|
65
|
+
const errMsg = e.error instanceof Error ? e.error.message : String(e.error);
|
|
66
|
+
get().setNodeStatus(e.nodeId, 'failed', errMsg);
|
|
67
|
+
});
|
|
49
68
|
try {
|
|
50
69
|
// 构建 Workflow
|
|
51
70
|
const workflow = buildLinearWorkflow(nodes);
|
|
52
71
|
const input = await runtime.getAsset(selectedAssetId);
|
|
53
72
|
set({ statusMessage: 'Running workflow...' });
|
|
54
73
|
const result = await runtime.run(workflow, [input]);
|
|
55
|
-
//
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
if (get().nodes.find((n) => n.id === node.id)?.status === 'pending') {
|
|
64
|
-
get().setNodeStatus(node.id, 'failed', result.error);
|
|
74
|
+
// 兜底:取消订阅后,根据 result.status 把剩余 pending 节点归位
|
|
75
|
+
// - completed: finishedNodeIds 已涵盖所有节点(无需额外处理)
|
|
76
|
+
// - failed: 失败节点之后未执行的节点标 cancelled
|
|
77
|
+
// - cancelled: 失败节点之外所有 running/pending 节点标 cancelled
|
|
78
|
+
if (result.status !== 'completed') {
|
|
79
|
+
for (const node of get().nodes) {
|
|
80
|
+
if (node.status === 'pending' || node.status === 'running') {
|
|
81
|
+
get().setNodeStatus(node.id, 'cancelled');
|
|
65
82
|
}
|
|
66
83
|
}
|
|
67
84
|
}
|
|
@@ -92,8 +109,19 @@ export const createWorkflowSlice = (set, get) => ({
|
|
|
92
109
|
error: message,
|
|
93
110
|
statusMessage: 'Failed',
|
|
94
111
|
});
|
|
112
|
+
// 异常退出时把仍在 pending/running 的节点标 failed
|
|
113
|
+
for (const node of get().nodes) {
|
|
114
|
+
if (node.status === 'pending' || node.status === 'running') {
|
|
115
|
+
get().setNodeStatus(node.id, 'failed', message);
|
|
116
|
+
}
|
|
117
|
+
}
|
|
95
118
|
throw err;
|
|
96
119
|
}
|
|
120
|
+
finally {
|
|
121
|
+
offStarted();
|
|
122
|
+
offFinished();
|
|
123
|
+
offNodeFailed();
|
|
124
|
+
}
|
|
97
125
|
},
|
|
98
126
|
clearWorkflow() {
|
|
99
127
|
set({ nodes: [], selectedNodeId: null });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-slice.js","sourceRoot":"","sources":["../../src/store/workflow-slice.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAevC,MAAM,CAAC,MAAM,mBAAmB,GAK5B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACjB,KAAK,EAAE,EAAE;IACT,cAAc,EAAE,IAAI;IAEpB,OAAO,CAAC,UAAU;QAChB,MAAM,IAAI,GAAkB;YAC1B,EAAE,EAAE,SAAS,EAAE;YACf,UAAU;YACV,MAAM,EAAE,EAAE;YACV,MAAM,EAAE,MAAM;SACf,CAAC;QACF,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACd,KAAK,EAAE,CAAC,GAAG,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC;YAC7B,cAAc,EAAE,IAAI,CAAC,EAAE;SACxB,CAAC,CAAC,CAAC;IACN,CAAC;IAED,gBAAgB,CAAC,EAAE,EAAE,MAAM;QACzB,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACd,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;SACpE,CAAC,CAAC,CAAC;IACN,CAAC;IAED,UAAU,CAAC,EAAE;QACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACd,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC;YAC7C,cAAc,EAAE,KAAK,CAAC,cAAc,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc;SAC1E,CAAC,CAAC,CAAC;IACN,CAAC;IAED,UAAU,CAAC,EAAE;QACX,GAAG,CAAC,EAAE,cAAc,EAAE,EAAE,EAAE,CAAC,CAAC;IAC9B,CAAC;IAED,aAAa,CAAC,EAAE,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ;QACvC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACd,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAC3B,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,CAAC,CACpD;SACF,CAAC,CAAC,CAAC;IACN,CAAC;IAED,KAAK,CAAC,GAAG;QACP,MAAM,EAAE,OAAO,EAAE,KAAK,EAAE,eAAe,EAAE,GAAG,GAAG,EAAE,CAAC;QAClD,IAAI,CAAC,OAAO;YAAE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QACzD,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAC7D,IAAI,CAAC,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAC;QAE3D,GAAG,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,aAAa,EAAE,YAAY,EAAE,CAAC,CAAC;QAEjE,WAAW;QACX,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YACd,KAAK,EAAE,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,MAAM,EAAE,SAAS,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"workflow-slice.js","sourceRoot":"","sources":["../../src/store/workflow-slice.ts"],"names":[],"mappings":"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"}
|
package/dist/store.d.ts
ADDED
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace UI 状态管理
|
|
3
|
+
*
|
|
4
|
+
* 使用 Zustand 管理工作台状态。Runtime 永远不知道 React,
|
|
5
|
+
* 但 UI 层负责把 Runtime 事件桥接到 store。
|
|
6
|
+
*/
|
|
7
|
+
import type { Asset, Capability } from '@lokvis/schema';
|
|
8
|
+
import type { LokvisRuntime } from '@lokvis/runtime';
|
|
9
|
+
import type { CapabilityMap, NodeStatus, WorkspaceNode } from './types.js';
|
|
10
|
+
/** 工作台完整状态 */
|
|
11
|
+
export interface WorkspaceState {
|
|
12
|
+
/** Runtime 实例 */
|
|
13
|
+
runtime: LokvisRuntime | null;
|
|
14
|
+
/** 是否正在初始化 Runtime */
|
|
15
|
+
initializing: boolean;
|
|
16
|
+
/** 初始化错误 */
|
|
17
|
+
initError: string | null;
|
|
18
|
+
/** 所有已导入资产 */
|
|
19
|
+
assets: Asset[];
|
|
20
|
+
/** 当前选中的资产 ID */
|
|
21
|
+
selectedAssetId: string | null;
|
|
22
|
+
/** 资产缩略图(AssetId → ObjectURL) */
|
|
23
|
+
thumbnails: Record<string, string>;
|
|
24
|
+
/** 所有已注册能力 */
|
|
25
|
+
capabilities: Capability[];
|
|
26
|
+
/** 能力映射表(name → Capability) */
|
|
27
|
+
capabilityMap: CapabilityMap;
|
|
28
|
+
/** 工作流节点序列(线性链) */
|
|
29
|
+
nodes: WorkspaceNode[];
|
|
30
|
+
/** 当前选中的节点 ID */
|
|
31
|
+
selectedNodeId: string | null;
|
|
32
|
+
/** 是否正在执行工作流 */
|
|
33
|
+
running: boolean;
|
|
34
|
+
/** 全局状态消息 */
|
|
35
|
+
statusMessage: string;
|
|
36
|
+
/** 错误信息 */
|
|
37
|
+
error: string | null;
|
|
38
|
+
}
|
|
39
|
+
/** 工作台操作 */
|
|
40
|
+
export interface WorkspaceActions {
|
|
41
|
+
/** 初始化 Runtime */
|
|
42
|
+
init(runtime: LokvisRuntime): Promise<void>;
|
|
43
|
+
/** 刷新资产列表 */
|
|
44
|
+
refreshAssets(): Promise<void>;
|
|
45
|
+
/** 刷新能力列表 */
|
|
46
|
+
refreshCapabilities(): Promise<void>;
|
|
47
|
+
/** 导入文件 */
|
|
48
|
+
importFiles(files: File[]): Promise<void>;
|
|
49
|
+
/** 选择资产 */
|
|
50
|
+
selectAsset(id: string | null): void;
|
|
51
|
+
/** 设置缩略图 */
|
|
52
|
+
setThumbnail(id: string, url: string): void;
|
|
53
|
+
/** 删除资产 */
|
|
54
|
+
removeAsset(id: string): Promise<void>;
|
|
55
|
+
/** 添加工作流节点 */
|
|
56
|
+
addNode(capability: string): void;
|
|
57
|
+
/** 更新节点参数 */
|
|
58
|
+
updateNodeParams(id: string, params: Record<string, unknown>): void;
|
|
59
|
+
/** 删除节点 */
|
|
60
|
+
removeNode(id: string): void;
|
|
61
|
+
/** 选择节点 */
|
|
62
|
+
selectNode(id: string | null): void;
|
|
63
|
+
/** 设置节点状态 */
|
|
64
|
+
setNodeStatus(id: string, status: NodeStatus, error?: string, duration?: number): void;
|
|
65
|
+
/** 执行工作流 */
|
|
66
|
+
run(): Promise<Asset[]>;
|
|
67
|
+
/** 设置状态消息 */
|
|
68
|
+
setStatus(message: string): void;
|
|
69
|
+
/** 设置错误 */
|
|
70
|
+
setError(error: string | null): void;
|
|
71
|
+
/** 清空工作流 */
|
|
72
|
+
clearWorkflow(): void;
|
|
73
|
+
}
|
|
74
|
+
export type WorkspaceStore = WorkspaceState & WorkspaceActions;
|
|
75
|
+
export declare const useWorkspaceStore: import("zustand").UseBoundStore<import("zustand").StoreApi<WorkspaceStore>>;
|
|
76
|
+
//# sourceMappingURL=store.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/dist/store.js
ADDED
|
@@ -0,0 +1,217 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Workspace UI 状态管理
|
|
3
|
+
*
|
|
4
|
+
* 使用 Zustand 管理工作台状态。Runtime 永远不知道 React,
|
|
5
|
+
* 但 UI 层负责把 Runtime 事件桥接到 store。
|
|
6
|
+
*/
|
|
7
|
+
import { create } from 'zustand';
|
|
8
|
+
/** 生成节点 ID */
|
|
9
|
+
function genNodeId() {
|
|
10
|
+
return `node_${Date.now().toString(36)}_${Math.random().toString(36).slice(2, 6)}`;
|
|
11
|
+
}
|
|
12
|
+
export const useWorkspaceStore = create((set, get) => ({
|
|
13
|
+
runtime: null,
|
|
14
|
+
initializing: false,
|
|
15
|
+
initError: null,
|
|
16
|
+
assets: [],
|
|
17
|
+
selectedAssetId: null,
|
|
18
|
+
thumbnails: {},
|
|
19
|
+
capabilities: [],
|
|
20
|
+
capabilityMap: {},
|
|
21
|
+
nodes: [],
|
|
22
|
+
selectedNodeId: null,
|
|
23
|
+
running: false,
|
|
24
|
+
statusMessage: 'Idle',
|
|
25
|
+
error: null,
|
|
26
|
+
async init(runtime) {
|
|
27
|
+
set({ runtime, initializing: true, initError: null });
|
|
28
|
+
try {
|
|
29
|
+
await get().refreshAssets();
|
|
30
|
+
await get().refreshCapabilities();
|
|
31
|
+
set({ initializing: false, statusMessage: 'Ready' });
|
|
32
|
+
}
|
|
33
|
+
catch (err) {
|
|
34
|
+
set({
|
|
35
|
+
initializing: false,
|
|
36
|
+
initError: err instanceof Error ? err.message : String(err),
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
},
|
|
40
|
+
async refreshAssets() {
|
|
41
|
+
const { runtime } = get();
|
|
42
|
+
if (!runtime)
|
|
43
|
+
return;
|
|
44
|
+
const assets = await runtime.listAssets();
|
|
45
|
+
set({ assets });
|
|
46
|
+
},
|
|
47
|
+
async refreshCapabilities() {
|
|
48
|
+
const { runtime } = get();
|
|
49
|
+
if (!runtime)
|
|
50
|
+
return;
|
|
51
|
+
const capabilities = await runtime.capabilities();
|
|
52
|
+
const capabilityMap = {};
|
|
53
|
+
for (const cap of capabilities)
|
|
54
|
+
capabilityMap[cap.name] = cap;
|
|
55
|
+
set({ capabilities, capabilityMap });
|
|
56
|
+
},
|
|
57
|
+
async importFiles(files) {
|
|
58
|
+
const { runtime } = get();
|
|
59
|
+
if (!runtime)
|
|
60
|
+
return;
|
|
61
|
+
set({ statusMessage: `Importing ${files.length} file(s)...` });
|
|
62
|
+
for (const file of files) {
|
|
63
|
+
await runtime.importAsset({ kind: 'file', file });
|
|
64
|
+
}
|
|
65
|
+
await get().refreshAssets();
|
|
66
|
+
set({ statusMessage: `Imported ${files.length} file(s)` });
|
|
67
|
+
},
|
|
68
|
+
selectAsset(id) {
|
|
69
|
+
set({ selectedAssetId: id });
|
|
70
|
+
},
|
|
71
|
+
setThumbnail(id, url) {
|
|
72
|
+
set((state) => ({ thumbnails: { ...state.thumbnails, [id]: url } }));
|
|
73
|
+
},
|
|
74
|
+
async removeAsset(id) {
|
|
75
|
+
const { runtime } = get();
|
|
76
|
+
if (!runtime)
|
|
77
|
+
return;
|
|
78
|
+
await runtime.removeAsset(id);
|
|
79
|
+
await get().refreshAssets();
|
|
80
|
+
if (get().selectedAssetId === id)
|
|
81
|
+
set({ selectedAssetId: null });
|
|
82
|
+
},
|
|
83
|
+
addNode(capability) {
|
|
84
|
+
const node = {
|
|
85
|
+
id: genNodeId(),
|
|
86
|
+
capability,
|
|
87
|
+
params: {},
|
|
88
|
+
status: 'idle',
|
|
89
|
+
};
|
|
90
|
+
set((state) => ({
|
|
91
|
+
nodes: [...state.nodes, node],
|
|
92
|
+
selectedNodeId: node.id,
|
|
93
|
+
}));
|
|
94
|
+
},
|
|
95
|
+
updateNodeParams(id, params) {
|
|
96
|
+
set((state) => ({
|
|
97
|
+
nodes: state.nodes.map((n) => (n.id === id ? { ...n, params } : n)),
|
|
98
|
+
}));
|
|
99
|
+
},
|
|
100
|
+
removeNode(id) {
|
|
101
|
+
set((state) => ({
|
|
102
|
+
nodes: state.nodes.filter((n) => n.id !== id),
|
|
103
|
+
selectedNodeId: state.selectedNodeId === id ? null : state.selectedNodeId,
|
|
104
|
+
}));
|
|
105
|
+
},
|
|
106
|
+
selectNode(id) {
|
|
107
|
+
set({ selectedNodeId: id });
|
|
108
|
+
},
|
|
109
|
+
setNodeStatus(id, status, error, duration) {
|
|
110
|
+
set((state) => ({
|
|
111
|
+
nodes: state.nodes.map((n) => n.id === id ? { ...n, status, error, duration } : n),
|
|
112
|
+
}));
|
|
113
|
+
},
|
|
114
|
+
async run() {
|
|
115
|
+
const { runtime, nodes, selectedAssetId } = get();
|
|
116
|
+
if (!runtime)
|
|
117
|
+
throw new Error('Runtime not initialized');
|
|
118
|
+
if (nodes.length === 0)
|
|
119
|
+
throw new Error('Workflow is empty');
|
|
120
|
+
if (!selectedAssetId)
|
|
121
|
+
throw new Error('No asset selected');
|
|
122
|
+
set({ running: true, error: null, statusMessage: 'Running...' });
|
|
123
|
+
// 重置所有节点状态
|
|
124
|
+
set((state) => ({
|
|
125
|
+
nodes: state.nodes.map((n) => ({ ...n, status: 'pending', error: undefined })),
|
|
126
|
+
}));
|
|
127
|
+
try {
|
|
128
|
+
// 构建 Workflow
|
|
129
|
+
const workflow = buildLinearWorkflow(nodes);
|
|
130
|
+
const input = await runtime.getAsset(selectedAssetId);
|
|
131
|
+
set({ statusMessage: 'Running workflow...' });
|
|
132
|
+
const result = await runtime.run(workflow, [input]);
|
|
133
|
+
// 更新节点状态
|
|
134
|
+
if (result.status === 'completed') {
|
|
135
|
+
for (const node of nodes) {
|
|
136
|
+
get().setNodeStatus(node.id, 'success', undefined, undefined);
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
else if (result.status === 'failed') {
|
|
140
|
+
for (const node of nodes) {
|
|
141
|
+
if (get().nodes.find((n) => n.id === node.id)?.status === 'pending') {
|
|
142
|
+
get().setNodeStatus(node.id, 'failed', result.error);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
// 加载输出资产
|
|
147
|
+
const outputs = [];
|
|
148
|
+
for (const id of result.outputs) {
|
|
149
|
+
try {
|
|
150
|
+
outputs.push(await runtime.getAsset(id));
|
|
151
|
+
}
|
|
152
|
+
catch {
|
|
153
|
+
// skip
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
set({
|
|
157
|
+
running: false,
|
|
158
|
+
statusMessage: `Workflow ${result.status} in ${result.duration}ms`,
|
|
159
|
+
});
|
|
160
|
+
if (result.status === 'failed') {
|
|
161
|
+
set({ error: result.error ?? 'Workflow failed' });
|
|
162
|
+
}
|
|
163
|
+
await get().refreshAssets();
|
|
164
|
+
return outputs;
|
|
165
|
+
}
|
|
166
|
+
catch (err) {
|
|
167
|
+
const message = err instanceof Error ? err.message : String(err);
|
|
168
|
+
set({
|
|
169
|
+
running: false,
|
|
170
|
+
error: message,
|
|
171
|
+
statusMessage: 'Failed',
|
|
172
|
+
});
|
|
173
|
+
throw err;
|
|
174
|
+
}
|
|
175
|
+
},
|
|
176
|
+
setStatus(message) {
|
|
177
|
+
set({ statusMessage: message });
|
|
178
|
+
},
|
|
179
|
+
setError(error) {
|
|
180
|
+
set({ error });
|
|
181
|
+
},
|
|
182
|
+
clearWorkflow() {
|
|
183
|
+
set({ nodes: [], selectedNodeId: null });
|
|
184
|
+
},
|
|
185
|
+
}));
|
|
186
|
+
/** 把工作台节点序列构建为线性 Workflow */
|
|
187
|
+
function buildLinearWorkflow(nodes) {
|
|
188
|
+
if (nodes.length === 0) {
|
|
189
|
+
throw new Error('Workflow is empty');
|
|
190
|
+
}
|
|
191
|
+
const workflowNodes = nodes.map((n) => ({
|
|
192
|
+
id: n.id,
|
|
193
|
+
type: 'transform',
|
|
194
|
+
capability: n.capability,
|
|
195
|
+
params: n.params,
|
|
196
|
+
}));
|
|
197
|
+
const edges = [];
|
|
198
|
+
for (let i = 0; i < workflowNodes.length - 1; i++) {
|
|
199
|
+
edges.push({ from: workflowNodes[i].id, to: workflowNodes[i + 1].id });
|
|
200
|
+
}
|
|
201
|
+
return {
|
|
202
|
+
id: `wf_${Date.now().toString(36)}`,
|
|
203
|
+
name: 'Workspace Workflow',
|
|
204
|
+
version: '1',
|
|
205
|
+
description: 'Workspace linear workflow',
|
|
206
|
+
author: { id: 'local', name: 'Local User' },
|
|
207
|
+
category: 'image',
|
|
208
|
+
tags: [],
|
|
209
|
+
nodes: workflowNodes,
|
|
210
|
+
edges,
|
|
211
|
+
inputs: { type: 'image', multiple: true },
|
|
212
|
+
outputs: { type: 'image' },
|
|
213
|
+
createdAt: Date.now(),
|
|
214
|
+
updatedAt: Date.now(),
|
|
215
|
+
};
|
|
216
|
+
}
|
|
217
|
+
//# sourceMappingURL=store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"store.js","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@lokvis/ui-react",
|
|
3
|
-
"version": "0.1.0",
|
|
3
|
+
"version": "0.1.1-beta.0",
|
|
4
4
|
"description": "Lokvis Workspace UI - React components for Image/Video/PDF Workspace",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -28,11 +28,11 @@
|
|
|
28
28
|
},
|
|
29
29
|
"dependencies": {
|
|
30
30
|
"zustand": "^5.0.0",
|
|
31
|
-
"@lokvis/schema": "0.
|
|
32
|
-
"@lokvis/
|
|
33
|
-
"@lokvis/sdk": "0.1.0",
|
|
34
|
-
"@lokvis/
|
|
35
|
-
"@lokvis/capability": "0.
|
|
31
|
+
"@lokvis/schema": "0.2.0-beta.0",
|
|
32
|
+
"@lokvis/ui-core": "0.1.1-beta.0",
|
|
33
|
+
"@lokvis/sdk": "0.1.1-beta.0",
|
|
34
|
+
"@lokvis/runtime": "0.2.0-beta.0",
|
|
35
|
+
"@lokvis/capability": "0.2.0-beta.0"
|
|
36
36
|
},
|
|
37
37
|
"devDependencies": {
|
|
38
38
|
"@types/react": "^19.0.0",
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import * as React from 'react';
|
|
9
|
+
import { Icon } from '@lokvis/ui-core';
|
|
9
10
|
import { useWorkspaceStore } from '../store/index.js';
|
|
10
11
|
|
|
11
12
|
export interface AssetPanelProps {
|
|
@@ -85,9 +86,9 @@ export function AssetPanel({ className = '' }: AssetPanelProps) {
|
|
|
85
86
|
className="hidden"
|
|
86
87
|
onChange={(e) => handleFiles(e.target.files)}
|
|
87
88
|
/>
|
|
88
|
-
<
|
|
89
|
-
<path
|
|
90
|
-
</
|
|
89
|
+
<Icon size={16} className="mx-auto">
|
|
90
|
+
<path d="M12 4.5v15m7.5-7.5h-15" />
|
|
91
|
+
</Icon>
|
|
91
92
|
<span className="mt-1 block text-[10px] font-medium">
|
|
92
93
|
{dragging ? 'Drop here' : 'Add files'}
|
|
93
94
|
</span>
|
|
@@ -138,7 +139,7 @@ export function AssetPanel({ className = '' }: AssetPanelProps) {
|
|
|
138
139
|
className="shrink-0 rounded p-0.5 text-zinc-300 opacity-0 transition-all hover:bg-red-50 hover:text-red-500 group-hover:opacity-100 dark:text-zinc-600 dark:hover:bg-red-950/30"
|
|
139
140
|
aria-label="Remove asset"
|
|
140
141
|
>
|
|
141
|
-
<
|
|
142
|
+
<Icon size={12}><path d="M6 18L18 6M6 6l12 12" /></Icon>
|
|
142
143
|
</button>
|
|
143
144
|
</li>
|
|
144
145
|
);
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import * as React from 'react';
|
|
9
|
+
import { Icon } from '@lokvis/ui-core';
|
|
9
10
|
import { useWorkspaceStore } from '../store/index.js';
|
|
10
11
|
|
|
11
12
|
export interface CanvasProps {
|
|
@@ -51,7 +52,7 @@ export function Canvas({ className = '' }: CanvasProps) {
|
|
|
51
52
|
{dragOver && (
|
|
52
53
|
<div className="absolute inset-4 z-10 rounded-xl border-2 border-dashed border-indigo-400 bg-indigo-50/80 flex items-center justify-center dark:border-indigo-600 dark:bg-indigo-950/60">
|
|
53
54
|
<div className="text-center">
|
|
54
|
-
<
|
|
55
|
+
<Icon size={32} className="mx-auto text-indigo-500" strokeWidth={1.5}><path d="M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5m-13.5-9L12 3m0 0 4.5 4.5M12 3v13.5" /></Icon>
|
|
55
56
|
<p className="mt-2 text-sm font-medium text-indigo-600 dark:text-indigo-400">Drop files to import</p>
|
|
56
57
|
</div>
|
|
57
58
|
</div>
|
|
@@ -89,9 +90,9 @@ export function Canvas({ className = '' }: CanvasProps) {
|
|
|
89
90
|
) : (
|
|
90
91
|
<div className="relative flex flex-col items-center gap-5 px-6 text-center">
|
|
91
92
|
<div className="flex h-20 w-20 items-center justify-center rounded-2xl bg-white shadow-sm ring-1 ring-zinc-200/80 dark:bg-zinc-800 dark:ring-zinc-700">
|
|
92
|
-
<
|
|
93
|
-
<path
|
|
94
|
-
</
|
|
93
|
+
<Icon size={36} className="text-zinc-300 dark:text-zinc-600" strokeWidth={1.5}>
|
|
94
|
+
<path d="m2.25 15.75 5.159-5.159a2.25 2.25 0 0 1 3.182 0l5.159 5.159m-1.5-1.5 1.409-1.409a2.25 2.25 0 0 1 3.182 0l2.909 2.909m-18 3.75h16.5a1.5 1.5 0 0 0 1.5-1.5V6a1.5 1.5 0 0 0-1.5-1.5H3.75A1.5 1.5 0 0 0 2.25 6v12a1.5 1.5 0 0 0 1.5 1.5Zm10.5-11.25h.008v.008h-.008V8.25Zm.375 0a.375.375 0 1 1-.75 0 .375.375 0 0 1 .75 0Z" />
|
|
95
|
+
</Icon>
|
|
95
96
|
</div>
|
|
96
97
|
<div>
|
|
97
98
|
<p className="text-sm font-medium text-zinc-500 dark:text-zinc-400">No asset selected</p>
|
|
@@ -103,7 +104,7 @@ export function Canvas({ className = '' }: CanvasProps) {
|
|
|
103
104
|
</div>
|
|
104
105
|
{assets.length === 0 && (
|
|
105
106
|
<label className="mt-2 inline-flex items-center gap-1.5 rounded-lg bg-indigo-600 px-4 py-2 text-xs font-medium text-white shadow-sm cursor-pointer transition-colors hover:bg-indigo-500">
|
|
106
|
-
<
|
|
107
|
+
<Icon size={14}><path d="M12 4.5v15m7.5-7.5h-15" /></Icon>
|
|
107
108
|
Import Files
|
|
108
109
|
<input
|
|
109
110
|
type="file"
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import * as React from 'react';
|
|
9
|
+
import { Icon } from '@lokvis/ui-core';
|
|
9
10
|
import { useWorkspaceStore } from '../store/index.js';
|
|
10
11
|
import { ParamForm } from './ParamForm.js';
|
|
11
12
|
|
|
@@ -57,7 +58,7 @@ export function Inspector({ className = '' }: InspectorProps) {
|
|
|
57
58
|
className="flex w-full items-center justify-between px-3 h-10 text-left transition-colors hover:bg-zinc-50 dark:hover:bg-zinc-800/50"
|
|
58
59
|
>
|
|
59
60
|
<div className="flex items-center gap-2">
|
|
60
|
-
<
|
|
61
|
+
<Icon size={12} className={`text-zinc-400 transition-transform ${configureOpen ? 'rotate-90' : ''}`}><path d="m9 5 7 7-7 7" /></Icon>
|
|
61
62
|
<span className="text-[11px] font-semibold uppercase tracking-wider text-zinc-400">Configure</span>
|
|
62
63
|
</div>
|
|
63
64
|
<span className="font-mono text-[10px] text-indigo-500 bg-indigo-50 dark:bg-indigo-950/30 px-1.5 py-0.5 rounded">
|
|
@@ -88,7 +89,7 @@ export function Inspector({ className = '' }: InspectorProps) {
|
|
|
88
89
|
{/* Search */}
|
|
89
90
|
<div className="px-2 py-2 border-b border-zinc-100 dark:border-zinc-800/50">
|
|
90
91
|
<div className="relative">
|
|
91
|
-
<
|
|
92
|
+
<Icon size={12} className="absolute left-2 top-1/2 -translate-y-1/2 text-zinc-400"><circle cx="11" cy="11" r="8" /><path d="m21 21-4.3-4.3" /></Icon>
|
|
92
93
|
<input
|
|
93
94
|
type="text"
|
|
94
95
|
placeholder="Search capabilities..."
|
|
@@ -6,6 +6,7 @@
|
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
8
|
import * as React from 'react';
|
|
9
|
+
import { Icon } from '@lokvis/ui-core';
|
|
9
10
|
import { useWorkspaceStore } from '../store/index.js';
|
|
10
11
|
|
|
11
12
|
export interface PipelineBarProps {
|
|
@@ -32,14 +33,14 @@ export function PipelineBar({ className = '' }: PipelineBarProps) {
|
|
|
32
33
|
<div className="flex flex-1 items-center gap-1 overflow-x-auto min-w-0">
|
|
33
34
|
{/* Source indicator */}
|
|
34
35
|
<div className="flex items-center gap-1 rounded-md bg-zinc-100 px-2 py-1 text-[10px] font-medium text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400 shrink-0">
|
|
35
|
-
<
|
|
36
|
+
<Icon size={12}><path d="M12 4.5v15m7.5-7.5h-15" /></Icon>
|
|
36
37
|
Source
|
|
37
38
|
</div>
|
|
38
39
|
|
|
39
40
|
{/* Arrow */}
|
|
40
|
-
<
|
|
41
|
-
<path
|
|
42
|
-
</
|
|
41
|
+
<Icon size={12} className="shrink-0 text-zinc-300 dark:text-zinc-600">
|
|
42
|
+
<path d="m9 5 7 7-7 7" />
|
|
43
|
+
</Icon>
|
|
43
44
|
|
|
44
45
|
{/* Nodes */}
|
|
45
46
|
{nodes.map((node, i) => {
|
|
@@ -72,26 +73,26 @@ export function PipelineBar({ className = '' }: PipelineBarProps) {
|
|
|
72
73
|
role="button"
|
|
73
74
|
aria-label="Remove step"
|
|
74
75
|
>
|
|
75
|
-
<
|
|
76
|
+
<Icon size={10} strokeWidth={3}><path d="M6 18L18 6M6 6l12 12" /></Icon>
|
|
76
77
|
</span>
|
|
77
78
|
</button>
|
|
78
79
|
|
|
79
80
|
{/* Arrow between nodes */}
|
|
80
81
|
{i < nodes.length - 1 && (
|
|
81
|
-
<
|
|
82
|
-
<path
|
|
83
|
-
</
|
|
82
|
+
<Icon size={12} className="shrink-0 text-zinc-300 dark:text-zinc-600">
|
|
83
|
+
<path d="m9 5 7 7-7 7" />
|
|
84
|
+
</Icon>
|
|
84
85
|
)}
|
|
85
86
|
</React.Fragment>
|
|
86
87
|
);
|
|
87
88
|
})}
|
|
88
89
|
|
|
89
90
|
{/* Output indicator */}
|
|
90
|
-
<
|
|
91
|
-
<path
|
|
92
|
-
</
|
|
91
|
+
<Icon size={12} className="shrink-0 text-zinc-300 dark:text-zinc-600">
|
|
92
|
+
<path d="m9 5 7 7-7 7" />
|
|
93
|
+
</Icon>
|
|
93
94
|
<div className="flex items-center gap-1 rounded-md bg-zinc-100 px-2 py-1 text-[10px] font-medium text-zinc-500 dark:bg-zinc-800 dark:text-zinc-400 shrink-0">
|
|
94
|
-
<
|
|
95
|
+
<Icon size={12}><path d="M3 16.5v2.25A2.25 2.25 0 0 0 5.25 21h13.5A2.25 2.25 0 0 0 21 18.75V16.5M16.5 12 12 16.5m0 0L7.5 12m4.5 4.5V3" /></Icon>
|
|
95
96
|
Output
|
|
96
97
|
</div>
|
|
97
98
|
</div>
|
|
@@ -13,6 +13,7 @@
|
|
|
13
13
|
* ```
|
|
14
14
|
*/
|
|
15
15
|
|
|
16
|
+
import { Icon } from '@lokvis/ui-core';
|
|
16
17
|
import { useLokvis, type UseLokvisOptions } from '../hooks/useLokvis.js';
|
|
17
18
|
import { Toolbar } from './Toolbar.js';
|
|
18
19
|
import { AssetPanel } from './AssetPanel.js';
|
|
@@ -59,7 +60,7 @@ export function Workspace({
|
|
|
59
60
|
<div className="flex h-full items-center justify-center px-6">
|
|
60
61
|
<div className="max-w-md rounded-xl border border-red-200 bg-red-50 p-6 text-center dark:border-red-800/50 dark:bg-red-950/20">
|
|
61
62
|
<div className="mb-3 flex h-10 w-10 mx-auto items-center justify-center rounded-full bg-red-100 dark:bg-red-900/40">
|
|
62
|
-
<
|
|
63
|
+
<Icon size={20} className="text-red-500"><circle cx="12" cy="12" r="10" /><line x1="12" y1="8" x2="12" y2="12" /><line x1="12" y1="16" x2="12.01" y2="16" /></Icon>
|
|
63
64
|
</div>
|
|
64
65
|
<p className="font-semibold text-red-700 dark:text-red-400">Failed to initialize</p>
|
|
65
66
|
<p className="mt-1.5 text-sm text-red-600/80 dark:text-red-400/70">{error}</p>
|
|
@@ -53,5 +53,22 @@ export const createAssetsSlice: StateCreator<
|
|
|
53
53
|
await runtime.removeAsset(id);
|
|
54
54
|
await get().refreshAssets();
|
|
55
55
|
if (get().selectedAssetId === id) set({ selectedAssetId: null });
|
|
56
|
+
|
|
57
|
+
// 修复 review 报告:原实现删除 asset 后未 revoke 缩略图 ObjectURL,导致
|
|
58
|
+
// 浏览器 Blob 引用泄漏(每删一张图就漏一个 blob 内存)。
|
|
59
|
+
// 同时从 thumbnails map 中删除该 entry,避免 stale ref
|
|
60
|
+
const oldUrl = get().thumbnails[id];
|
|
61
|
+
if (oldUrl) {
|
|
62
|
+
try {
|
|
63
|
+
URL.revokeObjectURL(oldUrl);
|
|
64
|
+
} catch {
|
|
65
|
+
/* URL 已失效或非 ObjectURL,忽略 */
|
|
66
|
+
}
|
|
67
|
+
set((state) => {
|
|
68
|
+
const next = { ...state.thumbnails };
|
|
69
|
+
delete next[id];
|
|
70
|
+
return { thumbnails: next };
|
|
71
|
+
});
|
|
72
|
+
}
|
|
56
73
|
},
|
|
57
74
|
});
|
|
@@ -84,9 +84,29 @@ export const createWorkflowSlice: StateCreator<
|
|
|
84
84
|
|
|
85
85
|
// 重置所有节点状态
|
|
86
86
|
set((state) => ({
|
|
87
|
-
nodes: state.nodes.map((n) => ({ ...n, status: 'pending', error: undefined })),
|
|
87
|
+
nodes: state.nodes.map((n) => ({ ...n, status: 'pending', error: undefined, duration: undefined })),
|
|
88
88
|
}));
|
|
89
89
|
|
|
90
|
+
// 修复 review 报告:原实现节点状态粒度不足
|
|
91
|
+
// - completed: 全部节点设 success(OK,但无耗时)
|
|
92
|
+
// - failed: 仅把仍为 pending 的节点设 failed,但 executor 在抛错前已 emit
|
|
93
|
+
// node:finished 给前面成功的节点(这些 status 仍是 pending)→ 这些节点
|
|
94
|
+
// 也被标 failed,UI 误显示前面成功的步骤都失败了
|
|
95
|
+
// - cancelled: 完全未处理
|
|
96
|
+
//
|
|
97
|
+
// 修复:订阅 node:started / node:finished / node:failed 事件实时更新节点状态,
|
|
98
|
+
// 这样 completed/failed/cancelled 三种情况下节点状态都精确
|
|
99
|
+
const offStarted = runtime.eventBus.on('node:started', (e) => {
|
|
100
|
+
get().setNodeStatus(e.nodeId, 'running');
|
|
101
|
+
});
|
|
102
|
+
const offFinished = runtime.eventBus.on('node:finished', (e) => {
|
|
103
|
+
get().setNodeStatus(e.nodeId, 'success', undefined, e.duration);
|
|
104
|
+
});
|
|
105
|
+
const offNodeFailed = runtime.eventBus.on('node:failed', (e) => {
|
|
106
|
+
const errMsg = e.error instanceof Error ? e.error.message : String(e.error);
|
|
107
|
+
get().setNodeStatus(e.nodeId, 'failed', errMsg);
|
|
108
|
+
});
|
|
109
|
+
|
|
90
110
|
try {
|
|
91
111
|
// 构建 Workflow
|
|
92
112
|
const workflow = buildLinearWorkflow(nodes);
|
|
@@ -95,15 +115,14 @@ export const createWorkflowSlice: StateCreator<
|
|
|
95
115
|
set({ statusMessage: 'Running workflow...' });
|
|
96
116
|
const result = await runtime.run(workflow, [input]);
|
|
97
117
|
|
|
98
|
-
//
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
get().setNodeStatus(node.id, 'failed', result.error);
|
|
118
|
+
// 兜底:取消订阅后,根据 result.status 把剩余 pending 节点归位
|
|
119
|
+
// - completed: finishedNodeIds 已涵盖所有节点(无需额外处理)
|
|
120
|
+
// - failed: 失败节点之后未执行的节点标 cancelled
|
|
121
|
+
// - cancelled: 失败节点之外所有 running/pending 节点标 cancelled
|
|
122
|
+
if (result.status !== 'completed') {
|
|
123
|
+
for (const node of get().nodes) {
|
|
124
|
+
if (node.status === 'pending' || node.status === 'running') {
|
|
125
|
+
get().setNodeStatus(node.id, 'cancelled');
|
|
107
126
|
}
|
|
108
127
|
}
|
|
109
128
|
}
|
|
@@ -136,7 +155,17 @@ export const createWorkflowSlice: StateCreator<
|
|
|
136
155
|
error: message,
|
|
137
156
|
statusMessage: 'Failed',
|
|
138
157
|
});
|
|
158
|
+
// 异常退出时把仍在 pending/running 的节点标 failed
|
|
159
|
+
for (const node of get().nodes) {
|
|
160
|
+
if (node.status === 'pending' || node.status === 'running') {
|
|
161
|
+
get().setNodeStatus(node.id, 'failed', message);
|
|
162
|
+
}
|
|
163
|
+
}
|
|
139
164
|
throw err;
|
|
165
|
+
} finally {
|
|
166
|
+
offStarted();
|
|
167
|
+
offFinished();
|
|
168
|
+
offNodeFailed();
|
|
140
169
|
}
|
|
141
170
|
},
|
|
142
171
|
|