@lokvis/ui-react 0.1.1-beta.0 → 0.2.1

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 (152) hide show
  1. package/LICENSE +21 -0
  2. package/dist/components/AssetPanel.d.ts +2 -2
  3. package/dist/components/AssetPanel.d.ts.map +1 -1
  4. package/dist/components/AssetPanel.js +79 -7
  5. package/dist/components/AssetPanel.js.map +1 -1
  6. package/dist/components/Canvas.d.ts +9 -1
  7. package/dist/components/Canvas.d.ts.map +1 -1
  8. package/dist/components/Canvas.js +39 -2
  9. package/dist/components/Canvas.js.map +1 -1
  10. package/dist/components/CommandPalette.d.ts +48 -0
  11. package/dist/components/CommandPalette.d.ts.map +1 -0
  12. package/dist/components/CommandPalette.js +154 -0
  13. package/dist/components/CommandPalette.js.map +1 -0
  14. package/dist/components/CompareSlider.d.ts +25 -0
  15. package/dist/components/CompareSlider.d.ts.map +1 -0
  16. package/dist/components/CompareSlider.js +106 -0
  17. package/dist/components/CompareSlider.js.map +1 -0
  18. package/dist/components/DownloadPanel.d.ts +20 -0
  19. package/dist/components/DownloadPanel.d.ts.map +1 -0
  20. package/dist/components/DownloadPanel.js +169 -0
  21. package/dist/components/DownloadPanel.js.map +1 -0
  22. package/dist/components/ErrorBanner.d.ts +22 -0
  23. package/dist/components/ErrorBanner.d.ts.map +1 -0
  24. package/dist/components/ErrorBanner.js +47 -0
  25. package/dist/components/ErrorBanner.js.map +1 -0
  26. package/dist/components/ExifPanel.d.ts +26 -0
  27. package/dist/components/ExifPanel.d.ts.map +1 -0
  28. package/dist/components/ExifPanel.js +104 -0
  29. package/dist/components/ExifPanel.js.map +1 -0
  30. package/dist/components/GlobalDropzone.d.ts +37 -0
  31. package/dist/components/GlobalDropzone.d.ts.map +1 -0
  32. package/dist/components/GlobalDropzone.js +154 -0
  33. package/dist/components/GlobalDropzone.js.map +1 -0
  34. package/dist/components/HistoryPanel.d.ts +17 -7
  35. package/dist/components/HistoryPanel.d.ts.map +1 -1
  36. package/dist/components/HistoryPanel.js +74 -62
  37. package/dist/components/HistoryPanel.js.map +1 -1
  38. package/dist/components/Inspector.d.ts.map +1 -1
  39. package/dist/components/Inspector.js +2 -1
  40. package/dist/components/Inspector.js.map +1 -1
  41. package/dist/components/ProgressBar.d.ts +18 -0
  42. package/dist/components/ProgressBar.d.ts.map +1 -0
  43. package/dist/components/ProgressBar.js +35 -0
  44. package/dist/components/ProgressBar.js.map +1 -0
  45. package/dist/components/StatusBar.d.ts +8 -2
  46. package/dist/components/StatusBar.d.ts.map +1 -1
  47. package/dist/components/StatusBar.js +59 -4
  48. package/dist/components/StatusBar.js.map +1 -1
  49. package/dist/components/ThemeToggle.d.ts +20 -0
  50. package/dist/components/ThemeToggle.d.ts.map +1 -0
  51. package/dist/components/ThemeToggle.js +60 -0
  52. package/dist/components/ThemeToggle.js.map +1 -0
  53. package/dist/components/WorkflowEditor.d.ts +24 -0
  54. package/dist/components/WorkflowEditor.d.ts.map +1 -0
  55. package/dist/components/WorkflowEditor.js +160 -0
  56. package/dist/components/WorkflowEditor.js.map +1 -0
  57. package/dist/components/WorkflowTemplates.d.ts +23 -0
  58. package/dist/components/WorkflowTemplates.d.ts.map +1 -0
  59. package/dist/components/WorkflowTemplates.js +32 -0
  60. package/dist/components/WorkflowTemplates.js.map +1 -0
  61. package/dist/components/Workspace.d.ts +48 -2
  62. package/dist/components/Workspace.d.ts.map +1 -1
  63. package/dist/components/Workspace.js +78 -4
  64. package/dist/components/Workspace.js.map +1 -1
  65. package/dist/data/workflow-templates.d.ts +42 -0
  66. package/dist/data/workflow-templates.d.ts.map +1 -0
  67. package/dist/data/workflow-templates.js +112 -0
  68. package/dist/data/workflow-templates.js.map +1 -0
  69. package/dist/hooks/useDebouncedRun.d.ts +49 -0
  70. package/dist/hooks/useDebouncedRun.d.ts.map +1 -0
  71. package/dist/hooks/useDebouncedRun.js +117 -0
  72. package/dist/hooks/useDebouncedRun.js.map +1 -0
  73. package/dist/hooks/useLokvis.js +1 -1
  74. package/dist/hooks/useMediaQuery.d.ts +27 -0
  75. package/dist/hooks/useMediaQuery.d.ts.map +1 -0
  76. package/dist/hooks/useMediaQuery.js +41 -0
  77. package/dist/hooks/useMediaQuery.js.map +1 -0
  78. package/dist/hooks/useShareLink.d.ts +58 -0
  79. package/dist/hooks/useShareLink.d.ts.map +1 -0
  80. package/dist/hooks/useShareLink.js +120 -0
  81. package/dist/hooks/useShareLink.js.map +1 -0
  82. package/dist/hooks/useTheme.d.ts +30 -0
  83. package/dist/hooks/useTheme.d.ts.map +1 -0
  84. package/dist/hooks/useTheme.js +105 -0
  85. package/dist/hooks/useTheme.js.map +1 -0
  86. package/dist/hooks/useWorkflowProgress.d.ts +28 -0
  87. package/dist/hooks/useWorkflowProgress.d.ts.map +1 -0
  88. package/dist/hooks/useWorkflowProgress.js +25 -0
  89. package/dist/hooks/useWorkflowProgress.js.map +1 -0
  90. package/dist/hooks/useWorkflows.d.ts +86 -0
  91. package/dist/hooks/useWorkflows.d.ts.map +1 -0
  92. package/dist/hooks/useWorkflows.js +247 -0
  93. package/dist/hooks/useWorkflows.js.map +1 -0
  94. package/dist/index.d.ts +26 -0
  95. package/dist/index.d.ts.map +1 -1
  96. package/dist/index.js +26 -0
  97. package/dist/index.js.map +1 -1
  98. package/dist/store/assets-slice.d.ts.map +1 -1
  99. package/dist/store/assets-slice.js +2 -0
  100. package/dist/store/assets-slice.js.map +1 -1
  101. package/dist/store/history-slice.d.ts +18 -0
  102. package/dist/store/history-slice.d.ts.map +1 -0
  103. package/dist/store/history-slice.js +42 -0
  104. package/dist/store/history-slice.js.map +1 -0
  105. package/dist/store/index.d.ts +1 -0
  106. package/dist/store/index.d.ts.map +1 -1
  107. package/dist/store/index.js +3 -0
  108. package/dist/store/index.js.map +1 -1
  109. package/dist/store/runtime-slice.d.ts +10 -2
  110. package/dist/store/runtime-slice.d.ts.map +1 -1
  111. package/dist/store/runtime-slice.js +77 -28
  112. package/dist/store/runtime-slice.js.map +1 -1
  113. package/dist/store/types.d.ts +70 -1
  114. package/dist/store/types.d.ts.map +1 -1
  115. package/dist/store/types.js +10 -0
  116. package/dist/store/types.js.map +1 -1
  117. package/dist/store/workflow-slice.d.ts +1 -1
  118. package/dist/store/workflow-slice.d.ts.map +1 -1
  119. package/dist/store/workflow-slice.js +128 -9
  120. package/dist/store/workflow-slice.js.map +1 -1
  121. package/package.json +9 -6
  122. package/src/components/AssetPanel.tsx +149 -8
  123. package/src/components/Canvas.tsx +79 -2
  124. package/src/components/CommandPalette.tsx +300 -0
  125. package/src/components/CompareSlider.tsx +186 -0
  126. package/src/components/DownloadPanel.tsx +252 -0
  127. package/src/components/ErrorBanner.tsx +95 -0
  128. package/src/components/ExifPanel.tsx +187 -0
  129. package/src/components/GlobalDropzone.tsx +220 -0
  130. package/src/components/HistoryPanel.tsx +231 -104
  131. package/src/components/Inspector.tsx +4 -0
  132. package/src/components/ProgressBar.tsx +104 -0
  133. package/src/components/StatusBar.tsx +124 -5
  134. package/src/components/ThemeToggle.tsx +122 -0
  135. package/src/components/WorkflowEditor.tsx +382 -0
  136. package/src/components/WorkflowTemplates.tsx +101 -0
  137. package/src/components/Workspace.tsx +205 -8
  138. package/src/data/workflow-templates.ts +137 -0
  139. package/src/hooks/useDebouncedRun.ts +151 -0
  140. package/src/hooks/useLokvis.ts +1 -1
  141. package/src/hooks/useMediaQuery.ts +53 -0
  142. package/src/hooks/useShareLink.ts +158 -0
  143. package/src/hooks/useTheme.ts +116 -0
  144. package/src/hooks/useWorkflowProgress.ts +41 -0
  145. package/src/hooks/useWorkflows.ts +326 -0
  146. package/src/index.ts +32 -0
  147. package/src/store/assets-slice.ts +2 -0
  148. package/src/store/history-slice.ts +65 -0
  149. package/src/store/index.ts +3 -0
  150. package/src/store/runtime-slice.ts +89 -32
  151. package/src/store/types.ts +71 -1
  152. package/src/store/workflow-slice.ts +139 -10
