toolcraft 0.0.749 → 0.0.751

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 (374) hide show
  1. package/composition.json +23 -3
  2. package/dist/composition.json +23 -3
  3. package/dist/human-in-loop/approvals-commands.d.ts +1 -1
  4. package/dist/index.d.ts +1 -262
  5. package/dist/index.js +1 -573
  6. package/dist/runtime-platform.d.ts +2 -0
  7. package/dist/runtime-platform.js +2 -0
  8. package/dist/runtime-platform.workerd.d.ts +3 -0
  9. package/dist/runtime-platform.workerd.js +10 -0
  10. package/dist/runtime.d.ts +262 -0
  11. package/dist/runtime.js +576 -0
  12. package/node_modules/@noble/hashes/LICENSE +21 -0
  13. package/node_modules/@noble/hashes/README.md +478 -0
  14. package/node_modules/@noble/hashes/_blake.d.ts +20 -0
  15. package/node_modules/@noble/hashes/_blake.js +59 -0
  16. package/node_modules/@noble/hashes/_md.d.ts +95 -0
  17. package/node_modules/@noble/hashes/_md.js +209 -0
  18. package/node_modules/@noble/hashes/_u64.d.ts +36 -0
  19. package/node_modules/@noble/hashes/_u64.js +77 -0
  20. package/node_modules/@noble/hashes/argon2.d.ts +148 -0
  21. package/node_modules/@noble/hashes/argon2.js +577 -0
  22. package/node_modules/@noble/hashes/blake1.d.ts +162 -0
  23. package/node_modules/@noble/hashes/blake1.js +630 -0
  24. package/node_modules/@noble/hashes/blake2.d.ts +203 -0
  25. package/node_modules/@noble/hashes/blake2.js +573 -0
  26. package/node_modules/@noble/hashes/blake3.d.ts +68 -0
  27. package/node_modules/@noble/hashes/blake3.js +310 -0
  28. package/node_modules/@noble/hashes/eskdf.d.ts +91 -0
  29. package/node_modules/@noble/hashes/eskdf.js +225 -0
  30. package/node_modules/@noble/hashes/hkdf.d.ts +70 -0
  31. package/node_modules/@noble/hashes/hkdf.js +152 -0
  32. package/node_modules/@noble/hashes/hmac.d.ts +50 -0
  33. package/node_modules/@noble/hashes/hmac.js +93 -0
  34. package/node_modules/@noble/hashes/index.d.ts +1 -0
  35. package/node_modules/@noble/hashes/index.js +34 -0
  36. package/node_modules/@noble/hashes/legacy.d.ts +107 -0
  37. package/node_modules/@noble/hashes/legacy.js +348 -0
  38. package/node_modules/@noble/hashes/package.json +91 -0
  39. package/node_modules/@noble/hashes/pbkdf2.d.ts +66 -0
  40. package/node_modules/@noble/hashes/pbkdf2.js +176 -0
  41. package/node_modules/@noble/hashes/scrypt.d.ts +98 -0
  42. package/node_modules/@noble/hashes/scrypt.js +304 -0
  43. package/node_modules/@noble/hashes/sha2.d.ts +176 -0
  44. package/node_modules/@noble/hashes/sha2.js +446 -0
  45. package/node_modules/@noble/hashes/sha3-addons.d.ts +533 -0
  46. package/node_modules/@noble/hashes/sha3-addons.js +973 -0
  47. package/node_modules/@noble/hashes/sha3.d.ts +208 -0
  48. package/node_modules/@noble/hashes/sha3.js +475 -0
  49. package/node_modules/@noble/hashes/src/_blake.ts +67 -0
  50. package/node_modules/@noble/hashes/src/_md.ts +227 -0
  51. package/node_modules/@noble/hashes/src/_u64.ts +111 -0
  52. package/node_modules/@noble/hashes/src/argon2.ts +693 -0
  53. package/node_modules/@noble/hashes/src/blake1.ts +677 -0
  54. package/node_modules/@noble/hashes/src/blake2.ts +648 -0
  55. package/node_modules/@noble/hashes/src/blake3.ts +344 -0
  56. package/node_modules/@noble/hashes/src/eskdf.ts +265 -0
  57. package/node_modules/@noble/hashes/src/hkdf.ts +161 -0
  58. package/node_modules/@noble/hashes/src/hmac.ts +130 -0
  59. package/node_modules/@noble/hashes/src/index.ts +33 -0
  60. package/node_modules/@noble/hashes/src/legacy.ts +361 -0
  61. package/node_modules/@noble/hashes/src/pbkdf2.ts +219 -0
  62. package/node_modules/@noble/hashes/src/scrypt.ts +375 -0
  63. package/node_modules/@noble/hashes/src/sha2.ts +486 -0
  64. package/node_modules/@noble/hashes/src/sha3-addons.ts +1157 -0
  65. package/node_modules/@noble/hashes/src/sha3.ts +525 -0
  66. package/node_modules/@noble/hashes/src/utils.ts +978 -0
  67. package/node_modules/@noble/hashes/src/webcrypto.ts +283 -0
  68. package/node_modules/@noble/hashes/utils.d.ts +560 -0
  69. package/node_modules/@noble/hashes/utils.js +687 -0
  70. package/node_modules/@noble/hashes/webcrypto.d.ts +121 -0
  71. package/node_modules/@noble/hashes/webcrypto.js +228 -0
  72. package/node_modules/@poe-code/agent-mcp-config/dist/apply.js +23 -9
  73. package/node_modules/@poe-code/config-mutations/README.md +2 -0
  74. package/node_modules/@poe-code/config-mutations/dist/execution/apply-mutation.js +4 -5
  75. package/node_modules/@poe-code/config-mutations/dist/execution/path-utils.d.ts +3 -4
  76. package/node_modules/@poe-code/config-mutations/dist/execution/path-utils.js +3 -3
  77. package/node_modules/@poe-code/config-mutations/dist/template/render.js +1 -1
  78. package/node_modules/@poe-code/config-mutations/dist/testing/mock-fs.d.ts +2 -2
  79. package/node_modules/@poe-code/config-mutations/dist/testing/mock-fs.js +3 -6
  80. package/node_modules/@poe-code/config-mutations/dist/types.d.ts +4 -2
  81. package/node_modules/@poe-code/process-runner/README.md +2 -1
  82. package/node_modules/@poe-code/process-runner/dist/transfer-filesystem.d.ts +1 -0
  83. package/node_modules/@poe-code/process-runner/dist/transfer-filesystem.js +1 -0
  84. package/node_modules/@poe-code/process-runner/dist/transfer-filesystem.workerd.d.ts +2 -0
  85. package/node_modules/@poe-code/process-runner/dist/transfer-filesystem.workerd.js +1 -0
  86. package/node_modules/@poe-code/process-runner/dist/types.d.ts +1 -1
  87. package/node_modules/@poe-code/process-runner/dist/workspace-transfer.d.ts +6 -5
  88. package/node_modules/@poe-code/process-runner/dist/workspace-transfer.js +67 -29
  89. package/node_modules/@poe-code/process-runner/package.json +13 -0
  90. package/node_modules/@poe-code/safe-fs/LICENSE +21 -0
  91. package/node_modules/@poe-code/safe-fs/PROVENANCE.json +428 -0
  92. package/node_modules/@poe-code/safe-fs/README.md +411 -0
  93. package/node_modules/@poe-code/safe-fs/dist/bridge/confinement.d.ts +3 -0
  94. package/node_modules/@poe-code/safe-fs/dist/bridge/confinement.js +171 -0
  95. package/node_modules/@poe-code/safe-fs/dist/bridge/filesystem.d.ts +93 -0
  96. package/node_modules/@poe-code/safe-fs/dist/bridge/filesystem.js +453 -0
  97. package/node_modules/@poe-code/safe-fs/dist/bridge/index.d.ts +7 -0
  98. package/node_modules/@poe-code/safe-fs/dist/bridge/index.js +19 -0
  99. package/node_modules/@poe-code/safe-fs/dist/bridge/stats.d.ts +4 -0
  100. package/node_modules/@poe-code/safe-fs/dist/bridge/stats.js +37 -0
  101. package/node_modules/@poe-code/safe-fs/dist/bridge/types.d.ts +81 -0
  102. package/node_modules/@poe-code/safe-fs/dist/bridge/types.js +1 -0
  103. package/node_modules/@poe-code/safe-fs/dist/bridge/values.d.ts +6 -0
  104. package/node_modules/@poe-code/safe-fs/dist/bridge/values.js +65 -0
  105. package/node_modules/@poe-code/safe-fs/dist/config/memory.d.ts +3 -0
  106. package/node_modules/@poe-code/safe-fs/dist/config/memory.js +7 -0
  107. package/node_modules/@poe-code/safe-fs/dist/config/real.d.ts +5 -0
  108. package/node_modules/@poe-code/safe-fs/dist/config/real.js +16 -0
  109. package/node_modules/@poe-code/safe-fs/dist/config/registry.d.ts +2 -0
  110. package/node_modules/@poe-code/safe-fs/dist/config/registry.js +15 -0
  111. package/node_modules/@poe-code/safe-fs/dist/config.d.ts +15 -0
  112. package/node_modules/@poe-code/safe-fs/dist/config.js +46 -0
  113. package/node_modules/@poe-code/safe-fs/dist/config.node.d.ts +2 -0
  114. package/node_modules/@poe-code/safe-fs/dist/config.node.js +11 -0
  115. package/node_modules/@poe-code/safe-fs/dist/config.portable.d.ts +3 -0
  116. package/node_modules/@poe-code/safe-fs/dist/config.portable.js +9 -0
  117. package/node_modules/@poe-code/safe-fs/dist/contracts/abort.d.ts +5 -0
  118. package/node_modules/@poe-code/safe-fs/dist/contracts/abort.js +34 -0
  119. package/node_modules/@poe-code/safe-fs/dist/contracts/cleanup.d.ts +1 -0
  120. package/node_modules/@poe-code/safe-fs/dist/contracts/cleanup.js +9 -0
  121. package/node_modules/@poe-code/safe-fs/dist/contracts/descriptor.d.ts +38 -0
  122. package/node_modules/@poe-code/safe-fs/dist/contracts/descriptor.js +1 -0
  123. package/node_modules/@poe-code/safe-fs/dist/contracts/errors.d.ts +53 -0
  124. package/node_modules/@poe-code/safe-fs/dist/contracts/errors.js +99 -0
  125. package/node_modules/@poe-code/safe-fs/dist/contracts/filesystem.d.ts +379 -0
  126. package/node_modules/@poe-code/safe-fs/dist/contracts/filesystem.js +1 -0
  127. package/node_modules/@poe-code/safe-fs/dist/contracts/index.d.ts +6 -0
  128. package/node_modules/@poe-code/safe-fs/dist/contracts/index.js +6 -0
  129. package/node_modules/@poe-code/safe-fs/dist/contracts/io.d.ts +12 -0
  130. package/node_modules/@poe-code/safe-fs/dist/contracts/io.js +321 -0
  131. package/node_modules/@poe-code/safe-fs/dist/contracts/object.d.ts +134 -0
  132. package/node_modules/@poe-code/safe-fs/dist/contracts/object.js +97 -0
  133. package/node_modules/@poe-code/safe-fs/dist/contracts/path.d.ts +3 -0
  134. package/node_modules/@poe-code/safe-fs/dist/contracts/path.js +2 -0
  135. package/node_modules/@poe-code/safe-fs/dist/contracts/portable-path.d.ts +21 -0
  136. package/node_modules/@poe-code/safe-fs/dist/contracts/portable-path.js +78 -0
  137. package/node_modules/@poe-code/safe-fs/dist/contracts/virtual-path.d.ts +15 -0
  138. package/node_modules/@poe-code/safe-fs/dist/contracts/virtual-path.js +162 -0
  139. package/node_modules/@poe-code/safe-fs/dist/core.d.ts +19 -0
  140. package/node_modules/@poe-code/safe-fs/dist/core.js +17 -0
  141. package/node_modules/@poe-code/safe-fs/dist/fs/capabilities.d.ts +10 -0
  142. package/node_modules/@poe-code/safe-fs/dist/fs/capabilities.js +216 -0
  143. package/node_modules/@poe-code/safe-fs/dist/fs/conditional-chmod.d.ts +7 -0
  144. package/node_modules/@poe-code/safe-fs/dist/fs/conditional-chmod.js +19 -0
  145. package/node_modules/@poe-code/safe-fs/dist/fs/descriptor.d.ts +21 -0
  146. package/node_modules/@poe-code/safe-fs/dist/fs/descriptor.js +279 -0
  147. package/node_modules/@poe-code/safe-fs/dist/fs/devices/index.d.ts +59 -0
  148. package/node_modules/@poe-code/safe-fs/dist/fs/devices/index.js +875 -0
  149. package/node_modules/@poe-code/safe-fs/dist/fs/devices/path.d.ts +7 -0
  150. package/node_modules/@poe-code/safe-fs/dist/fs/devices/path.js +250 -0
  151. package/node_modules/@poe-code/safe-fs/dist/fs/devices/stream.d.ts +6 -0
  152. package/node_modules/@poe-code/safe-fs/dist/fs/devices/stream.js +136 -0
  153. package/node_modules/@poe-code/safe-fs/dist/fs/directory-admission.d.ts +3 -0
  154. package/node_modules/@poe-code/safe-fs/dist/fs/directory-admission.js +14 -0
  155. package/node_modules/@poe-code/safe-fs/dist/fs/memory/atomic-view.d.ts +11 -0
  156. package/node_modules/@poe-code/safe-fs/dist/fs/memory/atomic-view.js +13 -0
  157. package/node_modules/@poe-code/safe-fs/dist/fs/memory/index.d.ts +186 -0
  158. package/node_modules/@poe-code/safe-fs/dist/fs/memory/index.js +3771 -0
  159. package/node_modules/@poe-code/safe-fs/dist/fs/memory/ledger.d.ts +26 -0
  160. package/node_modules/@poe-code/safe-fs/dist/fs/memory/ledger.js +96 -0
  161. package/node_modules/@poe-code/safe-fs/dist/fs/memory/limits.d.ts +13 -0
  162. package/node_modules/@poe-code/safe-fs/dist/fs/memory/limits.js +26 -0
  163. package/node_modules/@poe-code/safe-fs/dist/fs/memory/missing-target.d.ts +15 -0
  164. package/node_modules/@poe-code/safe-fs/dist/fs/memory/missing-target.js +144 -0
  165. package/node_modules/@poe-code/safe-fs/dist/fs/mount/comparison.d.ts +19 -0
  166. package/node_modules/@poe-code/safe-fs/dist/fs/mount/comparison.js +118 -0
  167. package/node_modules/@poe-code/safe-fs/dist/fs/mount/identity.d.ts +6 -0
  168. package/node_modules/@poe-code/safe-fs/dist/fs/mount/identity.js +29 -0
  169. package/node_modules/@poe-code/safe-fs/dist/fs/mount/index.d.ts +74 -0
  170. package/node_modules/@poe-code/safe-fs/dist/fs/mount/index.js +1291 -0
  171. package/node_modules/@poe-code/safe-fs/dist/fs/object-authority.d.ts +27 -0
  172. package/node_modules/@poe-code/safe-fs/dist/fs/object-authority.js +287 -0
  173. package/node_modules/@poe-code/safe-fs/dist/fs/object-publication/index.d.ts +45 -0
  174. package/node_modules/@poe-code/safe-fs/dist/fs/object-publication/index.js +531 -0
  175. package/node_modules/@poe-code/safe-fs/dist/fs/overlay/index.d.ts +87 -0
  176. package/node_modules/@poe-code/safe-fs/dist/fs/overlay/index.js +1185 -0
  177. package/node_modules/@poe-code/safe-fs/dist/fs/overlay/memory-publication.d.ts +42 -0
  178. package/node_modules/@poe-code/safe-fs/dist/fs/overlay/memory-publication.js +558 -0
  179. package/node_modules/@poe-code/safe-fs/dist/fs/path-namespace.d.ts +4 -0
  180. package/node_modules/@poe-code/safe-fs/dist/fs/path-namespace.js +63 -0
  181. package/node_modules/@poe-code/safe-fs/dist/fs/quota/index.d.ts +12 -0
  182. package/node_modules/@poe-code/safe-fs/dist/fs/quota/index.js +520 -0
  183. package/node_modules/@poe-code/safe-fs/dist/fs/readonly/index.d.ts +37 -0
  184. package/node_modules/@poe-code/safe-fs/dist/fs/readonly/index.js +208 -0
  185. package/node_modules/@poe-code/safe-fs/dist/fs/real/allocation.d.ts +1 -0
  186. package/node_modules/@poe-code/safe-fs/dist/fs/real/allocation.js +8 -0
  187. package/node_modules/@poe-code/safe-fs/dist/fs/real/index.d.ts +105 -0
  188. package/node_modules/@poe-code/safe-fs/dist/fs/real/index.js +1259 -0
  189. package/node_modules/@poe-code/safe-fs/dist/fs/s3/authority.d.ts +7 -0
  190. package/node_modules/@poe-code/safe-fs/dist/fs/s3/authority.js +38 -0
  191. package/node_modules/@poe-code/safe-fs/dist/fs/s3/filesystem.d.ts +130 -0
  192. package/node_modules/@poe-code/safe-fs/dist/fs/s3/filesystem.js +1137 -0
  193. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/bytes.d.ts +1 -0
  194. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/bytes.js +9 -0
  195. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/index.d.ts +2 -0
  196. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/index.js +1 -0
  197. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/request-fetch.d.ts +15 -0
  198. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/request-fetch.js +74 -0
  199. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/request-node.d.ts +4 -0
  200. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/request-node.js +111 -0
  201. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/request.d.ts +17 -0
  202. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/request.js +89 -0
  203. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/signature.d.ts +20 -0
  204. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/signature.js +76 -0
  205. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/transport.d.ts +3 -0
  206. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/transport.js +478 -0
  207. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/types.d.ts +30 -0
  208. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/types.js +1 -0
  209. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/xml.d.ts +14 -0
  210. package/node_modules/@poe-code/safe-fs/dist/fs/s3/http/xml.js +192 -0
  211. package/node_modules/@poe-code/safe-fs/dist/fs/s3/index.d.ts +8 -0
  212. package/node_modules/@poe-code/safe-fs/dist/fs/s3/index.js +4 -0
  213. package/node_modules/@poe-code/safe-fs/dist/fs/s3/key-order.d.ts +2 -0
  214. package/node_modules/@poe-code/safe-fs/dist/fs/s3/key-order.js +11 -0
  215. package/node_modules/@poe-code/safe-fs/dist/fs/s3/manifest-admission.d.ts +8 -0
  216. package/node_modules/@poe-code/safe-fs/dist/fs/s3/manifest-admission.js +167 -0
  217. package/node_modules/@poe-code/safe-fs/dist/fs/s3/mock.d.ts +48 -0
  218. package/node_modules/@poe-code/safe-fs/dist/fs/s3/mock.js +249 -0
  219. package/node_modules/@poe-code/safe-fs/dist/fs/s3/namespace.d.ts +13 -0
  220. package/node_modules/@poe-code/safe-fs/dist/fs/s3/namespace.js +400 -0
  221. package/node_modules/@poe-code/safe-fs/dist/fs/s3/registry.d.ts +10 -0
  222. package/node_modules/@poe-code/safe-fs/dist/fs/s3/registry.js +73 -0
  223. package/node_modules/@poe-code/safe-fs/dist/fs/s3/transport.d.ts +103 -0
  224. package/node_modules/@poe-code/safe-fs/dist/fs/s3/transport.js +28 -0
  225. package/node_modules/@poe-code/safe-fs/dist/fs/scoped.d.ts +19 -0
  226. package/node_modules/@poe-code/safe-fs/dist/fs/scoped.js +663 -0
  227. package/node_modules/@poe-code/safe-fs/dist/fs/staging-ancestry.d.ts +8 -0
  228. package/node_modules/@poe-code/safe-fs/dist/fs/staging-ancestry.js +115 -0
  229. package/node_modules/@poe-code/safe-fs/dist/fs/staging-cleanup.d.ts +5 -0
  230. package/node_modules/@poe-code/safe-fs/dist/fs/staging-cleanup.js +63 -0
  231. package/node_modules/@poe-code/safe-fs/dist/fs/webdav/index.d.ts +2 -0
  232. package/node_modules/@poe-code/safe-fs/dist/fs/webdav/index.js +1 -0
  233. package/node_modules/@poe-code/safe-fs/dist/fs/webdav/resource-id.d.ts +18 -0
  234. package/node_modules/@poe-code/safe-fs/dist/fs/webdav/resource-id.js +109 -0
  235. package/node_modules/@poe-code/safe-fs/dist/fs/webdav/webdav.d.ts +141 -0
  236. package/node_modules/@poe-code/safe-fs/dist/fs/webdav/webdav.js +1377 -0
  237. package/node_modules/@poe-code/safe-fs/dist/fs/webdav/xml.d.ts +15 -0
  238. package/node_modules/@poe-code/safe-fs/dist/fs/webdav/xml.js +59 -0
  239. package/node_modules/@poe-code/safe-fs/dist/index.d.ts +25 -0
  240. package/node_modules/@poe-code/safe-fs/dist/index.js +21 -0
  241. package/node_modules/@poe-code/safe-fs/dist/native/fs-seek/linux-x64-glibc.node +0 -0
  242. package/node_modules/@poe-code/safe-fs/dist/native/fs-seek/loader.d.ts +5 -0
  243. package/node_modules/@poe-code/safe-fs/dist/native/fs-seek/loader.mjs +120 -0
  244. package/node_modules/@poe-code/safe-fs/dist/native/fs-seek/manifest.json +46 -0
  245. package/node_modules/@poe-code/safe-fs/dist/node/filesystem.d.ts +19 -0
  246. package/node_modules/@poe-code/safe-fs/dist/node/filesystem.js +30 -0
  247. package/node_modules/@poe-code/safe-fs/dist/node/host.d.ts +3 -0
  248. package/node_modules/@poe-code/safe-fs/dist/node/host.js +78 -0
  249. package/node_modules/@poe-code/safe-fs/dist/node/index.d.ts +3 -0
  250. package/node_modules/@poe-code/safe-fs/dist/node/index.js +2 -0
  251. package/node_modules/@poe-code/safe-fs/dist/node/native-seek-unavailable.d.ts +1 -0
  252. package/node_modules/@poe-code/safe-fs/dist/node/native-seek-unavailable.js +5 -0
  253. package/node_modules/@poe-code/safe-fs/dist/node/native-seek.d.ts +3 -0
  254. package/node_modules/@poe-code/safe-fs/dist/node/native-seek.js +54 -0
  255. package/node_modules/@poe-code/safe-fs/dist/node/stats.d.ts +1 -0
  256. package/node_modules/@poe-code/safe-fs/dist/node/stats.js +1 -0
  257. package/node_modules/@poe-code/safe-fs/dist/node/values.d.ts +1 -0
  258. package/node_modules/@poe-code/safe-fs/dist/node/values.js +1 -0
  259. package/node_modules/@poe-code/safe-fs/dist/node-host.d.ts +1 -0
  260. package/node_modules/@poe-code/safe-fs/dist/node-host.js +1 -0
  261. package/node_modules/@poe-code/safe-fs/dist/node-unavailable.d.ts +1 -0
  262. package/node_modules/@poe-code/safe-fs/dist/node-unavailable.js +1 -0
  263. package/node_modules/@poe-code/safe-fs/dist/package.json +29 -0
  264. package/node_modules/@poe-code/safe-fs/dist/platform/browser-path.d.ts +1 -0
  265. package/node_modules/@poe-code/safe-fs/dist/platform/browser-path.js +1 -0
  266. package/node_modules/@poe-code/safe-fs/dist/platform/browser.d.ts +26 -0
  267. package/node_modules/@poe-code/safe-fs/dist/platform/browser.js +58 -0
  268. package/node_modules/@poe-code/safe-fs/dist/platform/node-path.d.ts +1 -0
  269. package/node_modules/@poe-code/safe-fs/dist/platform/node-path.js +1 -0
  270. package/node_modules/@poe-code/safe-fs/dist/platform/node.d.ts +26 -0
  271. package/node_modules/@poe-code/safe-fs/dist/platform/node.js +64 -0
  272. package/node_modules/@poe-code/safe-fs/dist/platform/transport-budget.d.ts +9 -0
  273. package/node_modules/@poe-code/safe-fs/dist/platform/transport-budget.js +17 -0
  274. package/node_modules/@poe-code/safe-fs/dist/python/emscripten.d.ts +15 -0
  275. package/node_modules/@poe-code/safe-fs/dist/python/emscripten.js +357 -0
  276. package/node_modules/@poe-code/safe-fs/dist/python/filesystem.d.ts +51 -0
  277. package/node_modules/@poe-code/safe-fs/dist/python/filesystem.js +243 -0
  278. package/node_modules/@poe-code/safe-fs/dist/python/flags.d.ts +3 -0
  279. package/node_modules/@poe-code/safe-fs/dist/python/flags.js +14 -0
  280. package/node_modules/@poe-code/safe-fs/dist/python/index.d.ts +9 -0
  281. package/node_modules/@poe-code/safe-fs/dist/python/index.js +5 -0
  282. package/node_modules/@poe-code/safe-fs/dist/python/native.d.ts +18 -0
  283. package/node_modules/@poe-code/safe-fs/dist/python/native.js +446 -0
  284. package/node_modules/@poe-code/safe-fs/dist/python/request.d.ts +2 -0
  285. package/node_modules/@poe-code/safe-fs/dist/python/request.js +61 -0
  286. package/node_modules/@poe-code/safe-fs/dist/python/stat.d.ts +8 -0
  287. package/node_modules/@poe-code/safe-fs/dist/python/stat.js +34 -0
  288. package/node_modules/@poe-code/safe-fs/dist/runtime-core.d.ts +27 -0
  289. package/node_modules/@poe-code/safe-fs/dist/runtime-core.js +57 -0
  290. package/node_modules/@poe-code/safe-fs/dist/testing/atomic-filesystem.d.ts +16 -0
  291. package/node_modules/@poe-code/safe-fs/dist/testing/atomic-filesystem.js +496 -0
  292. package/node_modules/@poe-code/safe-fs/dist/testing/object-io-control.d.ts +23 -0
  293. package/node_modules/@poe-code/safe-fs/dist/testing/object-io-control.js +39 -0
  294. package/node_modules/@poe-code/safe-fs/dist/testing/object-io-metrics.d.ts +31 -0
  295. package/node_modules/@poe-code/safe-fs/dist/testing/object-io-metrics.js +143 -0
  296. package/node_modules/@poe-code/safe-fs/dist/testing/object-publication.d.ts +19 -0
  297. package/node_modules/@poe-code/safe-fs/dist/testing/object-publication.js +209 -0
  298. package/node_modules/@poe-code/safe-fs/dist/xml.d.ts +1 -0
  299. package/node_modules/@poe-code/safe-fs/dist/xml.js +1 -0
  300. package/node_modules/@poe-code/safe-fs/package.json +189 -0
  301. package/node_modules/@poe-code/task-list/README.md +2 -0
  302. package/node_modules/@poe-code/task-list/dist/backends/gh-issues-client.d.ts +1 -1
  303. package/node_modules/@poe-code/task-list/dist/backends/gh-issues-client.js +11 -4
  304. package/node_modules/@poe-code/task-list/dist/backends/markdown-dir.js +2 -2
  305. package/node_modules/@poe-code/task-list/dist/backends/utils.js +5 -7
  306. package/node_modules/@poe-code/task-list/dist/backends/yaml-file.js +1 -1
  307. package/node_modules/@poe-code/task-list/dist/default-host.d.ts +2 -0
  308. package/node_modules/@poe-code/task-list/dist/default-host.js +2 -0
  309. package/node_modules/@poe-code/task-list/dist/default-host.workerd.d.ts +4 -0
  310. package/node_modules/@poe-code/task-list/dist/default-host.workerd.js +6 -0
  311. package/node_modules/@poe-code/task-list/dist/filesystem.d.ts +3 -0
  312. package/node_modules/@poe-code/task-list/dist/filesystem.js +32 -0
  313. package/node_modules/@poe-code/task-list/dist/move.js +3 -3
  314. package/node_modules/@poe-code/task-list/dist/open.js +2 -5
  315. package/node_modules/@poe-code/task-list/dist/paths.d.ts +12 -0
  316. package/node_modules/@poe-code/task-list/dist/paths.js +7 -0
  317. package/node_modules/@poe-code/task-list/dist/types.d.ts +6 -5
  318. package/node_modules/@poe-code/task-list/package.json +9 -0
  319. package/node_modules/@poe-code/terminal-text/LICENSE +21 -0
  320. package/node_modules/@poe-code/terminal-text/README.md +12 -0
  321. package/node_modules/@poe-code/terminal-text/dist/index.d.ts +2 -0
  322. package/node_modules/@poe-code/terminal-text/dist/index.js +20 -0
  323. package/node_modules/@poe-code/terminal-text/package.json +22 -0
  324. package/node_modules/@poe-code/xml-ast/LICENSE +21 -0
  325. package/node_modules/@poe-code/xml-ast/README.md +28 -0
  326. package/node_modules/@poe-code/xml-ast/dist/index.d.ts +47 -0
  327. package/node_modules/@poe-code/xml-ast/dist/index.js +635 -0
  328. package/node_modules/@poe-code/xml-ast/package.json +25 -0
  329. package/node_modules/auth-store/README.md +35 -0
  330. package/node_modules/auth-store/dist/index.browser.d.ts +4 -0
  331. package/node_modules/auth-store/dist/index.browser.js +2 -0
  332. package/node_modules/auth-store/dist/provider-store.d.ts +1 -1
  333. package/node_modules/auth-store/dist/safe-fs-secret-store.d.ts +21 -0
  334. package/node_modules/auth-store/dist/safe-fs-secret-store.js +119 -0
  335. package/node_modules/auth-store/dist/secret-store.d.ts +12 -0
  336. package/node_modules/auth-store/dist/secret-store.js +1 -0
  337. package/node_modules/auth-store/dist/transaction-lock.d.ts +2 -4
  338. package/node_modules/auth-store/dist/types.d.ts +2 -9
  339. package/node_modules/auth-store/package.json +16 -2
  340. package/node_modules/tiny-http-mcp-server/dist/composition.json +16 -1
  341. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/README.md +25 -0
  342. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/client/authorization-state.js +4 -4
  343. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/client/default-oauth-client-provider.js +6 -40
  344. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/client/oauth-form.d.ts +10 -0
  345. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/client/oauth-form.js +20 -0
  346. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/client/pkce.js +4 -3
  347. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/client/register-client.d.ts +14 -0
  348. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/client/register-client.js +53 -0
  349. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/client/resumable.d.ts +16 -2
  350. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/client/resumable.js +29 -9
  351. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/client/revoke-token.d.ts +12 -0
  352. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/client/revoke-token.js +23 -0
  353. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/client/token-endpoint.js +6 -19
  354. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/http-fetch.js +1 -1
  355. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/index.browser.d.ts +6 -2
  356. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/index.browser.js +5 -1
  357. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/index.d.ts +5 -2
  358. package/node_modules/tiny-http-mcp-server/node_modules/mcp-oauth/dist/index.js +4 -1
  359. package/node_modules/tiny-http-mcp-server/package.json +4 -4
  360. package/node_modules/tiny-mcp-client/README.md +2 -0
  361. package/node_modules/tiny-mcp-client/dist/index.browser.d.ts +25 -23
  362. package/node_modules/tiny-mcp-client/dist/index.browser.js +116 -1
  363. package/node_modules/tiny-mcp-client/dist/index.d.ts +25 -23
  364. package/node_modules/tiny-mcp-client/dist/index.js +1034 -561
  365. package/node_modules/tiny-mcp-client/package.json +15 -0
  366. package/node_modules/tiny-stdio-mcp-server/dist/composition.json +1 -1
  367. package/node_modules/toolcraft-design/dist/components/table.js +6 -0
  368. package/node_modules/toolcraft-design/dist/escape-terminal-text.d.ts +1 -2
  369. package/node_modules/toolcraft-design/dist/escape-terminal-text.js +1 -20
  370. package/node_modules/toolcraft-design/dist/terminal-markdown/parser/frontmatter.js +2 -1
  371. package/node_modules/toolcraft-design/dist/terminal-markdown/parser.js +2 -1
  372. package/node_modules/toolcraft-schema/dist/json-schema/utils.js +3 -0
  373. package/node_modules/toolcraft-schema/package.json +1 -1
  374. package/package.json +32 -7
