@powerhousedao/powerhouse-vetra-packages 6.2.2-dev.82 → 6.2.2-dev.84

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. package/dist/browser/{connect-Bpm1qc2o.js → connect-CZxjNDFs.js} +14 -5
  2. package/dist/browser/{connect-Bpm1qc2o.js.map → connect-CZxjNDFs.js.map} +1 -1
  3. package/dist/browser/{dist-DzuQgnp9.js → dist-CnNpgEVe.js} +134 -4
  4. package/dist/browser/dist-CnNpgEVe.js.map +1 -0
  5. package/dist/browser/{document-drive-BVYCdu_5.js → document-drive-ZQzPQfEL.js} +12 -5
  6. package/dist/browser/{document-drive-BVYCdu_5.js.map → document-drive-ZQzPQfEL.js.map} +1 -1
  7. package/dist/browser/document-models/index.js +1 -1
  8. package/dist/browser/{editor-BhVC9JGB.js → editor-Dg_2AIoc.js} +5 -5
  9. package/dist/browser/{editor-BhVC9JGB.js.map → editor-Dg_2AIoc.js.map} +1 -1
  10. package/dist/browser/{editor-Cr2SUFnl.js → editor-TmNqs_3q.js} +6 -6
  11. package/dist/browser/{editor-Cr2SUFnl.js.map → editor-TmNqs_3q.js.map} +1 -1
  12. package/dist/browser/editors/document-model-editor/module.js +1 -1
  13. package/dist/browser/editors/generic-drive-explorer/index.js +4 -4
  14. package/dist/browser/editors/generic-drive-explorer/module.js +1 -1
  15. package/dist/browser/{folder-view-EDdZl1fJ.js → folder-view-B7P3uF6d.js} +3 -3
  16. package/dist/browser/{folder-view-EDdZl1fJ.js.map → folder-view-B7P3uF6d.js.map} +1 -1
  17. package/dist/browser/{graphql-editor-BjkthIT9.js → graphql-editor-tFWpwJhB.js} +3 -3
  18. package/dist/browser/{graphql-editor-BjkthIT9.js.map → graphql-editor-tFWpwJhB.js.map} +1 -1
  19. package/dist/browser/index.js +1 -1
  20. package/dist/browser/{json-editor-nLgiw_aY.js → json-editor-DczBqrwD.js} +3 -3
  21. package/dist/browser/{json-editor-nLgiw_aY.js.map → json-editor-DczBqrwD.js.map} +1 -1
  22. package/dist/browser/lib-ewnRj2dJ.js.map +1 -1
  23. package/dist/browser/{state-schemas-IiwC01DT.js → state-schemas-inzuDitu.js} +3 -3
  24. package/dist/browser/{state-schemas-IiwC01DT.js.map → state-schemas-inzuDitu.js.map} +1 -1
  25. package/dist/node/{connect-DzMvrvtH.mjs → connect-Bfdoq4eL.mjs} +14 -5
  26. package/dist/node/{connect-DzMvrvtH.mjs.map → connect-Bfdoq4eL.mjs.map} +1 -1
  27. package/dist/node/{dist-CWqCyPep.mjs → dist-BDq_3xzc.mjs} +134 -4
  28. package/dist/node/dist-BDq_3xzc.mjs.map +1 -0
  29. package/dist/node/{document-drive-lf_0SP-H.mjs → document-drive-D1NMjQQc.mjs} +12 -5
  30. package/dist/node/{document-drive-lf_0SP-H.mjs.map → document-drive-D1NMjQQc.mjs.map} +1 -1
  31. package/dist/node/document-models/index.mjs +1 -1
  32. package/dist/node/{editor-DSlBxXEG.mjs → editor-DQvgS2LK.mjs} +5 -5
  33. package/dist/node/{editor-DSlBxXEG.mjs.map → editor-DQvgS2LK.mjs.map} +1 -1
  34. package/dist/node/{editor-BHFgv5Sn.mjs → editor-tTT_T9Fq.mjs} +6 -6
  35. package/dist/node/{editor-BHFgv5Sn.mjs.map → editor-tTT_T9Fq.mjs.map} +1 -1
  36. package/dist/node/editors/document-model-editor/module.mjs +1 -1
  37. package/dist/node/editors/generic-drive-explorer/index.mjs +4 -4
  38. package/dist/node/editors/generic-drive-explorer/module.mjs +1 -1
  39. package/dist/node/{folder-view-BU4jkZT4.mjs → folder-view-Bjnpy_l9.mjs} +3 -3
  40. package/dist/node/{folder-view-BU4jkZT4.mjs.map → folder-view-Bjnpy_l9.mjs.map} +1 -1
  41. package/dist/node/{graphql-editor-CScEOmFM.mjs → graphql-editor-DK16Va7B.mjs} +3 -3
  42. package/dist/node/{graphql-editor-CScEOmFM.mjs.map → graphql-editor-DK16Va7B.mjs.map} +1 -1
  43. package/dist/node/index.mjs +1 -1
  44. package/dist/node/{json-editor-BkdBLGDx.mjs → json-editor-CUxDXYvs.mjs} +3 -3
  45. package/dist/node/{json-editor-BkdBLGDx.mjs.map → json-editor-CUxDXYvs.mjs.map} +1 -1
  46. package/dist/node/main-B1tRsYOp.mjs.map +1 -1
  47. package/dist/node/{state-schemas-BCTGWiNB.mjs → state-schemas-CbnYhOyM.mjs} +3 -3
  48. package/dist/node/{state-schemas-BCTGWiNB.mjs.map → state-schemas-CbnYhOyM.mjs.map} +1 -1
  49. package/package.json +7 -7
  50. package/dist/browser/dist-DzuQgnp9.js.map +0 -1
  51. package/dist/node/dist-CWqCyPep.mjs.map +0 -1