@@ -0,0 +1,247 @@
1
+ /**
2
+ * useWorkflows - 工作流槽位持久化 hook(W10.6 + W10.7)
3
+ *
4
+ * 提供 5 个工作流槽位的本地保存能力(免费 5 / Pro 无限),以及 JSON 导入/导出。
5
+ * 数据存储在 localStorage 的 `lokvis.workflows` key,JSON 数组形式。
6
+ *
7
+ * 与 useCustomPresets 的区别:
8
+ * - 自定义预设是尺寸配置(width/height/fit)
9
+ * - 工作流槽位是完整 Workflow 定义(含 nodes/edges/inputs/outputs)
10
+ *
11
+ * 序列化策略:
12
+ * - 保存时用 workflowSchema.safeParse() 防御损坏数据(数据完整性)
13
+ * - 加载时用 workflowSchema.safeParse() 过滤无效条目(向前兼容)
14
+ * - JSON 导出:Workflow JSON + $schema 字段
15
+ * - JSON 导入:validateWorkflow() 完整校验(含 capability 兼容性若提供回调)
16
+ *
17
+ * 多 tab / 多实例同步:
18
+ * - 原生 storage 事件:跨 tab 同步
19
+ * - 自定义 SYNC_EVENT:同 tab 多实例同步
20
+ *
21
+ * @module useWorkflows
22
+ */
23
+ import { useCallback, useEffect, useState } from 'react';
24
+ import { workflowSchema, validateWorkflow } from '@lokvis/schema';
25
+ const STORAGE_KEY = 'lokvis.workflows';
26
+ /** 同 tab 多实例同步用的自定义事件名 */
27
+ const SYNC_EVENT = 'lokvis:workflows-change';
28
+ /** 免费用户工作流槽位上限 */
29
+ export const FREE_WORKFLOW_LIMIT = 5;
30
+ /** Pro 用户无上限 */
31
+ export const PRO_WORKFLOW_LIMIT = Infinity;
32
+ /** 类型守卫:判断 unknown 是否为 Record<string, unknown> */
33
+ function isRecord(x) {
34
+ return typeof x === 'object' && x !== null;
35
+ }
36
+ /** 从 localStorage 读取工作流槽位。
37
+ * 容错:JSON 解析失败 / 非数组 / 字段缺失时返回空数组。 */
38
+ function readFromStorage() {
39
+ if (typeof window === 'undefined')
40
+ return [];
41
+ try {
42
+ const raw = window.localStorage.getItem(STORAGE_KEY);
43
+ if (!raw)
44
+ return [];
45
+ const parsed = JSON.parse(raw);
46
+ if (!Array.isArray(parsed))
47
+ return [];
48
+ // 字段白名单过滤 + workflowSchema 校验(防御损坏数据)
49
+ return parsed.filter((it) => {
50
+ if (!isRecord(it))
51
+ return false;
52
+ if (typeof it.id !== 'string' ||
53
+ typeof it.name !== 'string' ||
54
+ typeof it.createdAt !== 'number' ||
55
+ typeof it.updatedAt !== 'number') {
56
+ return false;
57
+ }
58
+ // workflow 字段必须通过 schema 校验
59
+ const result = workflowSchema.safeParse(it.workflow);
60
+ return result.success;
61
+ });
62
+ }
63
+ catch {
64
+ return [];
65
+ }
66
+ }
67
+ /**
68
+ * 写入 localStorage。
69
+ * @returns true 成功;false 失败(隐私模式 / 配额超限 / 序列化异常)
70
+ * 失败时不静默:调用方需感知以便提示用户"保存失败,数据未持久化"
71
+ */
72
+ function writeToStorage(slots) {
73
+ if (typeof window === 'undefined')
74
+ return false;
75
+ try {
76
+ window.localStorage.setItem(STORAGE_KEY, JSON.stringify(slots));
77
+ window.dispatchEvent(new CustomEvent(SYNC_EVENT));
78
+ return true;
79
+ }
80
+ catch (err) {
81
+ // 隐私模式 / Safari 配额 / QuotaExceededError:不静默吞错,
82
+ // 但也不抛错(保存是 fire-and-forget 操作);返回 false 让调用方决策。
83
+ console.warn('[lokvis] Failed to persist workflows to localStorage:', err);
84
+ return false;
85
+ }
86
+ }
87
+ /** 生成唯一 ID */
88
+ function genId() {
89
+ return `wf-${Date.now()}-${Math.random().toString(36).slice(2, 8)}`;
90
+ }
91
+ /**
92
+ * @param isPro 是否为 Pro 模式。父组件从 runtime.isPro 传入。
93
+ * 影响 limit:免费 5 / Pro 无上限。
94
+ */
95
+ export function useWorkflows(isPro = false) {
96
+ const limit = isPro ? PRO_WORKFLOW_LIMIT : FREE_WORKFLOW_LIMIT;
97
+ const [slots, setSlots] = useState(() => readFromStorage());
98
+ // 监听跨 tab storage + 同 tab SYNC_EVENT
99
+ useEffect(() => {
100
+ const handler = () => setSlots(readFromStorage());
101
+ window.addEventListener('storage', handler);
102
+ window.addEventListener(SYNC_EVENT, handler);
103
+ return () => {
104
+ window.removeEventListener('storage', handler);
105
+ window.removeEventListener(SYNC_EVENT, handler);
106
+ };
107
+ }, []);
108
+ const save = useCallback((input) => {
109
+ const current = readFromStorage();
110
+ const now = Date.now();
111
+ // 更新已有
112
+ if (input.id) {
113
+ const existing = current.find((s) => s.id === input.id);
114
+ if (existing) {
115
+ const updated = {
116
+ ...existing,
117
+ name: input.name ?? input.workflow.name,
118
+ workflow: input.workflow,
119
+ updatedAt: now,
120
+ };
121
+ const next = current.map((s) => (s.id === input.id ? updated : s));
122
+ const ok = writeToStorage(next);
123
+ if (!ok) {
124
+ // 写入失败仍更新内存 state(用户当前会话可见),但提示未持久化
125
+ console.warn('[lokvis] 工作流未持久化到 localStorage,仅当前会话有效');
126
+ }
127
+ setSlots(next);
128
+ return updated;
129
+ }
130
+ }
131
+ // 新增
132
+ if (current.length >= limit) {
133
+ throw new Error(`工作流槽位已达上限(${limit} 个)${isPro ? '' : ',升级 Pro 可无限制保存'}`);
134
+ }
135
+ const slot = {
136
+ id: genId(),
137
+ name: input.name ?? input.workflow.name,
138
+ workflow: input.workflow,
139
+ createdAt: now,
140
+ updatedAt: now,
141
+ };
142
+ const next = [...current, slot];
143
+ const ok = writeToStorage(next);
144
+ if (!ok) {
145
+ console.warn('[lokvis] 工作流未持久化到 localStorage,仅当前会话有效');
146
+ }
147
+ setSlots(next);
148
+ return slot;
149
+ }, [limit, isPro]);
150
+ const remove = useCallback((id) => {
151
+ const current = readFromStorage();
152
+ const next = current.filter((s) => s.id !== id);
153
+ writeToStorage(next);
154
+ setSlots(next);
155
+ }, []);
156
+ const load = useCallback((id) => {
157
+ const current = readFromStorage();
158
+ const slot = current.find((s) => s.id === id);
159
+ return slot ? slot.workflow : null;
160
+ }, []);
161
+ const exportToJson = useCallback((id) => {
162
+ const current = readFromStorage();
163
+ const slot = current.find((s) => s.id === id);
164
+ if (!slot)
165
+ return null;
166
+ return JSON.stringify(slot.workflow, null, 2);
167
+ }, []);
168
+ const exportAllToJson = useCallback(() => {
169
+ const current = readFromStorage();
170
+ return JSON.stringify(current.map((s) => s.workflow), null, 2);
171
+ }, []);
172
+ const importFromJson = useCallback((json, options) => {
173
+ let parsed;
174
+ try {
175
+ parsed = JSON.parse(json);
176
+ }
177
+ catch {
178
+ throw new Error('JSON 格式错误,无法解析');
179
+ }
180
+ const list = Array.isArray(parsed) ? parsed : [parsed];
181
+ const current = readFromStorage();
182
+ const imported = [];
183
+ // 收集被跳过条目的原因,供调用方提示用户(不再静默吞错)
184
+ const skipped = [];
185
+ const now = Date.now();
186
+ for (const item of list) {
187
+ // 先做 zod 形状校验
188
+ const shapeResult = workflowSchema.safeParse(item);
189
+ if (!shapeResult.success) {
190
+ // 跳过无效条目而非抛错,继续处理后续;记录原因供调用方提示
191
+ const detail = shapeResult.error.issues
192
+ .map((i) => `${i.path.join('.') || '<root>'}: ${i.message}`)
193
+ .join('; ');
194
+ skipped.push({ reason: `shape validation failed: ${detail}` });
195
+ continue;
196
+ }
197
+ // 再做完整结构校验(含 capability 兼容性若提供回调)
198
+ const fullResult = validateWorkflow(item, options);
199
+ if (!fullResult.success) {
200
+ // 结构问题也跳过(导入是宽容操作,不阻断有效条目),但记录原因
201
+ const detail = fullResult.error.issues
202
+ .map((i) => i.message)
203
+ .join('; ');
204
+ skipped.push({ reason: `structural validation failed: ${detail}` });
205
+ continue;
206
+ }
207
+ // 检查上限
208
+ if (current.length + imported.length >= limit) {
209
+ throw new Error(`导入会超过上限(${limit} 个),已导入 ${imported.length} 条,请先删除部分工作流`);
210
+ }
211
+ imported.push({
212
+ id: genId(),
213
+ name: shapeResult.data.name,
214
+ workflow: shapeResult.data,
215
+ createdAt: now,
216
+ updatedAt: now,
217
+ });
218
+ }
219
+ if (imported.length === 0) {
220
+ // 不再以"没有有效工作流"作为唯一信息;把跳过原因一并抛出,
221
+ // 让用户知道为什么一个都没导入(而非笼统失败)
222
+ const skipSummary = skipped.length > 0
223
+ ? `; skipped: ${skipped.map((s) => s.reason).join(' | ')}`
224
+ : '';
225
+ throw new Error(`JSON 中没有有效的工作流定义${skipSummary}`);
226
+ }
227
+ const next = [...current, ...imported];
228
+ writeToStorage(next);
229
+ setSlots(next);
230
+ return { imported: imported.length, skipped };
231
+ }, [limit]);
232
+ const canSaveMore = slots.length < limit;
233
+ const remaining = Math.max(0, limit - slots.length);
234
+ return {
235
+ slots,
236
+ save,
237
+ remove,
238
+ load,
239
+ limit,
240
+ canSaveMore,
241
+ remaining,
242
+ exportToJson,
243
+ exportAllToJson,
244
+ importFromJson,
245
+ };
246
+ }
247
+ //# sourceMappingURL=useWorkflows.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"useWorkflows.js","sourceRoot":"","sources":["../../src/hooks/useWorkflows.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -11,17 +11,43 @@
11
11
  * - `<PipelineBar />` - Workflow pipeline step bar
