@openclaw/fs-safe 0.9.0 → 0.11.0

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 (326) hide show
  1. package/CHANGELOG.md +134 -0
  2. package/LICENSE +1 -0
  3. package/README.md +52 -4
  4. package/dist/absolute-path.d.ts.map +1 -1
  5. package/dist/absolute-path.js +3 -2
  6. package/dist/advanced.d.ts +5 -0
  7. package/dist/advanced.d.ts.map +1 -1
  8. package/dist/advanced.js +5 -0
  9. package/dist/archive-crc32.d.ts.map +1 -1
  10. package/dist/archive-crc32.js +6 -1
  11. package/dist/archive-deadline.d.ts.map +1 -1
  12. package/dist/archive-deadline.js +3 -4
  13. package/dist/archive-durability.d.ts +6 -6
  14. package/dist/archive-durability.d.ts.map +1 -1
  15. package/dist/archive-durability.js +1 -1
  16. package/dist/archive-entry.d.ts.map +1 -1
  17. package/dist/archive-entry.js +4 -5
  18. package/dist/archive-gzip-tail.d.ts +3 -0
  19. package/dist/archive-gzip-tail.d.ts.map +1 -1
  20. package/dist/archive-gzip-tail.js +23 -3
  21. package/dist/archive-input.d.ts.map +1 -1
  22. package/dist/archive-input.js +4 -2
  23. package/dist/archive-merge.d.ts +5 -1
  24. package/dist/archive-merge.d.ts.map +1 -1
  25. package/dist/archive-merge.js +16 -13
  26. package/dist/archive-native.d.ts.map +1 -1
  27. package/dist/archive-native.js +7 -6
  28. package/dist/archive-parser.wasm +0 -0
  29. package/dist/archive-read.d.ts.map +1 -1
  30. package/dist/archive-read.js +83 -74
  31. package/dist/archive-staging.d.ts +6 -3
  32. package/dist/archive-staging.d.ts.map +1 -1
  33. package/dist/archive-staging.js +42 -22
  34. package/dist/archive-tar-stream.d.ts +11 -4
  35. package/dist/archive-tar-stream.d.ts.map +1 -1
  36. package/dist/archive-tar-stream.js +23 -10
  37. package/dist/archive-tar-wasm.d.ts.map +1 -1
  38. package/dist/archive-tar-wasm.js +18 -14
  39. package/dist/archive-zip-admission.d.ts +1 -1
  40. package/dist/archive-zip-admission.d.ts.map +1 -1
  41. package/dist/archive-zip-admission.js +48 -12
  42. package/dist/archive-zip-loader.d.ts +6 -0
  43. package/dist/archive-zip-loader.d.ts.map +1 -0
  44. package/dist/archive-zip-loader.js +38 -0
  45. package/dist/archive-zip-names.d.ts.map +1 -1
  46. package/dist/archive-zip-names.js +13 -8
  47. package/dist/archive-zip-preflight.d.ts +2 -3
  48. package/dist/archive-zip-preflight.d.ts.map +1 -1
  49. package/dist/archive-zip-preflight.js +2 -34
  50. package/dist/archive.d.ts.map +1 -1
  51. package/dist/archive.js +12 -10
  52. package/dist/bounded-read.d.ts +12 -0
  53. package/dist/bounded-read.d.ts.map +1 -1
  54. package/dist/bounded-read.js +82 -45
  55. package/dist/clone-metadata.d.ts +19 -0
  56. package/dist/clone-metadata.d.ts.map +1 -0
  57. package/dist/clone-metadata.js +32 -0
  58. package/dist/copy-file-input.d.ts +22 -0
  59. package/dist/copy-file-input.d.ts.map +1 -0
  60. package/dist/copy-file-input.js +69 -0
  61. package/dist/copy-policy.d.ts +3 -0
  62. package/dist/copy-policy.d.ts.map +1 -0
  63. package/dist/copy-policy.js +8 -0
  64. package/dist/copy-publication.d.ts +10 -1
  65. package/dist/copy-publication.d.ts.map +1 -1
  66. package/dist/copy-publication.js +27 -0
  67. package/dist/copy-tree-portable.d.ts +9 -0
  68. package/dist/copy-tree-portable.d.ts.map +1 -0
  69. package/dist/copy-tree-portable.js +222 -0
  70. package/dist/copy.d.ts +16 -0
  71. package/dist/copy.d.ts.map +1 -0
  72. package/dist/copy.js +125 -0
  73. package/dist/directory-durability.d.ts.map +1 -1
  74. package/dist/directory-durability.js +5 -4
  75. package/dist/directory-guard.d.ts +11 -1
  76. package/dist/directory-guard.d.ts.map +1 -1
  77. package/dist/directory-guard.js +53 -11
  78. package/dist/durability.d.ts +1 -1
  79. package/dist/durability.d.ts.map +1 -1
  80. package/dist/durability.js +1 -1
  81. package/dist/error-detail.d.ts.map +1 -1
  82. package/dist/error-detail.js +4 -1
  83. package/dist/file-handle-transfer.d.ts +14 -0
  84. package/dist/file-handle-transfer.d.ts.map +1 -0
  85. package/dist/file-handle-transfer.js +64 -0
  86. package/dist/file-hash.d.ts +9 -2
  87. package/dist/file-hash.d.ts.map +1 -1
  88. package/dist/file-hash.js +135 -39
  89. package/dist/file-lock-sync.d.ts.map +1 -1
  90. package/dist/file-lock-sync.js +8 -4
  91. package/dist/file-store-boundary.d.ts.map +1 -1
  92. package/dist/file-store-boundary.js +7 -5
  93. package/dist/file-store-path.d.ts +3 -0
  94. package/dist/file-store-path.d.ts.map +1 -0
  95. package/dist/file-store-path.js +27 -0
  96. package/dist/file-store-prune.d.ts.map +1 -1
  97. package/dist/file-store-prune.js +6 -4
  98. package/dist/file-store-sync-write.d.ts.map +1 -1
  99. package/dist/file-store-sync-write.js +56 -44
  100. package/dist/file-store.d.ts.map +1 -1
  101. package/dist/file-store.js +2 -18
  102. package/dist/filename.d.ts.map +1 -1
  103. package/dist/filename.js +4 -13
  104. package/dist/guarded-mkdir.d.ts +1 -0
  105. package/dist/guarded-mkdir.d.ts.map +1 -1
  106. package/dist/guarded-mkdir.js +4 -2
  107. package/dist/guarded-mutation.d.ts +2 -0
  108. package/dist/guarded-mutation.d.ts.map +1 -1
  109. package/dist/guarded-mutation.js +8 -4
  110. package/dist/guest-dispatch-python.d.ts +2 -0
  111. package/dist/guest-dispatch-python.d.ts.map +1 -0
  112. package/dist/guest-dispatch-python.js +117 -0
  113. package/dist/guest-native-python.d.ts +4 -0
  114. package/dist/guest-native-python.d.ts.map +1 -0
  115. package/dist/guest-native-python.js +135 -0
  116. package/dist/guest.d.ts +9 -0
  117. package/dist/guest.d.ts.map +1 -0
  118. package/dist/guest.js +413 -0
  119. package/dist/home-dir.d.ts.map +1 -1
  120. package/dist/home-dir.js +9 -7
  121. package/dist/index.d.ts +1 -1
  122. package/dist/index.d.ts.map +1 -1
  123. package/dist/install-path.d.ts.map +1 -1
  124. package/dist/install-path.js +5 -8
  125. package/dist/json-durable-queue-directory.js +3 -3
  126. package/dist/json-durable-queue.d.ts.map +1 -1
  127. package/dist/json-durable-queue.js +19 -18
  128. package/dist/json.d.ts.map +1 -1
  129. package/dist/json.js +2 -1
  130. package/dist/local-roots.d.ts.map +1 -1
  131. package/dist/local-roots.js +24 -25
  132. package/dist/move-path-stage.d.ts +8 -0
  133. package/dist/move-path-stage.d.ts.map +1 -0
  134. package/dist/move-path-stage.js +56 -0
  135. package/dist/move-path.d.ts.map +1 -1
  136. package/dist/move-path.js +30 -34
  137. package/dist/mutation-authority.d.ts +9 -0
  138. package/dist/mutation-authority.d.ts.map +1 -0
  139. package/dist/mutation-authority.js +36 -0
  140. package/dist/native-binding.d.ts +29 -1
  141. package/dist/native-binding.d.ts.map +1 -1
  142. package/dist/native-operations.d.ts +1 -1
  143. package/dist/native-operations.d.ts.map +1 -1
  144. package/dist/native-operations.js +11 -5
  145. package/dist/native-pinned-write-windows.d.ts.map +1 -1
  146. package/dist/native-pinned-write-windows.js +19 -7
  147. package/dist/native-pinned-write.d.ts.map +1 -1
  148. package/dist/native-pinned-write.js +3 -1
  149. package/dist/native-staged-file.d.ts +3 -3
  150. package/dist/native-staged-file.d.ts.map +1 -1
  151. package/dist/native-staged-file.js +35 -8
  152. package/dist/opened-realpath.d.ts.map +1 -1
  153. package/dist/opened-realpath.js +5 -4
  154. package/dist/output.d.ts +2 -0
  155. package/dist/output.d.ts.map +1 -1
  156. package/dist/output.js +2 -0
  157. package/dist/overwrite-file-handle.d.ts +8 -0
  158. package/dist/overwrite-file-handle.d.ts.map +1 -0
  159. package/dist/overwrite-file-handle.js +42 -0
  160. package/dist/path-case.d.ts +7 -0
  161. package/dist/path-case.d.ts.map +1 -0
  162. package/dist/path-case.js +136 -0
  163. package/dist/path.d.ts.map +1 -1
  164. package/dist/path.js +5 -2
  165. package/dist/permissions-windows.d.ts +1 -1
  166. package/dist/permissions-windows.d.ts.map +1 -1
  167. package/dist/permissions-windows.js +85 -53
  168. package/dist/pinned-open.d.ts.map +1 -1
  169. package/dist/pinned-open.js +3 -1
  170. package/dist/pinned-operation.js +1 -1
  171. package/dist/pinned-write.d.ts +7 -3
  172. package/dist/pinned-write.d.ts.map +1 -1
  173. package/dist/pinned-write.js +51 -30
  174. package/dist/positional-read.d.ts +9 -0
  175. package/dist/positional-read.d.ts.map +1 -0
  176. package/dist/positional-read.js +36 -0
  177. package/dist/private-temp-workspace.d.ts.map +1 -1
  178. package/dist/private-temp-workspace.js +6 -4
  179. package/dist/publish-copy-stage.d.ts +13 -0
  180. package/dist/publish-copy-stage.d.ts.map +1 -0
  181. package/dist/publish-copy-stage.js +47 -0
  182. package/dist/publish-file.d.ts.map +1 -1
  183. package/dist/publish-file.js +6 -5
  184. package/dist/realpath.d.ts +4 -0
  185. package/dist/realpath.d.ts.map +1 -0
  186. package/dist/realpath.js +43 -0
  187. package/dist/recursive-mkdir-path.d.ts +3 -0
  188. package/dist/recursive-mkdir-path.d.ts.map +1 -0
  189. package/dist/recursive-mkdir-path.js +8 -0
  190. package/dist/replace-directory.d.ts.map +1 -1
  191. package/dist/replace-directory.js +2 -1
  192. package/dist/replace-file-copy-fallback.d.ts.map +1 -1
  193. package/dist/replace-file-copy-fallback.js +23 -31
  194. package/dist/replace-file-copy-source.d.ts.map +1 -1
  195. package/dist/replace-file-copy-source.js +7 -12
  196. package/dist/replace-file-mode.d.ts +3 -0
  197. package/dist/replace-file-mode.d.ts.map +1 -0
  198. package/dist/replace-file-mode.js +10 -0
  199. package/dist/replace-file-temp-owner.d.ts.map +1 -1
  200. package/dist/replace-file-temp-owner.js +6 -2
  201. package/dist/replace-file.d.ts +1 -0
  202. package/dist/replace-file.d.ts.map +1 -1
  203. package/dist/replace-file.js +14 -8
  204. package/dist/root-context.d.ts +3 -0
  205. package/dist/root-context.d.ts.map +1 -1
  206. package/dist/root-context.js +53 -28
  207. package/dist/root-create-input.d.ts +10 -0
  208. package/dist/root-create-input.d.ts.map +1 -0
  209. package/dist/root-create-input.js +80 -0
  210. package/dist/root-directory-list.d.ts +26 -0
  211. package/dist/root-directory-list.d.ts.map +1 -0
  212. package/dist/root-directory-list.js +219 -0
  213. package/dist/root-entries.d.ts +11 -0
  214. package/dist/root-entries.d.ts.map +1 -0
  215. package/dist/root-entries.js +61 -0
  216. package/dist/root-errors.d.ts +6 -5
  217. package/dist/root-errors.d.ts.map +1 -1
  218. package/dist/root-errors.js +16 -12
  219. package/dist/root-file.d.ts +2 -0
  220. package/dist/root-file.d.ts.map +1 -1
  221. package/dist/root-file.js +12 -4
  222. package/dist/root-impl.d.ts +17 -51
  223. package/dist/root-impl.d.ts.map +1 -1
  224. package/dist/root-impl.js +358 -234
  225. package/dist/root-options.d.ts +77 -0
  226. package/dist/root-options.d.ts.map +1 -0
  227. package/dist/root-options.js +18 -0
  228. package/dist/root-path-existing.d.ts +5 -0
  229. package/dist/root-path-existing.d.ts.map +1 -1
  230. package/dist/root-path-existing.js +59 -3
  231. package/dist/root-path-symlink.d.ts.map +1 -1
  232. package/dist/root-path-symlink.js +3 -2
  233. package/dist/root-path.d.ts +1 -0
  234. package/dist/root-path.d.ts.map +1 -1
  235. package/dist/root-path.js +74 -162
  236. package/dist/root-paths.d.ts.map +1 -1
  237. package/dist/root-paths.js +13 -9
  238. package/dist/root-remove.d.ts +5 -0
  239. package/dist/root-remove.d.ts.map +1 -0
  240. package/dist/root-remove.js +286 -0
  241. package/dist/root-symlink-policy.d.ts +14 -0
  242. package/dist/root-symlink-policy.d.ts.map +1 -0
  243. package/dist/root-symlink-policy.js +34 -0
  244. package/dist/root-walk.d.ts +5 -4
  245. package/dist/root-walk.d.ts.map +1 -1
  246. package/dist/root-walk.js +99 -50
  247. package/dist/root-write-mode.d.ts.map +1 -1
  248. package/dist/root-write-mode.js +3 -5
  249. package/dist/root.d.ts +4 -1
  250. package/dist/root.d.ts.map +1 -1
  251. package/dist/secret-file.d.ts.map +1 -1
  252. package/dist/secret-file.js +2 -1
  253. package/dist/secret-read-async.d.ts.map +1 -1
  254. package/dist/secret-read-async.js +2 -1
  255. package/dist/secure-file.d.ts.map +1 -1
  256. package/dist/secure-file.js +25 -8
  257. package/dist/secure-temp-dir.d.ts.map +1 -1
  258. package/dist/secure-temp-dir.js +2 -1
  259. package/dist/sibling-staged-file.d.ts +1 -0
  260. package/dist/sibling-staged-file.d.ts.map +1 -1
  261. package/dist/sibling-staged-file.js +42 -8
  262. package/dist/sibling-temp.d.ts +2 -0
  263. package/dist/sibling-temp.d.ts.map +1 -1
  264. package/dist/sibling-temp.js +6 -4
  265. package/dist/sidecar-lock-acquire.d.ts.map +1 -1
  266. package/dist/sidecar-lock-acquire.js +17 -5
  267. package/dist/sidecar-lock-policy.d.ts +2 -0
  268. package/dist/sidecar-lock-policy.d.ts.map +1 -1
  269. package/dist/sidecar-lock-policy.js +20 -1
  270. package/dist/staged-directory.d.ts.map +1 -1
  271. package/dist/staged-directory.js +4 -3
  272. package/dist/temp-cleanup.d.ts.map +1 -1
  273. package/dist/temp-cleanup.js +3 -2
  274. package/dist/temp-target.d.ts +14 -12
  275. package/dist/temp-target.d.ts.map +1 -1
  276. package/dist/temp-target.js +12 -6
  277. package/dist/timing.d.ts +1 -0
  278. package/dist/timing.d.ts.map +1 -1
  279. package/dist/timing.js +25 -6
  280. package/dist/trash.d.ts.map +1 -1
  281. package/dist/trash.js +9 -7
  282. package/dist/unicode-path.d.ts +3 -0
  283. package/dist/unicode-path.d.ts.map +1 -0
  284. package/dist/unicode-path.js +13 -0
  285. package/dist/walk.d.ts.map +1 -1
  286. package/dist/walk.js +9 -28
  287. package/dist/windows-owner.d.ts +9 -12
  288. package/dist/windows-owner.d.ts.map +1 -1
  289. package/dist/windows-owner.js +24 -58
  290. package/dist/write-file-handle.d.ts +7 -0
  291. package/dist/write-file-handle.d.ts.map +1 -0
  292. package/dist/write-file-handle.js +26 -0
  293. package/docs/advanced.md +22 -4
  294. package/docs/archive.md +44 -9
  295. package/docs/atomic.md +24 -1
  296. package/docs/config.md +1 -0
  297. package/docs/contributing.md +36 -1
  298. package/docs/copy.md +155 -0
  299. package/docs/directory-identity.md +85 -0
  300. package/docs/durability.md +53 -3
  301. package/docs/entries.md +109 -0
  302. package/docs/errors.md +4 -4
  303. package/docs/file-store.md +15 -0
  304. package/docs/guest.md +141 -0
  305. package/docs/in-place-write.md +81 -0
  306. package/docs/index.md +2 -0
  307. package/docs/install.md +31 -0
  308. package/docs/local-roots.md +8 -1
  309. package/docs/native-helper.md +10 -3
  310. package/docs/native.md +18 -1
  311. package/docs/output.md +32 -6
  312. package/docs/path-case.md +64 -0
  313. package/docs/path-scope.md +1 -1
  314. package/docs/permissions.md +29 -10
  315. package/docs/positional-read.md +63 -0
  316. package/docs/public-api.md +31 -2
  317. package/docs/root.md +196 -6
  318. package/docs/secure-file.md +2 -0
  319. package/docs/security-model.md +14 -0
  320. package/docs/sidecar-lock.md +12 -3
  321. package/docs/temp.md +35 -6
  322. package/docs/timing.md +2 -0
  323. package/docs/types.md +19 -12
  324. package/docs/walk.md +54 -5
  325. package/docs/writing.md +173 -5
  326. package/package.json +19 -8
