@aigne/aos 0.2.0-beta

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 (533) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/LICENSE.md +26 -0
  3. package/dist/agent-dsl.cjs +116 -0
  4. package/dist/agent-dsl.d.cts +31 -0
  5. package/dist/agent-dsl.d.cts.map +1 -0
  6. package/dist/agent-dsl.d.mts +31 -0
  7. package/dist/agent-dsl.d.mts.map +1 -0
  8. package/dist/agent-dsl.mjs +115 -0
  9. package/dist/agent-dsl.mjs.map +1 -0
  10. package/dist/arc-compat.cjs +125 -0
  11. package/dist/arc-compat.d.cts +17 -0
  12. package/dist/arc-compat.d.cts.map +1 -0
  13. package/dist/arc-compat.d.mts +17 -0
  14. package/dist/arc-compat.d.mts.map +1 -0
  15. package/dist/arc-compat.mjs +123 -0
  16. package/dist/arc-compat.mjs.map +1 -0
  17. package/dist/auto-surface/compiler.cjs +36 -0
  18. package/dist/auto-surface/compiler.d.cts +7 -0
  19. package/dist/auto-surface/compiler.d.cts.map +1 -0
  20. package/dist/auto-surface/compiler.d.mts +7 -0
  21. package/dist/auto-surface/compiler.d.mts.map +1 -0
  22. package/dist/auto-surface/compiler.mjs +37 -0
  23. package/dist/auto-surface/compiler.mjs.map +1 -0
  24. package/dist/auto-surface/definition-dsl.cjs +333 -0
  25. package/dist/auto-surface/definition-dsl.d.cts +41 -0
  26. package/dist/auto-surface/definition-dsl.d.cts.map +1 -0
  27. package/dist/auto-surface/definition-dsl.d.mts +41 -0
  28. package/dist/auto-surface/definition-dsl.d.mts.map +1 -0
  29. package/dist/auto-surface/definition-dsl.mjs +332 -0
  30. package/dist/auto-surface/definition-dsl.mjs.map +1 -0
  31. package/dist/auto-surface/fragments.cjs +177 -0
  32. package/dist/auto-surface/fragments.d.cts +23 -0
  33. package/dist/auto-surface/fragments.d.cts.map +1 -0
  34. package/dist/auto-surface/fragments.d.mts +23 -0
  35. package/dist/auto-surface/fragments.d.mts.map +1 -0
  36. package/dist/auto-surface/fragments.mjs +175 -0
  37. package/dist/auto-surface/fragments.mjs.map +1 -0
  38. package/dist/auto-surface/index.d.mts +9 -0
  39. package/dist/auto-surface/layering.cjs +43 -0
  40. package/dist/auto-surface/layering.d.cts +7 -0
  41. package/dist/auto-surface/layering.d.cts.map +1 -0
  42. package/dist/auto-surface/layering.d.mts +7 -0
  43. package/dist/auto-surface/layering.d.mts.map +1 -0
  44. package/dist/auto-surface/layering.mjs +43 -0
  45. package/dist/auto-surface/layering.mjs.map +1 -0
  46. package/dist/auto-surface/projection.cjs +11 -0
  47. package/dist/auto-surface/projection.d.cts +11 -0
  48. package/dist/auto-surface/projection.d.cts.map +1 -0
  49. package/dist/auto-surface/projection.d.mts +11 -0
  50. package/dist/auto-surface/projection.d.mts.map +1 -0
  51. package/dist/auto-surface/projection.mjs +12 -0
  52. package/dist/auto-surface/projection.mjs.map +1 -0
  53. package/dist/auto-surface/projectors/settings-shell.cjs +114 -0
  54. package/dist/auto-surface/projectors/settings-shell.d.cts +10 -0
  55. package/dist/auto-surface/projectors/settings-shell.d.cts.map +1 -0
  56. package/dist/auto-surface/projectors/settings-shell.d.mts +10 -0
  57. package/dist/auto-surface/projectors/settings-shell.d.mts.map +1 -0
  58. package/dist/auto-surface/projectors/settings-shell.mjs +114 -0
  59. package/dist/auto-surface/projectors/settings-shell.mjs.map +1 -0
  60. package/dist/auto-surface/scenario.cjs +38 -0
  61. package/dist/auto-surface/scenario.d.cts +31 -0
  62. package/dist/auto-surface/scenario.d.cts.map +1 -0
  63. package/dist/auto-surface/scenario.d.mts +31 -0
  64. package/dist/auto-surface/scenario.d.mts.map +1 -0
  65. package/dist/auto-surface/scenario.mjs +37 -0
  66. package/dist/auto-surface/scenario.mjs.map +1 -0
  67. package/dist/auto-surface/types.cjs +9 -0
  68. package/dist/auto-surface/types.d.cts +153 -0
  69. package/dist/auto-surface/types.d.cts.map +1 -0
  70. package/dist/auto-surface/types.d.mts +153 -0
  71. package/dist/auto-surface/types.d.mts.map +1 -0
  72. package/dist/auto-surface/types.mjs +9 -0
  73. package/dist/auto-surface/types.mjs.map +1 -0
  74. package/dist/auto-surface/value-dsl.cjs +80 -0
  75. package/dist/auto-surface/value-dsl.d.cts +24 -0
  76. package/dist/auto-surface/value-dsl.d.cts.map +1 -0
  77. package/dist/auto-surface/value-dsl.d.mts +24 -0
  78. package/dist/auto-surface/value-dsl.d.mts.map +1 -0
  79. package/dist/auto-surface/value-dsl.mjs +79 -0
  80. package/dist/auto-surface/value-dsl.mjs.map +1 -0
  81. package/dist/blocklet/activation.cjs +94 -0
  82. package/dist/blocklet/activation.d.cts +30 -0
  83. package/dist/blocklet/activation.d.cts.map +1 -0
  84. package/dist/blocklet/activation.d.mts +30 -0
  85. package/dist/blocklet/activation.d.mts.map +1 -0
  86. package/dist/blocklet/activation.mjs +94 -0
  87. package/dist/blocklet/activation.mjs.map +1 -0
  88. package/dist/blocklet/did-space-registry.cjs +282 -0
  89. package/dist/blocklet/did-space-registry.d.cts +82 -0
  90. package/dist/blocklet/did-space-registry.d.cts.map +1 -0
  91. package/dist/blocklet/did-space-registry.d.mts +82 -0
  92. package/dist/blocklet/did-space-registry.d.mts.map +1 -0
  93. package/dist/blocklet/did-space-registry.mjs +281 -0
  94. package/dist/blocklet/did-space-registry.mjs.map +1 -0
  95. package/dist/blocklet/handlers.cjs +66 -0
  96. package/dist/blocklet/handlers.d.cts +16 -0
  97. package/dist/blocklet/handlers.d.cts.map +1 -0
  98. package/dist/blocklet/handlers.d.mts +16 -0
  99. package/dist/blocklet/handlers.d.mts.map +1 -0
  100. package/dist/blocklet/handlers.mjs +65 -0
  101. package/dist/blocklet/handlers.mjs.map +1 -0
  102. package/dist/blocklet/index.d.mts +7 -0
  103. package/dist/blocklet/manifest.d.cts +2 -0
  104. package/dist/blocklet/manifest.d.mts +2 -0
  105. package/dist/blocklet/manifest.mjs +3 -0
  106. package/dist/blocklet/registry.cjs +447 -0
  107. package/dist/blocklet/registry.d.cts +197 -0
  108. package/dist/blocklet/registry.d.cts.map +1 -0
  109. package/dist/blocklet/registry.d.mts +197 -0
  110. package/dist/blocklet/registry.d.mts.map +1 -0
  111. package/dist/blocklet/registry.mjs +441 -0
  112. package/dist/blocklet/registry.mjs.map +1 -0
  113. package/dist/blocklet/static-render.cjs +183 -0
  114. package/dist/blocklet/static-render.d.cts +55 -0
  115. package/dist/blocklet/static-render.d.cts.map +1 -0
  116. package/dist/blocklet/static-render.d.mts +55 -0
  117. package/dist/blocklet/static-render.d.mts.map +1 -0
  118. package/dist/blocklet/static-render.mjs +181 -0
  119. package/dist/blocklet/static-render.mjs.map +1 -0
  120. package/dist/blocklet/types.d.cts +70 -0
  121. package/dist/blocklet/types.d.cts.map +1 -0
  122. package/dist/blocklet/types.d.mts +70 -0
  123. package/dist/blocklet/types.d.mts.map +1 -0
  124. package/dist/devices/chain.cjs +127 -0
  125. package/dist/devices/chain.d.cts +48 -0
  126. package/dist/devices/chain.d.cts.map +1 -0
  127. package/dist/devices/chain.d.mts +48 -0
  128. package/dist/devices/chain.d.mts.map +1 -0
  129. package/dist/devices/chain.mjs +125 -0
  130. package/dist/devices/chain.mjs.map +1 -0
  131. package/dist/dsl-shared.cjs +290 -0
  132. package/dist/dsl-shared.d.cts +54 -0
  133. package/dist/dsl-shared.d.cts.map +1 -0
  134. package/dist/dsl-shared.d.mts +54 -0
  135. package/dist/dsl-shared.d.mts.map +1 -0
  136. package/dist/dsl-shared.mjs +287 -0
  137. package/dist/dsl-shared.mjs.map +1 -0
  138. package/dist/http/afs-mcp.cjs +85 -0
  139. package/dist/http/afs-mcp.d.cts +14 -0
  140. package/dist/http/afs-mcp.d.cts.map +1 -0
  141. package/dist/http/afs-mcp.d.mts +14 -0
  142. package/dist/http/afs-mcp.d.mts.map +1 -0
  143. package/dist/http/afs-mcp.mjs +86 -0
  144. package/dist/http/afs-mcp.mjs.map +1 -0
  145. package/dist/http/afs-raw.cjs +264 -0
  146. package/dist/http/afs-raw.d.cts +31 -0
  147. package/dist/http/afs-raw.d.cts.map +1 -0
  148. package/dist/http/afs-raw.d.mts +31 -0
  149. package/dist/http/afs-raw.d.mts.map +1 -0
  150. package/dist/http/afs-raw.mjs +264 -0
  151. package/dist/http/afs-raw.mjs.map +1 -0
  152. package/dist/http/afs-rest.cjs +30 -0
  153. package/dist/http/afs-rest.d.cts +21 -0
  154. package/dist/http/afs-rest.d.cts.map +1 -0
  155. package/dist/http/afs-rest.d.mts +21 -0
  156. package/dist/http/afs-rest.d.mts.map +1 -0
  157. package/dist/http/afs-rest.mjs +31 -0
  158. package/dist/http/afs-rest.mjs.map +1 -0
  159. package/dist/http/afs-rpc-wire.cjs +271 -0
  160. package/dist/http/afs-rpc-wire.d.cts +195 -0
  161. package/dist/http/afs-rpc-wire.d.cts.map +1 -0
  162. package/dist/http/afs-rpc-wire.d.mts +195 -0
  163. package/dist/http/afs-rpc-wire.d.mts.map +1 -0
  164. package/dist/http/afs-rpc-wire.mjs +262 -0
  165. package/dist/http/afs-rpc-wire.mjs.map +1 -0
  166. package/dist/http/afs-rpc.cjs +729 -0
  167. package/dist/http/afs-rpc.d.cts +103 -0
  168. package/dist/http/afs-rpc.d.cts.map +1 -0
  169. package/dist/http/afs-rpc.d.mts +103 -0
  170. package/dist/http/afs-rpc.d.mts.map +1 -0
  171. package/dist/http/afs-rpc.mjs +729 -0
  172. package/dist/http/afs-rpc.mjs.map +1 -0
  173. package/dist/http/afs-upload.cjs +116 -0
  174. package/dist/http/afs-upload.d.cts +40 -0
  175. package/dist/http/afs-upload.d.cts.map +1 -0
  176. package/dist/http/afs-upload.d.mts +40 -0
  177. package/dist/http/afs-upload.d.mts.map +1 -0
  178. package/dist/http/afs-upload.mjs +116 -0
  179. package/dist/http/afs-upload.mjs.map +1 -0
  180. package/dist/http/aup-client.cjs +60 -0
  181. package/dist/http/aup-client.d.cts +22 -0
  182. package/dist/http/aup-client.d.cts.map +1 -0
  183. package/dist/http/aup-client.d.mts +22 -0
  184. package/dist/http/aup-client.d.mts.map +1 -0
  185. package/dist/http/aup-client.mjs +59 -0
  186. package/dist/http/aup-client.mjs.map +1 -0
  187. package/dist/http/aup-event.cjs +100 -0
  188. package/dist/http/aup-event.d.cts +38 -0
  189. package/dist/http/aup-event.d.cts.map +1 -0
  190. package/dist/http/aup-event.d.mts +38 -0
  191. package/dist/http/aup-event.d.mts.map +1 -0
  192. package/dist/http/aup-event.mjs +101 -0
  193. package/dist/http/aup-event.mjs.map +1 -0
  194. package/dist/http/auth-context.cjs +66 -0
  195. package/dist/http/auth-context.d.cts +64 -0
  196. package/dist/http/auth-context.d.cts.map +1 -0
  197. package/dist/http/auth-context.d.mts +64 -0
  198. package/dist/http/auth-context.d.mts.map +1 -0
  199. package/dist/http/auth-context.mjs +66 -0
  200. package/dist/http/auth-context.mjs.map +1 -0
  201. package/dist/http/csrf.cjs +50 -0
  202. package/dist/http/csrf.d.cts +8 -0
  203. package/dist/http/csrf.d.cts.map +1 -0
  204. package/dist/http/csrf.d.mts +8 -0
  205. package/dist/http/csrf.d.mts.map +1 -0
  206. package/dist/http/csrf.mjs +49 -0
  207. package/dist/http/csrf.mjs.map +1 -0
  208. package/dist/http/handlers.cjs +106 -0
  209. package/dist/http/handlers.d.cts +39 -0
  210. package/dist/http/handlers.d.cts.map +1 -0
  211. package/dist/http/handlers.d.mts +39 -0
  212. package/dist/http/handlers.d.mts.map +1 -0
  213. package/dist/http/handlers.mjs +104 -0
  214. package/dist/http/handlers.mjs.map +1 -0
  215. package/dist/http/index.d.mts +1 -0
  216. package/dist/http/ingest-facade.cjs +315 -0
  217. package/dist/http/ingest-facade.mjs +314 -0
  218. package/dist/http/ingest-facade.mjs.map +1 -0
  219. package/dist/http/raw-url.cjs +136 -0
  220. package/dist/http/raw-url.d.cts +54 -0
  221. package/dist/http/raw-url.d.cts.map +1 -0
  222. package/dist/http/raw-url.d.mts +54 -0
  223. package/dist/http/raw-url.d.mts.map +1 -0
  224. package/dist/http/raw-url.mjs +136 -0
  225. package/dist/http/raw-url.mjs.map +1 -0
  226. package/dist/http/request-context.cjs +178 -0
  227. package/dist/http/request-context.d.cts +76 -0
  228. package/dist/http/request-context.d.cts.map +1 -0
  229. package/dist/http/request-context.d.mts +76 -0
  230. package/dist/http/request-context.d.mts.map +1 -0
  231. package/dist/http/request-context.mjs +179 -0
  232. package/dist/http/request-context.mjs.map +1 -0
  233. package/dist/index.cjs +197 -0
  234. package/dist/index.d.cts +63 -0
  235. package/dist/index.d.mts +68 -0
  236. package/dist/index.mjs +61 -0
  237. package/dist/mcp/index.cjs +9 -0
  238. package/dist/mcp/index.d.cts +5 -0
  239. package/dist/mcp/index.d.mts +5 -0
  240. package/dist/mcp/index.mjs +6 -0
  241. package/dist/mcp/prompts.cjs +17 -0
  242. package/dist/mcp/prompts.d.cts +8 -0
  243. package/dist/mcp/prompts.d.cts.map +1 -0
  244. package/dist/mcp/prompts.d.mts +8 -0
  245. package/dist/mcp/prompts.d.mts.map +1 -0
  246. package/dist/mcp/prompts.mjs +17 -0
  247. package/dist/mcp/prompts.mjs.map +1 -0
  248. package/dist/mcp/resources.cjs +22 -0
  249. package/dist/mcp/resources.d.cts +8 -0
  250. package/dist/mcp/resources.d.cts.map +1 -0
  251. package/dist/mcp/resources.d.mts +8 -0
  252. package/dist/mcp/resources.d.mts.map +1 -0
  253. package/dist/mcp/resources.mjs +22 -0
  254. package/dist/mcp/resources.mjs.map +1 -0
  255. package/dist/mcp/server.cjs +51 -0
  256. package/dist/mcp/server.d.cts +20 -0
  257. package/dist/mcp/server.d.cts.map +1 -0
  258. package/dist/mcp/server.d.mts +20 -0
  259. package/dist/mcp/server.d.mts.map +1 -0
  260. package/dist/mcp/server.mjs +52 -0
  261. package/dist/mcp/server.mjs.map +1 -0
  262. package/dist/mcp/tools.cjs +218 -0
  263. package/dist/mcp/tools.d.cts +8 -0
  264. package/dist/mcp/tools.d.cts.map +1 -0
  265. package/dist/mcp/tools.d.mts +8 -0
  266. package/dist/mcp/tools.d.mts.map +1 -0
  267. package/dist/mcp/tools.mjs +219 -0
  268. package/dist/mcp/tools.mjs.map +1 -0
  269. package/dist/mcp/utils.cjs +75 -0
  270. package/dist/mcp/utils.mjs +69 -0
  271. package/dist/mcp/utils.mjs.map +1 -0
  272. package/dist/mount/index.cjs +4 -0
  273. package/dist/mount/index.d.cts +3 -0
  274. package/dist/mount/index.d.mts +3 -0
  275. package/dist/mount/index.mjs +3 -0
  276. package/dist/mount/materializer.cjs +167 -0
  277. package/dist/mount/materializer.d.cts +97 -0
  278. package/dist/mount/materializer.d.cts.map +1 -0
  279. package/dist/mount/materializer.d.mts +97 -0
  280. package/dist/mount/materializer.d.mts.map +1 -0
  281. package/dist/mount/materializer.mjs +167 -0
  282. package/dist/mount/materializer.mjs.map +1 -0
  283. package/dist/mount/types.d.cts +90 -0
  284. package/dist/mount/types.d.cts.map +1 -0
  285. package/dist/mount/types.d.mts +90 -0
  286. package/dist/mount/types.d.mts.map +1 -0
  287. package/dist/mount-config.cjs +61 -0
  288. package/dist/mount-config.d.cts +19 -0
  289. package/dist/mount-config.d.cts.map +1 -0
  290. package/dist/mount-config.d.mts +19 -0
  291. package/dist/mount-config.d.mts.map +1 -0
  292. package/dist/mount-config.mjs +61 -0
  293. package/dist/mount-config.mjs.map +1 -0
  294. package/dist/projectors/aup-projector.cjs +190 -0
  295. package/dist/projectors/aup-projector.d.cts +59 -0
  296. package/dist/projectors/aup-projector.d.cts.map +1 -0
  297. package/dist/projectors/aup-projector.d.mts +59 -0
  298. package/dist/projectors/aup-projector.d.mts.map +1 -0
  299. package/dist/projectors/aup-projector.mjs +188 -0
  300. package/dist/projectors/aup-projector.mjs.map +1 -0
  301. package/dist/projectors/index.cjs +6 -0
  302. package/dist/projectors/index.d.cts +2 -0
  303. package/dist/projectors/index.d.mts +2 -0
  304. package/dist/projectors/index.mjs +3 -0
  305. package/dist/scaffold/afs.cjs +195 -0
  306. package/dist/scaffold/afs.d.cts +16 -0
  307. package/dist/scaffold/afs.d.cts.map +1 -0
  308. package/dist/scaffold/afs.d.mts +16 -0
  309. package/dist/scaffold/afs.d.mts.map +1 -0
  310. package/dist/scaffold/afs.mjs +195 -0
  311. package/dist/scaffold/afs.mjs.map +1 -0
  312. package/dist/scaffold/composition.cjs +92 -0
  313. package/dist/scaffold/composition.d.cts +10 -0
  314. package/dist/scaffold/composition.d.cts.map +1 -0
  315. package/dist/scaffold/composition.d.mts +10 -0
  316. package/dist/scaffold/composition.d.mts.map +1 -0
  317. package/dist/scaffold/composition.mjs +92 -0
  318. package/dist/scaffold/composition.mjs.map +1 -0
  319. package/dist/scaffold/dsl-error.cjs +21 -0
  320. package/dist/scaffold/dsl-error.d.cts +11 -0
  321. package/dist/scaffold/dsl-error.d.cts.map +1 -0
  322. package/dist/scaffold/dsl-error.d.mts +11 -0
  323. package/dist/scaffold/dsl-error.d.mts.map +1 -0
  324. package/dist/scaffold/dsl-error.mjs +20 -0
  325. package/dist/scaffold/dsl-error.mjs.map +1 -0
  326. package/dist/scaffold/index.d.mts +12 -0
  327. package/dist/scaffold/manifest-dsl.cjs +188 -0
  328. package/dist/scaffold/manifest-dsl.d.cts +8 -0
  329. package/dist/scaffold/manifest-dsl.d.cts.map +1 -0
  330. package/dist/scaffold/manifest-dsl.d.mts +8 -0
  331. package/dist/scaffold/manifest-dsl.d.mts.map +1 -0
  332. package/dist/scaffold/manifest-dsl.mjs +188 -0
  333. package/dist/scaffold/manifest-dsl.mjs.map +1 -0
  334. package/dist/scaffold/module-dsl.cjs +284 -0
  335. package/dist/scaffold/module-dsl.d.cts +8 -0
  336. package/dist/scaffold/module-dsl.d.cts.map +1 -0
  337. package/dist/scaffold/module-dsl.d.mts +8 -0
  338. package/dist/scaffold/module-dsl.d.mts.map +1 -0
  339. package/dist/scaffold/module-dsl.mjs +284 -0
  340. package/dist/scaffold/module-dsl.mjs.map +1 -0
  341. package/dist/scaffold/resolver.cjs +156 -0
  342. package/dist/scaffold/resolver.d.cts +7 -0
  343. package/dist/scaffold/resolver.d.cts.map +1 -0
  344. package/dist/scaffold/resolver.d.mts +7 -0
  345. package/dist/scaffold/resolver.d.mts.map +1 -0
  346. package/dist/scaffold/resolver.mjs +156 -0
  347. package/dist/scaffold/resolver.mjs.map +1 -0
  348. package/dist/scaffold/runtime.cjs +24 -0
  349. package/dist/scaffold/runtime.d.cts +19 -0
  350. package/dist/scaffold/runtime.d.cts.map +1 -0
  351. package/dist/scaffold/runtime.d.mts +19 -0
  352. package/dist/scaffold/runtime.d.mts.map +1 -0
  353. package/dist/scaffold/runtime.mjs +25 -0
  354. package/dist/scaffold/runtime.mjs.map +1 -0
  355. package/dist/scaffold/shell-dsl.cjs +279 -0
  356. package/dist/scaffold/shell-dsl.d.cts +8 -0
  357. package/dist/scaffold/shell-dsl.d.cts.map +1 -0
  358. package/dist/scaffold/shell-dsl.d.mts +8 -0
  359. package/dist/scaffold/shell-dsl.d.mts.map +1 -0
  360. package/dist/scaffold/shell-dsl.mjs +279 -0
  361. package/dist/scaffold/shell-dsl.mjs.map +1 -0
  362. package/dist/scaffold/surface-dsl.cjs +182 -0
  363. package/dist/scaffold/surface-dsl.d.cts +8 -0
  364. package/dist/scaffold/surface-dsl.d.cts.map +1 -0
  365. package/dist/scaffold/surface-dsl.d.mts +8 -0
  366. package/dist/scaffold/surface-dsl.d.mts.map +1 -0
  367. package/dist/scaffold/surface-dsl.mjs +182 -0
  368. package/dist/scaffold/surface-dsl.mjs.map +1 -0
  369. package/dist/scaffold/surfaces.cjs +84 -0
  370. package/dist/scaffold/surfaces.d.cts +23 -0
  371. package/dist/scaffold/surfaces.d.cts.map +1 -0
  372. package/dist/scaffold/surfaces.d.mts +24 -0
  373. package/dist/scaffold/surfaces.d.mts.map +1 -0
  374. package/dist/scaffold/surfaces.mjs +84 -0
  375. package/dist/scaffold/surfaces.mjs.map +1 -0
  376. package/dist/scaffold/types.d.cts +264 -0
  377. package/dist/scaffold/types.d.cts.map +1 -0
  378. package/dist/scaffold/types.d.mts +265 -0
  379. package/dist/scaffold/types.d.mts.map +1 -0
  380. package/dist/scaffold/workspace-dsl.cjs +339 -0
  381. package/dist/scaffold/workspace-dsl.d.cts +49 -0
  382. package/dist/scaffold/workspace-dsl.d.cts.map +1 -0
  383. package/dist/scaffold/workspace-dsl.d.mts +49 -0
  384. package/dist/scaffold/workspace-dsl.d.mts.map +1 -0
  385. package/dist/scaffold/workspace-dsl.mjs +337 -0
  386. package/dist/scaffold/workspace-dsl.mjs.map +1 -0
  387. package/dist/scope/index.d.mts +3 -0
  388. package/dist/scope/read-blocklet-scope.cjs +29 -0
  389. package/dist/scope/read-blocklet-scope.d.cts +8 -0
  390. package/dist/scope/read-blocklet-scope.d.cts.map +1 -0
  391. package/dist/scope/read-blocklet-scope.d.mts +8 -0
  392. package/dist/scope/read-blocklet-scope.d.mts.map +1 -0
  393. package/dist/scope/read-blocklet-scope.mjs +30 -0
  394. package/dist/scope/read-blocklet-scope.mjs.map +1 -0
  395. package/dist/scope/resolve-scoped-afs.cjs +87 -0
  396. package/dist/scope/resolve-scoped-afs.d.cts +7 -0
  397. package/dist/scope/resolve-scoped-afs.d.cts.map +1 -0
  398. package/dist/scope/resolve-scoped-afs.d.mts +7 -0
  399. package/dist/scope/resolve-scoped-afs.d.mts.map +1 -0
  400. package/dist/scope/resolve-scoped-afs.mjs +88 -0
  401. package/dist/scope/resolve-scoped-afs.mjs.map +1 -0
  402. package/dist/scope/types.d.cts +25 -0
  403. package/dist/scope/types.d.cts.map +1 -0
  404. package/dist/scope/types.d.mts +25 -0
  405. package/dist/scope/types.d.mts.map +1 -0
  406. package/dist/session/backends.cjs +90 -0
  407. package/dist/session/backends.d.cts +35 -0
  408. package/dist/session/backends.d.cts.map +1 -0
  409. package/dist/session/backends.d.mts +35 -0
  410. package/dist/session/backends.d.mts.map +1 -0
  411. package/dist/session/backends.mjs +89 -0
  412. package/dist/session/backends.mjs.map +1 -0
  413. package/dist/session/replication-resolver.cjs +323 -0
  414. package/dist/session/replication-resolver.d.cts +71 -0
  415. package/dist/session/replication-resolver.d.cts.map +1 -0
  416. package/dist/session/replication-resolver.d.mts +71 -0
  417. package/dist/session/replication-resolver.d.mts.map +1 -0
  418. package/dist/session/replication-resolver.mjs +323 -0
  419. package/dist/session/replication-resolver.mjs.map +1 -0
  420. package/dist/session/role-level.cjs +36 -0
  421. package/dist/session/role-level.d.cts +24 -0
  422. package/dist/session/role-level.d.cts.map +1 -0
  423. package/dist/session/role-level.d.mts +24 -0
  424. package/dist/session/role-level.d.mts.map +1 -0
  425. package/dist/session/role-level.mjs +35 -0
  426. package/dist/session/role-level.mjs.map +1 -0
  427. package/dist/session/session-dir-providers.cjs +254 -0
  428. package/dist/session/session-dir-providers.d.cts +32 -0
  429. package/dist/session/session-dir-providers.d.cts.map +1 -0
  430. package/dist/session/session-dir-providers.d.mts +32 -0
  431. package/dist/session/session-dir-providers.d.mts.map +1 -0
  432. package/dist/session/session-dir-providers.mjs +252 -0
  433. package/dist/session/session-dir-providers.mjs.map +1 -0
  434. package/dist/session/session-id.cjs +20 -0
  435. package/dist/session/session-id.d.cts +15 -0
  436. package/dist/session/session-id.d.cts.map +1 -0
  437. package/dist/session/session-id.d.mts +15 -0
  438. package/dist/session/session-id.d.mts.map +1 -0
  439. package/dist/session/session-id.mjs +20 -0
  440. package/dist/session/session-id.mjs.map +1 -0
  441. package/dist/session/session-user-afs.cjs +899 -0
  442. package/dist/session/session-user-afs.d.cts +296 -0
  443. package/dist/session/session-user-afs.d.cts.map +1 -0
  444. package/dist/session/session-user-afs.d.mts +296 -0
  445. package/dist/session/session-user-afs.d.mts.map +1 -0
  446. package/dist/session/session-user-afs.mjs +896 -0
  447. package/dist/session/session-user-afs.mjs.map +1 -0
  448. package/dist/session/settings-cascade.cjs +69 -0
  449. package/dist/session/settings-cascade.d.cts +81 -0
  450. package/dist/session/settings-cascade.d.cts.map +1 -0
  451. package/dist/session/settings-cascade.d.mts +81 -0
  452. package/dist/session/settings-cascade.d.mts.map +1 -0
  453. package/dist/session/settings-cascade.mjs +69 -0
  454. package/dist/session/settings-cascade.mjs.map +1 -0
  455. package/dist/session/settings-resolver.cjs +770 -0
  456. package/dist/session/settings-resolver.d.cts +177 -0
  457. package/dist/session/settings-resolver.d.cts.map +1 -0
  458. package/dist/session/settings-resolver.d.mts +177 -0
  459. package/dist/session/settings-resolver.d.mts.map +1 -0
  460. package/dist/session/settings-resolver.mjs +771 -0
  461. package/dist/session/settings-resolver.mjs.map +1 -0
  462. package/dist/session/settings-schema-store.cjs +0 -0
  463. package/dist/session/settings-schema-store.d.cts +72 -0
  464. package/dist/session/settings-schema-store.d.cts.map +1 -0
  465. package/dist/session/settings-schema-store.d.mts +72 -0
  466. package/dist/session/settings-schema-store.d.mts.map +1 -0
  467. package/dist/session/settings-schema-store.mjs +0 -0
  468. package/dist/session/settings-schema-store.mjs.map +1 -0
  469. package/dist/system-mounts/index.cjs +14 -0
  470. package/dist/system-mounts/index.d.cts +6 -0
  471. package/dist/system-mounts/index.d.mts +6 -0
  472. package/dist/system-mounts/index.mjs +6 -0
  473. package/dist/system-mounts/install.cjs +101 -0
  474. package/dist/system-mounts/install.d.cts +36 -0
  475. package/dist/system-mounts/install.d.cts.map +1 -0
  476. package/dist/system-mounts/install.d.mts +37 -0
  477. package/dist/system-mounts/install.d.mts.map +1 -0
  478. package/dist/system-mounts/install.mjs +102 -0
  479. package/dist/system-mounts/install.mjs.map +1 -0
  480. package/dist/system-mounts/installers.cjs +247 -0
  481. package/dist/system-mounts/installers.d.cts +13 -0
  482. package/dist/system-mounts/installers.d.cts.map +1 -0
  483. package/dist/system-mounts/installers.d.mts +14 -0
  484. package/dist/system-mounts/installers.d.mts.map +1 -0
  485. package/dist/system-mounts/installers.mjs +244 -0
  486. package/dist/system-mounts/installers.mjs.map +1 -0
  487. package/dist/system-mounts/lists.cjs +122 -0
  488. package/dist/system-mounts/lists.d.cts +34 -0
  489. package/dist/system-mounts/lists.d.cts.map +1 -0
  490. package/dist/system-mounts/lists.d.mts +34 -0
  491. package/dist/system-mounts/lists.d.mts.map +1 -0
  492. package/dist/system-mounts/lists.mjs +122 -0
  493. package/dist/system-mounts/lists.mjs.map +1 -0
  494. package/dist/system-mounts/types.d.cts +124 -0
  495. package/dist/system-mounts/types.d.cts.map +1 -0
  496. package/dist/system-mounts/types.d.mts +125 -0
  497. package/dist/system-mounts/types.d.mts.map +1 -0
  498. package/dist/system-mounts/validate.cjs +56 -0
  499. package/dist/system-mounts/validate.d.cts +34 -0
  500. package/dist/system-mounts/validate.d.cts.map +1 -0
  501. package/dist/system-mounts/validate.d.mts +34 -0
  502. package/dist/system-mounts/validate.d.mts.map +1 -0
  503. package/dist/system-mounts/validate.mjs +56 -0
  504. package/dist/system-mounts/validate.mjs.map +1 -0
  505. package/dist/terminal-llm.cjs +90 -0
  506. package/dist/terminal-llm.d.cts +50 -0
  507. package/dist/terminal-llm.d.cts.map +1 -0
  508. package/dist/terminal-llm.d.mts +50 -0
  509. package/dist/terminal-llm.d.mts.map +1 -0
  510. package/dist/terminal-llm.mjs +90 -0
  511. package/dist/terminal-llm.mjs.map +1 -0
  512. package/dist/terminal-repl.cjs +371 -0
  513. package/dist/terminal-repl.d.cts +69 -0
  514. package/dist/terminal-repl.d.cts.map +1 -0
  515. package/dist/terminal-repl.d.mts +69 -0
  516. package/dist/terminal-repl.d.mts.map +1 -0
  517. package/dist/terminal-repl.mjs +370 -0
  518. package/dist/terminal-repl.mjs.map +1 -0
  519. package/dist/transport/idle-timer.cjs +136 -0
  520. package/dist/transport/idle-timer.d.cts +92 -0
  521. package/dist/transport/idle-timer.d.cts.map +1 -0
  522. package/dist/transport/idle-timer.d.mts +92 -0
  523. package/dist/transport/idle-timer.d.mts.map +1 -0
  524. package/dist/transport/idle-timer.mjs +132 -0
  525. package/dist/transport/idle-timer.mjs.map +1 -0
  526. package/dist/web-component-dsl.cjs +153 -0
  527. package/dist/web-component-dsl.d.cts +27 -0
  528. package/dist/web-component-dsl.d.cts.map +1 -0
  529. package/dist/web-component-dsl.d.mts +27 -0
  530. package/dist/web-component-dsl.d.mts.map +1 -0
  531. package/dist/web-component-dsl.mjs +152 -0
  532. package/dist/web-component-dsl.mjs.map +1 -0
  533. package/package.json +81 -0