12
12
  * - `<Toolbar />` - Top toolbar
13
13
  * - `<StatusBar />` - Bottom status bar
14
+ * - `<HistoryPanel />` - History panel (W7.1, supports horizontal variant W9.1)
15
+ * - `<CommandPalette />` - ⌘K command palette (W9.2)
16
+ * - `<GlobalDropzone />` - Full-screen drag-drop with MIME validation (W9.3)
17
+ * - `<CompareSlider />` - before/after comparison slider (W9.4)
18
+ * - `<DownloadPanel />` - Workflow outputs download panel (W9.5)
19
+ * - `<ThemeToggle />` - Dark mode toggle button (W9.7)
14
20
  * - `useLokvis()` - React hook for initializing Runtime + plugins
21
+ * - `useTheme()` - Dark mode hook with localStorage + system preference (W9.7)
22
+ * - `useMediaQuery()` / `useBreakpoints()` - Responsive hooks (W9.8)
23
+ * - `useCommandPalette()` - ⌘K shortcut registration hook (W9.2)
15
24
  */
16
25
  export { useLokvis, type UseLokvisOptions, type UseLokvisResult } from './hooks/useLokvis.js';
26
+ export { useTheme, type UseThemeResult, type ThemeMode } from './hooks/useTheme.js';
27
+ export { useMediaQuery, useBreakpoints, type Breakpoints } from './hooks/useMediaQuery.js';
28
+ export { useWorkflows, FREE_WORKFLOW_LIMIT, PRO_WORKFLOW_LIMIT, type UseWorkflowsResult, type WorkflowSlot, type SaveWorkflowInput } from './hooks/useWorkflows.js';
29
+ export { useDebouncedRun, type UseDebouncedRunOptions, type UseDebouncedRunResult } from './hooks/useDebouncedRun.js';
30
+ export { useShareLink, type UseShareLinkResult, encodeWorkflowForShare, decodeWorkflowFromShare } from './hooks/useShareLink.js';
17
31
  export { useWorkspaceStore, type WorkspaceState, type WorkspaceActions } from './store/index.js';
