@agentunion/fastaun 0.5.0 → 0.5.2

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 (114) hide show
  1. package/CHANGELOG.md +561 -472
  2. package/_packed_docs/CHANGELOG-validators.md +147 -0
  3. package/_packed_docs/CHANGELOG.md +561 -472
  4. package/_packed_docs/INDEX.md +201 -177
  5. package/_packed_docs/KITE_DOCS_GUIDE.md +38 -32
  6. package/_packed_docs/agent.md//350/277/234/347/250/213agent.md/347/274/223/345/255/230/344/270/216etag/351/200/217/344/274/240/346/226/271/346/241/210.md +169 -116
  7. package/_packed_docs/aun-perf-audit-critical-bugs.md +315 -0
  8. package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +263 -260
  9. package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +331 -0
  10. package/_packed_docs/protocol/00-/346/200/273/350/247/210/344/270/216/345/210/206/345/261/202.md +2 -2
  11. package/_packed_docs/protocol/00A-/350/256/276/350/256/241/345/216/237/345/210/231-/344/270/272Agent/350/200/214/347/224/237.md +1 -1
  12. package/_packed_docs/protocol/01-/350/272/253/344/273/275/344/270/216/345/207/255/350/257/201/345/215/217/350/256/256-auth.md +39 -16
  13. package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +8 -5
  14. package/_packed_docs/protocol/06-/346/234/215/345/212/241/345/215/217/350/256/256.md +18 -19
  15. package/_packed_docs/protocol/07-/351/224/231/350/257/257/347/240/201/344/270/216/347/212/266/346/200/201/346/234/272.md +1 -1
  16. package/_packed_docs/protocol/08-AUN-E2EE-Group.md +139 -746
  17. package/_packed_docs/protocol/08-AUN-E2EE.md +12 -10
  18. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +117 -171
  19. package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +6 -0
  20. package/_packed_docs/protocol/15-/347/246/273/347/272/277/346/216/250/351/200/201/351/200/232/347/237/245/345/215/217/350/256/256.md +1 -1
  21. package/_packed_docs/protocol/16-/347/263/273/347/273/237/347/233/256/345/275/225/344/277/235/346/212/244/346/226/271/346/241/210.md +177 -0
  22. package/_packed_docs/protocol/README.md +5 -4
  23. package/_packed_docs/protocol/aun-docs-guide.md +2 -2
  24. package/_packed_docs/protocol/index.md +12 -7
  25. package/_packed_docs/protocol//350/215/211/346/241/210-/346/213/222/347/273/235/344/277/241/345/217/267/345/215/217/350/256/256.md +1 -1
  26. package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +13 -13
  27. package/_packed_docs/protocol//351/231/204/345/275/225L-E2EE/345/256/236/347/216/260/346/214/207/345/215/227.md +9 -9
  28. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +15 -13
  29. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +26 -18
  30. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +35 -284
  31. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +473 -442
  32. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +11 -7
  33. package/_packed_docs/sdk/09-collab-rpc-manual.md +581 -550
  34. package/_packed_docs/sdk/09-group-rpc-manual.md +367 -433
  35. package/_packed_docs/sdk/09-message-rpc-manual.md +50 -28
  36. package/_packed_docs/sdk/09-payload-reference.md +3 -3
  37. package/_packed_docs/sdk/09-storage-rpc-manual.md +57 -20
  38. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +18 -17
  39. package/_packed_docs/sdk/E2EE_V2/346/266/210/346/201/257/351/200/232/344/277/241/346/227/266/345/272/217/345/233/276.md +3 -2
  40. package/_packed_docs/sdk/INDEX.md +25 -24
  41. package/_packed_docs/sdk/Notify/351/200/232/347/237/245/346/226/271/346/241/210.md +6 -2
  42. package/dist/agent-md.js +18 -9
  43. package/dist/agent-md.js.map +1 -1
  44. package/dist/client/delivery.d.ts +9 -0
  45. package/dist/client/delivery.js +157 -24
  46. package/dist/client/delivery.js.map +1 -1
  47. package/dist/client/group-state.js +33 -11
  48. package/dist/client/group-state.js.map +1 -1
  49. package/dist/client/rpc-pipeline.d.ts +1 -0
  50. package/dist/client/rpc-pipeline.js +127 -40
  51. package/dist/client/rpc-pipeline.js.map +1 -1
  52. package/dist/client/v2-e2ee.d.ts +6 -1
  53. package/dist/client/v2-e2ee.js +284 -140
  54. package/dist/client/v2-e2ee.js.map +1 -1
  55. package/dist/client.d.ts +8 -1
  56. package/dist/client.js +227 -31
  57. package/dist/client.js.map +1 -1
  58. package/dist/collab/client.d.ts +8 -0
  59. package/dist/collab/client.js +12 -0
  60. package/dist/collab/client.js.map +1 -1
  61. package/dist/errors.d.ts +0 -20
  62. package/dist/errors.js +8 -53
  63. package/dist/errors.js.map +1 -1
  64. package/dist/facades.d.ts +9 -4
  65. package/dist/facades.js +137 -15
  66. package/dist/facades.js.map +1 -1
  67. package/dist/group-fs.d.ts +26 -9
  68. package/dist/group-fs.js +84 -84
  69. package/dist/group-fs.js.map +1 -1
  70. package/dist/group-id.d.ts +9 -12
  71. package/dist/group-id.js +41 -63
  72. package/dist/group-id.js.map +1 -1
  73. package/dist/index.d.ts +4 -2
  74. package/dist/index.js +4 -1
  75. package/dist/index.js.map +1 -1
  76. package/dist/keystore/aid-db.d.ts +1 -0
  77. package/dist/keystore/aid-db.js +37 -37
  78. package/dist/keystore/aid-db.js.map +1 -1
  79. package/dist/keystore/local-identity-store.d.ts +16 -0
  80. package/dist/keystore/local-identity-store.js +190 -18
  81. package/dist/keystore/local-identity-store.js.map +1 -1
  82. package/dist/keystore/local-token-store.d.ts +0 -13
  83. package/dist/keystore/local-token-store.js +0 -105
  84. package/dist/keystore/local-token-store.js.map +1 -1
  85. package/dist/logger.d.ts +2 -0
  86. package/dist/logger.js +4 -0
  87. package/dist/logger.js.map +1 -1
  88. package/dist/storage/lowlevel.d.ts +9 -1
  89. package/dist/storage/lowlevel.js +12 -1
  90. package/dist/storage/lowlevel.js.map +1 -1
  91. package/dist/storage/types.d.ts +0 -1
  92. package/dist/storage/types.js.map +1 -1
  93. package/dist/storage/vfs.d.ts +22 -3
  94. package/dist/storage/vfs.js +89 -54
  95. package/dist/storage/vfs.js.map +1 -1
  96. package/dist/tools/cross-sdk-agent.js +336 -49
  97. package/dist/tools/cross-sdk-agent.js.map +1 -1
  98. package/dist/transport.d.ts +2 -0
  99. package/dist/transport.js +52 -3
  100. package/dist/transport.js.map +1 -1
  101. package/dist/types.d.ts +38 -0
  102. package/dist/v2/session/session.d.ts +2 -0
  103. package/dist/v2/session/session.js +53 -23
  104. package/dist/v2/session/session.js.map +1 -1
  105. package/dist/v2/state/commitment.d.ts +1 -1
  106. package/dist/v2/state/commitment.js +4 -2
  107. package/dist/v2/state/commitment.js.map +1 -1
  108. package/dist/validators.d.ts +32 -0
  109. package/dist/validators.js +128 -0
  110. package/dist/validators.js.map +1 -0
  111. package/dist/version.d.ts +1 -1
  112. package/dist/version.js +1 -1
  113. package/package.json +46 -46
  114. package/_packed_docs/collab-gateway-boundary-test-report.md +0 -164