package/dist/filename.js CHANGED
@@ -1,6 +1,7 @@
1
1
  import path from "node:path";
2
2
  import { WINDOWS_RESERVED_DEVICE_NAMES } from "./device-path.js";
3
- const WINDOWS_INVALID_FILE_NAME_CHARACTERS = new Set('<>:"/\\|?*');
3
+ import { maxNormalizedUtf8Bytes } from "./unicode-path.js";
4
+ const INVALID_FILE_NAME_CHARACTERS = /[\u0000-\u001f\u007f-\u009f<>:"/\\|?*]/g;
4
5
  function trimWindowsIgnoredSuffix(value) {
5
6
  let end = value.length;
6
7
  while (end > 0) {
@@ -24,7 +25,7 @@ function suffixWindowsReservedDeviceName(fileName) {
24
25
  }
25
26
  const PORTABLE_FILE_NAME_BYTES = 255;
26
27
  function normalizedFileNameBytes(value) {
27
- return Math.max(Buffer.byteLength(value.normalize("NFC"), "utf8"), Buffer.byteLength(value.normalize("NFD"), "utf8"));
28
+ return maxNormalizedUtf8Bytes(value, true);
28
29
  }
29
30
  /** Keeps short names exact and trims only the filename tail of a composite temp name. */
30
31
  export function fitFileNameToPortableComponent(params) {
@@ -65,17 +66,7 @@ export function sanitizeUntrustedFileName(fileName, fallbackName) {
65
66
  }
66
67
  let base = path.posix.basename(trimmed);
67
68
  base = path.win32.basename(base);
68
- let cleaned = "";
69
- for (let i = 0; i < base.length; i++) {
70
- const code = base.charCodeAt(i);
71
- if (code < 0x20 ||
72
- (code >= 0x7f && code <= 0x9f) ||
73
- WINDOWS_INVALID_FILE_NAME_CHARACTERS.has(base[i])) {
74
- continue;
75
- }
76
- cleaned += base[i];
77
- }
78
- base = cleaned.trim();
69
+ base = base.replace(INVALID_FILE_NAME_CHARACTERS, "").trim();
79
70
  if (!base || base === "." || base === "..") {
80
71
  return fallbackName;
81
72
  }
@@ -8,6 +8,7 @@ export declare function mkdirPathComponentsWithGuards(params: {
8
8
  rootReal: string;
9
9
  targetPath: string;
10
10
  beforeComponent?: (componentPath: string) => Promise<void> | void;
11
+ assertBeforeMutation?: () => void;
11
12
  mode?: number;
12
13
  rejectSymlinks?: boolean;
13
14
  }): Promise<string>;
@@ -1 +1 @@
1
- {"version":3,"file":"guarded-mkdir.d.ts","sourceRoot":"","sources":["../src/guarded-mkdir.ts"],"names":[],"mappings":"AA0BA;;;;;GAKG;AACH,wBAAsB,6BAA6B,CAAC,MAAM,EAAE;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClE,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CAuDlB"}
1
+ {"version":3,"file":"guarded-mkdir.d.ts","sourceRoot":"","sources":["../src/guarded-mkdir.ts"],"names":[],"mappings":"AA2BA;;;;;GAKG;AACH,wBAAsB,6BAA6B,CAAC,MAAM,EAAE;IAC1D,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,CAAC,aAAa,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;IAClE,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,OAAO,CAAC;CAC1B,GAAG,OAAO,CAAC,MAAM,CAAC,CAwDlB"}
@@ -5,13 +5,14 @@ import { assertAsyncDirectoryGuard, createAsyncDirectoryGuard } from "./director
5
5
  import { FsSafeError } from "./errors.js";
6
6
  import { isNotFoundPathError, isPathRelativeEscape } from "./path.js";
7
7
  import { directoryComponentNotDirectoryError } from "./root-errors.js";
8
+ import { realpathSync } from "./realpath.js";
8
9
  function isSameOrChildPath(candidate, parent) {
9
10
  const parentPrefix = parent.endsWith(path.sep) ? parent : `${parent}${path.sep}`;
10
11
  return candidate === parent || candidate.startsWith(parentPrefix);
11
12
  }
12
13
  async function realpathOrThrowNotFile(target) {
13
14
  try {
14
- return path.resolve(fsSync.realpathSync.native(target));
15
+ return path.resolve(realpathSync.native(target));
15
16
  }
16
17
  catch (error) {
17
18
  if (isNotFoundPathError(error)) {
@@ -30,7 +31,7 @@ async function realpathOrThrowNotFile(target) {
30
31
  */
31
32
  export async function mkdirPathComponentsWithGuards(params) {
32
33
  const root = path.resolve(params.rootReal);
33
- const rootCanonical = path.resolve(fsSync.realpathSync.native(root));
34
+ const rootCanonical = path.resolve(realpathSync.native(root));
34
35
  const target = path.resolve(params.targetPath);
35
36
  const relative = path.relative(root, target);
36
37
  if (isPathRelativeEscape(relative)) {
@@ -42,6 +43,7 @@ export async function mkdirPathComponentsWithGuards(params) {
42
43
  const parentGuard = await createAsyncDirectoryGuard(current);
43
44
  await assertAsyncDirectoryGuard(parentGuard);
44
45
  await params.beforeComponent?.(next);
46
+ params.assertBeforeMutation?.();
45
47
  try {
46
48
  await fs.mkdir(next, { mode: params.mode });
47
49
  }
@@ -24,12 +24,14 @@ export declare function guardedRenameSync(params: {
24
24
  }): void;
25
25
  export declare function guardedRm(params: {
26
26
  target: string;
27
+ assertBeforeMutation?: () => void;
27
28
  recursive?: boolean;
28
29
  force?: boolean;
29
30
  verifyAfter?: boolean;
30
31
  }): Promise<void>;
31
32
  export declare function guardedRmSync(params: {
32
33
  target: string;
34
+ assertBeforeMutation?: () => void;
33
35
  recursive?: boolean;
34
36
  force?: boolean;
35
37
  verifyAfter?: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"guarded-mutation.d.ts","sourceRoot":"","sources":["../src/guarded-mutation.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAGnD,OAAO,EAOL,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACxB,MAAM,sBAAsB,CAAC;AAE9B,wBAAsB,wBAAwB,CAAC,CAAC,EAC9C,MAAM,EAAE,SAAS,sBAAsB,EAAE,EACzC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACrE,GACL,OAAO,CAAC,CAAC,CAAC,CAyBZ;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EACvC,MAAM,EAAE,SAAS,kBAAkB,EAAE,EACrC,MAAM,EAAE,MAAM,CAAC,EACf,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,CAAC,CAWH;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC;IACzE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBhB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,IAAI,CAUP;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAYhB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,IAAI,CAWP"}
1
+ {"version":3,"file":"guarded-mutation.d.ts","sourceRoot":"","sources":["../src/guarded-mutation.ts"],"names":[],"mappings":"AAAA,OAAe,EAAE,KAAK,WAAW,EAAE,MAAM,SAAS,CAAC;AAGnD,OAAO,EAOL,KAAK,sBAAsB,EAC3B,KAAK,kBAAkB,EACxB,MAAM,sBAAsB,CAAC;AAE9B,wBAAsB,wBAAwB,CAAC,CAAC,EAC9C,MAAM,EAAE,SAAS,sBAAsB,EAAE,EACzC,MAAM,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,EACxB,OAAO,GAAE;IACP,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,kBAAkB,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,EAAE,KAAK,EAAE,OAAO,KAAK,OAAO,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC;CACrE,GACL,OAAO,CAAC,CAAC,CAAC,CAyBZ;AAED,wBAAgB,uBAAuB,CAAC,CAAC,EACvC,MAAM,EAAE,SAAS,kBAAkB,EAAE,EACrC,MAAM,EAAE,MAAM,CAAC,EACf,OAAO,GAAE;IAAE,WAAW,CAAC,EAAE,OAAO,CAAA;CAAO,GACtC,CAAC,CAWH;AAED,wBAAsB,aAAa,CAAC,MAAM,EAAE;IAC1C,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,IAAI,CAAC,WAAW,EAAE,KAAK,GAAG,KAAK,CAAC,KAAK,IAAI,CAAC;IACzE,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBhB;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE;IACxC,IAAI,EAAE,MAAM,CAAC;IACb,EAAE,EAAE,MAAM,CAAC;IACX,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,IAAI,CAUP;AAED,wBAAsB,SAAS,CAAC,MAAM,EAAE;IACtC,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,OAAO,CAAC,IAAI,CAAC,CAahB;AAED,wBAAgB,aAAa,CAAC,MAAM,EAAE;IACpC,MAAM,EAAE,MAAM,CAAC;IACf,oBAAoB,CAAC,EAAE,MAAM,IAAI,CAAC;IAClC,SAAS,CAAC,EAAE,OAAO,CAAC;IACpB,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,WAAW,CAAC,EAAE,OAAO,CAAC;CACvB,GAAG,IAAI,CAaP"}
@@ -67,6 +67,7 @@ export function guardedRenameSync(params) {
67
67
  export async function guardedRm(params) {
68
68
  const guard = await createAsyncDirectoryGuard(path.dirname(params.target));
69
69
  await withAsyncDirectoryGuards([guard], async () => {
70
+ params.assertBeforeMutation?.();
70
71
  await fs.rm(params.target, {
71
72
  ...(params.recursive !== undefined ? { recursive: params.recursive } : {}),
72
73
  ...(params.force !== undefined ? { force: params.force } : {}),
@@ -75,8 +76,11 @@ export async function guardedRm(params) {
75
76
  }
76
77
  export function guardedRmSync(params) {
77
78
  const guard = createSyncDirectoryGuard(path.dirname(params.target));
78
- withSyncDirectoryGuards([guard], () => fsSync.rmSync(params.target, {
79
- ...(params.recursive !== undefined ? { recursive: params.recursive } : {}),
80
- ...(params.force !== undefined ? { force: params.force } : {}),
81
- }), { verifyAfter: params.verifyAfter });
79
+ withSyncDirectoryGuards([guard], () => {
80
+ params.assertBeforeMutation?.();
81
+ fsSync.rmSync(params.target, {
82
+ ...(params.recursive !== undefined ? { recursive: params.recursive } : {}),
83
+ ...(params.force !== undefined ? { force: params.force } : {}),
84
+ });
85
+ }, { verifyAfter: params.verifyAfter });
82
86
  }
@@ -0,0 +1,2 @@
1
+ export declare const GUEST_FILESYSTEM_DISPATCH_PYTHON: string;
2
+ //# sourceMappingURL=guest-dispatch-python.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guest-dispatch-python.d.ts","sourceRoot":"","sources":["../src/guest-dispatch-python.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,gCAAgC,QAoHjC,CAAC"}
@@ -0,0 +1,117 @@
1
+ export const GUEST_FILESYSTEM_DISPATCH_PYTHON = [
2
+ "if operation == 'copy':",
3
+ " src_root_fd = open_dir(sys.argv[2])",
4
+ " dst_root_fd = open_dir(sys.argv[5])",
5
+ " src_parent_fd = None",
6
+ " dst_parent_fd = None",
7
+ " try:",
8
+ " src_parent_fd = walk_dir(src_root_fd, sys.argv[3], False)",
9
+ " dst_parent_fd = walk_dir(dst_root_fd, sys.argv[6], sys.argv[8] == '1')",
10
+ " copy_file_atomic(src_parent_fd, sys.argv[4], dst_parent_fd, sys.argv[7])",
11
+ " finally:",
12
+ " if src_parent_fd is not None:",
13
+ " os.close(src_parent_fd)",
14
+ " if dst_parent_fd is not None:",
15
+ " os.close(dst_parent_fd)",
16
+ " os.close(src_root_fd)",
17
+ " os.close(dst_root_fd)",
18
+ "elif operation == 'write':",
19
+ " root_fd = open_dir(sys.argv[2])",
20
+ " parent_fd = None",
21
+ " try:",
22
+ " parent_fd = walk_dir(root_fd, sys.argv[3], sys.argv[5] == '1')",
23
+ " write_atomic(parent_fd, sys.argv[4], sys.stdin.buffer)",
24
+ " finally:",
25
+ " if parent_fd is not None:",
26
+ " os.close(parent_fd)",
27
+ " os.close(root_fd)",
28
+ "elif operation == 'create':",
29
+ " root_fd = open_dir(sys.argv[2])",
30
+ " parent_fd = None",
31
+ " try:",
32
+ " parent_fd = walk_dir(root_fd, sys.argv[3], sys.argv[5] == '1')",
33
+ " try:",
34
+ " create_exclusive(parent_fd, sys.argv[4], sys.stdin.buffer)",
35
+ " except FileExistsError:",
36
+ " sys.exit(SANDBOX_CREATE_EXISTS_EXIT_CODE)",
37
+ " finally:",
38
+ " if parent_fd is not None:",
39
+ " os.close(parent_fd)",
40
+ " os.close(root_fd)",
41
+ "elif operation == 'read':",
42
+ " root_fd = open_dir(sys.argv[2])",
43
+ " parent_fd = None",
44
+ " try:",
45
+ " parent_fd = walk_dir(root_fd, sys.argv[3], False)",
46
+ " if len(sys.argv) > 5:",
47
+ " read_file_bounded(parent_fd, sys.argv[4], int(sys.argv[5]))",
48
+ " else:",
49
+ " read_file(parent_fd, sys.argv[4])",
50
+ " except FileNotFoundError:",
51
+ " sys.exit(SANDBOX_READ_NOT_FOUND_EXIT_CODE)",
52
+ " finally:",
53
+ " if parent_fd is not None:",
54
+ " os.close(parent_fd)",
55
+ " os.close(root_fd)",
56
+ "elif operation == 'readdir':",
57
+ " root_fd = open_dir(sys.argv[2])",
58
+ " target_fd = None",
59
+ " try:",
60
+ " target_fd = walk_dir(root_fd, sys.argv[3], False)",
61
+ " with os.scandir(target_fd) as entries:",
62
+ " print(json.dumps([{'name': entry.name, 'isDirectory': entry.is_dir(follow_symlinks=False)} for entry in entries]))",
63
+ " finally:",
64
+ " if target_fd is not None:",
65
+ " os.close(target_fd)",
66
+ " os.close(root_fd)",
67
+ "elif operation == 'mkdirp':",
68
+ " root_fd = open_dir(sys.argv[2])",
69
+ " target_fd = None",
70
+ " try:",
71
+ " target_fd = walk_dir(root_fd, sys.argv[3], True)",
72
+ " os.fsync(target_fd)",
73
+ " finally:",
74
+ " if target_fd is not None:",
75
+ " os.close(target_fd)",
76
+ " os.close(root_fd)",
77
+ "elif operation == 'remove':",
78
+ " root_fd = open_dir(sys.argv[2])",
79
+ " parent_fd = None",
80
+ " try:",
81
+ " parent_fd = walk_dir(root_fd, sys.argv[3], False)",
82
+ " try:",
83
+ " if sys.argv[5] == '1':",
84
+ " remove_tree(parent_fd, sys.argv[4])",
85
+ " else:",
86
+ " entry_stat = os.lstat(sys.argv[4], dir_fd=parent_fd)",
87
+ " if stat.S_ISDIR(entry_stat.st_mode) and not stat.S_ISLNK(entry_stat.st_mode):",
88
+ " os.rmdir(sys.argv[4], dir_fd=parent_fd)",
89
+ " else:",
90
+ " os.unlink(sys.argv[4], dir_fd=parent_fd)",
91
+ " os.fsync(parent_fd)",
92
+ " except FileNotFoundError:",
93
+ " if sys.argv[6] != '1':",
94
+ " raise",
95
+ " finally:",
96
+ " if parent_fd is not None:",
97
+ " os.close(parent_fd)",
98
+ " os.close(root_fd)",
99
+ "elif operation == 'rename':",
100
+ " src_root_fd = open_dir(sys.argv[2])",
101
+ " dst_root_fd = open_dir(sys.argv[5])",
102
+ " src_parent_fd = None",
103
+ " dst_parent_fd = None",
104
+ " try:",
105
+ " src_parent_fd = walk_dir(src_root_fd, sys.argv[3], False)",
106
+ " dst_parent_fd = walk_dir(dst_root_fd, sys.argv[6], sys.argv[8] == '1')",
107
+ " move_entry(src_parent_fd, sys.argv[4], dst_parent_fd, sys.argv[7])",
108
+ " finally:",
109
+ " if src_parent_fd is not None:",
110
+ " os.close(src_parent_fd)",
111
+ " if dst_parent_fd is not None:",
112
+ " os.close(dst_parent_fd)",
113
+ " os.close(src_root_fd)",
114
+ " os.close(dst_root_fd)",
115
+ "else:",
116
+ " raise RuntimeError('unknown sandbox mutation operation: ' + operation)",
117
+ ].join("\n");
@@ -0,0 +1,4 @@
1
+ export declare const GUEST_FILESYSTEM_CREATE_STAGING_PYTHON: string;
2
+ export declare const GUEST_FILESYSTEM_RENAME_NO_REPLACE_PYTHON: string;
3
+ export declare const GUEST_FILESYSTEM_CREATE_EXCLUSIVE_PYTHON: string;
4
+ //# sourceMappingURL=guest-native-python.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guest-native-python.d.ts","sourceRoot":"","sources":["../src/guest-native-python.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,sCAAsC,QA+BvC,CAAC;AAEb,eAAO,MAAM,yCAAyC,QAgD1C,CAAC;AAEb,eAAO,MAAM,wCAAwC,QAqDzC,CAAC"}
@@ -0,0 +1,135 @@
1
+ export const GUEST_FILESYSTEM_CREATE_STAGING_PYTHON = [
2
+ "def create_staging_dir(parent_fd):",
3
+ " # This helper guarantees descriptor-relative confinement and no-replace",
4
+ " # publication, not content integrity against same-UID peers; they can",
5
+ " # also rewrite the destination immediately after publication.",
6
+ " prefix = '.openclaw-create-'",
7
+ " for _ in range(128):",
8
+ " candidate = prefix + secrets.token_hex(6)",
9
+ " try:",
10
+ " os.mkdir(candidate, 0o700, dir_fd=parent_fd)",
11
+ " except FileExistsError:",
12
+ " continue",
13
+ " created_identity = entry_identity(os.lstat(candidate, dir_fd=parent_fd))",
14
+ " staging_fd = None",
15
+ " try:",
16
+ " staging_fd = open_dir(candidate, dir_fd=parent_fd)",
17
+ " if not same_identity(created_identity, os.fstat(staging_fd)):",
18
+ " raise OSError(errno.ESTALE, 'create staging directory changed', candidate)",
19
+ " return candidate, staging_fd",
20
+ " except Exception:",
21
+ " if staging_fd is not None:",
22
+ " os.close(staging_fd)",
23
+ " try:",
24
+ " current = os.lstat(candidate, dir_fd=parent_fd)",
25
+ " if same_identity(created_identity, current):",
26
+ " os.rmdir(candidate, dir_fd=parent_fd)",
27
+ " os.fsync(parent_fd)",
28
+ " except FileNotFoundError:",
29
+ " pass",
30
+ " raise",
31
+ " raise RuntimeError('failed to allocate sandbox create staging directory')",
32
+ ].join("\n");
33
+ export const GUEST_FILESYSTEM_RENAME_NO_REPLACE_PYTHON = [
34
+ "def rename_no_replace(src_parent_fd, src_basename, dst_parent_fd, dst_basename):",
35
+ " libc = ctypes.CDLL(None, use_errno=True)",
36
+ " is_linux = sys.platform.startswith('linux')",
37
+ " if is_linux:",
38
+ " rename_fn = getattr(libc, 'renameat2', None)",
39
+ " if rename_fn is None:",
40
+ " os.link(",
41
+ " src_basename,",
42
+ " dst_basename,",
43
+ " src_dir_fd=src_parent_fd,",
44
+ " dst_dir_fd=dst_parent_fd,",
45
+ " follow_symlinks=False,",
46
+ " )",
47
+ " return",
48
+ " flags = 1 # RENAME_NOREPLACE",
49
+ " elif sys.platform == 'darwin':",
50
+ " rename_fn = getattr(libc, 'renameatx_np', None)",
51
+ " flags = 0x00000004 # RENAME_EXCL",
52
+ " else:",
53
+ " rename_fn = None",
54
+ " flags = 0",
55
+ " if rename_fn is None:",
56
+ " raise OSError(errno.ENOSYS, 'atomic no-replace rename is unavailable')",
57
+ " rename_fn.argtypes = [ctypes.c_int, ctypes.c_char_p, ctypes.c_int, ctypes.c_char_p, ctypes.c_uint]",
58
+ " rename_fn.restype = ctypes.c_int",
59
+ " result = rename_fn(",
60
+ " src_parent_fd,",
61
+ " os.fsencode(src_basename),",
62
+ " dst_parent_fd,",
63
+ " os.fsencode(dst_basename),",
64
+ " flags,",
65
+ " )",
66
+ " if result != 0:",
67
+ " error_code = ctypes.get_errno()",
68
+ " unsupported_codes = {errno.ENOSYS, errno.EINVAL, errno.ENOTSUP}",
69
+ " if hasattr(errno, 'EOPNOTSUPP'):",
70
+ " unsupported_codes.add(errno.EOPNOTSUPP)",
71
+ " if is_linux and error_code in unsupported_codes:",
72
+ " os.link(",
73
+ " src_basename,",
74
+ " dst_basename,",
75
+ " src_dir_fd=src_parent_fd,",
76
+ " dst_dir_fd=dst_parent_fd,",
77
+ " follow_symlinks=False,",
78
+ " )",
79
+ " return",
80
+ " raise OSError(error_code, os.strerror(error_code), dst_basename)",
81
+ ].join("\n");
82
+ export const GUEST_FILESYSTEM_CREATE_EXCLUSIVE_PYTHON = [
83
+ "def create_exclusive(parent_fd, basename, stdin_buffer):",
84
+ " staging_fd = None",
85
+ " staging_name = None",
86
+ " temp_fd = None",
87
+ " temp_name = 'payload'",
88
+ " temp_inode = None",
89
+ " try:",
90
+ " try:",
91
+ " os.lstat(basename, dir_fd=parent_fd)",
92
+ " except FileNotFoundError:",
93
+ " pass",
94
+ " else:",
95
+ " raise FileExistsError(errno.EEXIST, os.strerror(errno.EEXIST), basename)",
96
+ " staging_name, staging_fd = create_staging_dir(parent_fd)",
97
+ " temp_fd = os.open(temp_name, WRITE_FLAGS, 0o600, dir_fd=staging_fd)",
98
+ " while True:",
99
+ " chunk = stdin_buffer.read(65536)",
100
+ " if not chunk:",
101
+ " break",
102
+ " write_all(temp_fd, chunk)",
103
+ " # exclusive create payload is durable before publication",
104
+ " os.fsync(temp_fd)",
105
+ " temp_inode = inode_identity(os.fstat(temp_fd))",
106
+ " # Publish with a native atomic no-replace rename.",
107
+ " rename_no_replace(staging_fd, temp_name, parent_fd, basename)",
108
+ " target_stat = os.lstat(basename, dir_fd=parent_fd)",
109
+ " if temp_inode != inode_identity(target_stat):",
110
+ " raise OSError(errno.ESTALE, 'exclusive publication source changed', basename)",
111
+ " os.fsync(parent_fd)",
112
+ " finally:",
113
+ " if temp_fd is not None:",
114
+ " os.close(temp_fd)",
115
+ " if staging_fd is not None:",
116
+ " # Cleanup stays relative to the private pinned directory, so a",
117
+ " # parent-path substitution cannot redirect payload deletion.",
118
+ " try:",
119
+ " os.unlink(temp_name, dir_fd=staging_fd)",
120
+ " except FileNotFoundError:",
121
+ " pass",
122
+ " staging_identity = entry_identity(os.fstat(staging_fd))",
123
+ " os.close(staging_fd)",
124
+ " staging_removed = False",
125
+ " if staging_name is not None:",
126
+ " try:",
127
+ " current_staging = os.lstat(staging_name, dir_fd=parent_fd)",
128
+ " if same_identity(staging_identity, current_staging):",
129
+ " os.rmdir(staging_name, dir_fd=parent_fd)",
130
+ " staging_removed = True",
131
+ " except FileNotFoundError:",
132
+ " pass",
133
+ " if staging_removed:",
134
+ " os.fsync(parent_fd)",
135
+ ].join("\n");
@@ -0,0 +1,9 @@
1
+ import { GUEST_FILESYSTEM_RENAME_NO_REPLACE_PYTHON } from "./guest-native-python.js";
2
+ /** Exclusive create found an existing destination, including a lost publication race. */
3
+ export declare const GUEST_FILESYSTEM_CREATE_EXISTS_EXIT_CODE = 17;
4
+ /** Read found a missing parent or file after the admitted root was opened. */
5
+ export declare const GUEST_FILESYSTEM_READ_NOT_FOUND_EXIT_CODE = 2;
6
+ /** Python 3 source for the descriptor-relative guest filesystem protocol. See docs/guest.md. */
7
+ export declare const GUEST_FILESYSTEM_PYTHON: string;
8
+ export { GUEST_FILESYSTEM_RENAME_NO_REPLACE_PYTHON };
9
+ //# sourceMappingURL=guest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"guest.d.ts","sourceRoot":"","sources":["../src/guest.ts"],"names":[],"mappings":"AAEA,OAAO,EAGL,yCAAyC,EAC1C,MAAM,0BAA0B,CAAC;AAElC,yFAAyF;AACzF,eAAO,MAAM,wCAAwC,KAAK,CAAC;AAC3D,8EAA8E;AAC9E,eAAO,MAAM,yCAAyC,IAAI,CAAC;AAE3D,gGAAgG;AAChG,eAAO,MAAM,uBAAuB,QAmZxB,CAAC;AAEb,OAAO,EAAE,yCAAyC,EAAE,CAAC"}