18
32
  export { Workspace, type WorkspaceProps } from './components/Workspace.js';
19
33
  export { AssetPanel } from './components/AssetPanel.js';
20
34
  export { Canvas } from './components/Canvas.js';
21
35
  export { Inspector } from './components/Inspector.js';
36
+ export { ExifPanel, type ExifPanelProps } from './components/ExifPanel.js';
22
37
  export { PipelineBar } from './components/PipelineBar.js';
38
+ export { WorkflowEditor, type WorkflowEditorProps } from './components/WorkflowEditor.js';
39
+ export { ProgressBar, type ProgressBarProps } from './components/ProgressBar.js';
40
+ export { ErrorBanner, type ErrorBannerProps } from './components/ErrorBanner.js';
41
+ export { WorkflowTemplates, type WorkflowTemplatesProps } from './components/WorkflowTemplates.js';
23
42
  export { Toolbar } from './components/Toolbar.js';
24
43
  export { StatusBar } from './components/StatusBar.js';
25
44
  export { ParamForm, type ParamFormProps } from './components/ParamForm.js';
45
+ export { HistoryPanel, type HistoryPanelProps } from './components/HistoryPanel.js';
46
+ export { CommandPalette, useCommandPalette, type CommandPaletteProps, type UseCommandPaletteOptions } from './components/CommandPalette.js';
47
+ export { GlobalDropzone, type GlobalDropzoneProps } from './components/GlobalDropzone.js';
48
+ export { CompareSlider, type CompareSliderProps } from './components/CompareSlider.js';
49
+ export { DownloadPanel, type DownloadPanelProps } from './components/DownloadPanel.js';
50
+ export { ThemeToggle, type ThemeToggleProps } from './components/ThemeToggle.js';
51
+ export { WORKFLOW_TEMPLATES, type WorkflowTemplate, type WorkflowTemplateNode, findTemplate, } from './data/workflow-templates.js';
26
52
  export type { WorkspaceEvent, NodeStatus, } from './types.js';