@@ -1,5 +1,5 @@
1
1
  import { D as __commonJSMin, M as __toESM, t as capitalCase } from "./dist-DT7jI9ol.mjs";
2
- import { C as baseLoadFromInputVersioned, O as createPresignedHeader, Q as setName, S as baseLoadFromInput, T as buildSignedAction, U as replayDocumentVersioned, a as handleTargetNameCollisions, ct as validateStateSchemaName, f as logger, h as UnsupportedDocumentModelVersionError, i as generateNodesCopy, j as createZip, l as moveNode, lt as generateId, n as copyNode, o as isFileNode, ot as validateInitialState, s as isFolderNode, st as validateModules, t as addFolder, u as updateNode, w as baseSaveToFileHandle, y as assertAuthPreservedOnDuplicate } from "./document-drive-lf_0SP-H.mjs";
2
+ import { A as createPresignedHeader, D as buildSignedAction, E as baseSaveToFileHandle, G as replayDocumentVersioned, N as createZip, T as baseLoadFromInputVersioned, _ as UnsupportedDocumentModelVersionError, a as getDescendants, c as isFileNode, ct as validateInitialState, d as moveNode, dt as zipEntries, et as setName, f as updateNode, ft as generateId, i as generateNodesCopy, l as isFolderNode, lt as validateModules, m as logger, n as copyNode, o as getNextCopyNumber, s as handleTargetNameCollisions, t as addFolder, ut as validateStateSchemaName, w as baseLoadFromInput, x as assertAuthPreservedOnDuplicate } from "./document-drive-D1NMjQQc.mjs";
3
3
  import { a as DriveCollectionId, i as SyncStatus, o as ModuleNotFoundError, t as require_main } from "./main-B1tRsYOp.mjs";
4
4
  import { t as require_graphql } from "./graphql-BfAoPeWM.mjs";
5
5
  import { createContext, use, useCallback, useContext, useEffect, useMemo, useState, useSyncExternalStore } from "react";
@@ -2058,7 +2058,7 @@ var MessageType = /* @__PURE__ */ ((MessageType2) => {
2058
2058
  })(MessageType || {});
2059
2059
  Error;
2060
2060
  //#endregion
2061
- //#region ../reactor-browser/dist/document-operations-BO-SlTDw.js
2061
+ //#region ../reactor-browser/dist/document-operations-Bo1dPDgq.js
2062
2062
  const modalEventFunctions = makePHEventFunctions("modal");
2063
2063
  modalEventFunctions.useValue;
2064
2064
  /** Sets the current modal */
@@ -3852,6 +3852,117 @@ var import_lz_string = /* @__PURE__ */ __toESM((/* @__PURE__ */ __commonJSMin(((
3852
3852
  return LZString;
3853
3853
  });
3854
3854
  })))(), 1);