@@ -0,0 +1,531 @@
1
+ import { composeAbortSignals } from "../../contracts/abort.js";
2
+ import { finishCleanup } from "../../contracts/cleanup.js";
3
+ import { FsError } from "../../contracts/errors.js";
4
+ import { validatePath } from "../../contracts/virtual-path.js";
5
+ import { openFileDescriptor } from "../descriptor.js";
6
+ export function withObjectFileDescriptors(filesystem, store, options = {}) {
7
+ const chunkBytes = options.chunkBytes ?? 65536;
8
+ const maxStagedBytes = options.maxStagedBytes ?? Infinity;
9
+ const maxStagedPages = options.maxStagedPages ?? Infinity;
10
+ const maxFileBytes = options.maxFileBytes ?? Infinity;
11
+ const maxOpenFiles = options.maxOpenFiles ?? Infinity;
12
+ if (!Number.isSafeInteger(chunkBytes) || chunkBytes < 1
13
+ || ![maxStagedBytes, maxStagedPages, maxFileBytes, maxOpenFiles].every(value => value === Infinity || Number.isSafeInteger(value) && value > 0)
14
+ || store.noFollow !== undefined && typeof store.noFollow !== "boolean"
15
+ || typeof store.acquire !== "function"
16
+ || store.publish !== undefined && typeof store.publish !== "function"
17
+ || store.createStaging !== undefined && typeof store.createStaging !== "function")
18
+ throw new TypeError("Invalid object descriptor configuration");
19
+ const createStaging = store.createStaging?.bind(store);
20
+ const defaultIdentityScope = Symbol("object-file-descriptors");
21
+ const withIdentity = (stat) => stat.type === "file" && stat.identityScope === undefined ? { ...stat, identityScope: defaultIdentityScope } : stat;
22
+ let stagedBytes = 0;
23
+ let openFiles = 0;
24
+ const stagingWaiters = new Set();
25
+ const reservePage = async (path, forwarded) => {
26
+ if (maxStagedBytes < chunkBytes)
27
+ throw new FsError("ENOSPC", { path, message: "Object staging requires at least one page of working memory" });
28
+ while (stagedBytes + chunkBytes > maxStagedBytes || stagedBytes / chunkBytes >= maxStagedPages) {
29
+ forwarded.signal?.throwIfAborted();
30
+ await new Promise((resolve, reject) => {
31
+ const wake = () => {
32
+ stagingWaiters.delete(wake);
33
+ forwarded.signal?.removeEventListener("abort", abort);
34
+ resolve();
35
+ };
36
+ const abort = () => {
37
+ stagingWaiters.delete(wake);
38
+ forwarded.signal?.removeEventListener("abort", abort);
39
+ reject(forwarded.signal?.reason);
40
+ };
41
+ stagingWaiters.add(wake);
42
+ forwarded.signal?.addEventListener("abort", abort, { once: true });
43
+ if (forwarded.signal?.aborted)
44
+ abort();
45
+ });
46
+ }
47
+ forwarded.signal?.throwIfAborted();
48
+ stagedBytes += chunkBytes;
49
+ };
50
+ const releasePage = () => {
51
+ stagedBytes -= chunkBytes;
52
+ for (const wake of stagingWaiters)
53
+ wake();
54
+ };
55
+ const version = (value) => {
56
+ if (!value || typeof value.revision !== "string" || value.revision.length === 0 || value.revision.length > 4096
57
+ || value.publicationToken !== undefined && (typeof value.publicationToken !== "string" || value.publicationToken.length === 0 || value.publicationToken.length > 4096)
58
+ || !value.stat || value.stat.type !== "file" || !Number.isSafeInteger(value.stat.size) || value.stat.size < 0
59
+ || !Number.isSafeInteger(value.stat.mode) || value.stat.mode < 0 || value.stat.mode > 0o177777
60
+ || ![value.stat.mtimeMs, value.stat.atimeMs, value.stat.ctimeMs].every(Number.isFinite)
61
+ || typeof value.read !== "function" || typeof value.close !== "function")
62
+ throw new FsError("EIO", { message: "Invalid immutable object version" });
63
+ if (value.stat.size > maxFileBytes)
64
+ throw new FsError("EFBIG", { message: "Object descriptor file limit exceeded" });
65
+ return Object.freeze({ revision: value.revision, ...(value.publicationToken === undefined ? {} : { publicationToken: value.publicationToken }), stat: Object.freeze(withIdentity(value.stat)), read: value.read.bind(value), close: value.close.bind(value) });
66
+ };
67
+ const clearPages = (state) => {
68
+ stagedBytes -= state.pages.size * chunkBytes;
69
+ state.pages.clear();
70
+ };
71
+ const open = (path, openOptions) => openFileDescriptor(path, openOptions, {
72
+ publication: "conditional", position: true, positionedRead: true, positionedWrite: true, noFollow: store.noFollow === true,
73
+ truncate: true, synchronization: "storage",
74
+ }, async (admitted) => {
75
+ validatePath(path);
76
+ if (path.length === 0)
77
+ throw new FsError("ENOENT", { path });
78
+ if (openFiles >= maxOpenFiles)
79
+ throw new FsError("EMFILE", { path });
80
+ openFiles++;
81
+ let acquiring = true;
82
+ const state = { head: undefined, position: 0, size: 0, inheritedSize: 0, modifiedAt: Date.now(), dirty: false, pages: new Map(), staging: undefined, failure: undefined };
83
+ const check = (forwarded) => {
84
+ if (acquiring)
85
+ admitted.signal?.throwIfAborted();
86
+ forwarded.signal?.throwIfAborted();
87
+ if (state.failure)
88
+ throw state.failure.reason;
89
+ };
90
+ const perform = async (forwarded, action) => {
91
+ check(forwarded);
92
+ const scope = composeAbortSignals([...(acquiring && admitted.signal ? [admitted.signal] : []), ...(forwarded.signal ? [forwarded.signal] : [])]);
93
+ try {
94
+ const result = await action({ signal: scope.signal });
95
+ scope.signal.throwIfAborted();
96
+ return result;
97
+ }
98
+ catch (error) {
99
+ scope.signal.throwIfAborted();
100
+ throw error;
101
+ }
102
+ finally {
103
+ scope.dispose();
104
+ }
105
+ };
106
+ const readBase = async (position, length, forwarded) => {
107
+ const count = Math.min(length, Math.max(0, state.inheritedSize - position));
108
+ if (count === 0 || !state.head)
109
+ return new Uint8Array();
110
+ const data = await perform(forwarded, selected => state.head.read(position, count, selected));
111
+ if (!(data instanceof Uint8Array) || data.byteLength !== count)
112
+ throw new FsError("EIO", { path, message: "Immutable range read returned an invalid byte count" });
113
+ return Uint8Array.from(data);
114
+ };
115
+ const readStagedPage = async (page, forwarded) => {
116
+ const bytes = await perform(forwarded, selected => state.staging.readPage(page, selected));
117
+ if (bytes !== undefined && (!(bytes instanceof Uint8Array) || bytes.byteLength !== chunkBytes))
118
+ throw new FsError("EIO", { path, message: "Invalid object staging page" });
119
+ return bytes;
120
+ };
121
+ const retireStaging = async () => {
122
+ const staging = state.staging;
123
+ state.staging = undefined;
124
+ if (typeof staging?.close === "function")
125
+ await staging.close();
126
+ };
127
+ const read = async (buffer, position, forwarded) => {
128
+ check(forwarded);
129
+ const count = Math.min(buffer.byteLength, Math.max(0, state.size - position));
130
+ let copied = 0;
131
+ while (copied < count) {
132
+ const offset = position + copied;
133
+ const page = Math.floor(offset / chunkBytes);
134
+ const within = offset % chunkBytes;
135
+ const length = Math.min(count - copied, chunkBytes - within);
136
+ const staged = state.pages.get(page);
137
+ if (staged)
138
+ buffer.set(staged.subarray(within, within + length), copied);
139
+ else if (state.staging) {
140
+ await reservePage(path, forwarded);
141
+ try {
142
+ const spilled = await readStagedPage(page, forwarded);
143
+ if (spilled)
144
+ buffer.set(spilled.subarray(within, within + length), copied);
145
+ else {
146
+ buffer.fill(0, copied, copied + length);
147
+ buffer.set(await readBase(offset, length, forwarded), copied);
148
+ }
149
+ }
150
+ finally {
151
+ releasePage();
152
+ }
153
+ }
154
+ else {
155
+ buffer.fill(0, copied, copied + length);
156
+ buffer.set(await readBase(offset, length, forwarded), copied);
157
+ }
158
+ copied += length;
159
+ }
160
+ return count;
161
+ };
162
+ const flush = async (forwarded) => {
163
+ check(forwarded);
164
+ if (!state.dirty)
165
+ return;
166
+ if (!store.publish)
167
+ throw new FsError("ENOTSUP", { path, message: "Object writes require authoritative conditional publication" });
168
+ const expected = state.head?.revision ?? null;
169
+ let emitted = 0;
170
+ let active = true;
171
+ let received;
172
+ let source;
173
+ const streamAbort = new AbortController();
174
+ let streamScope;
175
+ try {
176
+ await perform(forwarded, async (selected) => {
177
+ streamScope = composeAbortSignals([...(selected.signal ? [selected.signal] : []), streamAbort.signal]);
178
+ const bodyOptions = { signal: streamScope.signal };
179
+ source = (async function* () {
180
+ for (let position = 0; position < state.size; position += chunkBytes) {
181
+ if (!active)
182
+ throw new FsError("EBADF", { path });
183
+ const bytes = new Uint8Array(Math.min(chunkBytes, state.size - position));
184
+ await read(bytes, position, bodyOptions);
185
+ emitted += bytes.length;
186
+ yield bytes;
187
+ }
188
+ })();
189
+ received = await store.publish(path, expected, source, { ...selected, ...(state.head?.publicationToken === undefined ? {} : { previousToken: state.head.publicationToken }), size: state.size, mode: (state.head?.stat.mode ?? admitted.mode) & 0o7777 });
190
+ });
191
+ const published = version(received);
192
+ if (emitted !== state.size || published.stat.size !== state.size || published.revision === expected)
193
+ throw new FsError("EIO", { path, message: "Invalid conditional publication acknowledgement" });
194
+ const previous = state.head;
195
+ state.head = published;
196
+ received = undefined;
197
+ state.inheritedSize = state.size;
198
+ state.modifiedAt = published.stat.mtimeMs;
199
+ state.dirty = false;
200
+ clearPages(state);
201
+ let retirementFailed = true;
202
+ try {
203
+ await retireStaging();
204
+ retirementFailed = false;
205
+ }
206
+ finally {
207
+ await finishCleanup(() => previous?.close(), retirementFailed);
208
+ }
209
+ }
210
+ catch (reason) {
211
+ state.failure = { reason };
212
+ if (received)
213
+ await finishCleanup(() => received.close(), true);
214
+ throw reason;
215
+ }
216
+ finally {
217
+ active = false;
218
+ streamAbort.abort(new FsError("ECANCELED", { path, syscall: "object publication stream" }));
219
+ try {
220
+ await finishCleanup(() => source?.return(undefined), state.failure !== undefined);
221
+ }
222
+ finally {
223
+ streamScope?.dispose();
224
+ }
225
+ }
226
+ };
227
+ try {
228
+ const capabilities = await filesystem.capabilitiesFor?.(path, admitted) ?? filesystem.capabilities;
229
+ check(admitted);
230
+ const mutating = admitted.access !== "read" || admitted.creation !== "never" || admitted.truncate;
231
+ if (mutating && capabilities.readOnly === true)
232
+ throw new FsError("EROFS", { path });
233
+ if (mutating && (!store.publish || capabilities.write === false))
234
+ throw new FsError("ENOTSUP", { path, message: "Object writes require authoritative conditional publication" });
235
+ if (admitted.access !== "write" && capabilities.read === false)
236
+ throw new FsError("EACCES", { path });
237
+ const acquired = await store.acquire(path, { access: admitted.access, ...(admitted.noFollow ? { noFollow: true } : {}), ...(admitted.signal ? { signal: admitted.signal } : {}) });
238
+ if (acquired) {
239
+ try {
240
+ state.head = version(acquired);
241
+ }
242
+ catch (error) {
243
+ await finishCleanup(() => acquired.close(), true);
244
+ throw error;
245
+ }
246
+ }
247
+ check(admitted);
248
+ if (state.head && admitted.creation === "exclusive")
249
+ throw new FsError("EEXIST", { path });
250
+ if (!state.head && admitted.creation === "never")
251
+ throw new FsError("ENOENT", { path });
252
+ state.size = state.head?.stat.size ?? 0;
253
+ state.inheritedSize = state.size;
254
+ state.modifiedAt = state.head?.stat.mtimeMs ?? Date.now();
255
+ if (!state.head || admitted.truncate) {
256
+ state.size = 0;
257
+ state.inheritedSize = 0;
258
+ state.dirty = true;
259
+ await flush(admitted);
260
+ }
261
+ acquiring = false;
262
+ return {
263
+ resource: state,
264
+ getPosition: async () => state.position,
265
+ stat: async (_state, forwarded) => {
266
+ check(forwarded);
267
+ const { allocatedBytes: ignoredAllocated, ...metadata } = state.head.stat;
268
+ return { ...metadata, size: state.size, mtimeMs: state.modifiedAt };
269
+ },
270
+ read: async (_state, buffer, position, forwarded) => {
271
+ const count = await read(buffer, position ?? state.position, forwarded);
272
+ if (position === null)
273
+ state.position += count;
274
+ return count;
275
+ },
276
+ write: async (_state, buffer, position, forwarded) => {
277
+ check(forwarded);
278
+ const start = admitted.append ? state.size : position ?? state.position;
279
+ const end = start + buffer.byteLength;
280
+ if (!Number.isSafeInteger(end) || end > maxFileBytes)
281
+ throw new FsError("EFBIG", { path, message: "Object descriptor file limit exceeded" });
282
+ if (createStaging) {
283
+ try {
284
+ if (!state.staging) {
285
+ await perform(forwarded, async (selected) => {
286
+ state.staging = await createStaging(path, { ...selected, chunkBytes, maxFileBytes });
287
+ if (!state.staging || ![state.staging.readPage, state.staging.writePage, state.staging.truncate, state.staging.close].every(method => typeof method === "function"))
288
+ throw new FsError("EIO", { path, message: "Invalid object staging handle" });
289
+ });
290
+ }
291
+ let copied = 0;
292
+ while (copied < buffer.byteLength) {
293
+ await reservePage(path, forwarded);
294
+ try {
295
+ const offset = start + copied;
296
+ const page = Math.floor(offset / chunkBytes);
297
+ const within = offset % chunkBytes;
298
+ const length = Math.min(buffer.byteLength - copied, chunkBytes - within);
299
+ let bytes = within === 0 && length === chunkBytes ? undefined : await readStagedPage(page, forwarded);
300
+ if (!bytes) {
301
+ bytes = new Uint8Array(chunkBytes);
302
+ if (within !== 0 || length !== chunkBytes)
303
+ bytes.set(await readBase(page * chunkBytes, chunkBytes, forwarded));
304
+ }
305
+ bytes.set(buffer.subarray(copied, copied + length), within);
306
+ await perform(forwarded, selected => state.staging.writePage(page, bytes, selected));
307
+ copied += length;
308
+ }
309
+ finally {
310
+ releasePage();
311
+ }
312
+ }
313
+ }
314
+ catch (reason) {
315
+ state.failure = { reason };
316
+ throw reason;
317
+ }
318
+ state.size = Math.max(state.size, end);
319
+ state.modifiedAt = Date.now();
320
+ state.dirty = true;
321
+ if (position === null)
322
+ state.position = end;
323
+ if (admitted.synchronization !== undefined)
324
+ await flush(forwarded);
325
+ return buffer.byteLength;
326
+ }
327
+ const first = Math.floor(start / chunkBytes);
328
+ const last = Math.floor((end - 1) / chunkBytes);
329
+ const missing = [];
330
+ const available = Math.min(Math.floor((maxStagedBytes - stagedBytes) / chunkBytes), maxStagedPages - stagedBytes / chunkBytes);
331
+ for (let page = first; page <= last; page++)
332
+ if (!state.pages.has(page)) {
333
+ if (missing.length >= available)
334
+ throw new FsError("ENOSPC", { path, message: "Object descriptor staging budget exceeded; flush staged writes or increase maxStagedBytes/maxStagedPages" });
335
+ missing.push(page);
336
+ }
337
+ const additional = missing.length * chunkBytes;
338
+ stagedBytes += additional;
339
+ const prepared = new Map();
340
+ try {
341
+ for (const page of missing) {
342
+ const bytes = new Uint8Array(chunkBytes);
343
+ bytes.set(await readBase(page * chunkBytes, chunkBytes, forwarded));
344
+ prepared.set(page, bytes);
345
+ }
346
+ check(forwarded);
347
+ }
348
+ catch (error) {
349
+ stagedBytes -= additional;
350
+ throw error;
351
+ }
352
+ for (const [page, bytes] of prepared)
353
+ state.pages.set(page, bytes);
354
+ let copied = 0;
355
+ while (copied < buffer.byteLength) {
356
+ const offset = start + copied;
357
+ const length = Math.min(buffer.byteLength - copied, chunkBytes - offset % chunkBytes);
358
+ state.pages.get(Math.floor(offset / chunkBytes)).set(buffer.subarray(copied, copied + length), offset % chunkBytes);
359
+ copied += length;
360
+ }
361
+ state.size = Math.max(state.size, end);
362
+ state.modifiedAt = Date.now();
363
+ state.dirty = true;
364
+ if (position === null)
365
+ state.position = end;
366
+ if (admitted.synchronization !== undefined)
367
+ await flush(forwarded);
368
+ return buffer.byteLength;
369
+ },
370
+ truncate: async (_state, length, forwarded) => {
371
+ check(forwarded);
372
+ if (length > maxFileBytes)
373
+ throw new FsError("EFBIG", { path });
374
+ if (state.staging) {
375
+ try {
376
+ await perform(forwarded, selected => state.staging.truncate(length, selected));
377
+ }
378
+ catch (reason) {
379
+ state.failure = { reason };
380
+ throw reason;
381
+ }
382
+ }
383
+ for (const [page, bytes] of state.pages) {
384
+ if (page * chunkBytes >= length) {
385
+ state.pages.delete(page);
386
+ stagedBytes -= chunkBytes;
387
+ }
388
+ else if ((page + 1) * chunkBytes > length)
389
+ bytes.fill(0, length % chunkBytes);
390
+ }
391
+ state.inheritedSize = Math.min(state.inheritedSize, length);
392
+ state.size = length;
393
+ state.modifiedAt = Date.now();
394
+ state.dirty = true;
395
+ if (admitted.synchronization !== undefined)
396
+ await flush(forwarded);
397
+ },
398
+ sync: async (_state, _dataOnly, forwarded) => { await flush(forwarded); },
399
+ close: async (_state, forwarded) => {
400
+ let failed = false;
401
+ try {
402
+ if (state.dirty || state.failure)
403
+ await flush(forwarded);
404
+ }
405
+ catch (error) {
406
+ failed = true;
407
+ throw error;
408
+ }
409
+ finally {
410
+ clearPages(state);
411
+ const retained = state.head;
412
+ state.head = undefined;
413
+ let retirementFailed = true;
414
+ try {
415
+ await finishCleanup(retireStaging, failed);
416
+ retirementFailed = false;
417
+ }
418
+ finally {
419
+ try {
420
+ await finishCleanup(() => retained?.close(), failed || retirementFailed);
421
+ }
422
+ finally {
423
+ openFiles--;
424
+ }
425
+ }
426
+ }
427
+ },
428
+ };
429
+ }
430
+ catch (error) {
431
+ clearPages(state);
432
+ try {
433
+ await finishCleanup(() => state.head?.close(), true);
434
+ }
435
+ finally {
436
+ openFiles--;
437
+ }
438
+ throw error;
439
+ }
440
+ });
441
+ const openReadFile = async (path, readOptions = {}) => {
442
+ if (!readOptions || typeof readOptions !== "object"
443
+ || Object.keys(readOptions).some(key => key !== "signal" && key !== "allowDirectory")
444
+ || readOptions.allowDirectory !== undefined && typeof readOptions.allowDirectory !== "boolean") {
445
+ throw new FsError("EINVAL", { syscall: "openReadFile", path });
446
+ }
447
+ readOptions.signal?.throwIfAborted();
448
+ if (readOptions.allowDirectory === true)
449
+ throw new FsError("ENOTSUP", { syscall: "openReadFile", path });
450
+ const descriptor = await open(path, {
451
+ access: "read",
452
+ ...(readOptions.signal === undefined ? {} : { signal: readOptions.signal }),
453
+ });
454
+ let retainedStat;
455
+ try {
456
+ retainedStat = await descriptor.stat(readOptions.signal === undefined ? {} : { signal: readOptions.signal });
457
+ }
458
+ catch (error) {
459
+ await finishCleanup(() => descriptor.close(), true);
460
+ throw error;
461
+ }
462
+ let closed = false;
463
+ let closing;
464
+ const assertOpen = (forwarded, syscall) => {
465
+ forwarded.signal?.throwIfAborted();
466
+ if (closed)
467
+ throw new FsError("EBADF", { syscall, path });
468
+ };
469
+ return {
470
+ async stat(forwarded = {}) {
471
+ assertOpen(forwarded, "fstat");
472
+ return descriptor.stat(forwarded);
473
+ },
474
+ async seekEnd(forwarded = {}) {
475
+ assertOpen(forwarded, "lseek");
476
+ const stat = await descriptor.stat(forwarded);
477
+ return BigInt(stat.size);
478
+ },
479
+ async read(position, maxBytes, forwarded = {}) {
480
+ assertOpen(forwarded, "read");
481
+ if (!Number.isSafeInteger(position) || position < 0
482
+ || !Number.isSafeInteger(maxBytes) || maxBytes <= 0
483
+ || maxBytes > Number.MAX_SAFE_INTEGER - position) {
484
+ throw new FsError("EINVAL", { syscall: "read", path });
485
+ }
486
+ const length = Math.min(maxBytes, Math.max(0, retainedStat.size - position));
487
+ if (length === 0) {
488
+ await descriptor.stat(forwarded);
489
+ return new Uint8Array();
490
+ }
491
+ const buffer = new Uint8Array(length);
492
+ const count = await descriptor.read(buffer, position, forwarded);
493
+ return count === buffer.byteLength ? buffer : buffer.subarray(0, count);
494
+ },
495
+ close() {
496
+ closed = true;
497
+ return closing ??= descriptor.close();
498
+ },
499
+ };
500
+ };
501
+ return new Proxy(Object.create(filesystem), {
502
+ get(_target, property) {
503
+ if (property === "open")
504
+ return open;
505
+ if (property === "openReadFile")
506
+ return openReadFile;
507
+ if (property === "stat" || property === "lstat")
508
+ return async (path, statOptions) => withIdentity(await filesystem[property](path, statOptions));
509
+ if (property === "capabilities")
510
+ return {
511
+ ...filesystem.capabilities,
512
+ open: true,
513
+ versionedDescriptors: true,
514
+ retainedRead: filesystem.capabilities.read !== false,
515
+ };
516
+ if (property === "capabilitiesFor")
517
+ return async (path, query) => {
518
+ const capabilities = await filesystem.capabilitiesFor?.(path, query) ?? filesystem.capabilities;
519
+ query?.signal?.throwIfAborted();
520
+ return {
521
+ ...capabilities,
522
+ open: true,
523
+ versionedDescriptors: true,
524
+ ...(query?.allowDirectory ? {} : { retainedRead: capabilities.read !== false }),
525
+ };
526
+ };
527
+ const value = Reflect.get(filesystem, property, filesystem);
528
+ return typeof value === "function" ? value.bind(filesystem) : value;
529
+ },
530
+ });
531
+ }
@@ -0,0 +1,87 @@
1
+ import type { ByteSource } from "../../contracts/io.js";
2
+ import type { FileDescriptor, OpenFileOptions } from "../../contracts/descriptor.js";
3
+ import type { ConditionalWriteFileOptions, ConditionalRemoveFileOptions, PrepareDirectoryOptions, CreateStagedFileOptions, FileStaging, PublishStagedFileOptions, StagedFileContent, AppendFileOptions, CapabilityQueryOptions, CopyFileOptions, DirectoryEntry, OpenReadFileOptions, FileReadHandle, FileStat, FileSystem, FileSystemCapabilities, FsOptions, ChmodOptions, RenameOptions, MkdirOptions, ReadDirectoryOptions, ReadFileOptions, ReadStreamOptions, RemoveOptions, WriteFileOptions } from "../../contracts/filesystem.js";
4
+ export interface OverlayFileSystemOptions {
5
+ readonly upper: FileSystem;
6
+ readonly lower: FileSystem;
7
+ readonly maxBufferBytes?: number;
8
+ }
9
+ export declare class OverlayFileSystem implements FileSystem {
10
+ #private;
11
+ readonly capabilities: FileSystemCapabilities;
12
+ private readonly maxBufferBytes;
13
+ private readonly whiteouts;
14
+ private readonly opaque;
15
+ private readonly garbage;
16
+ private readonly activeStages;
17
+ private readonly linkMetadata;
18
+ private readonly linkOrigins;
19
+ private readonly publication;
20
+ private queue;
21
+ constructor(options: OverlayFileSystemOptions);
22
+ confineExtraction(roots: readonly string[], options?: FsOptions): Promise<FileSystem>;
23
+ createStagedFile(directory: string, name: string, content: StagedFileContent, options: CreateStagedFileOptions): Promise<FileStaging>;
24
+ publishStagedFile(staging: FileStaging, destination: string, options: PublishStagedFileOptions): Promise<void>;
25
+ removeStagedFile(staging: FileStaging, options?: FsOptions): Promise<void>;
26
+ open(path: string, options: OpenFileOptions): Promise<FileDescriptor>;
27
+ private run;
28
+ capabilitiesFor(path: string, options?: CapabilityQueryOptions): Promise<FileSystemCapabilities>;
29
+ openReadFile(path: string, options?: OpenReadFileOptions): Promise<FileReadHandle>;
30
+ private pinRead;
31
+ private handleBytes;
32
+ private writable;
33
+ private permission;
34
+ private maybeStat;
35
+ private hidden;
36
+ private lowerVisible;
37
+ private lookup;
38
+ private resolve;
39
+ private linkTarget;
40
+ private movableLinkTarget;
41
+ private required;
42
+ private listing;
43
+ private bytes;
44
+ private cleanGarbage;
45
+ cleanup(options?: FsOptions): Promise<void>;
46
+ private staged;
47
+ private preserve;
48
+ private clone;
49
+ private rememberLink;
50
+ private ensureDirectory;
51
+ private copyUp;
52
+ private parent;
53
+ private makeDirectory;
54
+ private writeOptions;
55
+ private writeLocation;
56
+ private replace;
57
+ readFile(path: string, options?: ReadFileOptions): Promise<Uint8Array>;
58
+ writeFile(path: string, data: Uint8Array, options?: WriteFileOptions): Promise<void>;
59
+ prepareDirectory(path: string, options: PrepareDirectoryOptions): Promise<FileStat>;
60
+ writeFileConditional(path: string, data: Uint8Array, options: ConditionalWriteFileOptions): Promise<FileStat>;
61
+ removeFileConditional(path: string, options: ConditionalRemoveFileOptions): Promise<void>;
62
+ appendFile(path: string, data: Uint8Array, options?: AppendFileOptions): Promise<void>;
63
+ stat(path: string, options?: FsOptions): Promise<FileStat>;
64
+ lstat(path: string, options?: FsOptions): Promise<FileStat>;
65
+ compareEntry(path: string, peer: FileSystem, peerPath: string, options?: FsOptions): Promise<import("../../contracts/filesystem.js").EntryComparison>;
66
+ readdir(path: string, options?: ReadDirectoryOptions): Promise<DirectoryEntry[]>;
67
+ realpath(path: string, options?: FsOptions): Promise<string>;
68
+ access(path: string, requestedMode?: number, options?: FsOptions): Promise<void>;
69
+ mkdir(path: string, options?: MkdirOptions): Promise<void>;
70
+ rmdir(path: string, options?: FsOptions): Promise<void>;
71
+ rm(path: string, options?: RemoveOptions): Promise<void>;
72
+ private materialize;
73
+ rename(source: string, destination: string, options?: RenameOptions): Promise<void>;
74
+ copyFile(source: string, destination: string, options?: CopyFileOptions): Promise<void>;
75
+ readlink(path: string, options?: FsOptions): Promise<string>;
76
+ symlink(target: string, path: string, options?: FsOptions): Promise<void>;
77
+ link(_existingPath: string, newPath: string, options?: FsOptions): Promise<void>;
78
+ private metadata;
79
+ chmod(path: string, permissions: number, options?: ChmodOptions): Promise<void>;
80
+ utimes(path: string, atimeMs: number, mtimeMs: number, options?: FsOptions): Promise<void>;
81
+ truncate(path: string, length?: number, options?: FsOptions): Promise<void>;
82
+ readStream(path: string, options?: ReadStreamOptions): ByteSource;
83
+ private bounded;
84
+ private streamToUpper;
85
+ writeStream(path: string, source: ByteSource, options?: WriteFileOptions): Promise<void>;
86
+ }
87
+ export declare function createOverlayFileSystem(options: OverlayFileSystemOptions): OverlayFileSystem;