27
53
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEjG,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAE3E,YAAY,EACV,cAAc,EACd,UAAU,GACX,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,SAAS,EAAE,KAAK,gBAAgB,EAAE,KAAK,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,QAAQ,EAAE,KAAK,cAAc,EAAE,KAAK,SAAS,EAAE,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAE,KAAK,kBAAkB,EAAE,KAAK,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AACpK,OAAO,EAAE,eAAe,EAAE,KAAK,sBAAsB,EAAE,KAAK,qBAAqB,EAAE,MAAM,4BAA4B,CAAC;AACtH,OAAO,EAAE,YAAY,EAAE,KAAK,kBAAkB,EAAE,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACjI,OAAO,EAAE,iBAAiB,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAEjG,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAAE,KAAK,sBAAsB,EAAE,MAAM,mCAAmC,CAAC;AACnG,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAE,KAAK,cAAc,EAAE,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAAE,KAAK,iBAAiB,EAAE,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAAE,KAAK,mBAAmB,EAAE,KAAK,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC5I,OAAO,EAAE,cAAc,EAAE,KAAK,mBAAmB,EAAE,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,aAAa,EAAE,KAAK,kBAAkB,EAAE,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,WAAW,EAAE,KAAK,gBAAgB,EAAE,MAAM,6BAA6B,CAAC;AAEjF,OAAO,EACL,kBAAkB,EAClB,KAAK,gBAAgB,EACrB,KAAK,oBAAoB,EACzB,YAAY,GACb,MAAM,8BAA8B,CAAC;AAEtC,YAAY,EACV,cAAc,EACd,UAAU,GACX,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -11,16 +11,42 @@
11
11
  * - `<PipelineBar />` - Workflow pipeline step bar
12
12
  * - `<Toolbar />` - Top toolbar
13
13
  * - `<StatusBar />` - Bottom status bar
14
+ * - `<HistoryPanel />` - History panel (W7.1, supports horizontal variant W9.1)
15
+ * - `<CommandPalette />` - ⌘K command palette (W9.2)
16
+ * - `<GlobalDropzone />` - Full-screen drag-drop with MIME validation (W9.3)
17
+ * - `<CompareSlider />` - before/after comparison slider (W9.4)
18
+ * - `<DownloadPanel />` - Workflow outputs download panel (W9.5)
19
+ * - `<ThemeToggle />` - Dark mode toggle button (W9.7)
14
20
  * - `useLokvis()` - React hook for initializing Runtime + plugins
21
+ * - `useTheme()` - Dark mode hook with localStorage + system preference (W9.7)
22
+ * - `useMediaQuery()` / `useBreakpoints()` - Responsive hooks (W9.8)
23
+ * - `useCommandPalette()` - ⌘K shortcut registration hook (W9.2)
15
24
  */
16
25
  export { useLokvis } from './hooks/useLokvis.js';
26
+ export { useTheme } from './hooks/useTheme.js';
27
+ export { useMediaQuery, useBreakpoints } from './hooks/useMediaQuery.js';
28
+ export { useWorkflows, FREE_WORKFLOW_LIMIT, PRO_WORKFLOW_LIMIT } from './hooks/useWorkflows.js';
29
+ export { useDebouncedRun } from './hooks/useDebouncedRun.js';
30
+ export { useShareLink, encodeWorkflowForShare, decodeWorkflowFromShare } from './hooks/useShareLink.js';
17
31
  export { useWorkspaceStore } from './store/index.js';