@@ -0,0 +1,271 @@
1
+
2
+ //#region src/http/afs-rpc-wire.ts
3
+ /**
4
+ * afs-rpc wire contract — encoding + validation helpers.
5
+ *
6
+ * Single source of truth for the binary content encoding (base64) and the
7
+ * write/delete body validation rules pinned in
8
+ * `planning/did-integration/mobile-didspace-transport/wire-contract.md`.
9
+ *
10
+ * Both runtime handlers (Node `daemon/server.ts`, Cloudflare `index.ts`) share
11
+ * `createAfsRpcHandler`; this module is where the write/delete dispatch (Phase
12
+ * 4) decodes `content` and enforces field-position rules. Defined in Phase 0
13
+ * so the contract is frozen before any implementation.
14
+ */
15
+ /** Stable error codes surfaced on the wire (see wire-contract.md §7/§9). */
16
+ const WIRE_ERROR_CODES = {
17
+ conflict: "AFS_CONFLICT",
18
+ payloadTooLarge: "PAYLOAD_TOO_LARGE",
19
+ batchOverBudget: "BATCH_OVER_BUDGET",
20
+ batchTailSkipped: "BATCH_TAIL_SKIPPED",
21
+ fileTooLarge: "FILE_TOO_LARGE"
22
+ };
23
+ /**
24
+ * Extract the JWT from an `Authorization: Bearer <jwt>` header, or null when
25
+ * absent/malformed. Shared by both runtimes' `resolveCaller` (Phase 4) so the
26
+ * Bearer parsing is single-sourced and case-insensitive on the scheme.
27
+ */
28
+ function parseBearerToken(header) {
29
+ if (!header) return null;
30
+ const token = /^Bearer\s+(.+)$/i.exec(header)?.[1]?.trim();
31
+ return token ? token : null;
32
+ }
33
+ /**
34
+ * Decode a base64 string into bytes. Pure; no DOM/Buffer assumptions beyond
35
+ * `atob` (present in workerd + Node 18+ globalThis). Throws on malformed input.
36
+ */
37
+ function decodeContentBase64(b64) {
38
+ const binary = atob(b64);
39
+ const bytes = new Uint8Array(binary.length);
40
+ for (let i = 0; i < binary.length; i++) bytes[i] = binary.charCodeAt(i);
41
+ return bytes;
42
+ }
43
+ /** Encode bytes into a base64 string. Inverse of {@link decodeContentBase64}. */
44
+ function encodeContentBase64(bytes) {
45
+ let binary = "";
46
+ const CHUNK = 32768;
47
+ for (let i = 0; i < bytes.length; i += CHUNK) binary += String.fromCharCode(...bytes.subarray(i, i + CHUNK));
48
+ return btoa(binary);
49
+ }
50
+ /**
51
+ * Validate + decode a `write` body per the wire contract.
52
+ *
53
+ * Enforces:
54
+ * - `content` present and `encoding === "base64"` (missing/other → 400).
55
+ * The empty string IS present — it is the canonical base64 of a 0-byte
56
+ * file, which must roundtrip (P6 crafted-sample finding; rejecting it
57
+ * made empty files unsyncable on every client).
58
+ * - `content` is valid base64 (bad → 400).
59
+ *
60
+ * Does NOT touch `options.ifMatch` placement: the field-position rule
61
+ * (ifMatch belongs at `options.ifMatch`, never `options.meta.ifMatch` for
62
+ * writes) is enforced by the handler reading ONLY `options.ifMatch`. A
63
+ * misplaced `meta.ifMatch` is simply ignored (treated as absent top-level
64
+ * ifMatch → LWW), per wire-contract.md §8.3.
65
+ */
66
+ function validateAndDecodeWrite(body) {
67
+ if (typeof body.content !== "string") return {
68
+ ok: false,
69
+ status: 400,
70
+ error: "Missing 'content' for write"
71
+ };
72
+ const encoding = body.encoding ?? "base64";
73
+ if (encoding !== "base64") return {
74
+ ok: false,
75
+ status: 400,
76
+ error: `Unsupported encoding '${encoding}' (use base64)`
77
+ };
78
+ let bytes;
79
+ try {
80
+ bytes = decodeContentBase64(body.content);
81
+ } catch {
82
+ return {
83
+ ok: false,
84
+ status: 400,
85
+ error: "Invalid base64 in 'content'"
86
+ };
87
+ }
88
+ return {
89
+ ok: true,
90
+ bytes
91
+ };
92
+ }
93
+ /**
94
+ * Read the top-level write ifMatch precondition. The misplaced
95
+ * `options.meta.ifMatch` is intentionally NOT consulted for writes — only
96
+ * `delete` carries ifMatch under `meta`.
97
+ */
98
+ function readWriteIfMatch(options) {
99
+ const v = options?.ifMatch;
100
+ return typeof v === "string" ? v : void 0;
101
+ }
102
+ const MB = 1024 * 1024;
103
+ /** Cloudflare-tier limits (free-tier portability baseline; P0-confirmed). */
104
+ const BATCH_LIMITS_CF = {
105
+ maxWriteEntries: 20,
106
+ maxDeleteEntries: 40,
107
+ maxReadEntries: 20,
108
+ maxWriteBatchBytes: 1 * MB,
109
+ maxEntryWriteBytes: 16 * MB,
110
+ readTailSkipThresholdBytes: 4 * MB,
111
+ maxEncodedRequestBytes: 24 * MB
112
+ };
113
+ /** Node-daemon limits (no subrequest budget; bounded by memory/UX only). */
114
+ const BATCH_LIMITS_NODE = {
115
+ maxWriteEntries: 100,
116
+ maxDeleteEntries: 100,
117
+ maxReadEntries: 100,
118
+ maxWriteBatchBytes: 16 * MB,
119
+ maxEntryWriteBytes: 16 * MB,
120
+ readTailSkipThresholdBytes: 4 * MB,
121
+ maxEncodedRequestBytes: 24 * MB
122
+ };
123
+ const BATCH_FORBIDDEN_ENTRY_FIELDS = ["blocklet", "sessionId"];
124
+ function maxEntriesFor(type, limits) {
125
+ if (type === "batchWrite") return limits.maxWriteEntries;
126
+ if (type === "batchDelete") return limits.maxDeleteEntries;
127
+ return limits.maxReadEntries;
128
+ }
129
+ /**
130
+ * Envelope-level validation for the three batch ops (wire-contract §9).
131
+ *
132
+ * Envelope rejections (zero entries executed): entries shape, per-type
133
+ * maxEntries / Σ-decoded-bytes budget (400 BATCH_OVER_BUDGET), forbidden
134
+ * per-entry `blocklet`/`sessionId` fields, invalid/traversal paths, and a
135
+ * single entry over the per-entry decoded cap (413 PAYLOAD_TOO_LARGE — the
136
+ * single-op code).
137
+ *
138
+ * Content-shape problems (missing/empty content, unknown encoding, bad
139
+ * base64) are NOT envelope rejections: single-op parity says each such entry
140
+ * fails alone, so they come back as per-entry decode outcomes in
141
+ * `writeDecodes` for the dispatch loop to surface as `results[i]`.
142
+ */
143
+ function validateBatchBody(body, limits, sanitizePath) {
144
+ const type = body.type ?? "";
145
+ const entries = body.entries;
146
+ if (!Array.isArray(entries) || entries.length === 0) return {
147
+ ok: false,
148
+ status: 400,
149
+ error: "'entries' must be a non-empty array"
150
+ };
151
+ const maxEntries = maxEntriesFor(type, limits);
152
+ if (entries.length > maxEntries) return {
153
+ ok: false,
154
+ status: 400,
155
+ error: `Too many entries for ${type} (${entries.length} > ${maxEntries})`,
156
+ code: WIRE_ERROR_CODES.batchOverBudget
157
+ };
158
+ for (let i = 0; i < entries.length; i++) {
159
+ const entry = entries[i];
160
+ if (typeof entry !== "object" || entry === null || Array.isArray(entry)) return {
161
+ ok: false,
162
+ status: 400,
163
+ error: `entries[${i}] must be an object`
164
+ };
165
+ for (const field of BATCH_FORBIDDEN_ENTRY_FIELDS) if (field in entry) return {
166
+ ok: false,
167
+ status: 400,
168
+ error: `entries[${i}] must not carry '${field}' (envelope-level field)`
169
+ };
170
+ const path = entry.path;
171
+ if (typeof path !== "string" || sanitizePath(path) === null) return {
172
+ ok: false,
173
+ status: 400,
174
+ error: `entries[${i}] has a missing or invalid 'path'`
175
+ };
176
+ }
177
+ if (type !== "batchWrite") return {
178
+ ok: true,
179
+ entries
180
+ };
181
+ const writeDecodes = [];
182
+ let totalDecoded = 0;
183
+ for (const raw of entries) {
184
+ const decoded = validateAndDecodeWrite({
185
+ type: "write",
186
+ path: raw.path,
187
+ content: raw.content,
188
+ encoding: raw.encoding,
189
+ options: raw.options
190
+ });
191
+ if (!decoded.ok) {
192
+ writeDecodes.push(decoded);
193
+ continue;
194
+ }
195
+ if (decoded.bytes.length > limits.maxEntryWriteBytes) return {
196
+ ok: false,
197
+ status: 413,
198
+ error: `Payload too large (> ${limits.maxEntryWriteBytes} bytes)`,
199
+ code: WIRE_ERROR_CODES.payloadTooLarge
200
+ };
201
+ totalDecoded += decoded.bytes.length;
202
+ writeDecodes.push(decoded);
203
+ }
204
+ if (totalDecoded > limits.maxWriteBatchBytes) return {
205
+ ok: false,
206
+ status: 400,
207
+ error: `Batch decoded bytes over budget (${totalDecoded} > ${limits.maxWriteBatchBytes})`,
208
+ code: WIRE_ERROR_CODES.batchOverBudget
209
+ };
210
+ return {
211
+ ok: true,
212
+ entries,
213
+ writeDecodes
214
+ };
215
+ }
216
+ /**
217
+ * Read the request body with a hard byte ceiling, BEFORE any JSON parsing.
218
+ *
219
+ * Two layers: a fast Content-Length pre-check (rejects honest oversized
220
+ * declarations without reading), then a bounded stream read (rejects lying
221
+ * Content-Length — declared small, actually large). Returns `{ tooLarge }`
222
+ * instead of throwing so the caller can shape the 413 response.
223
+ */
224
+ async function readBoundedBody(request, maxBytes) {
225
+ const declared = Number(request.headers.get("content-length") ?? "");
226
+ if (Number.isFinite(declared) && declared > maxBytes) return { tooLarge: true };
227
+ const reader = request.body?.getReader();
228
+ if (!reader) {
229
+ const text = await request.text();
230
+ return text.length > maxBytes ? { tooLarge: true } : {
231
+ tooLarge: false,
232
+ text
233
+ };
234
+ }
235
+ const chunks = [];
236
+ let total = 0;
237
+ while (true) {
238
+ const { done, value } = await reader.read();
239
+ if (done) break;
240
+ total += value.byteLength;
241
+ if (total > maxBytes) {
242
+ try {
243
+ await reader.cancel();
244
+ } catch {}
245
+ return { tooLarge: true };
246
+ }
247
+ chunks.push(value);
248
+ }
249
+ const buf = new Uint8Array(total);
250
+ let offset = 0;
251
+ for (const chunk of chunks) {
252
+ buf.set(chunk, offset);
253
+ offset += chunk.byteLength;
254
+ }
255
+ return {
256
+ tooLarge: false,
257
+ text: new TextDecoder().decode(buf)
258
+ };
259
+ }
260
+
261
+ //#endregion
262
+ exports.BATCH_LIMITS_CF = BATCH_LIMITS_CF;
263
+ exports.BATCH_LIMITS_NODE = BATCH_LIMITS_NODE;
264
+ exports.WIRE_ERROR_CODES = WIRE_ERROR_CODES;
265
+ exports.decodeContentBase64 = decodeContentBase64;
266
+ exports.encodeContentBase64 = encodeContentBase64;
267
+ exports.parseBearerToken = parseBearerToken;
268
+ exports.readBoundedBody = readBoundedBody;
269
+ exports.readWriteIfMatch = readWriteIfMatch;
270
+ exports.validateAndDecodeWrite = validateAndDecodeWrite;
271
+ exports.validateBatchBody = validateBatchBody;
@@ -0,0 +1,195 @@
1
+ //#region src/http/afs-rpc-wire.d.ts
2
+ /**
3
+ * afs-rpc wire contract — encoding + validation helpers.
4
+ *
5
+ * Single source of truth for the binary content encoding (base64) and the
6
+ * write/delete body validation rules pinned in
7
+ * `planning/did-integration/mobile-didspace-transport/wire-contract.md`.
8
+ *
9
+ * Both runtime handlers (Node `daemon/server.ts`, Cloudflare `index.ts`) share
10
+ * `createAfsRpcHandler`; this module is where the write/delete dispatch (Phase
11
+ * 4) decodes `content` and enforces field-position rules. Defined in Phase 0
12
+ * so the contract is frozen before any implementation.
13
+ */
14
+ /** Stable error codes surfaced on the wire (see wire-contract.md §7/§9). */
15
+ declare const WIRE_ERROR_CODES: {
16
+ readonly conflict: "AFS_CONFLICT";
17
+ readonly payloadTooLarge: "PAYLOAD_TOO_LARGE"; /** Batch envelope rejected up-front (entry count / Σ bytes) — zero entries executed. */
18
+ readonly batchOverBudget: "BATCH_OVER_BUDGET"; /** batchRead tail entry skipped (encoded-byte threshold reached) — retry next batch. */
19
+ readonly batchTailSkipped: "BATCH_TAIL_SKIPPED";
20
+ /**
21
+ * Declared-size upload rejected BEFORE any bytes move (ingest-prepare early
22
+ * reject — DID-Space upload-limits, design §8 / D7). Distinct from
23
+ * `PAYLOAD_TOO_LARGE` ("actual decoded bytes over the cap"): `FILE_TOO_LARGE`
24
+ * fires on the client-declared size at the planning stage, is per-entry, and
25
+ * is never auto-retried by the sync engine.
26
+ */
27
+ readonly fileTooLarge: "FILE_TOO_LARGE";
28
+ };
29
+ /**
30
+ * Extract the JWT from an `Authorization: Bearer <jwt>` header, or null when
31
+ * absent/malformed. Shared by both runtimes' `resolveCaller` (Phase 4) so the
32
+ * Bearer parsing is single-sourced and case-insensitive on the scheme.
33
+ */
34
+ declare function parseBearerToken(header: string | null | undefined): string | null;
35
+ /** Only encoding understood today. `bypass` (D-A) is reserved for large blobs. */
36
+ type WireEncoding = "base64";
37
+ /** Shape of a `write` RpcBody after JSON parse, before decoding. */
38
+ interface RpcWriteBody {
39
+ type: "write";
40
+ path?: string;
41
+ content?: string;
42
+ encoding?: string;
43
+ contentType?: string;
44
+ options?: {
45
+ ifMatch?: unknown;
46
+ meta?: {
47
+ deviceId?: unknown;
48
+ mtime?: unknown;
49
+ ifMatch?: unknown;
50
+ };
51
+ };
52
+ }
53
+ type WireValidation = {
54
+ ok: true;
55
+ bytes: Uint8Array;
56
+ } | {
57
+ ok: false;
58
+ status: number;
59
+ error: string;
60
+ code?: string;
61
+ };
62
+ /**
63
+ * Decode a base64 string into bytes. Pure; no DOM/Buffer assumptions beyond
64
+ * `atob` (present in workerd + Node 18+ globalThis). Throws on malformed input.
65
+ */
66
+ declare function decodeContentBase64(b64: string): Uint8Array;
67
+ /** Encode bytes into a base64 string. Inverse of {@link decodeContentBase64}. */
68
+ declare function encodeContentBase64(bytes: Uint8Array): string;
69
+ /**
70
+ * Validate + decode a `write` body per the wire contract.
71
+ *
72
+ * Enforces:
73
+ * - `content` present and `encoding === "base64"` (missing/other → 400).
74
+ * The empty string IS present — it is the canonical base64 of a 0-byte
75
+ * file, which must roundtrip (P6 crafted-sample finding; rejecting it
76
+ * made empty files unsyncable on every client).
77
+ * - `content` is valid base64 (bad → 400).
78
+ *
79
+ * Does NOT touch `options.ifMatch` placement: the field-position rule
80
+ * (ifMatch belongs at `options.ifMatch`, never `options.meta.ifMatch` for
81
+ * writes) is enforced by the handler reading ONLY `options.ifMatch`. A
82
+ * misplaced `meta.ifMatch` is simply ignored (treated as absent top-level
83
+ * ifMatch → LWW), per wire-contract.md §8.3.
84
+ */
85
+ declare function validateAndDecodeWrite(body: RpcWriteBody): WireValidation;
86
+ /**
87
+ * Read the top-level write ifMatch precondition. The misplaced
88
+ * `options.meta.ifMatch` is intentionally NOT consulted for writes — only
89
+ * `delete` carries ifMatch under `meta`.
90
+ */
91
+ declare function readWriteIfMatch(options: RpcWriteBody["options"]): string | undefined;
92
+ /**
93
+ * Per-type batch limits — the wire-contract §9 constant table. These are
94
+ * CONTRACT constants (clients mirror the same numbers when packing batches;
95
+ * no negotiation endpoint), injected into `createAfsRpcHandler` per runtime.
96
+ * Derived from the worst-case subrequest costs measured in P0
97
+ * (planning/afs-rpc-batch/p0-measurements.md).
98
+ */
99
+ interface BatchLimits {
100
+ /** Max entries per batchWrite envelope. */
101
+ maxWriteEntries: number;
102
+ /** Max entries per batchDelete envelope. */
103
+ maxDeleteEntries: number;
104
+ /** Max entries per batchRead envelope. */
105
+ maxReadEntries: number;
106
+ /** Σ decoded bytes cap across a batchWrite envelope (400 BATCH_OVER_BUDGET). */
107
+ maxWriteBatchBytes: number;
108
+ /** Single-entry decoded cap (413 PAYLOAD_TOO_LARGE — same code as single op). */
109
+ maxEntryWriteBytes: number;
110
+ /**
111
+ * batchRead tail-truncation threshold, accumulated over ENCODED (base64
112
+ * response) bytes. NOT a hard response cap: the entry that crosses it is
113
+ * still returned in full (never read-then-discard); subsequent entries get
114
+ * 503 BATCH_TAIL_SKIPPED without being read.
115
+ */
116
+ readTailSkipThresholdBytes: number;
117
+ /**
118
+ * Pre-parse cap on the ENCODED request body (whole endpoint, not just
119
+ * batch): checked against Content-Length AND enforced by bounded read
120
+ * BEFORE `request.json()`, so an unauthenticated oversized body can't buy
121
+ * parse CPU/memory. Covers single-op 16MB decoded ≈ 21.4MB encoded + slack.
122
+ */
123
+ maxEncodedRequestBytes: number;
124
+ }
125
+ /** Cloudflare-tier limits (free-tier portability baseline; P0-confirmed). */
126
+ declare const BATCH_LIMITS_CF: BatchLimits;
127
+ /** Node-daemon limits (no subrequest budget; bounded by memory/UX only). */
128
+ declare const BATCH_LIMITS_NODE: BatchLimits;
129
+ /** batchWrite entry = single-op write body minus type/blocklet/sessionId. */
130
+ interface BatchWriteWireEntry {
131
+ path: string;
132
+ content?: string;
133
+ encoding?: string;
134
+ contentType?: string;
135
+ options?: Record<string, unknown>;
136
+ /**
137
+ * Application metadata (createdAt / updatedAt / …) carried on the entry's
138
+ * top-level `meta` — distinct from `options.meta` (sync provenance). Forwarded
139
+ * to `AFSWriteEntryPayload.meta` so metadata-aware providers index it.
140
+ */
141
+ meta?: Record<string, unknown>;
142
+ }
143
+ /** batchDelete entry — ifMatch/provenance ride options.meta, like single op. */
144
+ interface BatchDeleteWireEntry {
145
+ path: string;
146
+ options?: Record<string, unknown>;
147
+ }
148
+ /** batchRead entry — `optional` mirrors the single-op wire field. */
149
+ interface BatchReadWireEntry {
150
+ path: string;
151
+ optional?: boolean;
152
+ options?: Record<string, unknown>;
153
+ }
154
+ type BatchWireEntry = BatchWriteWireEntry & BatchDeleteWireEntry & BatchReadWireEntry;
155
+ /** Per-entry decode outcome for batchWrite (aligned by index with entries). */
156
+ type BatchWriteDecode = {
157
+ ok: true;
158
+ bytes: Uint8Array;
159
+ } | {
160
+ ok: false;
161
+ status: number;
162
+ error: string;
163
+ code?: string;
164
+ };
165
+ type BatchValidation = {
166
+ ok: true;
167
+ entries: BatchWireEntry[];
168
+ writeDecodes?: BatchWriteDecode[];
169
+ } | {
170
+ ok: false;
171
+ status: number;
172
+ error: string;
173
+ code?: string;
174
+ };
175
+ /**
176
+ * Envelope-level validation for the three batch ops (wire-contract §9).
177
+ *
178
+ * Envelope rejections (zero entries executed): entries shape, per-type
179
+ * maxEntries / Σ-decoded-bytes budget (400 BATCH_OVER_BUDGET), forbidden
180
+ * per-entry `blocklet`/`sessionId` fields, invalid/traversal paths, and a
181
+ * single entry over the per-entry decoded cap (413 PAYLOAD_TOO_LARGE — the
182
+ * single-op code).
183
+ *
184
+ * Content-shape problems (missing/empty content, unknown encoding, bad
185
+ * base64) are NOT envelope rejections: single-op parity says each such entry
186
+ * fails alone, so they come back as per-entry decode outcomes in
187
+ * `writeDecodes` for the dispatch loop to surface as `results[i]`.
188
+ */
189
+ declare function validateBatchBody(body: {
190
+ type?: string;
191
+ entries?: unknown;
192
+ }, limits: BatchLimits, sanitizePath: (path: string) => string | null): BatchValidation;
193
+ //#endregion
194
+ export { BATCH_LIMITS_CF, BATCH_LIMITS_NODE, BatchDeleteWireEntry, BatchLimits, BatchReadWireEntry, BatchWriteWireEntry, RpcWriteBody, WIRE_ERROR_CODES, WireEncoding, WireValidation, decodeContentBase64, encodeContentBase64, parseBearerToken, readWriteIfMatch, validateAndDecodeWrite, validateBatchBody };
195
+ //# sourceMappingURL=afs-rpc-wire.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"afs-rpc-wire.d.cts","names":[],"sources":["../../src/http/afs-rpc-wire.ts"],"mappings":";;AAcA;;;;;;;;;;;AAsBA;AAAA,cAtBa,gBAAA;EAAA;iDAsBqD;EAAA,+CAQ1C;EAAA;EAAA;;AAGxB;;;;;EAHwB;;;;;;;iBARR,gBAAA,CAAiB,MAAA;;KAQrB,YAAA;;UAGK,YAAA;EACf,IAAA;EACA,IAAA;EACA,OAAA;EACA,QAAA;EACA,WAAA;EACA,OAAA;IACE,OAAA;IACA,IAAA;MAAS,QAAA;MAAoB,KAAA;MAAiB,OAAA;IAAA;EAAA;AAAA;AAAA,KAItC,cAAA;EACN,EAAA;EAAU,KAAA,EAAO,UAAA;AAAA;EACjB,EAAA;EAAW,MAAA;EAAgB,KAAA;EAAe,IAAA;AAAA;AA0ChD;;;;AAAA,iBApCgB,mBAAA,CAAoB,GAAA,WAAc,UAAA;;iBAUlC,mBAAA,CAAoB,KAAA,EAAO,UAAA;;;AAgD3C;;;;;AAcA;;;;;;;;;iBApCgB,sBAAA,CAAuB,IAAA,EAAM,YAAA,GAAe,cAAA;;;;AAkE5D;;iBA5CgB,gBAAA,CAAiB,OAAA,EAAS,YAAA;;;AAuD1C;;;;;UAzCiB,WAAA;EAoDmB;EAlDlC,eAAA;EA6Da;EA3Db,gBAAA;EAkDA;EAhDA,cAAA;EAkDA;EAhDA,kBAAA;EAiDU;EA/CV,kBAAA;EAqDO;;;AAIT;;;EAlDE,0BAAA;EAmDA;;;;;AAKF;EAjDE,sBAAA;AAAA;;cAMW,eAAA,EAAiB,WAAA;;cAWjB,iBAAA,EAAmB,WAAA;;UAWf,mBAAA;EACf,IAAA;EACA,OAAA;EACA,QAAA;EACA,WAAA;EACA,OAAA,GAAU,MAAA;EAsBuC;;;;;EAhBjD,IAAA,GAAO,MAAA;AAAA;;UAIQ,oBAAA;EACf,IAAA;EACA,OAAA,GAAU,MAAA;AAAA;;UAIK,kBAAA;EACf,IAAA;EACA,QAAA;EACA,OAAA,GAAU,MAAA;AAAA;AAAA,KAGA,cAAA,GAAiB,mBAAA,GAAsB,oBAAA,GAAuB,kBAAA;;KAG9D,gBAAA;EACN,EAAA;EAAU,KAAA,EAAO,UAAA;AAAA;EACjB,EAAA;EAAW,MAAA;EAAgB,KAAA;EAAe,IAAA;AAAA;AAAA,KAEpC,eAAA;EACN,EAAA;EAAU,OAAA,EAAS,cAAA;EAAkB,YAAA,GAAe,gBAAA;AAAA;EACpD,EAAA;EAAW,MAAA;EAAgB,KAAA;EAAe,IAAA;AAAA;;;;;;;;;;;;;;;iBAwBhC,iBAAA,CACd,IAAA;EAAQ,IAAA;EAAe,OAAA;AAAA,GACvB,MAAA,EAAQ,WAAA,EACR,YAAA,GAAe,IAAA,6BACd,eAAA"}
@@ -0,0 +1,195 @@
1
+ //#region src/http/afs-rpc-wire.d.ts
2
+ /**
3
+ * afs-rpc wire contract — encoding + validation helpers.
4
+ *
5
+ * Single source of truth for the binary content encoding (base64) and the
6
+ * write/delete body validation rules pinned in
7
+ * `planning/did-integration/mobile-didspace-transport/wire-contract.md`.
8
+ *
9
+ * Both runtime handlers (Node `daemon/server.ts`, Cloudflare `index.ts`) share
10
+ * `createAfsRpcHandler`; this module is where the write/delete dispatch (Phase
11
+ * 4) decodes `content` and enforces field-position rules. Defined in Phase 0
12
+ * so the contract is frozen before any implementation.
13
+ */
14
+ /** Stable error codes surfaced on the wire (see wire-contract.md §7/§9). */
15
+ declare const WIRE_ERROR_CODES: {
16
+ readonly conflict: "AFS_CONFLICT";
17
+ readonly payloadTooLarge: "PAYLOAD_TOO_LARGE"; /** Batch envelope rejected up-front (entry count / Σ bytes) — zero entries executed. */
18
+ readonly batchOverBudget: "BATCH_OVER_BUDGET"; /** batchRead tail entry skipped (encoded-byte threshold reached) — retry next batch. */
19
+ readonly batchTailSkipped: "BATCH_TAIL_SKIPPED";
20
+ /**
21
+ * Declared-size upload rejected BEFORE any bytes move (ingest-prepare early
22
+ * reject — DID-Space upload-limits, design §8 / D7). Distinct from
23
+ * `PAYLOAD_TOO_LARGE` ("actual decoded bytes over the cap"): `FILE_TOO_LARGE`
24
+ * fires on the client-declared size at the planning stage, is per-entry, and
25
+ * is never auto-retried by the sync engine.
26
+ */
27
+ readonly fileTooLarge: "FILE_TOO_LARGE";
28
+ };
29
+ /**
30
+ * Extract the JWT from an `Authorization: Bearer <jwt>` header, or null when
31
+ * absent/malformed. Shared by both runtimes' `resolveCaller` (Phase 4) so the
32
+ * Bearer parsing is single-sourced and case-insensitive on the scheme.
33
+ */
34
+ declare function parseBearerToken(header: string | null | undefined): string | null;
35
+ /** Only encoding understood today. `bypass` (D-A) is reserved for large blobs. */
36
+ type WireEncoding = "base64";
37
+ /** Shape of a `write` RpcBody after JSON parse, before decoding. */
38
+ interface RpcWriteBody {
39
+ type: "write";
40
+ path?: string;
41
+ content?: string;
42
+ encoding?: string;
43
+ contentType?: string;
44
+ options?: {
45
+ ifMatch?: unknown;
46
+ meta?: {
47
+ deviceId?: unknown;
48
+ mtime?: unknown;
49
+ ifMatch?: unknown;
50
+ };
51
+ };
52
+ }
53
+ type WireValidation = {
54
+ ok: true;
55
+ bytes: Uint8Array;
56
+ } | {
57
+ ok: false;
58
+ status: number;
59
+ error: string;
60
+ code?: string;
61
+ };
62
+ /**
63
+ * Decode a base64 string into bytes. Pure; no DOM/Buffer assumptions beyond
64
+ * `atob` (present in workerd + Node 18+ globalThis). Throws on malformed input.
65
+ */
66
+ declare function decodeContentBase64(b64: string): Uint8Array;
67
+ /** Encode bytes into a base64 string. Inverse of {@link decodeContentBase64}. */
68
+ declare function encodeContentBase64(bytes: Uint8Array): string;
69
+ /**
70
+ * Validate + decode a `write` body per the wire contract.
71
+ *
72
+ * Enforces:
73
+ * - `content` present and `encoding === "base64"` (missing/other → 400).
74
+ * The empty string IS present — it is the canonical base64 of a 0-byte
75
+ * file, which must roundtrip (P6 crafted-sample finding; rejecting it
76
+ * made empty files unsyncable on every client).
77
+ * - `content` is valid base64 (bad → 400).
78
+ *
79
+ * Does NOT touch `options.ifMatch` placement: the field-position rule
80
+ * (ifMatch belongs at `options.ifMatch`, never `options.meta.ifMatch` for
81
+ * writes) is enforced by the handler reading ONLY `options.ifMatch`. A
82
+ * misplaced `meta.ifMatch` is simply ignored (treated as absent top-level
83
+ * ifMatch → LWW), per wire-contract.md §8.3.
84
+ */
85
+ declare function validateAndDecodeWrite(body: RpcWriteBody): WireValidation;
86
+ /**
87
+ * Read the top-level write ifMatch precondition. The misplaced
88
+ * `options.meta.ifMatch` is intentionally NOT consulted for writes — only
89
+ * `delete` carries ifMatch under `meta`.
90
+ */
91
+ declare function readWriteIfMatch(options: RpcWriteBody["options"]): string | undefined;
92
+ /**
93
+ * Per-type batch limits — the wire-contract §9 constant table. These are
94
+ * CONTRACT constants (clients mirror the same numbers when packing batches;
95
+ * no negotiation endpoint), injected into `createAfsRpcHandler` per runtime.
96
+ * Derived from the worst-case subrequest costs measured in P0
97
+ * (planning/afs-rpc-batch/p0-measurements.md).
98
+ */
99
+ interface BatchLimits {
100
+ /** Max entries per batchWrite envelope. */
101
+ maxWriteEntries: number;
102
+ /** Max entries per batchDelete envelope. */
103
+ maxDeleteEntries: number;
104
+ /** Max entries per batchRead envelope. */
105
+ maxReadEntries: number;
106
+ /** Σ decoded bytes cap across a batchWrite envelope (400 BATCH_OVER_BUDGET). */
107
+ maxWriteBatchBytes: number;
108
+ /** Single-entry decoded cap (413 PAYLOAD_TOO_LARGE — same code as single op). */
109
+ maxEntryWriteBytes: number;
110
+ /**
111
+ * batchRead tail-truncation threshold, accumulated over ENCODED (base64
112
+ * response) bytes. NOT a hard response cap: the entry that crosses it is
113
+ * still returned in full (never read-then-discard); subsequent entries get
114
+ * 503 BATCH_TAIL_SKIPPED without being read.
115
+ */
116
+ readTailSkipThresholdBytes: number;
117
+ /**
118
+ * Pre-parse cap on the ENCODED request body (whole endpoint, not just
119
+ * batch): checked against Content-Length AND enforced by bounded read
120
+ * BEFORE `request.json()`, so an unauthenticated oversized body can't buy
121
+ * parse CPU/memory. Covers single-op 16MB decoded ≈ 21.4MB encoded + slack.
122
+ */
123
+ maxEncodedRequestBytes: number;
124
+ }
125
+ /** Cloudflare-tier limits (free-tier portability baseline; P0-confirmed). */
126
+ declare const BATCH_LIMITS_CF: BatchLimits;
127
+ /** Node-daemon limits (no subrequest budget; bounded by memory/UX only). */
128
+ declare const BATCH_LIMITS_NODE: BatchLimits;
129
+ /** batchWrite entry = single-op write body minus type/blocklet/sessionId. */
130
+ interface BatchWriteWireEntry {
131
+ path: string;
132
+ content?: string;
133
+ encoding?: string;
134
+ contentType?: string;
135
+ options?: Record<string, unknown>;
136
+ /**
137
+ * Application metadata (createdAt / updatedAt / …) carried on the entry's
138
+ * top-level `meta` — distinct from `options.meta` (sync provenance). Forwarded
139
+ * to `AFSWriteEntryPayload.meta` so metadata-aware providers index it.
140
+ */
141
+ meta?: Record<string, unknown>;
142
+ }
143
+ /** batchDelete entry — ifMatch/provenance ride options.meta, like single op. */
144
+ interface BatchDeleteWireEntry {
145
+ path: string;
146
+ options?: Record<string, unknown>;
147
+ }
148
+ /** batchRead entry — `optional` mirrors the single-op wire field. */
149
+ interface BatchReadWireEntry {
150
+ path: string;
151
+ optional?: boolean;
152
+ options?: Record<string, unknown>;
153
+ }
154
+ type BatchWireEntry = BatchWriteWireEntry & BatchDeleteWireEntry & BatchReadWireEntry;
155
+ /** Per-entry decode outcome for batchWrite (aligned by index with entries). */
156
+ type BatchWriteDecode = {
157
+ ok: true;
158
+ bytes: Uint8Array;
159
+ } | {
160
+ ok: false;
161
+ status: number;
162
+ error: string;
163
+ code?: string;
164
+ };
165
+ type BatchValidation = {
166
+ ok: true;
167
+ entries: BatchWireEntry[];
168
+ writeDecodes?: BatchWriteDecode[];
169
+ } | {
170
+ ok: false;
171
+ status: number;
172
+ error: string;
173
+ code?: string;
174
+ };
175
+ /**
176
+ * Envelope-level validation for the three batch ops (wire-contract §9).
177
+ *
178
+ * Envelope rejections (zero entries executed): entries shape, per-type
179
+ * maxEntries / Σ-decoded-bytes budget (400 BATCH_OVER_BUDGET), forbidden
180
+ * per-entry `blocklet`/`sessionId` fields, invalid/traversal paths, and a
181
+ * single entry over the per-entry decoded cap (413 PAYLOAD_TOO_LARGE — the
182
+ * single-op code).
183
+ *
184
+ * Content-shape problems (missing/empty content, unknown encoding, bad
185
+ * base64) are NOT envelope rejections: single-op parity says each such entry
186
+ * fails alone, so they come back as per-entry decode outcomes in
187
+ * `writeDecodes` for the dispatch loop to surface as `results[i]`.
188
+ */
189
+ declare function validateBatchBody(body: {
190
+ type?: string;
191
+ entries?: unknown;
192
+ }, limits: BatchLimits, sanitizePath: (path: string) => string | null): BatchValidation;
193
+ //#endregion
194
+ export { BATCH_LIMITS_CF, BATCH_LIMITS_NODE, BatchDeleteWireEntry, BatchLimits, BatchReadWireEntry, BatchWriteWireEntry, RpcWriteBody, WIRE_ERROR_CODES, WireEncoding, WireValidation, decodeContentBase64, encodeContentBase64, parseBearerToken, readWriteIfMatch, validateAndDecodeWrite, validateBatchBody };
195
+ //# sourceMappingURL=afs-rpc-wire.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"afs-rpc-wire.d.mts","names":[],"sources":["../../src/http/afs-rpc-wire.ts"],"mappings":";;AAcA;;;;;;;;;;;AAsBA;AAAA,cAtBa,gBAAA;EAAA;iDAsBqD;EAAA,+CAQ1C;EAAA;EAAA;;AAGxB;;;;;EAHwB;;;;;;;iBARR,gBAAA,CAAiB,MAAA;;KAQrB,YAAA;;UAGK,YAAA;EACf,IAAA;EACA,IAAA;EACA,OAAA;EACA,QAAA;EACA,WAAA;EACA,OAAA;IACE,OAAA;IACA,IAAA;MAAS,QAAA;MAAoB,KAAA;MAAiB,OAAA;IAAA;EAAA;AAAA;AAAA,KAItC,cAAA;EACN,EAAA;EAAU,KAAA,EAAO,UAAA;AAAA;EACjB,EAAA;EAAW,MAAA;EAAgB,KAAA;EAAe,IAAA;AAAA;AA0ChD;;;;AAAA,iBApCgB,mBAAA,CAAoB,GAAA,WAAc,UAAA;;iBAUlC,mBAAA,CAAoB,KAAA,EAAO,UAAA;;;AAgD3C;;;;;AAcA;;;;;;;;;iBApCgB,sBAAA,CAAuB,IAAA,EAAM,YAAA,GAAe,cAAA;;;;AAkE5D;;iBA5CgB,gBAAA,CAAiB,OAAA,EAAS,YAAA;;;AAuD1C;;;;;UAzCiB,WAAA;EAoDmB;EAlDlC,eAAA;EA6Da;EA3Db,gBAAA;EAkDA;EAhDA,cAAA;EAkDA;EAhDA,kBAAA;EAiDU;EA/CV,kBAAA;EAqDO;;;AAIT;;;EAlDE,0BAAA;EAmDA;;;;;AAKF;EAjDE,sBAAA;AAAA;;cAMW,eAAA,EAAiB,WAAA;;cAWjB,iBAAA,EAAmB,WAAA;;UAWf,mBAAA;EACf,IAAA;EACA,OAAA;EACA,QAAA;EACA,WAAA;EACA,OAAA,GAAU,MAAA;EAsBuC;;;;;EAhBjD,IAAA,GAAO,MAAA;AAAA;;UAIQ,oBAAA;EACf,IAAA;EACA,OAAA,GAAU,MAAA;AAAA;;UAIK,kBAAA;EACf,IAAA;EACA,QAAA;EACA,OAAA,GAAU,MAAA;AAAA;AAAA,KAGA,cAAA,GAAiB,mBAAA,GAAsB,oBAAA,GAAuB,kBAAA;;KAG9D,gBAAA;EACN,EAAA;EAAU,KAAA,EAAO,UAAA;AAAA;EACjB,EAAA;EAAW,MAAA;EAAgB,KAAA;EAAe,IAAA;AAAA;AAAA,KAEpC,eAAA;EACN,EAAA;EAAU,OAAA,EAAS,cAAA;EAAkB,YAAA,GAAe,gBAAA;AAAA;EACpD,EAAA;EAAW,MAAA;EAAgB,KAAA;EAAe,IAAA;AAAA;;;;;;;;;;;;;;;iBAwBhC,iBAAA,CACd,IAAA;EAAQ,IAAA;EAAe,OAAA;AAAA,GACvB,MAAA,EAAQ,WAAA,EACR,YAAA,GAAe,IAAA,6BACd,eAAA"}