@haex-space/vault-sdk 2.5.42 → 2.5.45

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/index.js CHANGED
@@ -487,50 +487,19 @@ var HAEXTENSION_METHODS = {
487
487
  filesystem: {
488
488
  saveFile: "haextension:filesystem:save-file",
489
489
  openFile: "haextension:filesystem:open-file",
490
- showImage: "haextension:filesystem:show-image"
491
- },
492
- filesync: {
493
- // Spaces
494
- listSpaces: "haextension:filesync:list-spaces",
495
- createSpace: "haextension:filesync:create-space",
496
- deleteSpace: "haextension:filesync:delete-space",
497
- // Files
498
- listFiles: "haextension:filesync:list-files",
499
- getFile: "haextension:filesync:get-file",
500
- uploadFile: "haextension:filesync:upload-file",
501
- downloadFile: "haextension:filesync:download-file",
502
- deleteFile: "haextension:filesync:delete-file",
503
- // Backends
504
- listBackends: "haextension:filesync:list-backends",
505
- addBackend: "haextension:filesync:add-backend",
506
- removeBackend: "haextension:filesync:remove-backend",
507
- testBackend: "haextension:filesync:test-backend",
508
- // Sync Rules
509
- listSyncRules: "haextension:filesync:list-sync-rules",
510
- addSyncRule: "haextension:filesync:add-sync-rule",
511
- updateSyncRule: "haextension:filesync:update-sync-rule",
512
- removeSyncRule: "haextension:filesync:remove-sync-rule",
513
- // Sync Operations
514
- getSyncStatus: "haextension:filesync:get-sync-status",
515
- triggerSync: "haextension:filesync:trigger-sync",
516
- pauseSync: "haextension:filesync:pause-sync",
517
- resumeSync: "haextension:filesync:resume-sync",
518
- // Conflict Resolution
519
- resolveConflict: "haextension:filesync:resolve-conflict",
520
- // UI Helpers
521
- selectFolder: "haextension:filesync:select-folder",
522
- scanLocal: "haextension:filesync:scan-local",
523
- // Sync Queue (persistent upload/download queue)
524
- addToQueue: "haextension:filesync:add-to-queue",
525
- getQueue: "haextension:filesync:get-queue",
526
- getQueueSummary: "haextension:filesync:get-queue-summary",
527
- startQueueEntry: "haextension:filesync:start-queue-entry",
528
- completeQueueEntry: "haextension:filesync:complete-queue-entry",
529
- failQueueEntry: "haextension:filesync:fail-queue-entry",
530
- retryFailedQueue: "haextension:filesync:retry-failed-queue",
531
- removeQueueEntry: "haextension:filesync:remove-queue-entry",
532
- clearQueue: "haextension:filesync:clear-queue",
533
- recoverQueue: "haextension:filesync:recover-queue"
490
+ showImage: "haextension:filesystem:show-image",
491
+ // Generic FS operations (Phase 2)
492
+ readFile: "haextension:filesystem:read-file",
493
+ writeFile: "haextension:filesystem:write-file",
494
+ readDir: "haextension:filesystem:read-dir",
495
+ mkdir: "haextension:filesystem:mkdir",
496
+ remove: "haextension:filesystem:remove",
497
+ exists: "haextension:filesystem:exists",
498
+ stat: "haextension:filesystem:stat",
499
+ selectFolder: "haextension:filesystem:select-folder",
500
+ selectFile: "haextension:filesystem:select-file",
501
+ rename: "haextension:filesystem:rename",
502
+ copy: "haextension:filesystem:copy"
534
503
  },
535
504
  storage: {
536
505
  getItem: "haextension:storage:get-item",
@@ -676,406 +645,193 @@ var DatabaseAPI = class {
676
645
  }
677
646
  };
678
647
 
679
- // src/api/filesync.ts
680
- var FILE_SYNC_STATE = {
681
- SYNCED: "synced",
682
- SYNCING: "syncing",
683
- LOCAL_ONLY: "localOnly",
684
- REMOTE_ONLY: "remoteOnly",
685
- CONFLICT: "conflict",
686
- ERROR: "error"
687
- };
688
- var SYNC_DIRECTION = {
689
- UP: "up",
690
- DOWN: "down",
691
- BOTH: "both"
692
- };
693
- var STORAGE_BACKEND_TYPE = {
694
- S3: "s3",
695
- R2: "r2",
696
- MINIO: "minio",
697
- GDRIVE: "gdrive",
698
- DROPBOX: "dropbox"
699
- };
700
- var CONFLICT_STRATEGY = {
701
- /** Always prefer local version */
702
- LOCAL: "local",
703
- /** Always prefer remote version */
704
- REMOTE: "remote",
705
- /** Prefer newer version (Last-Writer-Wins) */
706
- NEWER: "newer",
707
- /** Ask user to resolve each conflict manually */
708
- ASK: "ask",
709
- /** Keep both versions (create conflict copy) */
710
- KEEP_BOTH: "keepBoth"
711
- };
712
- var QUEUE_OPERATION = {
713
- UPLOAD: "upload",
714
- DOWNLOAD: "download"
715
- };
716
- var QUEUE_STATUS = {
717
- PENDING: "pending",
718
- IN_PROGRESS: "inProgress",
719
- COMPLETED: "completed",
720
- FAILED: "failed"
721
- };
722
- var FileSyncAPI = class {
648
+ // src/api/filesystem.ts
649
+ var FilesystemAPI = class {
723
650
  constructor(client) {
724
651
  this.client = client;
725
652
  }
726
- // --------------------------------------------------------------------------
727
- // Spaces
728
- // --------------------------------------------------------------------------
729
- /**
730
- * List all file spaces
731
- */
732
- async listSpacesAsync() {
733
- return this.client.request(
734
- HAEXTENSION_METHODS.filesync.listSpaces
735
- );
736
- }
737
- /**
738
- * Create a new file space
739
- */
740
- async createSpaceAsync(options) {
741
- return this.client.request(
742
- HAEXTENSION_METHODS.filesync.createSpace,
743
- options
744
- );
745
- }
746
- /**
747
- * Delete a file space
748
- */
749
- async deleteSpaceAsync(spaceId) {
750
- await this.client.request(HAEXTENSION_METHODS.filesync.deleteSpace, {
751
- spaceId
752
- });
753
- }
754
- // --------------------------------------------------------------------------
755
- // Files
756
- // --------------------------------------------------------------------------
757
653
  /**
758
- * List files in a space
654
+ * Opens a save file dialog and saves the provided data to the selected location
655
+ * @param data The file data as Uint8Array
656
+ * @param options Options for the save dialog
657
+ * @returns The path where the file was saved, or null if cancelled
759
658
  */
760
- async listFilesAsync(options) {
761
- return this.client.request(
762
- HAEXTENSION_METHODS.filesync.listFiles,
763
- options
659
+ async saveFileAsync(data, options = {}) {
660
+ const result = await this.client.request(
661
+ HAEXTENSION_METHODS.filesystem.saveFile,
662
+ {
663
+ data: Array.from(data),
664
+ // Convert Uint8Array to regular array for postMessage
665
+ defaultPath: options.defaultPath,
666
+ title: options.title,
667
+ filters: options.filters
668
+ }
764
669
  );
670
+ return result;
765
671
  }
766
672
  /**
767
- * Scan local files in a sync rule folder
768
- * Returns unencrypted local files for display in the UI
673
+ * Opens a file with the system's default viewer
674
+ * @param data The file data as Uint8Array
675
+ * @param options Options for opening the file
676
+ * @returns The result of the operation
769
677
  */
770
- async scanLocalAsync(options) {
771
- return this.client.request(
772
- HAEXTENSION_METHODS.filesync.scanLocal,
773
- options
678
+ async openFileAsync(data, options) {
679
+ const result = await this.client.request(
680
+ HAEXTENSION_METHODS.filesystem.openFile,
681
+ {
682
+ data: Array.from(data),
683
+ // Convert Uint8Array to regular array for postMessage
684
+ fileName: options.fileName,
685
+ mimeType: options.mimeType
686
+ }
774
687
  );
688
+ return result;
775
689
  }
776
690
  /**
777
- * Get file info by ID
691
+ * Shows an image using a data URL (safe, read-only viewing)
692
+ * This is safe to use without special permissions as it only displays images
693
+ * and doesn't execute any code or open files with external applications
694
+ * @param options Options containing the data URL
695
+ * @returns The result of the operation
778
696
  */
779
- async getFileAsync(fileId) {
780
- return this.client.request(
781
- HAEXTENSION_METHODS.filesync.getFile,
782
- { fileId }
697
+ async showImageAsync(options) {
698
+ const result = await this.client.request(
699
+ HAEXTENSION_METHODS.filesystem.showImage,
700
+ {
701
+ dataUrl: options.dataUrl
702
+ }
783
703
  );
704
+ return result;
784
705
  }
706
+ // ==========================================================================
707
+ // Generic Filesystem Operations (Phase 2)
708
+ // ==========================================================================
785
709
  /**
786
- * Upload a file to the sync system
710
+ * Read file contents
711
+ * @param path Absolute path to the file
712
+ * @returns File contents as Uint8Array
787
713
  */
788
- async uploadFileAsync(options) {
789
- return this.client.request(
790
- HAEXTENSION_METHODS.filesync.uploadFile,
791
- options
714
+ async readFile(path) {
715
+ const base64 = await this.client.request(
716
+ HAEXTENSION_METHODS.filesystem.readFile,
717
+ { path }
792
718
  );
719
+ const binary = atob(base64);
720
+ const bytes = new Uint8Array(binary.length);
721
+ for (let i = 0; i < binary.length; i++) {
722
+ bytes[i] = binary.charCodeAt(i);
723
+ }
724
+ return bytes;
793
725
  }
794
726
  /**
795
- * Download a file to local storage
727
+ * Write file contents
728
+ * @param path Absolute path to the file
729
+ * @param data File contents as Uint8Array
796
730
  */
797
- async downloadFileAsync(options) {
731
+ async writeFile(path, data) {
732
+ const base64 = btoa(String.fromCharCode(...data));
798
733
  await this.client.request(
799
- HAEXTENSION_METHODS.filesync.downloadFile,
800
- options
801
- );
802
- }
803
- /**
804
- * Delete a file from the sync system
805
- */
806
- async deleteFileAsync(fileId) {
807
- await this.client.request(HAEXTENSION_METHODS.filesync.deleteFile, {
808
- fileId
809
- });
810
- }
811
- // --------------------------------------------------------------------------
812
- // Storage Backends
813
- // --------------------------------------------------------------------------
814
- /**
815
- * List configured storage backends
816
- */
817
- async listBackendsAsync() {
818
- return this.client.request(
819
- HAEXTENSION_METHODS.filesync.listBackends
820
- );
821
- }
822
- /**
823
- * Add a new storage backend
824
- */
825
- async addBackendAsync(options) {
826
- return this.client.request(
827
- HAEXTENSION_METHODS.filesync.addBackend,
828
- options
734
+ HAEXTENSION_METHODS.filesystem.writeFile,
735
+ { path, data: base64 }
829
736
  );
830
737
  }
831
738
  /**
832
- * Remove a storage backend
833
- */
834
- async removeBackendAsync(backendId) {
835
- await this.client.request(HAEXTENSION_METHODS.filesync.removeBackend, {
836
- backendId
837
- });
838
- }
839
- /**
840
- * Test backend connection
739
+ * Read directory contents
740
+ * @param path Absolute path to the directory
741
+ * @returns Array of directory entries
841
742
  */
842
- async testBackendAsync(backendId) {
743
+ async readDir(path) {
843
744
  return this.client.request(
844
- HAEXTENSION_METHODS.filesync.testBackend,
845
- { backendId }
745
+ HAEXTENSION_METHODS.filesystem.readDir,
746
+ { path }
846
747
  );
847
748
  }
848
- // --------------------------------------------------------------------------
849
- // Sync Rules
850
- // --------------------------------------------------------------------------
851
749
  /**
852
- * List sync rules
750
+ * Create a directory (and parent directories if needed)
751
+ * @param path Absolute path to create
853
752
  */
854
- async listSyncRulesAsync() {
855
- return this.client.request(
856
- HAEXTENSION_METHODS.filesync.listSyncRules
753
+ async mkdir(path) {
754
+ await this.client.request(
755
+ HAEXTENSION_METHODS.filesystem.mkdir,
756
+ { path }
857
757
  );
858
758
  }
859
759
  /**
860
- * Add a sync rule
760
+ * Remove a file or directory
761
+ * @param path Absolute path to remove
762
+ * @param recursive If true, remove directories recursively
861
763
  */
862
- async addSyncRuleAsync(options) {
863
- return this.client.request(
864
- HAEXTENSION_METHODS.filesync.addSyncRule,
865
- options
764
+ async remove(path, recursive = false) {
765
+ await this.client.request(
766
+ HAEXTENSION_METHODS.filesystem.remove,
767
+ { path, recursive }
866
768
  );
867
769
  }
868
770
  /**
869
- * Update a sync rule
771
+ * Check if a path exists
772
+ * @param path Absolute path to check
773
+ * @returns True if the path exists
870
774
  */
871
- async updateSyncRuleAsync(options) {
775
+ async exists(path) {
872
776
  return this.client.request(
873
- HAEXTENSION_METHODS.filesync.updateSyncRule,
874
- options
777
+ HAEXTENSION_METHODS.filesystem.exists,
778
+ { path }
875
779
  );
876
780
  }
877
781
  /**
878
- * Remove a sync rule
782
+ * Get file/directory metadata
783
+ * @param path Absolute path
784
+ * @returns File metadata
879
785
  */
880
- async removeSyncRuleAsync(ruleId) {
881
- await this.client.request(HAEXTENSION_METHODS.filesync.removeSyncRule, {
882
- ruleId
883
- });
884
- }
885
- // --------------------------------------------------------------------------
886
- // Sync Operations
887
- // --------------------------------------------------------------------------
888
- /**
889
- * Get current sync status
890
- */
891
- async getSyncStatusAsync() {
786
+ async stat(path) {
892
787
  return this.client.request(
893
- HAEXTENSION_METHODS.filesync.getSyncStatus
788
+ HAEXTENSION_METHODS.filesystem.stat,
789
+ { path }
894
790
  );
895
791
  }
896
- /**
897
- * Trigger a manual sync
898
- */
899
- async triggerSyncAsync() {
900
- await this.client.request(HAEXTENSION_METHODS.filesync.triggerSync);
901
- }
902
- /**
903
- * Pause syncing
904
- */
905
- async pauseSyncAsync() {
906
- await this.client.request(HAEXTENSION_METHODS.filesync.pauseSync);
907
- }
908
- /**
909
- * Resume syncing
910
- */
911
- async resumeSyncAsync() {
912
- await this.client.request(HAEXTENSION_METHODS.filesync.resumeSync);
913
- }
914
- // --------------------------------------------------------------------------
915
- // Conflict Resolution
916
- // --------------------------------------------------------------------------
917
- /**
918
- * Resolve a file conflict
919
- */
920
- async resolveConflictAsync(fileId, resolution) {
921
- await this.client.request(HAEXTENSION_METHODS.filesync.resolveConflict, {
922
- fileId,
923
- resolution
924
- });
925
- }
926
- // --------------------------------------------------------------------------
927
- // Folder Selection (Native Dialog)
928
- // --------------------------------------------------------------------------
929
792
  /**
930
793
  * Open a folder selection dialog
794
+ * @param options Dialog options
795
+ * @returns Selected folder path, or null if cancelled
931
796
  */
932
- async selectFolderAsync() {
933
- return this.client.request(
934
- HAEXTENSION_METHODS.filesync.selectFolder
935
- );
936
- }
937
- // --------------------------------------------------------------------------
938
- // Sync Queue
939
- // --------------------------------------------------------------------------
940
- /**
941
- * Add files to the sync queue
942
- */
943
- async addToQueueAsync(options) {
797
+ async selectFolder(options = {}) {
944
798
  return this.client.request(
945
- HAEXTENSION_METHODS.filesync.addToQueue,
799
+ HAEXTENSION_METHODS.filesystem.selectFolder,
946
800
  options
947
801
  );
948
802
  }
949
803
  /**
950
- * Get queue entries for the current device
804
+ * Open a file selection dialog
805
+ * @param options Dialog options
806
+ * @returns Selected file paths, or null if cancelled
951
807
  */
952
- async getQueueAsync(options) {
808
+ async selectFile(options = {}) {
953
809
  return this.client.request(
954
- HAEXTENSION_METHODS.filesync.getQueue,
810
+ HAEXTENSION_METHODS.filesystem.selectFile,
955
811
  options
956
812
  );
957
813
  }
958
814
  /**
959
- * Get aggregated queue summary for the current device
960
- */
961
- async getQueueSummaryAsync() {
962
- return this.client.request(
963
- HAEXTENSION_METHODS.filesync.getQueueSummary
964
- );
965
- }
966
- /**
967
- * Mark a queue entry as started (in_progress)
968
- */
969
- async startQueueEntryAsync(entryId) {
970
- await this.client.request(HAEXTENSION_METHODS.filesync.startQueueEntry, {
971
- entryId
972
- });
973
- }
974
- /**
975
- * Mark a queue entry as completed
976
- */
977
- async completeQueueEntryAsync(entryId) {
978
- await this.client.request(HAEXTENSION_METHODS.filesync.completeQueueEntry, {
979
- entryId
980
- });
981
- }
982
- /**
983
- * Mark a queue entry as failed
984
- */
985
- async failQueueEntryAsync(entryId, errorMessage) {
986
- await this.client.request(HAEXTENSION_METHODS.filesync.failQueueEntry, {
987
- entryId,
988
- errorMessage
989
- });
990
- }
991
- /**
992
- * Retry all failed queue entries (reset to pending)
993
- */
994
- async retryFailedQueueAsync() {
995
- await this.client.request(HAEXTENSION_METHODS.filesync.retryFailedQueue);
996
- }
997
- /**
998
- * Remove a queue entry
999
- */
1000
- async removeQueueEntryAsync(entryId) {
1001
- await this.client.request(HAEXTENSION_METHODS.filesync.removeQueueEntry, {
1002
- entryId
1003
- });
1004
- }
1005
- /**
1006
- * Clear all queue entries for a sync rule
1007
- */
1008
- async clearQueueAsync(ruleId) {
1009
- await this.client.request(HAEXTENSION_METHODS.filesync.clearQueue, {
1010
- ruleId
1011
- });
1012
- }
1013
- /**
1014
- * Reset in_progress entries to pending (for recovery after crash)
815
+ * Rename/move a file or directory
816
+ * @param from Source path
817
+ * @param to Destination path
1015
818
  */
1016
- async recoverQueueAsync() {
1017
- await this.client.request(HAEXTENSION_METHODS.filesync.recoverQueue);
1018
- }
1019
- };
1020
-
1021
- // src/api/filesystem.ts
1022
- var FilesystemAPI = class {
1023
- constructor(client) {
1024
- this.client = client;
1025
- this.sync = new FileSyncAPI(client);
1026
- }
1027
- /**
1028
- * Opens a save file dialog and saves the provided data to the selected location
1029
- * @param data The file data as Uint8Array
1030
- * @param options Options for the save dialog
1031
- * @returns The path where the file was saved, or null if cancelled
1032
- */
1033
- async saveFileAsync(data, options = {}) {
1034
- const result = await this.client.request(
1035
- HAEXTENSION_METHODS.filesystem.saveFile,
1036
- {
1037
- data: Array.from(data),
1038
- // Convert Uint8Array to regular array for postMessage
1039
- defaultPath: options.defaultPath,
1040
- title: options.title,
1041
- filters: options.filters
1042
- }
1043
- );
1044
- return result;
1045
- }
1046
- /**
1047
- * Opens a file with the system's default viewer
1048
- * @param data The file data as Uint8Array
1049
- * @param options Options for opening the file
1050
- * @returns The result of the operation
1051
- */
1052
- async openFileAsync(data, options) {
1053
- const result = await this.client.request(
1054
- HAEXTENSION_METHODS.filesystem.openFile,
1055
- {
1056
- data: Array.from(data),
1057
- // Convert Uint8Array to regular array for postMessage
1058
- fileName: options.fileName,
1059
- mimeType: options.mimeType
1060
- }
819
+ async rename(from, to) {
820
+ await this.client.request(
821
+ HAEXTENSION_METHODS.filesystem.rename,
822
+ { from, to }
1061
823
  );
1062
- return result;
1063
824
  }
1064
825
  /**
1065
- * Shows an image using a data URL (safe, read-only viewing)
1066
- * This is safe to use without special permissions as it only displays images
1067
- * and doesn't execute any code or open files with external applications
1068
- * @param options Options containing the data URL
1069
- * @returns The result of the operation
826
+ * Copy a file
827
+ * @param from Source path
828
+ * @param to Destination path
1070
829
  */
1071
- async showImageAsync(options) {
1072
- const result = await this.client.request(
1073
- HAEXTENSION_METHODS.filesystem.showImage,
1074
- {
1075
- dataUrl: options.dataUrl
1076
- }
830
+ async copy(from, to) {
831
+ await this.client.request(
832
+ HAEXTENSION_METHODS.filesystem.copy,
833
+ { from, to }
1077
834
  );
1078
- return result;
1079
835
  }
1080
836
  };
1081
837
 
@@ -1571,7 +1327,20 @@ var TAURI_COMMANDS = {
1571
1327
  filesystem: {
1572
1328
  saveFile: "webview_extension_fs_save_file",
1573
1329
  openFile: "webview_extension_fs_open_file",
1574
- showImage: "webview_extension_fs_show_image"
1330
+ showImage: "webview_extension_fs_show_image",
1331
+ // Generic filesystem operations (no webview_ prefix because they're global)
1332
+ // Permission checks happen in the message handler layer
1333
+ readFile: "filesystem_read_file",
1334
+ writeFile: "filesystem_write_file",
1335
+ readDir: "filesystem_read_dir",
1336
+ mkdir: "filesystem_mkdir",
1337
+ remove: "filesystem_remove",
1338
+ exists: "filesystem_exists",
1339
+ stat: "filesystem_stat",
1340
+ selectFolder: "filesystem_select_folder",
1341
+ selectFile: "filesystem_select_file",
1342
+ rename: "filesystem_rename",
1343
+ copy: "filesystem_copy"
1575
1344
  },
1576
1345
  external: {
1577
1346
  // Response handling (called by extensions running in WebView)
@@ -2859,15 +2628,12 @@ function createHaexVaultSdk(config = {}) {
2859
2628
  return new HaexVaultSdk(config);
2860
2629
  }
2861
2630
 
2862
- exports.CONFLICT_STRATEGY = CONFLICT_STRATEGY;
2863
2631
  exports.DEFAULT_TIMEOUT = DEFAULT_TIMEOUT;
2864
2632
  exports.DatabaseAPI = DatabaseAPI;
2865
2633
  exports.EXTERNAL_EVENTS = EXTERNAL_EVENTS;
2866
2634
  exports.ErrorCode = ErrorCode;
2867
2635
  exports.ExternalConnectionErrorCode = ExternalConnectionErrorCode;
2868
2636
  exports.ExternalConnectionState = ExternalConnectionState;
2869
- exports.FILE_SYNC_STATE = FILE_SYNC_STATE;
2870
- exports.FileSyncAPI = FileSyncAPI;
2871
2637
  exports.FilesystemAPI = FilesystemAPI;
2872
2638
  exports.HAEXSPACE_MESSAGE_TYPES = HAEXSPACE_MESSAGE_TYPES;
2873
2639
  exports.HAEXTENSION_EVENTS = HAEXTENSION_EVENTS;
@@ -2876,11 +2642,7 @@ exports.HaexVaultSdk = HaexVaultSdk;
2876
2642
  exports.HaexVaultSdkError = HaexVaultSdkError;
2877
2643
  exports.PermissionStatus = PermissionStatus;
2878
2644
  exports.PermissionsAPI = PermissionsAPI;
2879
- exports.QUEUE_OPERATION = QUEUE_OPERATION;
2880
- exports.QUEUE_STATUS = QUEUE_STATUS;
2881
2645
  exports.RemoteStorageAPI = RemoteStorageAPI;
2882
- exports.STORAGE_BACKEND_TYPE = STORAGE_BACKEND_TYPE;
2883
- exports.SYNC_DIRECTION = SYNC_DIRECTION;
2884
2646
  exports.TABLE_SEPARATOR = TABLE_SEPARATOR;
2885
2647
  exports.TAURI_COMMANDS = TAURI_COMMANDS;
2886
2648
  exports.WebAPI = WebAPI;