18
32
  export { Workspace } from './components/Workspace.js';
19
33
  export { AssetPanel } from './components/AssetPanel.js';
20
34
  export { Canvas } from './components/Canvas.js';
21
35
  export { Inspector } from './components/Inspector.js';
36
+ export { ExifPanel } from './components/ExifPanel.js';
22
37
  export { PipelineBar } from './components/PipelineBar.js';
38
+ export { WorkflowEditor } from './components/WorkflowEditor.js';
39
+ export { ProgressBar } from './components/ProgressBar.js';
40
+ export { ErrorBanner } from './components/ErrorBanner.js';
41
+ export { WorkflowTemplates } from './components/WorkflowTemplates.js';
23
42
  export { Toolbar } from './components/Toolbar.js';
24
43
  export { StatusBar } from './components/StatusBar.js';
25
44
  export { ParamForm } from './components/ParamForm.js';
45
+ export { HistoryPanel } from './components/HistoryPanel.js';
46
+ export { CommandPalette, useCommandPalette } from './components/CommandPalette.js';
47
+ export { GlobalDropzone } from './components/GlobalDropzone.js';
48
+ export { CompareSlider } from './components/CompareSlider.js';
49
+ export { DownloadPanel } from './components/DownloadPanel.js';
50
+ export { ThemeToggle } from './components/ThemeToggle.js';
51
+ export { WORKFLOW_TEMPLATES, findTemplate, } from './data/workflow-templates.js';
26
52
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,SAAS,EAA+C,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,iBAAiB,EAA8C,MAAM,kBAAkB,CAAC;AAEjG,OAAO,EAAE,SAAS,EAAuB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAuB,MAAM,2BAA2B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;GAuBG;AAEH,OAAO,EAAE,SAAS,EAA+C,MAAM,sBAAsB,CAAC;AAC9F,OAAO,EAAE,QAAQ,EAAuC,MAAM,qBAAqB,CAAC;AACpF,OAAO,EAAE,aAAa,EAAE,cAAc,EAAoB,MAAM,0BAA0B,CAAC;AAC3F,OAAO,EAAE,YAAY,EAAE,mBAAmB,EAAE,kBAAkB,EAAsE,MAAM,yBAAyB,CAAC;AACpK,OAAO,EAAE,eAAe,EAA2D,MAAM,4BAA4B,CAAC;AACtH,OAAO,EAAE,YAAY,EAA2B,sBAAsB,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AACjI,OAAO,EAAE,iBAAiB,EAA8C,MAAM,kBAAkB,CAAC;AAEjG,OAAO,EAAE,SAAS,EAAuB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,UAAU,EAAE,MAAM,4BAA4B,CAAC;AACxD,OAAO,EAAE,MAAM,EAAE,MAAM,wBAAwB,CAAC;AAChD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAuB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,WAAW,EAAE,MAAM,6BAA6B,CAAC;AAC1D,OAAO,EAAE,cAAc,EAA4B,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,WAAW,EAAyB,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,WAAW,EAAyB,MAAM,6BAA6B,CAAC;AACjF,OAAO,EAAE,iBAAiB,EAA+B,MAAM,mCAAmC,CAAC;AACnG,OAAO,EAAE,OAAO,EAAE,MAAM,yBAAyB,CAAC;AAClD,OAAO,EAAE,SAAS,EAAE,MAAM,2BAA2B,CAAC;AACtD,OAAO,EAAE,SAAS,EAAuB,MAAM,2BAA2B,CAAC;AAC3E,OAAO,EAAE,YAAY,EAA0B,MAAM,8BAA8B,CAAC;AACpF,OAAO,EAAE,cAAc,EAAE,iBAAiB,EAA2D,MAAM,gCAAgC,CAAC;AAC5I,OAAO,EAAE,cAAc,EAA4B,MAAM,gCAAgC,CAAC;AAC1F,OAAO,EAAE,aAAa,EAA2B,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,aAAa,EAA2B,MAAM,+BAA+B,CAAC;AACvF,OAAO,EAAE,WAAW,EAAyB,MAAM,6BAA6B,CAAC;AAEjF,OAAO,EACL,kBAAkB,EAGlB,YAAY,GACb,MAAM,8BAA8B,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,CAwDX,CAAC"}
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,CA0DX,CAAC"}
@@ -18,6 +18,7 @@ export const createAssetsSlice = (set, get) => ({
18
18
  await runtime.importAsset({ kind: 'file', file });
19
19
  }
20
20
  await get().refreshAssets();
21
+ await get().refreshStorageUsage();
21
22
  set({ statusMessage: `Imported ${files.length} file(s)` });
22
23
  },
