aitu-app 0.6.78 → 0.6.80
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/README.md +3 -3
- package/assets/CanvasAudioPlayer-CSFENxi6.js +2 -0
- package/assets/ChatDrawer-CWZQP5R5.css +1 -0
- package/assets/ChatDrawer-sVEVW11M.js +11 -0
- package/assets/ChatMessagesArea-Cnb94V8-.js +7 -0
- package/assets/ChatMessagesArea-PlF5AwzD.css +1 -0
- package/assets/DeferredAIInputBar-D99l6sBS.js +8 -0
- package/assets/DrawnixDeferredFeatures-78cIu-ev.js +2 -0
- package/assets/{KnowledgeBaseContent-DcX5Jofx.js → KnowledgeBaseContent-DZ-1fPZa.js} +10 -10
- package/assets/{MVCreator-DllHozYg.js → MVCreator-BV8KDR6E.js} +8 -8
- package/assets/ModelBenchmarkWorkbench-DL6r0Z_5.js +2 -0
- package/assets/MusicAnalyzer-D9Bpmhym.css +1 -0
- package/assets/{MusicAnalyzer-DDeT6g3c.js → MusicAnalyzer-DQtjf36o.js} +2 -2
- package/assets/{MusicAnalyzer-CHcQ5t4P.js → MusicAnalyzer-u_5sy56T.js} +1 -1
- package/assets/PromptHistoryTool-B-ktaOpK.js +2 -0
- package/assets/PromptHistoryTool-BH7hq916.css +1 -0
- package/assets/ResizableDivider-BpUFdkte.js +1 -0
- package/assets/TaskQueuePanel-BLD1r7_I.js +1 -0
- package/assets/{VideoAnalyzer-BSLz1FaI.js → VideoAnalyzer-Bjv9pyDs.js} +2 -2
- package/assets/ai-generation-preferences-service-BSpgVCHz.js +1 -0
- package/assets/arc-CnA_FoJK.js +1 -0
- package/assets/{arc-BU2KKCa_.js → arc-DDvk_-VM.js} +1 -1
- package/assets/{batch-image-generation-Bg68r_Ql.js → batch-image-generation-N-lwbjRE.js} +3 -3
- package/assets/{blockDiagram-38ab4fdb-BCGEnMME.js → blockDiagram-38ab4fdb-B2G4wjZe.js} +6 -6
- package/assets/{blockDiagram-38ab4fdb-CsZR5uC5.js → blockDiagram-38ab4fdb-DBkZWrKk.js} +1 -1
- package/assets/{browser-DpICcNby.js → browser-ZXTF4AKv.js} +1 -1
- package/assets/{c4Diagram-3d4e48cf-9fuiuFdV.js → c4Diagram-3d4e48cf-BFg-wccg.js} +1 -1
- package/assets/{c4Diagram-3d4e48cf-WM4wd_GR.js → c4Diagram-3d4e48cf-CmyNnfip.js} +1 -1
- package/assets/{canvas-insertion-CdUQF7IV.js → canvas-insertion-CKIoVZ9a.js} +1 -1
- package/assets/channel-BQh3J7kz.js +1 -0
- package/assets/channel-CPsF_uSp.js +1 -0
- package/assets/{classDiagram-70f12bd4-DcYDedz1.js → classDiagram-70f12bd4-BoP-e23u.js} +2 -2
- package/assets/{classDiagram-70f12bd4-CBVHTwQu.js → classDiagram-70f12bd4-UTHJc2XA.js} +1 -1
- package/assets/classDiagram-v2-f2320105-BeBc2H-D.js +2 -0
- package/assets/{classDiagram-v2-f2320105-jpCwaHEd.js → classDiagram-v2-f2320105-Bjwz5ljW.js} +1 -1
- package/assets/{clipper-jvd5rF5a.js → clipper-NoHaeWV4.js} +1 -1
- package/assets/clone-CA2KqVCK.js +1 -0
- package/assets/createText-2e5e7dd3-Bsu7vT-L.js +8 -0
- package/assets/{createText-2e5e7dd3-x5lOIwut.js → createText-2e5e7dd3-DrWUfa-s.js} +1 -1
- package/assets/{edges-e0da2a9e-CbrF4nbD.js → edges-e0da2a9e-B9sYOHRt.js} +1 -1
- package/assets/{edges-e0da2a9e-Ch6PBwWs.js → edges-e0da2a9e-DX4IQMED.js} +1 -1
- package/assets/{erDiagram-9861fffd-DSlNVuAZ.js → erDiagram-9861fffd-B-LfsIMf.js} +1 -1
- package/assets/{erDiagram-9861fffd-Bq07elcI.js → erDiagram-9861fffd-DPdud_LA.js} +1 -1
- package/assets/{flowDb-956e92f1-Ti5YC4Vv.js → flowDb-956e92f1-C3xKlizM.js} +1 -1
- package/assets/{flowDb-956e92f1-BqPCJlZp.js → flowDb-956e92f1-Ck5oiEta.js} +1 -1
- package/assets/{flowDiagram-66a62f08-CPDuG3rY.js → flowDiagram-66a62f08-Bkt2NoHM.js} +4 -4
- package/assets/{flowDiagram-66a62f08-D3GSABFi.js → flowDiagram-66a62f08-CJnxo6dI.js} +1 -1
- package/assets/flowDiagram-v2-96b9c2cf-MnwxRDMO.js +1 -0
- package/assets/flowDiagram-v2-96b9c2cf-U7nNPvdl.js +1 -0
- package/assets/{flowchart-elk-definition-4a651766-BH09NeLA.js → flowchart-elk-definition-4a651766-2XkrsdKI.js} +2 -2
- package/assets/{flowchart-elk-definition-4a651766-BLaLPCDV.js → flowchart-elk-definition-4a651766-ec8y1a8S.js} +1 -1
- package/assets/{ganttDiagram-c361ad54-DL9ZeaEc.js → ganttDiagram-c361ad54-1TA0mZY_.js} +3 -3
- package/assets/{ganttDiagram-c361ad54-Sp9M1KHP.js → ganttDiagram-c361ad54-D-OrVtXV.js} +3 -3
- package/assets/{gitGraphDiagram-72cf32ee-BWwmRKo-.js → gitGraphDiagram-72cf32ee-Blt3RsBD.js} +1 -1
- package/assets/{gitGraphDiagram-72cf32ee-BSf1fsDV.js → gitGraphDiagram-72cf32ee-CKf6xgO1.js} +1 -1
- package/assets/{graph-g-2U7grQ.js → graph-CUYgHJmb.js} +1 -1
- package/assets/{graph--nPw8zXQ.js → graph-WeSRtsZO.js} +1 -1
- package/assets/{index-ZrVeQUWo.js → index--MqiaN5t.js} +1 -1
- package/assets/{index-C5eu4uSl.js → index-0b_TeH8L.js} +11 -11
- package/assets/{index-3862675e-BXwbZ2pz.js → index-3862675e-C2ipEQC8.js} +1 -1
- package/assets/{index-3862675e-D6Zy95zZ.js → index-3862675e-CeX6VlsU.js} +1 -1
- package/assets/{index-CLJUfzvO.js → index-B-J0JJak.js} +1 -1
- package/assets/{index-TkfyNewx.js → index-B7Hj7g41.js} +1 -1
- package/assets/{index-eZfwJ9bV.js → index-BS_v5cOh.js} +1 -1
- package/assets/index-Btk31p7r.js +1 -0
- package/assets/{index-DH12_HTj.js → index-C-Samsu3.js} +2 -2
- package/assets/index-C-llNX01.js +1 -0
- package/assets/index-C8c9icsH.js +2 -0
- package/assets/{index-D7b5fX1d.js → index-CAn2jfNg.js} +1 -1
- package/assets/{index-Dz8sghkK.js → index-CK2zt94U.js} +1 -1
- package/assets/{index-CfgvFFx3.js → index-CP51k4n6.js} +17 -17
- package/assets/{index-DI0OV6F8.js → index-CXBhIy30.js} +1 -1
- package/assets/index-C_Mj1wbj.js +2 -0
- package/assets/{index-BwSnJN93.js → index-CbfE0MBd.js} +1 -1
- package/assets/{index-C3qD42ws.js → index-CjeDxq0c.js} +1 -1
- package/assets/{index-DqMndQiP.js → index-Ct7OFnWK.js} +1 -1
- package/assets/{index-BaCHOxhI.js → index-CxxUIkx1.js} +1 -1
- package/assets/{index-B2dttXd7.js → index-D2Kc-3MO.js} +1 -1
- package/assets/{index-Bq8mPedC.js → index-DK0XEByD.js} +1 -1
- package/assets/{index-DllL1sx1.js → index-DQcV2DYj.js} +1 -1
- package/assets/{index-BP77pG9S.js → index-DSKRBuhn.js} +73 -73
- package/assets/{index-BXzGHPXz.js → index-DXqL8NRE.js} +2 -2
- package/assets/{index-B7V7-Vxz.js → index-DcLrRIlS.js} +1 -1
- package/assets/{index-D4pIkh3S.js → index-DdA-dF0D.js} +1 -1
- package/assets/{index-QkP3EC02.js → index-DdxTnVj5.js} +1 -1
- package/assets/{index-CmyOpFTN.js → index-DmrnShhc.js} +1 -1
- package/assets/{index-Bti3m-iW.js → index-QO0uGVDP.js} +1 -1
- package/assets/{index-BPR_DyGD.js → index-aIKXDB1M.js} +1 -1
- package/assets/{index-DIiIUyb-.js → index-n6JhNACm.js} +1 -1
- package/assets/{index-BWrcsh8u.js → index-qbS_W7PW.js} +1 -1
- package/assets/index-v7iKPBEu.css +1 -0
- package/assets/{infoDiagram-f8f76790-DpFqCCNv.js → infoDiagram-f8f76790-DEWQ3NXc.js} +1 -1
- package/assets/{infoDiagram-f8f76790-G2JpJJP7.js → infoDiagram-f8f76790-u_qjHFCm.js} +3 -3
- package/assets/{journeyDiagram-49397b02-DLLTobRM.js → journeyDiagram-49397b02-C8A30CBr.js} +1 -1
- package/assets/{journeyDiagram-49397b02-BdESGMrv.js → journeyDiagram-49397b02-hQJfqZih.js} +1 -1
- package/assets/{layout-WSR0vNPO.js → layout-CFKTKeqQ.js} +1 -1
- package/assets/{layout-CVkuImk4.js → layout-DvRyabpG.js} +1 -1
- package/assets/{line-D3bnG227.js → line-C72F34Po.js} +1 -1
- package/assets/{line-DQuMJveY.js → line-W5R41tQ1.js} +1 -1
- package/assets/{linear-CciP-97N.js → linear-7FXykgHM.js} +1 -1
- package/assets/{linear-Z6vFvuwc.js → linear-CVyOPUvz.js} +1 -1
- package/assets/main-BO0HWBB1.js +42 -0
- package/assets/{main-8DNjLY6L.css → main-DAuE07rf.css} +1 -1
- package/assets/{mermaid.core-CwZQb0ud.js → mermaid.core-2VcXhn43.js} +4 -4
- package/assets/{mindmap-definition-fc14e90a-BnJ8OOTI.js → mindmap-definition-fc14e90a-CcVXKGg4.js} +1 -1
- package/assets/{mindmap-definition-fc14e90a-CxQMydCW.js → mindmap-definition-fc14e90a-DRDYXe84.js} +2 -2
- package/assets/model-benchmark-launcher-C2qBiDlM.js +1 -0
- package/assets/{photo-wall-splitter-BZ88W5Zy.js → photo-wall-splitter-CFntSOdS.js} +1 -1
- package/assets/{pieDiagram-8a3498a8-BSDdkTeu.js → pieDiagram-8a3498a8-Be9dl9pU.js} +1 -1
- package/assets/{pieDiagram-8a3498a8-D6VtAoja.js → pieDiagram-8a3498a8-DXZOJYBv.js} +5 -5
- package/assets/ppt-generation-B5fKT_by.js +48 -0
- package/assets/{quadrantDiagram-120e2f19-C8k2xuBd.js → quadrantDiagram-120e2f19-DoU7aQSp.js} +3 -3
- package/assets/{quadrantDiagram-120e2f19-BbFV0VXY.js → quadrantDiagram-120e2f19-l5K9mx26.js} +1 -1
- package/assets/{requirementDiagram-deff3bca-C3xMdzJV.js → requirementDiagram-deff3bca-DN_87Wxe.js} +1 -1
- package/assets/{requirementDiagram-deff3bca-CpjqKjYZ.js → requirementDiagram-deff3bca-DOooq7kx.js} +1 -1
- package/assets/retry-image-BmIVuAVu.js +6 -0
- package/assets/{sankeyDiagram-04a897e0-Bjvig9bW.js → sankeyDiagram-04a897e0-BB33nO6_.js} +1 -1
- package/assets/{sankeyDiagram-04a897e0-BBJJgsFv.js → sankeyDiagram-04a897e0-CCa0hwml.js} +2 -2
- package/assets/{sequenceDiagram-704730f1-PFC_9IFI.js → sequenceDiagram-704730f1-CNhXZiix.js} +1 -1
- package/assets/{sequenceDiagram-704730f1-DX1MmBN_.js → sequenceDiagram-704730f1-ZqQ1QrY-.js} +1 -1
- package/assets/settings-dialog-BFuWTeQR.js +1 -0
- package/assets/{skill-dsl-parser-syNWYxFu.js → skill-dsl-parser-b-aB3P5u.js} +1 -1
- package/assets/{stateDiagram-587899a1-Dc3mI_B_.js → stateDiagram-587899a1-BBlOIJr7.js} +1 -1
- package/assets/{stateDiagram-587899a1-SFMUVAam.js → stateDiagram-587899a1-BhomZ0AN.js} +1 -1
- package/assets/{stateDiagram-v2-d93cdb3a-P4Yt2p_j.js → stateDiagram-v2-d93cdb3a-BpJsgMa0.js} +1 -1
- package/assets/stateDiagram-v2-d93cdb3a-CuOn9du2.js +1 -0
- package/assets/{styles-6aaf32cf-C3jnr3hV.js → styles-6aaf32cf-C2WEewoA.js} +1 -1
- package/assets/{styles-6aaf32cf-b6AdP7fu.js → styles-6aaf32cf-CTtf8moq.js} +1 -1
- package/assets/{styles-9a916d00-BUiD9iBe.js → styles-9a916d00-44Xi2-39.js} +1 -1
- package/assets/{styles-9a916d00-ii0XTdIm.js → styles-9a916d00-DUU3VgNe.js} +4 -4
- package/assets/{styles-c10674c1-DbTSpy3W.js → styles-c10674c1--AhWSGg7.js} +1 -1
- package/assets/styles-c10674c1-DS-wE3tK.js +116 -0
- package/assets/{svgDrawCommon-08f97a94-D4gIV05W.js → svgDrawCommon-08f97a94-CXcvtSSy.js} +1 -1
- package/assets/{svgDrawCommon-08f97a94-BK6lD4D6.js → svgDrawCommon-08f97a94-Dyqh4V2s.js} +1 -1
- package/assets/{timeline-definition-85554ec2-Bl2y548G.js → timeline-definition-85554ec2-k788753O.js} +1 -1
- package/assets/{timeline-definition-85554ec2-CWKg_JxG.js → timeline-definition-85554ec2-sw6-UuBe.js} +1 -1
- package/assets/tool-windows-BEnZdJqF.js +2948 -0
- package/assets/{tool-windows-CUNbW1Tz.css → tool-windows-D61Le6TE.css} +1 -1
- package/assets/ttd-dialog-BJzXAZ0l.js +99 -0
- package/assets/useCharacters-DRBoWvvj.css +1 -0
- package/assets/useCharacters-gsV4K8Hn.js +2 -0
- package/assets/{useWorkflowSubmission-BizuDmuw.js → useWorkflowSubmission-XRR21P6Y.js} +10 -10
- package/assets/{video-analyze-6v3Y-rUE.js → video-analyze-CpbnpSiI.js} +1 -1
- package/assets/{video-generation-DnmTlWnm.js → video-generation-BXhS7x-a.js} +2 -2
- package/assets/video-recovery-service-6G2lkWcu.js +1 -0
- package/assets/workflow-generation-utils-CYxtSHl0.js +3 -0
- package/assets/workflow-submission-service-DygSzydV.js +4 -0
- package/assets/{xychartDiagram-e933f94c-CJX9_9WF.js → xychartDiagram-e933f94c-CvTTDwPb.js} +3 -3
- package/assets/{xychartDiagram-e933f94c-Cep8CQEH.js → xychartDiagram-e933f94c-Ga9zi9ha.js} +1 -1
- package/changelog.json +45 -0
- package/idle-prefetch-manifest.json +310 -306
- package/manifest.json +3 -3
- package/package.json +1 -1
- package/precache-manifest.json +10 -10
- package/sitemap.xml +37 -0
- package/sw-debug/app.js +269 -156
- package/sw-debug/backup-restore.js +235 -103
- package/sw-debug/crypto-helper.js +116 -120
- package/sw-debug/duplex-client.js +33 -19
- package/sw-debug/gist-management.js +938 -655
- package/sw-debug/sw-communication.js +87 -50
- package/sw.js +5 -5
- package/version.json +7 -17
- package/assets/CanvasAudioPlayer-DutgwdiU.js +0 -2
- package/assets/ChatDrawer-0jNvKIoI.css +0 -1
- package/assets/ChatDrawer-E6Fog16I.js +0 -11
- package/assets/ChatMessagesArea-Bgwiz_XP.js +0 -250
- package/assets/ChatMessagesArea-DyR_wHFQ.css +0 -1
- package/assets/DeferredAIInputBar-CPkD8Cv9.js +0 -8
- package/assets/DrawnixDeferredFeatures-Cul76-88.js +0 -2
- package/assets/ModelBenchmarkWorkbench-Dv9SNYTi.js +0 -2
- package/assets/MusicAnalyzer-DhtRGpAp.css +0 -1
- package/assets/ResizableDivider-CaG9JQbJ.js +0 -1
- package/assets/TaskQueuePanel-BNhNzGp5.js +0 -1
- package/assets/ai-generation-preferences-service-BF7QkuJp.js +0 -1
- package/assets/arc-DmGoDCEL.js +0 -1
- package/assets/channel-CZjE-WNp.js +0 -1
- package/assets/channel-SXZD6bG3.js +0 -1
- package/assets/classDiagram-v2-f2320105-CsxWGkSy.js +0 -2
- package/assets/clone-C4mvvMDb.js +0 -1
- package/assets/createText-2e5e7dd3-CkXS3l7I.js +0 -5
- package/assets/flowDiagram-v2-96b9c2cf-BCcJ-cre.js +0 -1
- package/assets/flowDiagram-v2-96b9c2cf-DCVaFEgV.js +0 -1
- package/assets/index-3eqA7Bag.js +0 -1
- package/assets/index-7Q-aiwln.js +0 -4
- package/assets/index-B1XP5g7P.css +0 -1
- package/assets/index-BHPTfCZM.js +0 -1
- package/assets/index-BqHZCcen.js +0 -2
- package/assets/index-DcZrElEK.js +0 -2
- package/assets/index-gQ7LgvSv.js +0 -12
- package/assets/main-BFEkxCOK.js +0 -56
- package/assets/model-benchmark-launcher-Ct3lYXVq.js +0 -1
- package/assets/ppt-generation-FzjP_rp0.js +0 -48
- package/assets/settings-dialog-CQM4v791.js +0 -1
- package/assets/stateDiagram-v2-d93cdb3a-DmnBjHpC.js +0 -1
- package/assets/styles-c10674c1-Bt89Yy8Q.js +0 -116
- package/assets/tool-windows-DOIu9TAD.js +0 -2975
- package/assets/ttd-dialog-DI4kQSg8.js +0 -99
- package/assets/useCharacters-Chv4Ky7x.js +0 -7
- package/assets/useCharacters-OrDbG69o.css +0 -1
- package/assets/video-recovery-service-BeRoh0s2.js +0 -1
- package/assets/workflow-generation-utils-me381Cax.js +0 -3
- package/assets/workflow-submission-service-YOpo7g37.js +0 -4
|
@@ -86,7 +86,13 @@ async function performRestore(file) {
|
|
|
86
86
|
throw new Error(`不支持的备份版本: ${manifest.version}`);
|
|
87
87
|
}
|
|
88
88
|
|
|
89
|
-
const stats = {
|
|
89
|
+
const stats = {
|
|
90
|
+
prompts: 0,
|
|
91
|
+
projects: 0,
|
|
92
|
+
tasks: 0,
|
|
93
|
+
knowledgeBase: 0,
|
|
94
|
+
assets: 0,
|
|
95
|
+
};
|
|
90
96
|
|
|
91
97
|
// 1. 恢复提示词
|
|
92
98
|
if (manifest.includes?.prompts !== false) {
|
|
@@ -126,7 +132,6 @@ async function performRestore(file) {
|
|
|
126
132
|
progressContainer.remove();
|
|
127
133
|
showRestoreSuccessNotification(stats, manifest);
|
|
128
134
|
}, 500);
|
|
129
|
-
|
|
130
135
|
} catch (error) {
|
|
131
136
|
progressContainer.remove();
|
|
132
137
|
throw error;
|
|
@@ -147,8 +152,10 @@ async function restorePrompts(zip) {
|
|
|
147
152
|
const mergePromptList = async (kvKey, incoming) => {
|
|
148
153
|
if (!incoming || incoming.length === 0) return 0;
|
|
149
154
|
const existing = (await readKVItem(kvKey)) || [];
|
|
150
|
-
const existingContents = new Set(existing.map(p => p.content));
|
|
151
|
-
const newItems = incoming.filter(
|
|
155
|
+
const existingContents = new Set(existing.map((p) => p.content));
|
|
156
|
+
const newItems = incoming.filter(
|
|
157
|
+
(p) => p.content && !existingContents.has(p.content)
|
|
158
|
+
);
|
|
152
159
|
if (newItems.length > 0) {
|
|
153
160
|
await writeKVItem(kvKey, [...existing, ...newItems]);
|
|
154
161
|
}
|
|
@@ -156,8 +163,14 @@ async function restorePrompts(zip) {
|
|
|
156
163
|
};
|
|
157
164
|
|
|
158
165
|
count += await mergePromptList(KV_KEYS.PROMPT_HISTORY, data.promptHistory);
|
|
159
|
-
count += await mergePromptList(
|
|
160
|
-
|
|
166
|
+
count += await mergePromptList(
|
|
167
|
+
KV_KEYS.VIDEO_PROMPT_HISTORY,
|
|
168
|
+
data.videoPromptHistory
|
|
169
|
+
);
|
|
170
|
+
count += await mergePromptList(
|
|
171
|
+
KV_KEYS.IMAGE_PROMPT_HISTORY,
|
|
172
|
+
data.imagePromptHistory
|
|
173
|
+
);
|
|
161
174
|
|
|
162
175
|
// 恢复预设设置(如果本地没有则写入)
|
|
163
176
|
if (data.presetSettings) {
|
|
@@ -206,21 +219,29 @@ async function restoreProjects(zip) {
|
|
|
206
219
|
});
|
|
207
220
|
}
|
|
208
221
|
} catch (err) {
|
|
209
|
-
|
|
222
|
+
void err;
|
|
210
223
|
}
|
|
211
224
|
}
|
|
212
225
|
|
|
213
226
|
const existingFolders = await readAllFromIDB(
|
|
214
|
-
IDB_STORES.WORKSPACE.name,
|
|
227
|
+
IDB_STORES.WORKSPACE.name,
|
|
228
|
+
IDB_STORES.WORKSPACE.stores.FOLDERS
|
|
229
|
+
);
|
|
230
|
+
const folderRestore = await restoreProjectFolders(
|
|
231
|
+
zip,
|
|
232
|
+
existingFolders || [],
|
|
233
|
+
drawnixFiles.map((file) => file.name)
|
|
215
234
|
);
|
|
216
|
-
const folderRestore = await restoreProjectFolders(zip, existingFolders || [], drawnixFiles.map(file => file.name));
|
|
217
235
|
|
|
218
236
|
// 写入画板(upsert)
|
|
219
237
|
if (boards.length > 0) {
|
|
220
238
|
const existingBoards = await readAllFromIDB(
|
|
221
|
-
IDB_STORES.WORKSPACE.name,
|
|
239
|
+
IDB_STORES.WORKSPACE.name,
|
|
240
|
+
IDB_STORES.WORKSPACE.stores.BOARDS
|
|
241
|
+
);
|
|
242
|
+
const existingBoardMap = new Map(
|
|
243
|
+
(existingBoards || []).map((b) => [b.id, b])
|
|
222
244
|
);
|
|
223
|
-
const existingBoardMap = new Map((existingBoards || []).map(b => [b.id, b]));
|
|
224
245
|
|
|
225
246
|
for (let i = 0; i < boards.length; i++) {
|
|
226
247
|
const board = boards[i];
|
|
@@ -231,20 +252,27 @@ async function restoreProjects(zip) {
|
|
|
231
252
|
const filePath = drawnixFiles[i]?.name || '';
|
|
232
253
|
const relativePath = filePath.replace(/^projects\//, '');
|
|
233
254
|
const parts = relativePath.split('/');
|
|
234
|
-
const folderPath =
|
|
255
|
+
const folderPath =
|
|
256
|
+
parts.length > 1 ? parts.slice(0, -1).join('/') : null;
|
|
235
257
|
const folderId = folderPath
|
|
236
|
-
? folderRestore.pathToId.get(folderPath)
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
258
|
+
? folderRestore.pathToId.get(folderPath) ||
|
|
259
|
+
(board.folderId
|
|
260
|
+
? folderRestore.importedToLocalId.get(board.folderId)
|
|
261
|
+
: null) ||
|
|
262
|
+
board.folderId ||
|
|
263
|
+
null
|
|
240
264
|
: null;
|
|
241
|
-
await writeToIDB(
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
265
|
+
await writeToIDB(
|
|
266
|
+
IDB_STORES.WORKSPACE.name,
|
|
267
|
+
IDB_STORES.WORKSPACE.stores.BOARDS,
|
|
268
|
+
{
|
|
269
|
+
...board,
|
|
270
|
+
folderId,
|
|
271
|
+
}
|
|
272
|
+
);
|
|
245
273
|
count++;
|
|
246
274
|
} catch (err) {
|
|
247
|
-
|
|
275
|
+
void err;
|
|
248
276
|
}
|
|
249
277
|
}
|
|
250
278
|
}
|
|
@@ -262,14 +290,21 @@ async function restoreTasks(zip) {
|
|
|
262
290
|
const tasks = JSON.parse(await tasksFile.async('string'));
|
|
263
291
|
if (!Array.isArray(tasks) || tasks.length === 0) return 0;
|
|
264
292
|
|
|
265
|
-
const existingTasks = await readAllFromIDB(
|
|
266
|
-
|
|
293
|
+
const existingTasks = await readAllFromIDB(
|
|
294
|
+
SW_TASK_QUEUE_DB.name,
|
|
295
|
+
SW_TASK_QUEUE_DB.stores.TASKS
|
|
296
|
+
);
|
|
297
|
+
const existingIds = new Set((existingTasks || []).map((t) => t.id));
|
|
267
298
|
|
|
268
|
-
const newTasks = tasks.filter(t => !existingIds.has(t.id));
|
|
299
|
+
const newTasks = tasks.filter((t) => !existingIds.has(t.id));
|
|
269
300
|
if (newTasks.length > 0) {
|
|
270
301
|
// 标记为远程同步,避免 SW 重新执行
|
|
271
|
-
const markedTasks = newTasks.map(t => ({ ...t, syncedFromRemote: true }));
|
|
272
|
-
await writeBatchToIDB(
|
|
302
|
+
const markedTasks = newTasks.map((t) => ({ ...t, syncedFromRemote: true }));
|
|
303
|
+
await writeBatchToIDB(
|
|
304
|
+
SW_TASK_QUEUE_DB.name,
|
|
305
|
+
SW_TASK_QUEUE_DB.stores.TASKS,
|
|
306
|
+
markedTasks
|
|
307
|
+
);
|
|
273
308
|
}
|
|
274
309
|
|
|
275
310
|
return newTasks.length;
|
|
@@ -300,16 +335,24 @@ async function restoreAssets(zip, onProgress) {
|
|
|
300
335
|
try {
|
|
301
336
|
const meta = JSON.parse(await file.async('string'));
|
|
302
337
|
const assetId = meta.id;
|
|
303
|
-
if (!assetId) {
|
|
338
|
+
if (!assetId) {
|
|
339
|
+
processedCount++;
|
|
340
|
+
continue;
|
|
341
|
+
}
|
|
304
342
|
|
|
305
343
|
// 查找对应的二进制文件
|
|
306
|
-
const binaryFile = findBinaryFile(
|
|
344
|
+
const binaryFile = findBinaryFile(
|
|
345
|
+
assetsFolder,
|
|
346
|
+
relativePath,
|
|
347
|
+
meta.mimeType
|
|
348
|
+
);
|
|
307
349
|
|
|
308
350
|
if (binaryFile) {
|
|
309
351
|
const blob = await binaryFile.async('blob');
|
|
310
352
|
if (blob.size > 0 && meta.url) {
|
|
311
353
|
// 写入 Cache Storage(为每个 URL 创建独立 Response)
|
|
312
|
-
const contentType =
|
|
354
|
+
const contentType =
|
|
355
|
+
meta.mimeType || blob.type || 'application/octet-stream';
|
|
313
356
|
const response = new Response(blob, {
|
|
314
357
|
headers: { 'Content-Type': contentType },
|
|
315
358
|
});
|
|
@@ -329,7 +372,11 @@ async function restoreAssets(zip, onProgress) {
|
|
|
329
372
|
lastUsed: meta.updatedAt || meta.createdAt,
|
|
330
373
|
metadata: meta.metadata,
|
|
331
374
|
};
|
|
332
|
-
await writeToIDB(
|
|
375
|
+
await writeToIDB(
|
|
376
|
+
IDB_STORES.UNIFIED_CACHE.name,
|
|
377
|
+
IDB_STORES.UNIFIED_CACHE.store,
|
|
378
|
+
cacheItem
|
|
379
|
+
);
|
|
333
380
|
} else {
|
|
334
381
|
// 本地素材 → aitu-assets
|
|
335
382
|
await writeToIDB(IDB_STORES.ASSETS.name, IDB_STORES.ASSETS.store, meta);
|
|
@@ -337,7 +384,7 @@ async function restoreAssets(zip, onProgress) {
|
|
|
337
384
|
|
|
338
385
|
count++;
|
|
339
386
|
} catch (err) {
|
|
340
|
-
|
|
387
|
+
void err;
|
|
341
388
|
}
|
|
342
389
|
|
|
343
390
|
processedCount++;
|
|
@@ -356,30 +403,35 @@ async function restoreKnowledgeBase(zip) {
|
|
|
356
403
|
|
|
357
404
|
const data = JSON.parse(await kbFile.async('string'));
|
|
358
405
|
const result = await importKnowledgeBaseData(data, {
|
|
359
|
-
getAllDirectories: () =>
|
|
360
|
-
|
|
361
|
-
|
|
362
|
-
|
|
363
|
-
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
367
|
-
|
|
368
|
-
|
|
369
|
-
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
373
|
-
|
|
374
|
-
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
380
|
-
|
|
381
|
-
|
|
382
|
-
)
|
|
406
|
+
getAllDirectories: () =>
|
|
407
|
+
readAllFromIDB(
|
|
408
|
+
IDB_STORES.KNOWLEDGE_BASE.name,
|
|
409
|
+
IDB_STORES.KNOWLEDGE_BASE.stores.DIRECTORIES
|
|
410
|
+
),
|
|
411
|
+
getDirectoryById: (id) =>
|
|
412
|
+
readItemFromIDB(
|
|
413
|
+
IDB_STORES.KNOWLEDGE_BASE.name,
|
|
414
|
+
IDB_STORES.KNOWLEDGE_BASE.stores.DIRECTORIES,
|
|
415
|
+
id
|
|
416
|
+
),
|
|
417
|
+
putDirectory: (_id, value) =>
|
|
418
|
+
writeToIDB(
|
|
419
|
+
IDB_STORES.KNOWLEDGE_BASE.name,
|
|
420
|
+
IDB_STORES.KNOWLEDGE_BASE.stores.DIRECTORIES,
|
|
421
|
+
value
|
|
422
|
+
),
|
|
423
|
+
getTagById: (id) =>
|
|
424
|
+
readItemFromIDB(
|
|
425
|
+
IDB_STORES.KNOWLEDGE_BASE.name,
|
|
426
|
+
IDB_STORES.KNOWLEDGE_BASE.stores.TAGS,
|
|
427
|
+
id
|
|
428
|
+
),
|
|
429
|
+
putTag: (_id, value) =>
|
|
430
|
+
writeToIDB(
|
|
431
|
+
IDB_STORES.KNOWLEDGE_BASE.name,
|
|
432
|
+
IDB_STORES.KNOWLEDGE_BASE.stores.TAGS,
|
|
433
|
+
value
|
|
434
|
+
),
|
|
383
435
|
getNoteById: async (id) => {
|
|
384
436
|
const meta = await readItemFromIDB(
|
|
385
437
|
IDB_STORES.KNOWLEDGE_BASE.name,
|
|
@@ -397,36 +449,42 @@ async function restoreKnowledgeBase(zip) {
|
|
|
397
449
|
content: contentRecord?.content ?? '',
|
|
398
450
|
};
|
|
399
451
|
},
|
|
400
|
-
putNoteMeta: (_id, value) =>
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
)
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
452
|
+
putNoteMeta: (_id, value) =>
|
|
453
|
+
writeToIDB(
|
|
454
|
+
IDB_STORES.KNOWLEDGE_BASE.name,
|
|
455
|
+
IDB_STORES.KNOWLEDGE_BASE.stores.NOTES,
|
|
456
|
+
value
|
|
457
|
+
),
|
|
458
|
+
putNoteContent: (_id, value) =>
|
|
459
|
+
writeToIDB(
|
|
460
|
+
IDB_STORES.KNOWLEDGE_BASE.name,
|
|
461
|
+
IDB_STORES.KNOWLEDGE_BASE.stores.NOTE_CONTENTS,
|
|
462
|
+
value
|
|
463
|
+
),
|
|
464
|
+
getNoteTagById: (id) =>
|
|
465
|
+
readItemFromIDB(
|
|
466
|
+
IDB_STORES.KNOWLEDGE_BASE.name,
|
|
467
|
+
IDB_STORES.KNOWLEDGE_BASE.stores.NOTE_TAGS,
|
|
468
|
+
id
|
|
469
|
+
),
|
|
470
|
+
putNoteTag: (_id, value) =>
|
|
471
|
+
writeToIDB(
|
|
472
|
+
IDB_STORES.KNOWLEDGE_BASE.name,
|
|
473
|
+
IDB_STORES.KNOWLEDGE_BASE.stores.NOTE_TAGS,
|
|
474
|
+
value
|
|
475
|
+
),
|
|
476
|
+
getNoteImageById: (id) =>
|
|
477
|
+
readItemFromIDB(
|
|
478
|
+
IDB_STORES.KNOWLEDGE_BASE.name,
|
|
479
|
+
IDB_STORES.KNOWLEDGE_BASE.stores.NOTE_IMAGES,
|
|
480
|
+
id
|
|
481
|
+
),
|
|
482
|
+
putNoteImage: (_id, value) =>
|
|
483
|
+
writeToIDB(
|
|
484
|
+
IDB_STORES.KNOWLEDGE_BASE.name,
|
|
485
|
+
IDB_STORES.KNOWLEDGE_BASE.stores.NOTE_IMAGES,
|
|
486
|
+
value
|
|
487
|
+
),
|
|
430
488
|
});
|
|
431
489
|
|
|
432
490
|
return result.noteCount;
|
|
@@ -435,28 +493,47 @@ async function restoreKnowledgeBase(zip) {
|
|
|
435
493
|
async function restoreProjectFolders(zip, existingFolders, drawnixFilePaths) {
|
|
436
494
|
const importedToLocalId = new Map();
|
|
437
495
|
const pathToId = new Map();
|
|
438
|
-
const folderKeyMap = new Map(
|
|
496
|
+
const folderKeyMap = new Map(
|
|
497
|
+
existingFolders.map((folder) => [
|
|
498
|
+
getFolderKey(folder.name, folder.parentId),
|
|
499
|
+
folder,
|
|
500
|
+
])
|
|
501
|
+
);
|
|
439
502
|
const foldersFile = zip.file('projects/_folders.json');
|
|
440
503
|
|
|
441
504
|
if (foldersFile) {
|
|
442
505
|
const parsed = JSON.parse(await foldersFile.async('string'));
|
|
443
|
-
const importedFolders = Array.isArray(parsed)
|
|
444
|
-
|
|
506
|
+
const importedFolders = Array.isArray(parsed)
|
|
507
|
+
? parsed
|
|
508
|
+
: parsed?.folders || [];
|
|
509
|
+
const folderMap = new Map(
|
|
510
|
+
importedFolders.map((folder) => [folder.id, folder])
|
|
511
|
+
);
|
|
445
512
|
const sortedFolders = [...importedFolders].sort((a, b) => {
|
|
446
513
|
const depthA = getFolderDepth(a, folderMap);
|
|
447
514
|
const depthB = getFolderDepth(b, folderMap);
|
|
448
|
-
return
|
|
515
|
+
return (
|
|
516
|
+
depthA - depthB ||
|
|
517
|
+
(a.order || 0) - (b.order || 0) ||
|
|
518
|
+
a.name.localeCompare(b.name)
|
|
519
|
+
);
|
|
449
520
|
});
|
|
450
521
|
|
|
451
522
|
for (const folder of sortedFolders) {
|
|
452
|
-
const mappedParentId = folder.parentId
|
|
453
|
-
|
|
523
|
+
const mappedParentId = folder.parentId
|
|
524
|
+
? importedToLocalId.get(folder.parentId) || null
|
|
525
|
+
: null;
|
|
526
|
+
const existingById = existingFolders.find(
|
|
527
|
+
(item) => item.id === folder.id
|
|
528
|
+
);
|
|
454
529
|
if (existingById) {
|
|
455
530
|
importedToLocalId.set(folder.id, existingById.id);
|
|
456
531
|
continue;
|
|
457
532
|
}
|
|
458
533
|
|
|
459
|
-
const existingByKey = folderKeyMap.get(
|
|
534
|
+
const existingByKey = folderKeyMap.get(
|
|
535
|
+
getFolderKey(folder.name, mappedParentId)
|
|
536
|
+
);
|
|
460
537
|
if (existingByKey) {
|
|
461
538
|
importedToLocalId.set(folder.id, existingByKey.id);
|
|
462
539
|
continue;
|
|
@@ -466,13 +543,23 @@ async function restoreProjectFolders(zip, existingFolders, drawnixFilePaths) {
|
|
|
466
543
|
...folder,
|
|
467
544
|
parentId: mappedParentId,
|
|
468
545
|
};
|
|
469
|
-
await writeToIDB(
|
|
546
|
+
await writeToIDB(
|
|
547
|
+
IDB_STORES.WORKSPACE.name,
|
|
548
|
+
IDB_STORES.WORKSPACE.stores.FOLDERS,
|
|
549
|
+
nextFolder
|
|
550
|
+
);
|
|
470
551
|
existingFolders.push(nextFolder);
|
|
471
|
-
folderKeyMap.set(
|
|
552
|
+
folderKeyMap.set(
|
|
553
|
+
getFolderKey(nextFolder.name, nextFolder.parentId),
|
|
554
|
+
nextFolder
|
|
555
|
+
);
|
|
472
556
|
importedToLocalId.set(folder.id, nextFolder.id);
|
|
473
557
|
}
|
|
474
558
|
|
|
475
|
-
const allFolders = await readAllFromIDB(
|
|
559
|
+
const allFolders = await readAllFromIDB(
|
|
560
|
+
IDB_STORES.WORKSPACE.name,
|
|
561
|
+
IDB_STORES.WORKSPACE.stores.FOLDERS
|
|
562
|
+
);
|
|
476
563
|
const fullPathMap = buildFolderPathMap(allFolders || []);
|
|
477
564
|
for (const [folderId, folderPath] of fullPathMap.entries()) {
|
|
478
565
|
pathToId.set(folderPath, folderId);
|
|
@@ -493,7 +580,9 @@ async function restoreProjectFolders(zip, existingFolders, drawnixFilePaths) {
|
|
|
493
580
|
}
|
|
494
581
|
|
|
495
582
|
const folder = {
|
|
496
|
-
id: `${Date.now().toString(36)}-${Math.random()
|
|
583
|
+
id: `${Date.now().toString(36)}-${Math.random()
|
|
584
|
+
.toString(36)
|
|
585
|
+
.slice(2, 10)}`,
|
|
497
586
|
name: folderName,
|
|
498
587
|
parentId,
|
|
499
588
|
order: existingFolders.length,
|
|
@@ -501,7 +590,11 @@ async function restoreProjectFolders(zip, existingFolders, drawnixFilePaths) {
|
|
|
501
590
|
createdAt: Date.now(),
|
|
502
591
|
updatedAt: Date.now(),
|
|
503
592
|
};
|
|
504
|
-
await writeToIDB(
|
|
593
|
+
await writeToIDB(
|
|
594
|
+
IDB_STORES.WORKSPACE.name,
|
|
595
|
+
IDB_STORES.WORKSPACE.stores.FOLDERS,
|
|
596
|
+
folder
|
|
597
|
+
);
|
|
505
598
|
existingFolders.push(folder);
|
|
506
599
|
folderKeyMap.set(getFolderKey(folder.name, folder.parentId), folder);
|
|
507
600
|
pathToId.set(folderPath, folder.id);
|
|
@@ -536,7 +629,9 @@ function showRestoreProgress() {
|
|
|
536
629
|
*/
|
|
537
630
|
function showRestoreSuccessNotification(stats, manifest) {
|
|
538
631
|
const partInfo = manifest.partIndex
|
|
539
|
-
? ` (分片 ${manifest.partIndex}${
|
|
632
|
+
? ` (分片 ${manifest.partIndex}${
|
|
633
|
+
manifest.totalParts ? '/' + manifest.totalParts : ''
|
|
634
|
+
})`
|
|
540
635
|
: '';
|
|
541
636
|
const notification = document.createElement('div');
|
|
542
637
|
notification.className = 'import-notification restore-notification';
|
|
@@ -547,11 +642,48 @@ function showRestoreSuccessNotification(stats, manifest) {
|
|
|
547
642
|
<strong>恢复成功${partInfo}</strong>
|
|
548
643
|
<p class="counts">
|
|
549
644
|
${stats.prompts > 0 ? `新增提示词: ${stats.prompts}` : ''}
|
|
550
|
-
${
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
645
|
+
${
|
|
646
|
+
stats.projects > 0
|
|
647
|
+
? `${stats.prompts > 0 ? ' | ' : ''}画板: ${stats.projects}`
|
|
648
|
+
: ''
|
|
649
|
+
}
|
|
650
|
+
${
|
|
651
|
+
stats.tasks > 0
|
|
652
|
+
? `${stats.prompts + stats.projects > 0 ? ' | ' : ''}任务: ${
|
|
653
|
+
stats.tasks
|
|
654
|
+
}`
|
|
655
|
+
: ''
|
|
656
|
+
}
|
|
657
|
+
${
|
|
658
|
+
stats.knowledgeBase > 0
|
|
659
|
+
? `${
|
|
660
|
+
stats.prompts + stats.projects + stats.tasks > 0 ? ' | ' : ''
|
|
661
|
+
}知识库笔记: ${stats.knowledgeBase}`
|
|
662
|
+
: ''
|
|
663
|
+
}
|
|
664
|
+
${
|
|
665
|
+
stats.assets > 0
|
|
666
|
+
? `${
|
|
667
|
+
stats.prompts +
|
|
668
|
+
stats.projects +
|
|
669
|
+
stats.tasks +
|
|
670
|
+
stats.knowledgeBase >
|
|
671
|
+
0
|
|
672
|
+
? ' | '
|
|
673
|
+
: ''
|
|
674
|
+
}素材: ${stats.assets}`
|
|
675
|
+
: ''
|
|
676
|
+
}
|
|
677
|
+
${
|
|
678
|
+
stats.prompts +
|
|
679
|
+
stats.projects +
|
|
680
|
+
stats.tasks +
|
|
681
|
+
stats.knowledgeBase +
|
|
682
|
+
stats.assets ===
|
|
683
|
+
0
|
|
684
|
+
? '所有数据已是最新,无需更新'
|
|
685
|
+
: ''
|
|
686
|
+
}
|
|
555
687
|
</p>
|
|
556
688
|
</div>
|
|
557
689
|
<button class="close" onclick="this.parentElement.parentElement.remove()">×</button>
|