@agentunion/fastaun-browser 0.4.13 → 0.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (223) hide show
  1. package/CHANGELOG.md +536 -386
  2. package/_packed_docs/CHANGELOG-validators.md +144 -0
  3. package/_packed_docs/CHANGELOG.md +536 -386
  4. package/_packed_docs/INDEX.md +159 -84
  5. package/_packed_docs/KITE_DOCS_GUIDE.md +48 -31
  6. package/_packed_docs/agent.md/SCHEMA.md +2 -0
  7. package/_packed_docs/agent.md/examples/codeagent-claudecode.md +2 -0
  8. package/_packed_docs/agent.md/examples/human-developer.md +2 -0
  9. package/_packed_docs/agent.md/examples/openclaw-lobster.md +2 -0
  10. package/_packed_docs/agent.md/examples/signed-openclaw-lobster.md +2 -0
  11. 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 +2 -0
  12. package/_packed_docs/cli/AUN-CLI/350/256/276/350/256/241/346/226/207/346/241/243.md +266 -686
  13. package/_packed_docs/cli/CLI/346/211/213/345/206/214.md +331 -0
  14. package/_packed_docs/design/2026-05-22-aun-rpc-trace-enhancement.md +2 -0
  15. package/_packed_docs/design/AUNClient/346/213/206/345/210/206/351/207/215/346/236/204/346/211/247/350/241/214/346/226/271/346/241/210.md +2 -0
  16. package/_packed_docs/design/E2EE_V2/347/256/200/345/214/226/344/270/2721DH/345/212/240Per-AID_Wrap/346/226/271/346/241/210.md +2 -0
  17. package/_packed_docs/design//350/267/250/350/257/255/350/250/200/345/256/271/345/231/250E2E/346/265/213/350/257/225/346/226/271/346/241/210.md +2 -0
  18. package/_packed_docs/protocol/00-/346/200/273/350/247/210/344/270/216/345/210/206/345/261/202.md +2 -0
  19. 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 +2 -0
  20. 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 +2 -0
  21. package/_packed_docs/protocol/02-/350/257/201/344/271/246/344/270/216/344/277/241/344/273/273/344/275/223/347/263/273.md +2 -0
  22. package/_packed_docs/protocol/03-Gateway-/350/277/236/346/216/245/346/250/241/345/274/217.md +2 -0
  23. package/_packed_docs/protocol/04-Peer-/345/255/220/345/215/217/350/256/256.md +2 -0
  24. package/_packed_docs/protocol/05-Relay-/345/255/220/345/215/217/350/256/256.md +2 -0
  25. 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 +2 -0
  26. package/_packed_docs/protocol/08-AUN-E2EE-Group.md +296 -900
  27. package/_packed_docs/protocol/08-AUN-E2EE.md +2 -0
  28. package/_packed_docs/protocol/09-/345/256/211/345/205/250/350/200/203/350/231/221.md +2 -0
  29. package/_packed_docs/protocol/10-Group-/345/255/220/345/215/217/350/256/256.md +66 -173
  30. package/_packed_docs/protocol/11-Storage-/345/255/220/345/215/217/350/256/256.md +55 -0
  31. package/_packed_docs/protocol/12-Stream-/345/255/220/345/215/217/350/256/256.md +2 -0
  32. package/_packed_docs/protocol/13-Agent/350/241/214/344/270/272/350/247/204/350/214/203.md +2 -0
  33. package/_packed_docs/protocol/14-/344/272/244/344/272/222/346/234/272/345/210/266-/345/223/215/345/272/224/346/250/241/345/274/217/344/270/216/350/207/252/344/270/273/346/250/241/345/274/217.md +2 -0
  34. 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 +2 -0
  35. 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
  36. package/_packed_docs/protocol/README.md +4 -1
  37. package/_packed_docs/protocol/agent.md/SCHEMA.md +2 -0
  38. package/_packed_docs/protocol/agent.md/examples/codeagent-claudecode.md +2 -0
  39. package/_packed_docs/protocol/agent.md/examples/human-developer.md +2 -0
  40. package/_packed_docs/protocol/agent.md/examples/openclaw-lobster.md +2 -0
  41. package/_packed_docs/protocol/aun-docs-guide.md +2 -0
  42. package/_packed_docs/protocol/index.md +10 -3
  43. package/_packed_docs/protocol//350/215/211/346/241/210-agent.md/347/255/276/345/220/215/345/215/217/350/256/256.md +2 -0
  44. 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 +2 -0
  45. package/_packed_docs/protocol//351/231/204/345/275/225A-/346/234/257/350/257/255/350/241/250.md +2 -0
  46. package/_packed_docs/protocol//351/231/204/345/275/225B-/346/211/251/345/261/225/346/200/247/346/214/207/345/215/227.md +2 -0
  47. package/_packed_docs/protocol//351/231/204/345/275/225C-/347/247/201/351/222/245/347/256/241/347/220/206/344/270/216/350/272/253/344/273/275/346/201/242/345/244/215.md +2 -0
  48. package/_packed_docs/protocol//351/231/204/345/275/225D-Root_CA_/346/262/273/347/220/206/346/234/272/345/210/266.md +2 -0
  49. package/_packed_docs/protocol//351/231/204/345/275/225E-Root_CA_/345/207/206/345/205/245/346/265/201/347/250/213.md +2 -0
  50. package/_packed_docs/protocol//351/231/204/345/275/225F-Issuer_CA_/347/224/263/350/257/267/346/265/201/347/250/213.md +2 -0
  51. package/_packed_docs/protocol//351/231/204/345/275/225G-AID_/345/255/244/345/204/277/351/242/204/351/230/262/344/270/216/346/225/221/346/217/264/346/234/272/345/210/266.md +2 -0
  52. package/_packed_docs/protocol//351/231/204/345/275/225H-Identity/346/234/215/345/212/241/345/256/236/347/216/260/346/214/207/345/215/227.md +2 -0
  53. package/_packed_docs/protocol//351/231/204/345/275/225I-/350/267/250/345/237/237/346/266/210/346/201/257/350/267/257/347/224/261/345/256/236/347/216/260/346/214/207/345/215/227.md +2 -0
  54. package/_packed_docs/protocol//351/231/204/345/275/225J-/345/256/242/346/210/267/347/253/257/346/216/245/345/205/245/347/244/272/344/276/213.md +2 -0
  55. package/_packed_docs/protocol//351/231/204/345/275/225K-Agent_Web/345/217/221/347/216/260/345/215/217/350/256/256.md +2 -0
  56. package/_packed_docs/protocol//351/231/204/345/275/225L-E2EE/345/256/236/347/216/260/346/214/207/345/215/227.md +2 -0
  57. package/_packed_docs/protocol//351/231/204/345/275/225M-JWT/350/256/244/350/257/201/345/256/236/347/216/260/346/214/207/345/215/227.md +2 -0
  58. package/_packed_docs/protocol//351/231/204/345/275/225N-/345/210/206/345/270/203/345/274/217Trace/345/215/217/350/256/256.md +2 -0
  59. package/_packed_docs/sdk/01-/345/277/253/351/200/237/345/274/200/345/247/213.md +2 -0
  60. package/_packed_docs/sdk/02-WebSocket/345/215/217/350/256/256.md +2 -0
  61. package/_packed_docs/sdk/03-/346/240/270/345/277/203/346/246/202/345/277/265.md +2 -0
  62. package/_packed_docs/sdk/04-/350/277/236/346/216/245/344/270/216/350/256/244/350/257/201.md +2 -0
  63. package/_packed_docs/sdk/05-E2EE/345/212/240/345/257/206/351/200/232/344/277/241.md +6 -252
  64. package/_packed_docs/sdk/06-API/346/211/213/345/206/214.md +219 -177
  65. package/_packed_docs/sdk/07-/351/224/231/350/257/257/345/244/204/347/220/206.md +4 -1
  66. package/_packed_docs/sdk/08-/346/234/200/344/275/263/345/256/236/350/267/265.md +2 -0
  67. package/_packed_docs/sdk/09-collab-rpc-manual.md +581 -0
  68. package/_packed_docs/sdk/09-custody-api-manual.md +2 -0
  69. package/_packed_docs/sdk/09-group-rpc-manual.md +301 -634
  70. package/_packed_docs/sdk/09-message-rpc-manual.md +2 -0
  71. package/_packed_docs/sdk/09-meta-rpc-manual.md +2 -0
  72. package/_packed_docs/sdk/09-payload-reference.md +2 -0
  73. package/_packed_docs/sdk/09-proxy-rpc-manual.md +2 -0
  74. package/_packed_docs/sdk/09-storage-rpc-manual.md +984 -274
  75. package/_packed_docs/sdk/09-stream-rpc-manual.md +2 -0
  76. package/_packed_docs/sdk/AUN_DOCS_GUIDE.md +36 -23
  77. 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 +2 -0
  78. package/_packed_docs/sdk/INDEX.md +47 -30
  79. package/_packed_docs/sdk/Notify/351/200/232/347/237/245/346/226/271/346/241/210.md +2 -0
  80. package/_packed_docs/sdk/README.md +17 -15
  81. package/dist/aid-store.d.ts +25 -0
  82. package/dist/aid-store.d.ts.map +1 -1
  83. package/dist/aid-store.js +89 -8
  84. package/dist/aid-store.js.map +1 -1
  85. package/dist/bundle.js +19615 -16870
  86. package/dist/client/delivery.d.ts +15 -2
  87. package/dist/client/delivery.d.ts.map +1 -1
  88. package/dist/client/delivery.js +303 -54
  89. package/dist/client/delivery.js.map +1 -1
  90. package/dist/client/group-state.d.ts.map +1 -1
  91. package/dist/client/group-state.js +36 -14
  92. package/dist/client/group-state.js.map +1 -1
  93. package/dist/client/lifecycle.js +2 -2
  94. package/dist/client/lifecycle.js.map +1 -1
  95. package/dist/client/rpc-pipeline.d.ts +2 -0
  96. package/dist/client/rpc-pipeline.d.ts.map +1 -1
  97. package/dist/client/rpc-pipeline.js +235 -82
  98. package/dist/client/rpc-pipeline.js.map +1 -1
  99. package/dist/client/v2-e2ee.d.ts +14 -1
  100. package/dist/client/v2-e2ee.d.ts.map +1 -1
  101. package/dist/client/v2-e2ee.js +300 -121
  102. package/dist/client/v2-e2ee.js.map +1 -1
  103. package/dist/client.d.ts +36 -4
  104. package/dist/client.d.ts.map +1 -1
  105. package/dist/client.js +460 -57
  106. package/dist/client.js.map +1 -1
  107. package/dist/collab/client.d.ts +47 -0
  108. package/dist/collab/client.d.ts.map +1 -0
  109. package/dist/collab/client.js +136 -0
  110. package/dist/collab/client.js.map +1 -0
  111. package/dist/collab/errors.d.ts +16 -0
  112. package/dist/collab/errors.d.ts.map +1 -0
  113. package/dist/collab/errors.js +60 -0
  114. package/dist/collab/errors.js.map +1 -0
  115. package/dist/collab/index.d.ts +4 -0
  116. package/dist/collab/index.d.ts.map +1 -0
  117. package/dist/collab/index.js +4 -0
  118. package/dist/collab/index.js.map +1 -0
  119. package/dist/collab/types.d.ts +111 -0
  120. package/dist/collab/types.d.ts.map +1 -0
  121. package/dist/collab/types.js +2 -0
  122. package/dist/collab/types.js.map +1 -0
  123. package/dist/crypto.d.ts +6 -0
  124. package/dist/crypto.d.ts.map +1 -1
  125. package/dist/crypto.js +6 -0
  126. package/dist/crypto.js.map +1 -1
  127. package/dist/errors.d.ts +0 -20
  128. package/dist/errors.d.ts.map +1 -1
  129. package/dist/errors.js +9 -37
  130. package/dist/errors.js.map +1 -1
  131. package/dist/facades.d.ts +94 -0
  132. package/dist/facades.d.ts.map +1 -0
  133. package/dist/facades.js +389 -0
  134. package/dist/facades.js.map +1 -0
  135. package/dist/group-fs.d.ts +120 -0
  136. package/dist/group-fs.d.ts.map +1 -0
  137. package/dist/group-fs.js +539 -0
  138. package/dist/group-fs.js.map +1 -0
  139. package/dist/group-id.d.ts +9 -12
  140. package/dist/group-id.d.ts.map +1 -1
  141. package/dist/group-id.js +41 -63
  142. package/dist/group-id.js.map +1 -1
  143. package/dist/group-resources.d.ts +98 -0
  144. package/dist/group-resources.d.ts.map +1 -0
  145. package/dist/group-resources.js +635 -0
  146. package/dist/group-resources.js.map +1 -0
  147. package/dist/index.d.ts +8 -3
  148. package/dist/index.d.ts.map +1 -1
  149. package/dist/index.js +10 -1
  150. package/dist/index.js.map +1 -1
  151. package/dist/keystore/index.d.ts +2 -54
  152. package/dist/keystore/index.d.ts.map +1 -1
  153. package/dist/keystore/indexeddb-identity-store.d.ts +3 -0
  154. package/dist/keystore/indexeddb-identity-store.d.ts.map +1 -1
  155. package/dist/keystore/indexeddb-identity-store.js +65 -0
  156. package/dist/keystore/indexeddb-identity-store.js.map +1 -1
  157. package/dist/keystore/indexeddb-shared.d.ts +3 -17
  158. package/dist/keystore/indexeddb-shared.d.ts.map +1 -1
  159. package/dist/keystore/indexeddb-shared.js +4 -47
  160. package/dist/keystore/indexeddb-shared.js.map +1 -1
  161. package/dist/keystore/indexeddb-token-store.d.ts +1 -64
  162. package/dist/keystore/indexeddb-token-store.d.ts.map +1 -1
  163. package/dist/keystore/indexeddb-token-store.js +45 -774
  164. package/dist/keystore/indexeddb-token-store.js.map +1 -1
  165. package/dist/logger.d.ts +2 -0
  166. package/dist/logger.d.ts.map +1 -1
  167. package/dist/logger.js +4 -0
  168. package/dist/logger.js.map +1 -1
  169. package/dist/register-flow.d.ts +1 -0
  170. package/dist/register-flow.d.ts.map +1 -1
  171. package/dist/register-flow.js +3 -0
  172. package/dist/register-flow.js.map +1 -1
  173. package/dist/service-proxy.d.ts +1 -0
  174. package/dist/service-proxy.d.ts.map +1 -1
  175. package/dist/service-proxy.js +15 -3
  176. package/dist/service-proxy.js.map +1 -1
  177. package/dist/storage/errors.d.ts +28 -0
  178. package/dist/storage/errors.d.ts.map +1 -0
  179. package/dist/storage/errors.js +65 -0
  180. package/dist/storage/errors.js.map +1 -0
  181. package/dist/storage/index.d.ts +2 -0
  182. package/dist/storage/index.d.ts.map +1 -0
  183. package/dist/storage/index.js +2 -0
  184. package/dist/storage/index.js.map +1 -0
  185. package/dist/storage/lowlevel.d.ts +322 -0
  186. package/dist/storage/lowlevel.d.ts.map +1 -0
  187. package/dist/storage/lowlevel.js +471 -0
  188. package/dist/storage/lowlevel.js.map +1 -0
  189. package/dist/storage/types.d.ts +59 -0
  190. package/dist/storage/types.d.ts.map +1 -0
  191. package/dist/storage/types.js +113 -0
  192. package/dist/storage/types.js.map +1 -0
  193. package/dist/storage/vfs.d.ts +166 -0
  194. package/dist/storage/vfs.d.ts.map +1 -0
  195. package/dist/storage/vfs.js +457 -0
  196. package/dist/storage/vfs.js.map +1 -0
  197. package/dist/tools/cross-sdk-agent.d.ts +3 -0
  198. package/dist/tools/cross-sdk-agent.d.ts.map +1 -0
  199. package/dist/tools/cross-sdk-agent.js +1376 -0
  200. package/dist/tools/cross-sdk-agent.js.map +1 -0
  201. package/dist/transport.d.ts +5 -0
  202. package/dist/transport.d.ts.map +1 -1
  203. package/dist/transport.js +125 -12
  204. package/dist/transport.js.map +1 -1
  205. package/dist/types.d.ts +39 -56
  206. package/dist/types.d.ts.map +1 -1
  207. package/dist/v2/session/session.d.ts +2 -0
  208. package/dist/v2/session/session.d.ts.map +1 -1
  209. package/dist/v2/session/session.js +58 -22
  210. package/dist/v2/session/session.js.map +1 -1
  211. package/dist/v2/state/commitment.d.ts +1 -1
  212. package/dist/v2/state/commitment.d.ts.map +1 -1
  213. package/dist/v2/state/commitment.js +5 -3
  214. package/dist/v2/state/commitment.js.map +1 -1
  215. package/dist/validators.d.ts +35 -0
  216. package/dist/validators.d.ts.map +1 -0
  217. package/dist/validators.js +127 -0
  218. package/dist/validators.js.map +1 -0
  219. package/dist/version.d.ts +1 -1
  220. package/dist/version.d.ts.map +1 -1
  221. package/dist/version.js +1 -1
  222. package/dist/version.js.map +1 -1
  223. package/package.json +44 -44