23
24
  selectAsset(id) {
@@ -32,6 +33,7 @@ export const createAssetsSlice = (set, get) => ({
32
33
  return;
33
34
  await runtime.removeAsset(id);
34
35
  await get().refreshAssets();
36
+ await get().refreshStorageUsage();
35
37
  if (get().selectedAssetId === id)
36
38
  set({ selectedAssetId: null });
37
39
  // 修复 review 报告:原实现删除 asset 后未 revoke 缩略图 ObjectURL,导致
@@ -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;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
+ {"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,MAAM,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAAC;QAClC,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,MAAM,GAAG,EAAE,CAAC,mBAAmB,EAAE,CAAC;QAClC,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"}
@@ -0,0 +1,18 @@
1
+ /**
2
+ * History slice —— 历史栈状态与撤销/重做/跳转(W7.1)
3
+ *
4
+ * 负责:
5
+ * - 跟踪当前活跃工作流的历史条目与游标(供 HistoryPanel 高亮当前步骤)
6
+ * - undo / redo / jumpTo 委托给 runtime,history:changed 事件回流自动更新 state
7
+ *
8
+ * 事件桥接:runtime-slice.init 订阅 history:changed,回调里 set 本 slice 的
9
+ * state,保证 store 是历史状态的单一来源,组件无需各自订阅。
10
+ */
11
+ import type { StateCreator } from 'zustand';
12
+ import type { WorkspaceStore, WorkspaceState, WorkspaceActions } from './types.js';
13
+ export interface HistorySlice extends Pick<WorkspaceState, 'historyEntries' | 'historyCursor' | 'historyWorkflowId'>, Pick<WorkspaceActions, 'refreshHistory' | 'undo' | 'redo' | 'jumpToHistory'> {
14
+ }
15
+ export declare const createHistorySlice: StateCreator<WorkspaceStore, [
16
+ ], [
17
+ ], HistorySlice>;
18
+ //# sourceMappingURL=history-slice.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-slice.d.ts","sourceRoot":"","sources":["../../src/store/history-slice.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;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,YACf,SAAQ,IAAI,CACR,cAAc,EACd,gBAAgB,GAAG,eAAe,GAAG,mBAAmB,CACzD,EACD,IAAI,CAAC,gBAAgB,EAAE,gBAAgB,GAAG,MAAM,GAAG,MAAM,GAAG,eAAe,CAAC;CAAG;AAEnF,eAAO,MAAM,kBAAkB,EAAE,YAAY,CAC3C,cAAc,EACd;CAAE,EACF;CAAE,EACF,YAAY,CAwCZ,CAAC"}
@@ -0,0 +1,42 @@
1
+ export const createHistorySlice = (set, get) => ({
2
+ historyEntries: [],
3
+ historyCursor: -1,
4
+ historyWorkflowId: null,
5
+ async refreshHistory(workflowId) {
6
+ const { runtime } = get();
7
+ if (!runtime)
8
+ return;
9
+ try {
10
+ const { entries, cursor } = await runtime.getHistoryState(workflowId);
11
+ set({
12
+ historyEntries: entries,
13
+ historyCursor: cursor,
14
+ historyWorkflowId: workflowId,
15
+ });
16
+ }
17
+ catch {
18
+ // 查询失败保持上次值,不阻断
19
+ }
20
+ },
21
+ async undo() {
22
+ const { runtime, historyWorkflowId } = get();
23
+ if (!runtime || !historyWorkflowId)
24
+ return;
25
+ await runtime.undo(historyWorkflowId);
26
+ // history:changed 事件会触发 runtime-slice 的订阅回调更新 state,
27
+ // 此处无需手动 refresh,避免双发
28
+ },
29
+ async redo() {
30
+ const { runtime, historyWorkflowId } = get();
31
+ if (!runtime || !historyWorkflowId)
32
+ return;
33
+ await runtime.redo(historyWorkflowId);
34
+ },
35
+ async jumpToHistory(index) {
36
+ const { runtime, historyWorkflowId } = get();
37
+ if (!runtime || !historyWorkflowId)
38
+ return;
39
+ await runtime.jumpTo(historyWorkflowId, index);
40
+ },
41
+ });
42
+ //# sourceMappingURL=history-slice.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"history-slice.js","sourceRoot":"","sources":["../../src/store/history-slice.ts"],"names":[],"mappings":"AAoBA,MAAM,CAAC,MAAM,kBAAkB,GAK3B,CAAC,GAAG,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;IACjB,cAAc,EAAE,EAAE;IAClB,aAAa,EAAE,CAAC,CAAC;IACjB,iBAAiB,EAAE,IAAI;IAEvB,KAAK,CAAC,cAAc,CAAC,UAAU;QAC7B,MAAM,EAAE,OAAO,EAAE,GAAG,GAAG,EAAE,CAAC;QAC1B,IAAI,CAAC,OAAO;YAAE,OAAO;QACrB,IAAI,CAAC;YACH,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,MAAM,OAAO,CAAC,eAAe,CAAC,UAAU,CAAC,CAAC;YACtE,GAAG,CAAC;gBACF,cAAc,EAAE,OAAO;gBACvB,aAAa,EAAE,MAAM;gBACrB,iBAAiB,EAAE,UAAU;aAC9B,CAAC,CAAC;QACL,CAAC;QAAC,MAAM,CAAC;YACP,gBAAgB;QAClB,CAAC;IACH,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,GAAG,EAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAC3C,MAAM,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;QACtC,qDAAqD;QACrD,sBAAsB;IACxB,CAAC;IAED,KAAK,CAAC,IAAI;QACR,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,GAAG,EAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAC3C,MAAM,OAAO,CAAC,IAAI,CAAC,iBAAiB,CAAC,CAAC;IACxC,CAAC;IAED,KAAK,CAAC,aAAa,CAAC,KAAK;QACvB,MAAM,EAAE,OAAO,EAAE,iBAAiB,EAAE,GAAG,GAAG,EAAE,CAAC;QAC7C,IAAI,CAAC,OAAO,IAAI,CAAC,iBAAiB;YAAE,OAAO;QAC3C,MAAM,OAAO,CAAC,MAAM,CAAC,iBAAiB,EAAE,KAAK,CAAC,CAAC;IACjD,CAAC;CACF,CAAC,CAAC"}
@@ -1,4 +1,5 @@
1
1
  import type { WorkspaceStore } from './types.js';
2
2
  export declare const useWorkspaceStore: import("zustand").UseBoundStore<import("zustand").StoreApi<WorkspaceStore>>;
3
3
  export type { WorkspaceState, WorkspaceActions, WorkspaceStore } from './types.js';
4
+ export { MAX_WORKFLOW_STEPS } from './types.js';
4
5
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAMjD,eAAO,MAAM,iBAAiB,6EAK3B,CAAC;AAEJ,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAOjD,eAAO,MAAM,iBAAiB,6EAM3B,CAAC;AAEJ,YAAY,EAAE,cAAc,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AACnF,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
@@ -15,10 +15,13 @@ import { createRuntimeSlice } from './runtime-slice.js';
15
15
  import { createAssetsSlice } from './assets-slice.js';
16
16
  import { createCapabilitiesSlice } from './capabilities-slice.js';
17
17
  import { createWorkflowSlice } from './workflow-slice.js';
18
+ import { createHistorySlice } from './history-slice.js';
18
19
  export const useWorkspaceStore = create()((...a) => ({
19
20
  ...createRuntimeSlice(...a),
20
21
  ...createAssetsSlice(...a),
21
22
  ...createCapabilitiesSlice(...a),
22
23
  ...createWorkflowSlice(...a),
24
+ ...createHistorySlice(...a),
23
25
  }));
26
+ export { MAX_WORKFLOW_STEPS } from './types.js';
24
27
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAE1D,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,EAAkB,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACnE,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC3B,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC1B,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAChC,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;CAC7B,CAAC,CAAC,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/store/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;GAWG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAEjC,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,uBAAuB,EAAE,MAAM,yBAAyB,CAAC;AAClE,OAAO,EAAE,mBAAmB,EAAE,MAAM,qBAAqB,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AAExD,MAAM,CAAC,MAAM,iBAAiB,GAAG,MAAM,EAAkB,CAAC,CAAC,GAAG,CAAC,EAAE,EAAE,CAAC,CAAC;IACnE,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;IAC3B,GAAG,iBAAiB,CAAC,GAAG,CAAC,CAAC;IAC1B,GAAG,uBAAuB,CAAC,GAAG,CAAC,CAAC;IAChC,GAAG,mBAAmB,CAAC,GAAG,CAAC,CAAC;IAC5B,GAAG,kBAAkB,CAAC,GAAG,CAAC,CAAC;CAC5B,CAAC,CAAC,CAAC;AAGJ,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC"}
@@ -1,12 +1,20 @@
1
1
  /**
2
2
  * Runtime slice —— Runtime 初始化与状态消息
3
3
  *
4
- * 负责 runtime 实例注入、初始化、全局状态消息与错误。
4
+ * 负责 runtime 实例注入、初始化、全局状态消息与错误、存储配额(W6.7)、
5
+ * 历史栈事件桥接(W7.1)。
5
6
  */
6
7
  import type { StateCreator } from 'zustand';
7
8
  import type { WorkspaceStore, WorkspaceState, WorkspaceActions } from './types.js';
8
- export interface RuntimeSlice extends Pick<WorkspaceState, 'runtime' | 'initializing' | 'initError' | 'running' | 'statusMessage' | 'error'>, Pick<WorkspaceActions, 'init' | 'setStatus' | 'setError'> {
9
+ export interface RuntimeSlice extends Pick<WorkspaceState, 'runtime' | 'initializing' | 'initError' | 'running' | 'statusMessage' | 'error' | 'errorSeq' | 'storageUsage'>, Pick<WorkspaceActions, 'init' | 'setStatus' | 'setError' | 'refreshStorageUsage'> {
9
10
  }
11
+ /**
12
+ * 历史事件订阅解除函数。
13
+ *
14
+ * 修复 review 报告:原为模块级 let,多个 store 实例(测试 / 多 Workspace)
15
+ * 共用同一变量,后创建的 store 会覆盖前者,先前的订阅无法被正确清理 → 泄漏。
16
+ * 现迁到 createRuntime slice 工厂闭包内,每个 store 实例持有独立 offFn。
17
+ */
10
18
  export declare const createRuntimeSlice: StateCreator<WorkspaceStore, [
11
19
  ], [
12
20
  ], RuntimeSlice>;
@@ -1 +1 @@
1
- {"version":3,"file":"runtime-slice.d.ts","sourceRoot":"","sources":["../../src/store/runtime-slice.ts"],"names":[],"mappings":"AAAA;;;;GAIG;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,YACf,SAAQ,IAAI,CACV,cAAc,EACd,SAAS,GAAG,cAAc,GAAG,WAAW,GAAG,SAAS,GAAG,eAAe,GAAG,OAAO,CACjF,EACC,IAAI,CACF,gBAAgB,EAChB,MAAM,GAAG,WAAW,GAAG,UAAU,CAClC;CAAG;AAER,eAAO,MAAM,kBAAkB,EAAE,YAAY,CAC3C,cAAc,EACd;CAAE,EACF;CAAE,EACF,YAAY,CA8BZ,CAAC"}
1
+ {"version":3,"file":"runtime-slice.d.ts","sourceRoot":"","sources":["../../src/store/runtime-slice.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AAE5C,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnF,MAAM,WAAW,YACf,SAAQ,IAAI,CACR,cAAc,EACZ,SAAS,GACT,cAAc,GACd,WAAW,GACX,SAAS,GACT,eAAe,GACf,OAAO,GACP,UAAU,GACV,cAAc,CACjB,EACD,IAAI,CACF,gBAAgB,EAChB,MAAM,GAAG,WAAW,GAAG,UAAU,GAAG,qBAAqB,CAC1D;CAAG;AAER;;;;;;GAMG;AACH,eAAO,MAAM,kBAAkB,EAAE,YAAY,CAC3C,cAAc,EACd;CAAE,EACF;CAAE,EACF,YAAY,CAuEb,CAAC"}