3855
+ const sanitize = (segment) => segment.replace(/\//g, "-");
3856
+ /**
3857
+ * Name segments from the exported folder (exclusive) down to `node`
3858
+ * (inclusive), in top-down order. `root === undefined` means the drive root:
3859
+ * all ancestors. A node that IS the exported folder yields no segments.
3860
+ */
3861
+ function segmentsBelow(root, node, allNodes) {
3862
+ const segments = [];
3863
+ let current = node;
3864
+ while (current && current.id !== root?.id) {
3865
+ segments.push(sanitize(current.name));
3866
+ const parentId = current.parentFolder;
3867
+ current = parentId ? allNodes.find((n) => n.id === parentId) : void 0;
3868
+ }
3869
+ return segments.reverse();
3870
+ }
3871
+ /**
3872
+ * Assemble the archive zip for a folder (or the whole drive when
3873
+ * `folderNode` is undefined). Every folder in the subtree becomes a
3874
+ * directory entry (empty folders survive); every file becomes a standard
3875
+ * single-document zip named after the node (drive naming convention:
3876
+ * `${name}.${extension}.phd`, ` (copy) N` on a same-folder collision).
3877
+ *
3878
+ * `fetchDocument` must return the document WITH its full operations and
3879
+ * initialState (see downloadFolderZip).
3880
+ */
3881
+ async function buildFolderZip(drive, folderNode, fetchDocument, onProgress) {
3882
+ const allNodes = drive.state.global.nodes;
3883
+ const topName = sanitize(folderNode?.name ?? (drive.state.global.name || drive.header.name));
3884
+ const subtree = folderNode ? [folderNode, ...getDescendants(folderNode, allNodes)] : allNodes;
3885
+ const entries = { [topName + "/"]: new Uint8Array(0) };
3886
+ for (const node of subtree) {
3887
+ if (!isFolderNode(node)) continue;
3888
+ const dir = [topName, ...segmentsBelow(folderNode, node, allNodes)].join("/");
3889
+ entries[dir + "/"] = new Uint8Array(0);
3890
+ }
3891
+ const files = subtree.filter(isFileNode);
3892
+ const failed = [];
3893
+ const usedNamesByDir = /* @__PURE__ */ new Map();
3894
+ let done = 0;
3895
+ for (const node of files) try {
3896
+ const doc = await fetchDocument(node.id);
3897
+ const extension = await getDocumentExtension(doc);
3898
+ const parent = node.parentFolder ? allNodes.find((n) => n.id === node.parentFolder) : void 0;
3899
+ const dir = [topName, ...parent ? segmentsBelow(folderNode, parent, allNodes) : []].join("/");
3900
+ let usedNames = usedNamesByDir.get(dir);
3901
+ if (!usedNames) {
3902
+ usedNames = /* @__PURE__ */ new Set();
3903
+ usedNamesByDir.set(dir, usedNames);
3904
+ }
3905
+ const base = sanitize(node.name);
3906
+ let candidate = base;
3907
+ let count = getNextCopyNumber([...usedNames], base);
3908
+ while (usedNames.has(candidate)) {
3909
+ candidate = `${base} (copy) ${count}`;
3910
+ count += 1;
3911
+ }
3912
+ usedNames.add(candidate);
3913
+ const leaf = extension ? `${candidate}.${extension}.phd` : `${candidate}.phd`;
3914
+ entries[`${dir}/${leaf}`] = await createZip(doc);
3915
+ } catch {
3916
+ failed.push(node.name);
3917
+ } finally {
3918
+ done += 1;
3919
+ onProgress?.(done, files.length);
3920
+ }
3921
+ return {
3922
+ zip: await zipEntries(entries),
3923
+ archiveName: `${topName}.zip`,
3924
+ entryCount: files.length - failed.length,
3925
+ failed
3926
+ };
3927
+ }
3928
+ /**
3929
+ * Export a folder (or whole drive) to disk: fetches every document with its
3930
+ * full operation history, builds the archive, and saves it via
3931
+ * showSaveFilePicker (fallback: blob download), mirroring exportFile.
3932
+ */
3933
+ async function downloadFolderZip(drive, folderNode, onProgress) {
3934
+ const reactorClient = window.ph?.reactorClient;
3935
+ if (!reactorClient) throw new Error("ReactorClient not initialized");
3936
+ const result = await buildFolderZip(drive, folderNode, async (id) => {
3937
+ const doc = await reactorClient.get(id);
3938
+ const operations = await fetchDocumentOperations(reactorClient, doc);
3939
+ const initialState = extractInitialState(operations["document"] ?? []);
3940
+ return {
3941
+ ...doc,
3942
+ operations,
3943
+ initialState
3944
+ };
3945
+ }, onProgress);
3946
+ if (!window.showSaveFilePicker) {
3947
+ const blob = new Blob([new Uint8Array(result.zip)], { type: "application/zip" });
3948
+ const link = window.document.createElement("a");
3949
+ link.style.display = "none";
3950
+ link.href = URL.createObjectURL(blob);
3951
+ link.download = result.archiveName;
3952
+ window.document.body.appendChild(link);
3953
+ link.click();
3954
+ window.document.body.removeChild(link);
3955
+ return result;
3956
+ }
3957
+ try {
3958
+ const writable = await (await window.showSaveFilePicker({ suggestedName: result.archiveName })).createWritable();
3959
+ await writable.write(new Uint8Array(result.zip));
3960
+ await writable.close();
3961
+ } catch (e) {
3962
+ if (!(e instanceof DOMException && e.name === "AbortError")) throw e;
3963
+ }
3964
+ return result;
3965
+ }
3855
3966
  /** Document types that represent a "drive": a container of nodes. */
3856
3967
  const DRIVE_DOCUMENT_TYPES = ["powerhouse/document-drive", "powerhouse/reactor-drive"];
3857
3968
  function useAllowedDocumentModelModules() {
@@ -4029,6 +4140,25 @@ function useDownloadDocument(id) {
4029
4140
  }
4030
4141
  };
4031
4142
  }