@@ -0,0 +1,120 @@
1
+ import { StorageLowLevel } from './storage/lowlevel.js';
2
+ import type { RpcParams } from './types.js';
3
+ export interface GroupFSRpcClient {
4
+ aid?: string | null;
5
+ call(method: string, params?: RpcParams): Promise<unknown>;
6
+ }
7
+ type GroupFSSigningAID = {
8
+ aid?: string;
9
+ privateKeyPem?: string;
10
+ certPem?: string;
11
+ };
12
+ type GroupFSAIDStoreResult = {
13
+ ok?: boolean;
14
+ data?: {
15
+ aid?: GroupFSSigningAID;
16
+ };
17
+ error?: {
18
+ message?: string;
19
+ };
20
+ };
21
+ type GroupFSAIDStore = {
22
+ load?: (aid: string) => GroupFSAIDStoreResult | Promise<GroupFSAIDStoreResult>;
23
+ loadAsync?: (aid: string) => Promise<GroupFSAIDStoreResult>;
24
+ };
25
+ export type GroupFSParams = Record<string, unknown>;
26
+ export type GroupFSBinarySource = Uint8Array | ArrayBuffer | ArrayBufferView | Blob;
27
+ export type GroupFSCpSource = string | GroupFSBinarySource;
28
+ export type GroupFSCpDestination = string | {
29
+ type?: 'blob' | 'bytes';
30
+ path?: string;
31
+ localPath?: string;
32
+ };
33
+ export interface GroupFSCpOptions extends GroupFSParams {
34
+ force?: boolean;
35
+ recursive?: boolean;
36
+ parents?: boolean;
37
+ followSymlinks?: boolean | null;
38
+ follow_symlinks?: boolean | null;
39
+ contentType?: string | null;
40
+ content_type?: string | null;
41
+ metadata?: Record<string, unknown> | null;
42
+ expectedVersion?: number | null;
43
+ expected_version?: number | null;
44
+ verifyHash?: boolean;
45
+ verify_hash?: boolean;
46
+ groupId?: string | null;
47
+ groupAid?: string | null;
48
+ group_id?: string | null;
49
+ group_aid?: string | null;
50
+ srcGroupId?: string | null;
51
+ srcGroupAid?: string | null;
52
+ src_group_id?: string | null;
53
+ src_group_aid?: string | null;
54
+ dstGroupId?: string | null;
55
+ dstGroupAid?: string | null;
56
+ dst_group_id?: string | null;
57
+ dst_group_aid?: string | null;
58
+ sourceType?: 'data' | 'path';
59
+ source_type?: 'data' | 'path';
60
+ localPath?: boolean;
61
+ local_path?: boolean;
62
+ signAs?: string;
63
+ sign_as?: string;
64
+ aidStore?: GroupFSAIDStore;
65
+ aid_store?: GroupFSAIDStore;
66
+ }
67
+ export interface GroupFSDownloadResult {
68
+ path: string;
69
+ localPath?: string;
70
+ size: number;
71
+ sha256: string;
72
+ verified: boolean;
73
+ data: Uint8Array;
74
+ blob?: Blob;
75
+ wroteLocalFile?: boolean;
76
+ }
77
+ export declare function isGroupRemotePath(value: string): boolean;
78
+ export declare class GroupFSVFS {
79
+ readonly lowlevel: StorageLowLevel;
80
+ private readonly client;
81
+ constructor(client: GroupFSRpcClient, options?: {
82
+ lowlevel?: StorageLowLevel;
83
+ });
84
+ private call;
85
+ private prepareParams;
86
+ ls(path: string, options?: GroupFSParams): Promise<unknown>;
87
+ find(path: string, options?: GroupFSParams): Promise<unknown>;
88
+ stat(path: string, options?: GroupFSParams): Promise<unknown>;
89
+ lstat(path: string, options?: GroupFSParams): Promise<unknown>;
90
+ mkdir(path: string, options?: GroupFSParams & {
91
+ parents?: boolean;
92
+ }): Promise<unknown>;
93
+ setAcl(path: string, options?: GroupFSParams & {
94
+ granteeAid?: string;
95
+ grantee_aid?: string;
96
+ perms?: string;
97
+ }): Promise<unknown>;
98
+ removeAcl(path: string, options?: GroupFSParams & {
99
+ granteeAid?: string;
100
+ grantee_aid?: string;
101
+ }): Promise<unknown>;
102
+ getAcl(path: string, options?: GroupFSParams): Promise<unknown>;
103
+ listAcl(path: string, options?: GroupFSParams): Promise<unknown>;
104
+ rm(path: string, options?: GroupFSParams & {
105
+ recursive?: boolean;
106
+ force?: boolean;
107
+ }): Promise<unknown>;
108
+ cp(src: GroupFSCpSource, dst: GroupFSCpDestination, options?: GroupFSCpOptions): Promise<unknown>;
109
+ mv(src: string, dst: string, options?: GroupFSCpOptions): Promise<unknown>;
110
+ df(pathOrGroup?: string | null, options?: GroupFSParams): Promise<unknown>;
111
+ mount(path: string, options?: GroupFSParams): Promise<unknown>;
112
+ umount(path: string, options?: GroupFSParams): Promise<unknown>;
113
+ private remoteCopyParams;
114
+ private copyRemoteToRemote;
115
+ private sourceBytes;
116
+ private uploadToGroup;
117
+ private downloadFromGroup;
118
+ }
119
+ export {};
120
+ //# sourceMappingURL=group-fs.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"group-fs.d.ts","sourceRoot":"","sources":["../src/group-fs.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,539 @@
1
+ import { StorageConflictError, StorageError, StorageExistsError, mapStorageError } from './storage/errors.js';
2
+ import { StorageLowLevel } from './storage/lowlevel.js';
3
+ const WINDOWS_DRIVE_RE = /^[A-Za-z]:[\\/]/;
4
+ const GROUP_REF_RE = /^[^:/\\][^:]*:\//;
5
+ const LOCAL_PREFIX = 'local:';
6
+ function isExplicitLocalPath(value) {
7
+ return String(value || '').trim().toLowerCase().startsWith(LOCAL_PREFIX);
8
+ }
9
+ function stripLocalPathPrefix(value) {
10
+ const text = String(value || '').trim();
11
+ return text.toLowerCase().startsWith(LOCAL_PREFIX) ? text.slice(LOCAL_PREFIX.length) : text;
12
+ }
13
+ function isGroupRemoteCopyPath(value, ...groupHints) {
14
+ if (isExplicitLocalPath(value))
15
+ return false;
16
+ return isGroupRemotePath(value) || groupHints.some(Boolean);
17
+ }
18
+ export function isGroupRemotePath(value) {
19
+ const text = String(value || '').trim();
20
+ if (!text)
21
+ return false;
22
+ if (isExplicitLocalPath(text))
23
+ return false;
24
+ if (WINDOWS_DRIVE_RE.test(text))
25
+ return false;
26
+ if (text.startsWith('http://') || text.startsWith('https://'))
27
+ return true;
28
+ return GROUP_REF_RE.test(text);
29
+ }
30
+ function stripNil(params) {
31
+ const out = {};
32
+ for (const [key, value] of Object.entries(params ?? {})) {
33
+ if (value !== undefined && value !== null)
34
+ out[key] = value;
35
+ }
36
+ return out;
37
+ }
38
+ async function loadSigningAID(store, signAs) {
39
+ const loaded = store.load
40
+ ? await store.load(signAs)
41
+ : store.loadAsync
42
+ ? await store.loadAsync(signAs)
43
+ : null;
44
+ if (!loaded?.ok || !loaded.data?.aid) {
45
+ throw new Error(loaded?.error?.message || `signer identity not found: ${signAs}`);
46
+ }
47
+ if (!loaded.data.aid.privateKeyPem) {
48
+ throw new Error(`signer identity missing private key: ${signAs}`);
49
+ }
50
+ return loaded.data.aid;
51
+ }
52
+ function text(value) {
53
+ return value === undefined || value === null ? '' : String(value).trim();
54
+ }
55
+ function accessTokenFromClient(client) {
56
+ const authClient = client;
57
+ if (typeof authClient.getAccessToken === 'function') {
58
+ const token = text(authClient.getAccessToken());
59
+ if (token)
60
+ return token;
61
+ }
62
+ const directToken = text(authClient.accessToken ?? authClient.access_token);
63
+ if (directToken)
64
+ return directToken;
65
+ const identityToken = text(authClient._identity?.access_token);
66
+ if (identityToken)
67
+ return identityToken;
68
+ return text(authClient._sessionParams?.access_token);
69
+ }
70
+ function bearerHeaders(client) {
71
+ const token = accessTokenFromClient(client);
72
+ return token ? { Authorization: `Bearer ${token}` } : undefined;
73
+ }
74
+ function toExactArrayBuffer(bytes) {
75
+ return bytes.buffer.slice(bytes.byteOffset, bytes.byteOffset + bytes.byteLength);
76
+ }
77
+ async function sha256Hex(data) {
78
+ const subtle = globalThis.crypto?.subtle;
79
+ if (!subtle?.digest)
80
+ throw new StorageError('SHA-256 unavailable', 'EUNSUPPORTED');
81
+ const digest = await subtle.digest('SHA-256', toExactArrayBuffer(data));
82
+ return Array.from(new Uint8Array(digest)).map((b) => b.toString(16).padStart(2, '0')).join('');
83
+ }
84
+ async function blobToBytes(blob) {
85
+ if (typeof blob.arrayBuffer === 'function') {
86
+ return new Uint8Array(await blob.arrayBuffer());
87
+ }
88
+ if (typeof blob.stream === 'function' && typeof Response !== 'undefined') {
89
+ return new Uint8Array(await new Response(blob).arrayBuffer());
90
+ }
91
+ if (typeof FileReader !== 'undefined') {
92
+ return await new Promise((resolve, reject) => {
93
+ const reader = new FileReader();
94
+ reader.onload = () => resolve(new Uint8Array(reader.result));
95
+ reader.onerror = () => reject(reader.error ?? new StorageError('Blob read failed', 'ESTORAGE'));
96
+ reader.readAsArrayBuffer(blob);
97
+ });
98
+ }
99
+ if (typeof blob.text === 'function') {
100
+ return new TextEncoder().encode(await blob.text());
101
+ }
102
+ throw new StorageError('Blob reads are unavailable in this JavaScript runtime', 'EUNSUPPORTED');
103
+ }
104
+ async function toBytes(source) {
105
+ if (typeof source === 'string')
106
+ return new TextEncoder().encode(source);
107
+ if (source instanceof Uint8Array)
108
+ return source;
109
+ if (source instanceof ArrayBuffer)
110
+ return new Uint8Array(source);
111
+ if (typeof Blob !== 'undefined' && source instanceof Blob) {
112
+ return blobToBytes(source);
113
+ }
114
+ if (ArrayBuffer.isView(source)) {
115
+ return new Uint8Array(source.buffer, source.byteOffset, source.byteLength);
116
+ }
117
+ throw new StorageError('unsupported group fs upload source', 'EUNSUPPORTED');
118
+ }
119
+ async function importNodeModule(specifier) {
120
+ if (typeof document !== 'undefined')
121
+ return null;
122
+ const getBuiltinModule = globalThis.process?.getBuiltinModule;
123
+ if (typeof getBuiltinModule === 'function' && specifier.startsWith('node:')) {
124
+ try {
125
+ return getBuiltinModule(specifier.slice('node:'.length));
126
+ }
127
+ catch {
128
+ // 回退到动态 import。
129
+ }
130
+ }
131
+ try {
132
+ const requireFn = Function('return typeof require !== "undefined" ? require : undefined');
133
+ const requireModule = requireFn();
134
+ if (requireModule)
135
+ return requireModule(specifier);
136
+ }
137
+ catch {
138
+ // 回退到动态 import。
139
+ }
140
+ try {
141
+ const dynamicImport = Function(`return import(${JSON.stringify(specifier)})`);
142
+ return await dynamicImport();
143
+ }
144
+ catch {
145
+ return null;
146
+ }
147
+ }
148
+ async function readLocalFile(path) {
149
+ const fs = await importNodeModule('node:fs/promises');
150
+ if (!fs?.readFile)
151
+ throw new StorageError('local file reads are unavailable in this JavaScript runtime', 'EUNSUPPORTED', path);
152
+ return new Uint8Array(await fs.readFile(path));
153
+ }
154
+ async function writeLocalFile(path, data, force) {
155
+ const fs = await importNodeModule('node:fs/promises');
156
+ const pathMod = await importNodeModule('node:path');
157
+ if (!fs?.writeFile || !pathMod?.dirname)
158
+ return false;
159
+ await fs.mkdir(pathMod.dirname(path), { recursive: true });
160
+ try {
161
+ await fs.writeFile(path, data, force ? undefined : { flag: 'wx' });
162
+ return true;
163
+ }
164
+ catch (exc) {
165
+ const code = text(exc.code);
166
+ if (code === 'EEXIST')
167
+ throw new StorageExistsError(`local path already exists: ${path}`, 'EEXIST', path);
168
+ throw exc;
169
+ }
170
+ }
171
+ async function localFileStatus(path) {
172
+ const fs = await importNodeModule('node:fs/promises');
173
+ if (!fs?.stat)
174
+ return 'unavailable';
175
+ try {
176
+ const info = await fs.stat(path);
177
+ return info.isDirectory() ? 'dir' : 'file';
178
+ }
179
+ catch (exc) {
180
+ const code = text(exc.code);
181
+ if (code === 'ENOENT')
182
+ return 'missing';
183
+ throw exc;
184
+ }
185
+ }
186
+ function guessContentType(path) {
187
+ const lower = path.toLowerCase();
188
+ if (lower.endsWith('.md'))
189
+ return 'text/markdown';
190
+ if (lower.endsWith('.txt'))
191
+ return 'text/plain';
192
+ if (lower.endsWith('.json'))
193
+ return 'application/json';
194
+ if (lower.endsWith('.html') || lower.endsWith('.htm'))
195
+ return 'text/html';
196
+ if (lower.endsWith('.png'))
197
+ return 'image/png';
198
+ if (lower.endsWith('.jpg') || lower.endsWith('.jpeg'))
199
+ return 'image/jpeg';
200
+ return 'application/octet-stream';
201
+ }
202
+ function downloadTarget(dst) {
203
+ if (typeof dst === 'string') {
204
+ if (dst === 'blob:')
205
+ return { mode: 'blob' };
206
+ if (dst === 'bytes:')
207
+ return { mode: 'bytes' };
208
+ return { mode: 'local', localPath: stripLocalPathPrefix(dst) };
209
+ }
210
+ const mode = dst.type === 'blob' ? 'blob' : dst.type === 'bytes' ? 'bytes' : dst.path || dst.localPath ? 'local' : 'bytes';
211
+ const localPath = dst.path ?? dst.localPath;
212
+ return { mode, localPath: localPath ? stripLocalPathPrefix(localPath) : localPath };
213
+ }
214
+ export class GroupFSVFS {
215
+ lowlevel;
216
+ client;
217
+ constructor(client, options = {}) {
218
+ this.client = client;
219
+ this.lowlevel = options.lowlevel ?? new StorageLowLevel(client);
220
+ }
221
+ async call(method, params, path = '') {
222
+ try {
223
+ return await this.client.call(method, await this.prepareParams(params));
224
+ }
225
+ catch (exc) {
226
+ throw mapStorageError(exc, path);
227
+ }
228
+ }
229
+ async prepareParams(params) {
230
+ const next = { ...(params ?? {}) };
231
+ const signAs = text(next.sign_as ?? next.signAs);
232
+ const aidStore = (next.aid_store ?? next.aidStore);
233
+ delete next.sign_as;
234
+ delete next.signAs;
235
+ delete next.aid_store;
236
+ delete next.aidStore;
237
+ if (signAs) {
238
+ const currentAid = text(this.client.aid ?? this.client._aid);
239
+ if (currentAid.toLowerCase() !== signAs.toLowerCase()) {
240
+ if (!aidStore) {
241
+ throw new Error(`group.fs operation requires aidStore to sign as ${signAs}`);
242
+ }
243
+ next._client_signature_identity = await loadSigningAID(aidStore, signAs);
244
+ }
245
+ }
246
+ return stripNil(next);
247
+ }
248
+ ls(path, options = {}) {
249
+ return this.call('group.fs.ls', { path, ...options }, path);
250
+ }
251
+ find(path, options = {}) {
252
+ return this.call('group.fs.find', { path, ...options }, path);
253
+ }
254
+ stat(path, options = {}) {
255
+ return this.call('group.fs.stat', { path, ...options }, path);
256
+ }
257
+ lstat(path, options = {}) {
258
+ return this.call('group.fs.lstat', { path, ...options }, path);
259
+ }
260
+ mkdir(path, options = {}) {
261
+ return this.call('group.fs.mkdir', { path, parents: options.parents ?? false, ...options }, path);
262
+ }
263
+ setAcl(path, options = {}) {
264
+ const grantee = options.grantee_aid ?? options.granteeAid ?? 'role:admin';
265
+ const params = { ...options, path, grantee_aid: grantee, perms: options.perms ?? 'rwx' };
266
+ delete params.granteeAid;
267
+ return this.call('group.fs.set_acl', params, path);
268
+ }
269
+ removeAcl(path, options = {}) {
270
+ const grantee = options.grantee_aid ?? options.granteeAid ?? 'role:admin';
271
+ const params = { ...options, path, grantee_aid: grantee };
272
+ delete params.granteeAid;
273
+ return this.call('group.fs.remove_acl', params, path);
274
+ }
275
+ getAcl(path, options = {}) {
276
+ return this.call('group.fs.get_acl', { path, ...options }, path);
277
+ }
278
+ listAcl(path, options = {}) {
279
+ return this.call('group.fs.list_acl', { path, ...options }, path);
280
+ }
281
+ rm(path, options = {}) {
282
+ return this.call('group.fs.rm', {
283
+ path,
284
+ recursive: options.recursive ?? false,
285
+ force: options.force ?? false,
286
+ ...options,
287
+ }, path);
288
+ }
289
+ async cp(src, dst, options = {}) {
290
+ const groupRef = options.group_aid ?? options.groupAid ?? options.group_id ?? options.groupId;
291
+ const srcGroupRef = options.src_group_aid ?? options.srcGroupAid ?? options.src_group_id ?? options.srcGroupId;
292
+ const dstGroupRef = options.dst_group_aid ?? options.dstGroupAid ?? options.dst_group_id ?? options.dstGroupId;
293
+ const srcRemote = typeof src === 'string' && isGroupRemoteCopyPath(src, srcGroupRef, groupRef);
294
+ const dstRemote = typeof dst === 'string' && isGroupRemoteCopyPath(dst, dstGroupRef, groupRef);
295
+ if (srcRemote && dstRemote)
296
+ return this.copyRemoteToRemote(src, dst, options);
297
+ if (!srcRemote && dstRemote)
298
+ return this.uploadToGroup(src, dst, options);
299
+ if (srcRemote && !dstRemote)
300
+ return this.downloadFromGroup(src, dst, options);
301
+ throw new StorageError('local-to-local copy is not handled by group.fs', 'EINVAL', typeof src === 'string' ? src : '');
302
+ }
303
+ async mv(src, dst, options = {}) {
304
+ const groupRef = options.group_aid ?? options.groupAid ?? options.group_id ?? options.groupId;
305
+ const srcGroupRef = options.src_group_aid ?? options.srcGroupAid ?? options.src_group_id ?? options.srcGroupId;
306
+ const dstGroupRef = options.dst_group_aid ?? options.dstGroupAid ?? options.dst_group_id ?? options.dstGroupId;
307
+ if (!isGroupRemoteCopyPath(src, srcGroupRef, groupRef) || !isGroupRemoteCopyPath(dst, dstGroupRef, groupRef)) {
308
+ throw new StorageError('group.fs.mv only supports group remote paths', 'EINVAL', src);
309
+ }
310
+ const params = this.remoteCopyParams(src, dst, options);
311
+ return this.call('group.fs.mv', params, src);
312
+ }
313
+ df(pathOrGroup, options = {}) {
314
+ const params = { ...options };
315
+ if (pathOrGroup !== undefined && pathOrGroup !== null)
316
+ params.path = pathOrGroup;
317
+ return this.call('group.fs.df', params, pathOrGroup ?? '');
318
+ }
319
+ mount(path, options = {}) {
320
+ return this.call('group.fs.mount', { path, ...options }, path);
321
+ }
322
+ umount(path, options = {}) {
323
+ return this.call('group.fs.umount', { path, ...options }, path);
324
+ }
325
+ remoteCopyParams(src, dst, options) {
326
+ const params = { ...options, src, dst };
327
+ delete params.contentType;
328
+ delete params.content_type;
329
+ delete params.metadata;
330
+ delete params.expectedVersion;
331
+ delete params.expected_version;
332
+ delete params.parents;
333
+ delete params.verifyHash;
334
+ delete params.verify_hash;
335
+ delete params.sourceType;
336
+ delete params.source_type;
337
+ delete params.localPath;
338
+ delete params.local_path;
339
+ if (options.groupAid !== undefined)
340
+ params.group_aid = options.groupAid;
341
+ if (options.groupId !== undefined)
342
+ params.group_id = options.groupId;
343
+ if (options.srcGroupAid !== undefined)
344
+ params.src_group_aid = options.srcGroupAid;
345
+ if (options.srcGroupId !== undefined)
346
+ params.src_group_id = options.srcGroupId;
347
+ if (options.dstGroupAid !== undefined)
348
+ params.dst_group_aid = options.dstGroupAid;
349
+ if (options.dstGroupId !== undefined)
350
+ params.dst_group_id = options.dstGroupId;
351
+ if (options.followSymlinks !== undefined)
352
+ params.follow_symlinks = options.followSymlinks;
353
+ delete params.groupAid;
354
+ delete params.srcGroupAid;
355
+ delete params.dstGroupAid;
356
+ delete params.followSymlinks;
357
+ if (!options.force)
358
+ delete params.force;
359
+ if (!options.recursive)
360
+ delete params.recursive;
361
+ return stripNil(params);
362
+ }
363
+ copyRemoteToRemote(src, dst, options) {
364
+ return this.call('group.fs.cp', this.remoteCopyParams(src, dst, options), src);
365
+ }
366
+ async sourceBytes(src, options) {
367
+ if (typeof src === 'string') {
368
+ const sourceType = text(options.source_type ?? options.sourceType);
369
+ if (isExplicitLocalPath(src) || sourceType === 'path' || options.localPath === true || options.local_path === true) {
370
+ const localPath = stripLocalPathPrefix(src);
371
+ return { data: await readLocalFile(localPath), contentType: guessContentType(localPath) };
372
+ }
373
+ return { data: await toBytes(src), contentType: 'text/plain;charset=utf-8' };
374
+ }
375
+ const data = await toBytes(src);
376
+ const blobType = typeof Blob !== 'undefined' && src instanceof Blob ? text(src.type) : '';
377
+ const fileName = text(src.name);
378
+ return { data, contentType: blobType || (fileName ? guessContentType(fileName) : 'application/octet-stream') };
379
+ }
380
+ async uploadToGroup(src, dst, options) {
381
+ const { data, contentType } = await this.sourceBytes(src, options);
382
+ const digest = await sha256Hex(data);
383
+ const groupAid = options.group_aid ?? options.groupAid ?? options.dst_group_aid ?? options.dstGroupAid;
384
+ const groupId = options.group_id ?? options.groupId ?? options.dst_group_id ?? options.dstGroupId;
385
+ const baseParams = stripNil({
386
+ ...options,
387
+ path: dst,
388
+ group_aid: groupAid,
389
+ group_id: groupAid ? undefined : groupId,
390
+ size_bytes: data.byteLength,
391
+ sha256: digest,
392
+ content_type: options.content_type ?? options.contentType ?? contentType,
393
+ force: options.force ?? false,
394
+ parents: options.parents ?? true,
395
+ metadata: options.metadata,
396
+ expected_version: options.expected_version ?? options.expectedVersion,
397
+ });
398
+ delete baseParams.groupId;
399
+ delete baseParams.groupAid;
400
+ delete baseParams.dstGroupId;
401
+ delete baseParams.dstGroupAid;
402
+ delete baseParams.dst_group_aid;
403
+ delete baseParams.dst_group_id;
404
+ delete baseParams.srcGroupId;
405
+ delete baseParams.srcGroupAid;
406
+ delete baseParams.src_group_aid;
407
+ delete baseParams.src_group_id;
408
+ delete baseParams.contentType;
409
+ delete baseParams.expectedVersion;
410
+ delete baseParams.verifyHash;
411
+ delete baseParams.verify_hash;
412
+ delete baseParams.recursive;
413
+ delete baseParams.followSymlinks;
414
+ delete baseParams.follow_symlinks;
415
+ delete baseParams.sourceType;
416
+ delete baseParams.source_type;
417
+ delete baseParams.localPath;
418
+ delete baseParams.local_path;
419
+ const check = await this.call('group.fs.check_upload', baseParams, dst);
420
+ if (check && typeof check === 'object') {
421
+ const raw = check;
422
+ if (raw.within_limit === false)
423
+ throw new StorageError('file size exceeds group fs upload limit', 'E2BIG', dst, raw);
424
+ if (raw.target_exists && !options.force && options.expected_version === undefined && options.expectedVersion === undefined) {
425
+ throw new StorageExistsError('group fs target already exists', 'EEXIST', dst, raw.target);
426
+ }
427
+ if (raw.instant || raw.dedup_hit || raw.skip_upload) {
428
+ return this.call('group.fs.complete_upload', {
429
+ ...baseParams,
430
+ skip_blob: true,
431
+ session_id: raw.session_id,
432
+ }, dst);
433
+ }
434
+ }
435
+ const session = await this.call('group.fs.create_upload_session', baseParams, dst);
436
+ if (!session || typeof session !== 'object') {
437
+ throw new StorageError(`group.fs.create_upload_session returned invalid response`, 'ESTORAGE', dst, session);
438
+ }
439
+ const rawSession = session;
440
+ const uploadUrl = text(rawSession.upload_url ?? rawSession.url);
441
+ if (!uploadUrl)
442
+ throw new StorageError('group.fs.create_upload_session did not return upload_url', 'ESTORAGE', dst, session);
443
+ const headers = {};
444
+ if (rawSession.headers && typeof rawSession.headers === 'object' && !Array.isArray(rawSession.headers)) {
445
+ for (const [key, value] of Object.entries(rawSession.headers)) {
446
+ if (value !== undefined && value !== null)
447
+ headers[key] = String(value);
448
+ }
449
+ }
450
+ if (!Object.keys(headers).some((key) => key.toLowerCase() === 'content-type')) {
451
+ headers['Content-Type'] = text(baseParams.content_type) || 'application/octet-stream';
452
+ }
453
+ await this.lowlevel.httpPut(uploadUrl, data, headers);
454
+ return this.call('group.fs.complete_upload', {
455
+ ...baseParams,
456
+ session_id: rawSession.session_id ?? rawSession.id,
457
+ }, dst);
458
+ }
459
+ async downloadFromGroup(src, dst, options) {
460
+ const target = downloadTarget(dst);
461
+ if (target.mode === 'local' && target.localPath) {
462
+ const status = await localFileStatus(target.localPath);
463
+ if (status === 'file' && !options.force) {
464
+ throw new StorageExistsError(`local path already exists: ${target.localPath}`, 'EEXIST', target.localPath);
465
+ }
466
+ }
467
+ const groupAid = options.group_aid ?? options.groupAid ?? options.src_group_aid ?? options.srcGroupAid;
468
+ const groupId = options.group_id ?? options.groupId ?? options.src_group_id ?? options.srcGroupId;
469
+ const params = stripNil({
470
+ ...options,
471
+ path: src,
472
+ group_aid: groupAid,
473
+ group_id: groupAid ? undefined : groupId,
474
+ });
475
+ delete params.groupId;
476
+ delete params.groupAid;
477
+ delete params.srcGroupId;
478
+ delete params.srcGroupAid;
479
+ delete params.src_group_aid;
480
+ delete params.src_group_id;
481
+ delete params.dstGroupId;
482
+ delete params.dstGroupAid;
483
+ delete params.dst_group_aid;
484
+ delete params.dst_group_id;
485
+ delete params.force;
486
+ delete params.recursive;
487
+ delete params.parents;
488
+ delete params.contentType;
489
+ delete params.content_type;
490
+ delete params.expectedVersion;
491
+ delete params.expected_version;
492
+ delete params.verifyHash;
493
+ delete params.verify_hash;
494
+ delete params.sourceType;
495
+ delete params.source_type;
496
+ delete params.localPath;
497
+ delete params.local_path;
498
+ const ticket = await this.call('group.fs.create_download_ticket', params, src);
499
+ if (!ticket || typeof ticket !== 'object') {
500
+ throw new StorageError('group.fs.create_download_ticket returned invalid response', 'ESTORAGE', src, ticket);
501
+ }
502
+ const rawTicket = ticket;
503
+ const downloadUrl = text(rawTicket.download_url ?? rawTicket.url);
504
+ if (!downloadUrl)
505
+ throw new StorageError('group.fs.create_download_ticket did not return download_url', 'ESTORAGE', src, ticket);
506
+ const data = await this.lowlevel.httpGet(downloadUrl, bearerHeaders(this.client));
507
+ const expectedSha = text(rawTicket.sha256);
508
+ const verifyHash = options.verify_hash ?? options.verifyHash ?? true;
509
+ const verified = !verifyHash || !expectedSha || (await sha256Hex(data)) === expectedSha.toLowerCase();
510
+ if (verifyHash && !verified) {
511
+ throw new StorageConflictError('download hash verification failed', 'ECONFLICT', src, ticket);
512
+ }
513
+ if (target.mode === 'local' && target.localPath) {
514
+ const status = await localFileStatus(target.localPath);
515
+ if (status === 'dir') {
516
+ throw new StorageError('directory download target is not supported in this JavaScript runtime', 'EISDIR', target.localPath);
517
+ }
518
+ if (status === 'file' && !options.force) {
519
+ throw new StorageExistsError(`local path already exists: ${target.localPath}`, 'EEXIST', target.localPath);
520
+ }
521
+ }
522
+ const result = {
523
+ path: src,
524
+ localPath: target.localPath,
525
+ size: data.byteLength,
526
+ sha256: expectedSha,
527
+ verified,
528
+ data,
529
+ };
530
+ if (target.mode === 'blob' && typeof Blob !== 'undefined') {
531
+ result.blob = new Blob([toExactArrayBuffer(data)], { type: text(rawTicket.content_type) || 'application/octet-stream' });
532
+ }
533
+ if (target.mode === 'local' && target.localPath) {
534
+ result.wroteLocalFile = await writeLocalFile(target.localPath, data, Boolean(options.force));
535
+ }
536
+ return result;
537
+ }
538
+ }
539
+ //# sourceMappingURL=group-fs.js.map