@@ -54,6 +54,12 @@ function textOf(value) {
54
54
  function jsonObjectOf(value) {
55
55
  return value && typeof value === 'object' && !Array.isArray(value) ? value : null;
56
56
  }
57
+ function withoutKeys(source, keys) {
58
+ const next = { ...source };
59
+ for (const key of keys)
60
+ delete next[key];
61
+ return next;
62
+ }
57
63
  function accessTokenFromClient(client) {
58
64
  const internals = client;
59
65
  const direct = textOf(internals.accessToken ?? internals.access_token).trim();
@@ -579,10 +585,13 @@ class CrossSdkTsAgent {
579
585
  const traceId = textOf(body.trace_id || crypto.randomUUID().replace(/-/g, ''));
580
586
  const action = textOf(body.action).trim();
581
587
  const params = jsonObjectOf(body.params) ?? {};
588
+ const asGroupAid = textOf(body.as_group_aid || body.asGroupAid || params.as_group_aid || params.asGroupAid).trim();
589
+ delete params.as_group_aid;
590
+ delete params.asGroupAid;
582
591
  try {
583
- const result = await this.callGroupFsAction(action, params);
592
+ const result = await this.callGroupFsAction(action, params, asGroupAid);
584
593
  const response = { ok: true, trace_id: traceId, action, result: jsonSafe(result) };
585
- this.recordTrace(traceId, { stage: 'group_fs_call', action, result: response });
594
+ this.recordTrace(traceId, { stage: 'group_fs_call', action, as_group_aid: asGroupAid, result: response });
586
595
  sendJson(res, 200, response);
587
596
  }
588
597
  catch (err) {
@@ -593,7 +602,7 @@ class CrossSdkTsAgent {
593
602
  error_code: err instanceof Error ? err.name : 'Error',
594
603
  error_message: err instanceof Error ? err.message : String(err),
595
604
  };
596
- this.recordTrace(traceId, { stage: 'group_fs_call_error', action, error });
605
+ this.recordTrace(traceId, { stage: 'group_fs_call_error', action, as_group_aid: asGroupAid, error });
597
606
  sendJson(res, 500, error);
598
607
  }
599
608
  }
@@ -691,6 +700,14 @@ class CrossSdkTsAgent {
691
700
  return await this.client.collab.lsRemote(textOf(params.group_aid ?? params.groupAid));
692
701
  case 'unregister':
693
702
  return await this.client.collab.unregister(textOf(params.group_aid ?? params.groupAid), collabRoot);
703
+ case 'set_acl':
704
+ return await this.client.collab.setAcl(collabRoot, textOf(params.grantee_aid ?? params.granteeAID), {
705
+ perms: textOf(params.perms || 'w'),
706
+ expires_at: params.expires_at == null && params.expiresAt == null ? undefined : Number(params.expires_at ?? params.expiresAt),
707
+ max_uses: params.max_uses == null && params.maxUses == null ? undefined : Number(params.max_uses ?? params.maxUses),
708
+ });
709
+ case 'remove_acl':
710
+ return await this.client.collab.removeAcl(collabRoot, textOf(params.grantee_aid ?? params.granteeAID));
694
711
  case 'snapshot.create':
695
712
  case 'tag.create':
696
713
  return await this.client.collab.tag.create(collabRoot, {
@@ -722,56 +739,110 @@ class CrossSdkTsAgent {
722
739
  throw new Error(`unsupported collab action: ${action}`);
723
740
  }
724
741
  }
725
- async callGroupFsAction(action, params) {
742
+ async callGroupFsAction(action, params, asGroupAid = '') {
726
743
  const groupFs = this.client.group.fs;
744
+ let signingStore = null;
745
+ const withSigning = (source) => {
746
+ const next = { ...source };
747
+ if (asGroupAid) {
748
+ signingStore ??= this.aidStore();
749
+ next.signAs = asGroupAid;
750
+ next.aidStore = signingStore;
751
+ }
752
+ return next;
753
+ };
754
+ const rawCall = async (method, source) => {
755
+ const payload = { ...source };
756
+ if (asGroupAid) {
757
+ signingStore ??= this.aidStore();
758
+ const loaded = await signingStore.load(asGroupAid);
759
+ if (!loaded.ok || !loaded.data?.aid) {
760
+ throw new Error(loaded.error?.message || `signer identity not found: ${asGroupAid}`);
761
+ }
762
+ payload._client_signature_identity = loaded.data.aid;
763
+ }
764
+ return await this.client.call(method, payload);
765
+ };
727
766
  const path = textOf(params.path).trim();
728
- const options = { ...params };
767
+ const options = withSigning(params);
729
768
  delete options.path;
730
- switch (action) {
731
- case 'ls':
732
- return await groupFs.ls(path, options);
733
- case 'find':
734
- return await groupFs.find(path, options);
735
- case 'stat':
736
- return await groupFs.stat(path, options);
737
- case 'lstat':
738
- return await groupFs.lstat(path, options);
739
- case 'mkdir':
740
- return await groupFs.mkdir(path, { ...options, parents: Boolean(params.parents) });
741
- case 'rm':
742
- return await groupFs.rm(path, {
743
- ...options,
744
- recursive: Boolean(params.recursive),
745
- force: Boolean(params.force),
746
- });
747
- case 'cp': {
748
- let src = textOf(params.src);
749
- const dst = textOf(params.dst);
750
- const cpOptions = { ...params };
751
- delete cpOptions.src;
752
- delete cpOptions.dst;
753
- delete cpOptions.src_text;
754
- if (params.src_text != null) {
755
- src = this.writeTempText(textOf(params.src_text), '.txt');
769
+ try {
770
+ switch (action) {
771
+ case 'ls':
772
+ return await groupFs.ls(path, options);
773
+ case 'find':
774
+ return await groupFs.find(path, options);
775
+ case 'stat':
776
+ return await groupFs.stat(path, options);
777
+ case 'lstat':
778
+ return await groupFs.lstat(path, options);
779
+ case 'mkdir':
780
+ return await groupFs.mkdir(path, { ...options, parents: Boolean(params.parents) });
781
+ case 'set_acl':
782
+ return await groupFs.setAcl(path, {
783
+ ...options,
784
+ grantee_aid: textOf(params.grantee_aid ?? params.granteeAid).trim() || 'role:admin',
785
+ perms: textOf(params.perms).trim() || 'rwx',
786
+ });
787
+ case 'remove_acl':
788
+ return await groupFs.removeAcl(path, {
789
+ ...options,
790
+ grantee_aid: textOf(params.grantee_aid ?? params.granteeAid).trim() || 'role:admin',
791
+ });
792
+ case 'get_acl':
793
+ return await groupFs.getAcl(path, options);
794
+ case 'list_acl':
795
+ return await groupFs.listAcl(path, options);
796
+ case 'rm':
797
+ return await groupFs.rm(path, {
798
+ ...options,
799
+ recursive: Boolean(params.recursive),
800
+ force: Boolean(params.force),
801
+ });
802
+ case 'cp': {
803
+ let src = textOf(params.src);
804
+ const dst = textOf(params.dst);
805
+ const cpOptions = withSigning(params);
806
+ delete cpOptions.src;
807
+ delete cpOptions.dst;
808
+ delete cpOptions.src_text;
809
+ if (params.src_text != null) {
810
+ src = this.writeTempText(textOf(params.src_text), '.txt');
811
+ }
812
+ const result = await groupFs.cp(src, dst, cpOptions);
813
+ return this.groupFsCpResponse(result, dst);
756
814
  }
757
- const result = await groupFs.cp(src, dst, cpOptions);
758
- return this.groupFsCpResponse(result, dst);
815
+ case 'mv':
816
+ {
817
+ const mvOptions = withSigning(params);
818
+ delete mvOptions.src;
819
+ delete mvOptions.dst;
820
+ return await groupFs.mv(textOf(params.src), textOf(params.dst), mvOptions);
821
+ }
822
+ case 'df':
823
+ return await groupFs.df(path || textOf(params.group_id), options);
824
+ case 'mount':
825
+ return await groupFs.mount(path, options);
826
+ case 'umount':
827
+ return await groupFs.umount(path, options);
828
+ case 'raw':
829
+ return await rawCall(textOf(params.method), withoutKeys(params, ['method']));
830
+ case 'check_upload':
831
+ return await rawCall('group.fs.check_upload', params);
832
+ case 'create_upload_session':
833
+ return await rawCall('group.fs.create_upload_session', params);
834
+ case 'complete_upload':
835
+ return await rawCall('group.fs.complete_upload', params);
836
+ case 'create_download_ticket':
837
+ return await rawCall('group.fs.create_download_ticket', params);
838
+ default:
839
+ throw new Error(`unsupported group fs action: ${action}`);
759
840
  }
760
- case 'mv':
761
- {
762
- const mvOptions = { ...params };
763
- delete mvOptions.src;
764
- delete mvOptions.dst;
765
- return await groupFs.mv(textOf(params.src), textOf(params.dst), mvOptions);
766
- }
767
- case 'df':
768
- return await groupFs.df(path || textOf(params.group_id), options);
769
- case 'mount':
770
- return await groupFs.mount(path, options);
771
- case 'umount':
772
- return await groupFs.umount(path, options);
773
- default:
774
- throw new Error(`unsupported group fs action: ${action}`);
841
+ }
842
+ finally {
843
+ const storeToClose = signingStore;
844
+ if (storeToClose)
845
+ storeToClose.close();
775
846
  }
776
847
  }
777
848
  writeTempText(content, suffix = '') {
@@ -814,6 +885,9 @@ class CrossSdkTsAgent {
814
885
  const owner = textOf(params.owner_aid ?? params.ownerAID).trim() || undefined;
815
886
  const bucket = textOf(params.bucket).trim() || 'default';
816
887
  const token = textOf(params.token).trim() || undefined;
888
+ const src = textOf(params.src).trim();
889
+ const dst = textOf(params.dst).trim();
890
+ const objectKey = textOf(params.object_key ?? params.objectKey ?? path).replace(/^\/+/, '');
817
891
  switch (action) {
818
892
  case 'write_bytes':
819
893
  return await storage.writeBytes(path, params.content_base64 || params.contentBase64
@@ -834,7 +908,6 @@ class CrossSdkTsAgent {
834
908
  };
835
909
  }
836
910
  case 'create_download_ticket': {
837
- const objectKey = textOf(params.object_key ?? params.objectKey ?? path).replace(/^\/+/, '');
838
911
  return await storage.lowlevel.createDownloadTicket({ owner, bucket, objectKey, token });
839
912
  }
840
913
  case 'download_text': {
@@ -858,6 +931,220 @@ class CrossSdkTsAgent {
858
931
  bucket,
859
932
  granteeAid: textOf(params.grantee_aid ?? params.granteeAID).trim(),
860
933
  });
934
+ case 'list':
935
+ return await storage.list(path, {
936
+ owner,
937
+ bucket,
938
+ page: Number(params.page ?? 1) || 1,
939
+ size: Number(params.size ?? 100) || 100,
940
+ marker: textOf(params.marker).trim() || undefined,
941
+ long: Boolean(params.long),
942
+ recursive: Boolean(params.recursive),
943
+ token,
944
+ });
945
+ case 'find':
946
+ return await storage.find(path, {
947
+ owner,
948
+ bucket,
949
+ name: textOf(params.name).trim() || undefined,
950
+ nodeType: textOf(params.node_type ?? params.nodeType).trim() || undefined,
951
+ size: textOf(params.size_expr ?? params.sizeExpr).trim() || undefined,
952
+ mtime: textOf(params.mtime).trim() || undefined,
953
+ page: Number(params.page ?? 1) || 1,
954
+ pageSize: Number(params.page_size ?? params.pageSize ?? 1000) || 1000,
955
+ token,
956
+ });
957
+ case 'stat':
958
+ return await storage.stat(path, { owner, bucket, token });
959
+ case 'lstat':
960
+ return await storage.lstat(path, { owner, bucket, token });
961
+ case 'mkdir':
962
+ return await storage.mkdir(path, { owner, bucket, parents: Boolean(params.parents) });
963
+ case 'touch':
964
+ return await storage.touch(path, {
965
+ owner,
966
+ bucket,
967
+ parents: Boolean(params.parents),
968
+ noCreate: Boolean(params.no_create ?? params.noCreate),
969
+ mtime: params.mtime == null ? undefined : Number(params.mtime),
970
+ followSymlinks: Boolean(params.follow_symlinks ?? params.followSymlinks),
971
+ });
972
+ case 'remove':
973
+ return await storage.remove(path, { owner, bucket, recursive: Boolean(params.recursive) });
974
+ case 'rename':
975
+ return await storage.rename(src, dst, {
976
+ owner,
977
+ bucket,
978
+ overwrite: Boolean(params.overwrite),
979
+ expectedVersion: params.expected_version == null && params.expectedVersion == null ? undefined : Number(params.expected_version ?? params.expectedVersion),
980
+ });
981
+ case 'copy':
982
+ return await storage.copy(src, dst, {
983
+ owner,
984
+ bucket,
985
+ dstOwner: textOf(params.dst_owner_aid ?? params.dstOwnerAID ?? params.dstOwner).trim() || undefined,
986
+ dstBucket: textOf(params.dst_bucket ?? params.dstBucket).trim() || undefined,
987
+ overwrite: Boolean(params.overwrite),
988
+ followSymlinks: Boolean(params.follow_symlinks ?? params.followSymlinks),
989
+ recursive: Boolean(params.recursive),
990
+ });
991
+ case 'df':
992
+ return await storage.df({ owner, bucket });
993
+ case 'du':
994
+ return await storage.du(path, {
995
+ owner,
996
+ bucket,
997
+ maxDepth: params.max_depth == null && params.maxDepth == null ? undefined : Number(params.max_depth ?? params.maxDepth),
998
+ pageSize: Number(params.page_size ?? params.pageSize ?? 1000) || 1000,
999
+ token,
1000
+ });
1001
+ case 'symlink':
1002
+ return await storage.symlink(textOf(params.target), path, { owner, bucket, overwrite: Boolean(params.overwrite) });
1003
+ case 'readlink':
1004
+ return await storage.readlink(path, { owner, bucket });
1005
+ case 'repoint':
1006
+ return await storage.repoint(path, textOf(params.new_target ?? params.newTarget), {
1007
+ owner,
1008
+ bucket,
1009
+ expectedVersion: params.expected_version == null && params.expectedVersion == null ? undefined : Number(params.expected_version ?? params.expectedVersion),
1010
+ });
1011
+ case 'rename_symlink':
1012
+ return await storage.renameSymlink(src, dst, {
1013
+ owner,
1014
+ bucket,
1015
+ overwrite: Boolean(params.overwrite),
1016
+ expectedVersion: params.expected_version == null && params.expectedVersion == null ? undefined : Number(params.expected_version ?? params.expectedVersion),
1017
+ });
1018
+ case 'delete_symlink':
1019
+ return await storage.lowlevel.deleteSymlink({ owner, bucket, path: objectKey });
1020
+ case 'list_acl':
1021
+ return await storage.listAcl(path, { owner, bucket });
1022
+ case 'check_access':
1023
+ return await storage.checkAccess(path, {
1024
+ owner,
1025
+ bucket,
1026
+ operation: textOf(params.operation).trim() || 'read',
1027
+ token,
1028
+ followSymlinks: params.follow_symlinks == null && params.followSymlinks == null ? true : Boolean(params.follow_symlinks ?? params.followSymlinks),
1029
+ });
1030
+ case 'issue_token':
1031
+ return await storage.issueToken(path, {
1032
+ owner,
1033
+ bucket,
1034
+ expiresAt: params.expires_at == null && params.expiresAt == null ? undefined : Number(params.expires_at ?? params.expiresAt),
1035
+ maxReads: params.max_reads == null && params.maxReads == null ? undefined : Number(params.max_reads ?? params.maxReads),
1036
+ });
1037
+ case 'revoke_token':
1038
+ return await storage.revokeToken(path, { owner, bucket, token: textOf(params.token) });
1039
+ case 'list_tokens':
1040
+ return await storage.listTokens(path, { owner, bucket });
1041
+ case 'set_visibility': {
1042
+ const allowRoles = Array.isArray(params.allow_roles) ? params.allow_roles.map((item) => textOf(item)) : (Array.isArray(params.allowRoles) ? params.allowRoles.map((item) => textOf(item)) : undefined);
1043
+ return await storage.setVisibility(path, { owner, bucket, visibility: textOf(params.visibility).trim() || 'private', allowRoles });
1044
+ }
1045
+ case 'create_share_link': {
1046
+ const allowedAids = Array.isArray(params.allowed_aids) ? params.allowed_aids.map((item) => textOf(item)) : (Array.isArray(params.allowedAids) ? params.allowedAids.map((item) => textOf(item)) : undefined);
1047
+ return await storage.lowlevel.createShareLink({
1048
+ owner,
1049
+ bucket,
1050
+ objectKey,
1051
+ allowedAids,
1052
+ expireInSeconds: params.expire_in_seconds == null && params.expireInSeconds == null ? undefined : Number(params.expire_in_seconds ?? params.expireInSeconds),
1053
+ maxUses: params.max_uses == null && params.maxUses == null ? undefined : Number(params.max_uses ?? params.maxUses),
1054
+ });
1055
+ }
1056
+ case 'list_share_links':
1057
+ return await storage.lowlevel.listShareLinks({ owner, bucket, objectKey: objectKey || undefined });
1058
+ case 'revoke_share_link':
1059
+ return await storage.lowlevel.revokeShareLink({ shareId: textOf(params.share_id ?? params.shareId).trim() });
1060
+ case 'get_by_share': {
1061
+ const result = await storage.lowlevel.getByShare({ shareId: textOf(params.share_id ?? params.shareId).trim() });
1062
+ const resultObj = jsonObjectOf(result);
1063
+ const content = textOf(resultObj?.content);
1064
+ if (content) {
1065
+ try {
1066
+ const buffer = Buffer.from(content, 'base64');
1067
+ return { ...(resultObj ?? {}), content_text: buffer.toString('utf-8'), content_base64: buffer.toString('base64') };
1068
+ }
1069
+ catch {
1070
+ return result;
1071
+ }
1072
+ }
1073
+ return result;
1074
+ }
1075
+ case 'head_object':
1076
+ return await storage.lowlevel.headObject({ owner, bucket, objectKey, token });
1077
+ case 'list_objects':
1078
+ return await storage.lowlevel.listObjects({
1079
+ owner,
1080
+ bucket,
1081
+ prefix: textOf(params.prefix),
1082
+ page: Number(params.page ?? 1) || 1,
1083
+ size: Number(params.size ?? 100) || 100,
1084
+ marker: textOf(params.marker).trim() || undefined,
1085
+ });
1086
+ case 'list_prefixes':
1087
+ return await storage.lowlevel.listPrefixes({ owner, bucket, prefix: textOf(params.prefix), size: Number(params.size ?? 100) || 100 });
1088
+ case 'delete_object':
1089
+ return await storage.lowlevel.deleteObject({ owner, bucket, objectKey });
1090
+ case 'set_object_meta':
1091
+ return await storage.lowlevel.setObjectMeta({
1092
+ owner,
1093
+ bucket,
1094
+ objectKey,
1095
+ metadata: jsonObjectOf(params.metadata) ?? {},
1096
+ contentType: textOf(params.content_type ?? params.contentType).trim() || undefined,
1097
+ merge: params.merge == null ? true : Boolean(params.merge),
1098
+ expectedVersion: params.expected_version == null && params.expectedVersion == null ? undefined : Number(params.expected_version ?? params.expectedVersion),
1099
+ });
1100
+ case 'append_object':
1101
+ return await storage.lowlevel.appendObject({
1102
+ owner,
1103
+ bucket,
1104
+ objectKey,
1105
+ content: params.content_base64 || params.contentBase64 ? Buffer.from(textOf(params.content), 'base64') : Buffer.from(textOf(params.content), 'utf-8'),
1106
+ contentType: textOf(params.content_type ?? params.contentType).trim() || undefined,
1107
+ metadata: jsonObjectOf(params.metadata) ?? undefined,
1108
+ expectedVersion: params.expected_version == null && params.expectedVersion == null ? undefined : Number(params.expected_version ?? params.expectedVersion),
1109
+ isPublic: Boolean(params.public ?? params.isPublic),
1110
+ });
1111
+ case 'create_folder':
1112
+ return await storage.lowlevel.createFolder({ owner, bucket, path: objectKey, parents: Boolean(params.parents ?? params.mkdirs) });
1113
+ case 'list_children':
1114
+ return await storage.lowlevel.listChildren({
1115
+ owner,
1116
+ bucket,
1117
+ path: objectKey,
1118
+ nodeType: textOf(params.node_type ?? params.nodeType ?? params.type).trim() || 'all',
1119
+ page: Number(params.page ?? 1) || 1,
1120
+ size: Number(params.size ?? 50) || 50,
1121
+ orderBy: textOf(params.order_by ?? params.orderBy).trim() || undefined,
1122
+ order: textOf(params.order).trim() || undefined,
1123
+ includeMetadata: params.include_metadata == null && params.includeMetadata == null ? undefined : Boolean(params.include_metadata ?? params.includeMetadata),
1124
+ includeUrls: params.include_urls == null && params.includeUrls == null ? undefined : Boolean(params.include_urls ?? params.includeUrls),
1125
+ });
1126
+ case 'copy_object':
1127
+ return await storage.lowlevel.copyObject({
1128
+ owner,
1129
+ bucket,
1130
+ srcPath: textOf(params.src_path ?? params.srcPath ?? src).replace(/^\/+/, ''),
1131
+ dstPath: textOf(params.dst_path ?? params.dstPath ?? dst).replace(/^\/+/, ''),
1132
+ overwrite: Boolean(params.overwrite),
1133
+ });
1134
+ case 'move_object':
1135
+ return await storage.lowlevel.moveObject({
1136
+ owner,
1137
+ bucket,
1138
+ path: textOf(params.src_path ?? params.srcPath ?? src ?? objectKey).replace(/^\/+/, ''),
1139
+ dstParentPath: textOf(params.dst_parent_path ?? params.dstParentPath).replace(/^\/+/, '').replace(/\/+$/g, ''),
1140
+ newName: textOf(params.new_name ?? params.newName),
1141
+ overwrite: Boolean(params.overwrite),
1142
+ expectedVersion: params.expected_version == null && params.expectedVersion == null ? undefined : Number(params.expected_version ?? params.expectedVersion),
1143
+ });
1144
+ case 'batch_delete': {
1145
+ const items = Array.isArray(params.items) ? params.items.filter((item) => item && typeof item === 'object' && !Array.isArray(item)) : [];
1146
+ return await storage.lowlevel.batchDelete({ owner, bucket, items, recursive: Boolean(params.recursive) });
1147
+ }
861
1148
  default:
862
1149
  throw new Error(`unsupported storage action: ${action}`);
863
1150
  }