4143
+ /**
4144
+ * Downloads the selected drive's folder (or the whole drive when no folder
4145
+ * is given) as a single zip archive mirroring the folder tree.
4146
+ */
4147
+ function useDownloadFolder(folderNode) {
4148
+ const [selectedDrive] = useSelectedDriveSafe();
4149
+ const toast = usePHToast();
4150
+ return async () => {
4151
+ if (!selectedDrive) return;
4152
+ const name = folderNode?.name ?? selectedDrive.header.name;
4153
+ toast?.(`Downloading "${name}"…`);
4154
+ try {
4155
+ const { entryCount, failed } = await downloadFolderZip(selectedDrive, folderNode);
4156
+ toast?.(failed.length ? `Downloaded ${entryCount} files (${failed.length} failed)` : `Downloaded ${entryCount} files`);
4157
+ } catch (error) {
4158
+ toast?.(`Failed to download "${name}": ${error.message}`);
4159
+ }
4160
+ };
4161
+ }
4032
4162
  /** An editor is a drive "app" if it targets any supported drive document type. */
4033
4163
  function isDriveEditor(module) {
4034
4164
  const driveTypes = DRIVE_DOCUMENT_TYPES;
@@ -4375,6 +4505,6 @@ function createDebouncedRefreshReactorDataClient(debounceDelayMs = DEFAULT_DEBOU
4375
4505
  createDebouncedRefreshReactorData();
4376
4506
  createDebouncedRefreshReactorDataClient();
4377
4507
  //#endregion
4378
- export { usePHToast as A, useSelectedDriveId as B, addFolder$1 as C, useDisabledEditors as D, showRevisionHistory as E, t$5 as F, useDocumentById as H, isFileNodeKind as I, isFolderNodeKind as L, e$1 as M, e$4 as N, useDragNode as O, t$2 as P, setSelectedDrive as R, addDocument as S, showPHModal as T, useSelectedDriveSafe as V, useSetPHDocumentEditorConfig as _, useDownloadDocument as a, useSelectedDocumentOfType as b, useGetSwitchboardLink as c, useNodeParentFolderById as d, useNodesInSelectedDriveOrFolder as f, useSetPHAppConfig as g, useSelectedNodePath as h, useDocumentVersionStatus as i, useStudioMode as j, useDropNode as k, useNodeActions as l, useSelectedFolder as m, preloadEditorModule as n, useEditorModules as o, useParentFolderForSelectedNode as p, useAllowedDocumentModelModules as r, useEditorModulesForDocumentType as s, getSyncStatusSync as t, useNodeById as u, useTheme as v, showDeleteNodeModal as w, useSelectedDocumentSafe as x, useUserPermissions as y, setSelectedNode as z };
4508
+ export { useDropNode as A, setSelectedNode as B, addDocument as C, showRevisionHistory as D, showPHModal as E, t$2 as F, useSelectedDriveSafe as H, t$5 as I, isFileNodeKind as L, useStudioMode as M, e$1 as N, useDisabledEditors as O, e$4 as P, isFolderNodeKind as R, useSelectedDocumentSafe as S, showDeleteNodeModal as T, useDocumentById as U, useSelectedDriveId as V, useSetPHAppConfig as _, useDownloadDocument as a, useUserPermissions as b, useEditorModulesForDocumentType as c, useNodeById as d, useNodeParentFolderById as f, useSelectedNodePath as g, useSelectedFolder as h, useDocumentVersionStatus as i, usePHToast as j, useDragNode as k, useGetSwitchboardLink as l, useParentFolderForSelectedNode as m, preloadEditorModule as n, useDownloadFolder as o, useNodesInSelectedDriveOrFolder as p, useAllowedDocumentModelModules as r, useEditorModules as s, getSyncStatusSync as t, useNodeActions as u, useSetPHDocumentEditorConfig as v, addFolder$1 as w, useSelectedDocumentOfType as x, useTheme as y, setSelectedDrive as z };
4379
4509
 
4380
- //# sourceMappingURL=dist-CWqCyPep.mjs.map
4510
+ //# sourceMappingURL=dist-BDq_3xzc.mjs.map