@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,729 @@
1
+ import { createAfsRequestContext } from "./request-context.mjs";
2
+ import { BATCH_LIMITS_CF, WIRE_ERROR_CODES, encodeContentBase64, readBoundedBody, validateAndDecodeWrite, validateBatchBody } from "./afs-rpc-wire.mjs";
3
+ import { csrfRejection } from "./csrf.mjs";
4
+ import { execIngestFacade, injectIngestFacadeList, isIngestFacadePath } from "./ingest-facade.mjs";
5
+ import { UPLOAD_LIMIT_DEFAULTS, logEnabled, makeNsLog, sanitizeAfsPath } from "@aigne/afs";
6
+ import { time, timeMeta } from "@aigne/afs-timing";
7
+
8
+ //#region src/http/afs-rpc.ts
9
+ /**
10
+ * Blocklet-aware HTTP RPC handler for stateless AFS read operations.
11
+ *
12
+ * Why: AUP pages that just need `afs.list()` / `afs.read()` open a
13
+ * WebSocket otherwise — pinning a Durable Object on Cloudflare, or holding a
14
+ * WS handle on a Node daemon — even though the call is stateless. This
15
+ * handler runs purely in the HTTP request path; no WebSocket required.
16
+ *
17
+ * Distinct from `createAFSRestHandler` (which exposes the global AFS
18
+ * unscoped at `/afs/*`): this handler resolves the caller's blocklet from
19
+ * the request and returns paths that look like the blocklet's root to the
20
+ * client. It mirrors `AUPSessionDO.onSessionStart`'s `ProjectionProvider`
21
+ * setup but for HTTP, not WS.
22
+ *
23
+ * Scope: `read`, `list`, `stat`, `search`, `exec` (open to any resolved
24
+ * caller), plus `write`/`delete` (Phase 4) gated by an auth + allowlist layer —
25
+ * a verified Bearer caller writing only their own `/user/**` data path.
26
+ *
27
+ * Blocklet resolution priority:
28
+ * 1. options.resolveHostAlias(host) — caller-provided alias map
29
+ * (e.g. CF worker's patternCache
30
+ * from `.afs/aliases.json` —
31
+ * resolves `explorer.arcblock.io`
32
+ * → `chain-explorer` when the
33
+ * first label is NOT the
34
+ * blocklet id)
35
+ * 2. extractBlockletFromHost(host) — e.g. `showcase.afsd.io`
36
+ * → `"showcase"` when first
37
+ * label IS the blocklet id
38
+ * 3. body.blocklet / ?blocklet= — untrusted browser hint fallback
39
+ * 4. options.fallbackBlocklet
40
+ */
41
+ const READ_ONLY_OPS = new Set([
42
+ "read",
43
+ "list",
44
+ "stat",
45
+ "search",
46
+ "exec",
47
+ "batchRead"
48
+ ]);
49
+ const log = makeNsLog("aos:rpc");
50
+ /**
51
+ * Mutating ops (Phase 4 + afs-rpc-batch P1). Gated by an extra auth +
52
+ * allowlist layer on top of the read pipeline: a verified BEARER caller
53
+ * writing only their own `/user/**` data path. Batch ops run the SAME gate
54
+ * per entry — any entry failing it rejects the whole envelope (fail-closed).
55
+ */
56
+ const MUTATING_OPS = new Set([
57
+ "write",
58
+ "delete",
59
+ "batchWrite",
60
+ "batchDelete"
61
+ ]);
62
+ /** Batch wire ops (afs-rpc-batch P1): entries carry paths; no top-level path. */
63
+ const BATCH_OPS = new Set([
64
+ "batchRead",
65
+ "batchWrite",
66
+ "batchDelete"
67
+ ]);
68
+ const RPC_BLOCKLET_HINT_PRIORITY = {
69
+ explicitPriority: "fallback",
70
+ queryPriority: "fallback"
71
+ };
72
+ const JSON_HEADERS = { "Content-Type": "application/json; charset=utf-8" };
73
+ function jsonResponse(status, body) {
74
+ return new Response(JSON.stringify(body), {
75
+ status,
76
+ headers: { ...JSON_HEADERS }
77
+ });
78
+ }
79
+ function fail(status, error) {
80
+ return jsonResponse(status, {
81
+ ok: false,
82
+ error
83
+ });
84
+ }
85
+ /**
86
+ * Lift a wire write entry's top-level `meta` onto `AFSWriteEntryPayload.meta`
87
+ * so metadata-aware providers (did-space) index application fields like
88
+ * `createdAt` / `updatedAt`. Sync provenance stays in `options.meta` and is
89
+ * untouched here. Mirrors `execRootWriteAction`'s `args.meta` forwarding
90
+ * (afs-root-handlers) for the RPC write/batchWrite ingress, which previously
91
+ * dropped `meta` entirely. Returns `undefined` for absent/non-object meta.
92
+ */
93
+ function wireMeta(meta) {
94
+ return meta !== null && typeof meta === "object" ? meta : void 0;
95
+ }
96
+ /**
97
+ * Map AFS-layer errors onto sensible HTTP status codes.
98
+ * Unknown classes fall through to 500; the message still surfaces in
99
+ * the response body for debugging.
100
+ * Exported for the raw endpoint (afs-raw.ts) — one mapping, not two.
101
+ */
102
+ /**
103
+ * Stable AFS error code → HTTP status (afs-rpc-batch P2). One map serves both
104
+ * thrown errors ({@link statusForError}) and the structured `code` slot on
105
+ * core batch entry results — the two derivations must never drift.
106
+ */
107
+ const STATUS_BY_CODE = {
108
+ AFS_CONFLICT: 409,
109
+ AFS_NOT_FOUND: 404,
110
+ AFS_ACTION_NOT_FOUND: 404,
111
+ ENOENT: 404,
112
+ ENOTDIR: 404,
113
+ AFS_VALIDATION_ERROR: 400,
114
+ AFS_ACCESS_MODE: 405,
115
+ AFS_READONLY: 405,
116
+ AFS_ACCESS_DENIED: 403,
117
+ AFS_FORBIDDEN: 403,
118
+ AFS_AUTH_REQUIRED: 401,
119
+ AFS_PAYMENT_REQUIRED: 402,
120
+ AFS_UNSUPPORTED: 501
121
+ };
122
+ /** HTTP status for a structured per-entry error code (500 when unknown). */
123
+ function statusForCode(code) {
124
+ return code && STATUS_BY_CODE[code] || 500;
125
+ }
126
+ function statusForError(err) {
127
+ const byCode = STATUS_BY_CODE[err?.code ?? ""];
128
+ if (byCode) return byCode;
129
+ const name = err?.name ?? "";
130
+ if (name === "AFSAuthRequiredError") return 401;
131
+ if (name === "AFSPaymentRequiredError") return 402;
132
+ if (name === "AFSConflictError") return 409;
133
+ if (name === "AFSForbiddenError" || name === "AFSPermissionError") return 403;
134
+ if (name === "AFSNotFoundError") return 404;
135
+ if (name === "AFSValidationError") return 400;
136
+ if (name === "AFSAccessModeError") return 405;
137
+ if (name === "AFSReadonlyError") return 405;
138
+ if (name === "AFSUnsupportedError") return 501;
139
+ const message = errorMessage(err);
140
+ if (/\b(ENOENT|ENOTDIR):/.test(message)) return 404;
141
+ return 500;
142
+ }
143
+ function errorMessage(err) {
144
+ return err instanceof Error ? err.message : String(err);
145
+ }
146
+ /**
147
+ * Shape the 409 conflict body fields (wire-contract §7): the opaque
148
+ * current-version triple the client's conflict resolution (LWW) consumes.
149
+ * Single source for the single-op catch branch AND batch per-entry results —
150
+ * the triple must never drift between the two (afs-rpc-batch G3).
151
+ */
152
+ function enrichConflictBody(err) {
153
+ const c = err;
154
+ return {
155
+ error: errorMessage(err),
156
+ code: WIRE_ERROR_CODES.conflict,
157
+ currentCid: typeof c.currentCid === "string" ? c.currentCid : null,
158
+ currentMtime: typeof c.currentMtime === "number" ? c.currentMtime : null,
159
+ currentDeviceId: typeof c.currentDeviceId === "string" ? c.currentDeviceId : null
160
+ };
161
+ }
162
+ /**
163
+ * Map a per-entry failure onto the batch `results[i]` shape — identical to
164
+ * the single-op error body plus the `status` field (design §5.4 isomorphism).
165
+ * `optional` mirrors the single-op soft-miss: 404 → `{status:200, missing}`.
166
+ */
167
+ function batchEntryError(err, optional) {
168
+ const status = statusForError(err);
169
+ const message = errorMessage(err);
170
+ if (optional === true && status === 404) return {
171
+ status: 200,
172
+ ok: false,
173
+ error: message,
174
+ missing: true
175
+ };
176
+ if (status === 409) return {
177
+ status: 409,
178
+ ok: false,
179
+ ...enrichConflictBody(err)
180
+ };
181
+ const code = err?.code;
182
+ return {
183
+ status,
184
+ ok: false,
185
+ error: message,
186
+ ...code ? { code } : {}
187
+ };
188
+ }
189
+ /**
190
+ * Map a CORE batch entry result onto the wire `results[i]` shape (L2 switch,
191
+ * P2). Field-for-field identical to what the P1 handler loop produced from
192
+ * thrown errors: success → single-op body, conflict → 409 + triple, other
193
+ * failures → status derived from the structured `code`.
194
+ */
195
+ function wireResultFromCore(r) {
196
+ if (r.success) return {
197
+ status: 200,
198
+ ok: true,
199
+ data: encodeReadData(r.data)
200
+ };
201
+ if (r.conflict) return {
202
+ status: 409,
203
+ ok: false,
204
+ error: r.error ?? "",
205
+ code: WIRE_ERROR_CODES.conflict,
206
+ ...r.conflict
207
+ };
208
+ return {
209
+ status: statusForCode(r.code),
210
+ ok: false,
211
+ error: r.error ?? "",
212
+ ...r.code ? { code: r.code } : {}
213
+ };
214
+ }
215
+ /** Max write payload (decoded bytes) before a 413. Large-blob bypass (D-A) is
216
+ * deferred to Phase 6; until then, oversize writes are rejected outright. */
217
+ const MAX_WRITE_BYTES = 16 * 1024 * 1024;
218
+ /**
219
+ * Phase 4 write-surface allowlist: ONLY the caller's own `/user/**` data paths
220
+ * are mutable over afs-rpc. `/user` itself, `/instance/**`, `/space/**`, the
221
+ * blocklet-global root paths, and the `.objects`/`.changelog`/`.shares` virtual
222
+ * namespaces are all rejected (the provider's D4 guard is a second layer).
223
+ */
224
+ function isAllowedUserDataPath(path) {
225
+ if (!path.startsWith("/user/")) return false;
226
+ const segs = path.split("/").filter(Boolean);
227
+ if (segs.length < 2) return false;
228
+ return !segs.some((s) => s === ".objects" || s === ".changelog" || s === ".shares");
229
+ }
230
+ /**
231
+ * Authorize a mutating op (Phase 4, P0-1 + P1-1). Returns an error `Response`
232
+ * when the write/delete is NOT permitted, else `null`.
233
+ *
234
+ * Defense in depth (not "trust the client to write /user"):
235
+ * - authenticated (caller.did present) → else 401
236
+ * - BEARER auth-source (cookie alone can't drive a write) → else 403 (CSRF)
237
+ * - non-root blocklet scope (root exposes global topology) → else 403
238
+ * - path under the caller's own `/user/**` data namespace → else 403
239
+ * The `/user` overlay is keyed by `caller.did`, so a caller can only ever reach
240
+ * its own fragment (structural isolation); `body.blocklet` only selects the app.
241
+ */
242
+ function checkMutationAllowed(path, caller, scope) {
243
+ if (!caller || !caller.did) return fail(401, "Authentication required for write/delete");
244
+ if (caller.authSource !== "bearer") return fail(403, "write/delete require Authorization: Bearer (cookie-only is rejected)");
245
+ if (scope === "root") return fail(403, "write/delete not allowed on a root-scope blocklet");
246
+ if (!isAllowedUserDataPath(path)) return fail(403, `write/delete only allowed under /user/** data paths (got '${path}')`);
247
+ return null;
248
+ }
249
+ /**
250
+ * Wire-contract §5: a `read` whose `content` is raw bytes (e.g. `.objects/{cid}`
251
+ * or any binary file) is base64-encoded with an `encoding` marker so it
252
+ * survives JSON transport. Text/JSON content passes through unchanged. The
253
+ * client (mobile RemoteDIDSpaceAFS) base64-decodes + recomputes the CID.
254
+ */
255
+ function encodeReadData(data) {
256
+ if (!data || typeof data !== "object") return data;
257
+ const c = data.content;
258
+ if (c instanceof Uint8Array) return {
259
+ ...data,
260
+ content: encodeContentBase64(c),
261
+ encoding: "base64"
262
+ };
263
+ if (c instanceof ArrayBuffer) return {
264
+ ...data,
265
+ content: encodeContentBase64(new Uint8Array(c)),
266
+ encoding: "base64"
267
+ };
268
+ return data;
269
+ }
270
+ /**
271
+ * Extract the `{error,code,details}` triple from a provider that resolved with
272
+ * `success:false` (semantic failure, no throw). Buffered and streaming exec
273
+ * MUST format these identically — the cross-phase "流式与 buffered 语义对齐"
274
+ * invariant — so both spread this single source of truth.
275
+ */
276
+ function execFailureFields(error) {
277
+ return {
278
+ error: error?.message || error?.code || "Action failed",
279
+ code: error?.code,
280
+ details: error?.details
281
+ };
282
+ }
283
+ /**
284
+ * NDJSON streaming response for a streaming `exec` (README §3.2). Each output
285
+ * line is one typed envelope:
286
+ * {"t":"chunk","chunk":{ ...full AFSExecChunk... }} — per onChunk callback
287
+ * {"t":"done","data":<final exec result data>} — exec resolved success
288
+ * {"t":"error","error":"...","code":"...","details":...} — failure / reject
289
+ *
290
+ * Wire contract (§3.2): the chunk envelope serializes the WHOLE `AFSExecChunk`
291
+ * (incl. `thoughts` + provider-specific fields) so the transport layer never
292
+ * drops fields — the client typed-surface narrowing happens later, not here.
293
+ *
294
+ * Errors are two-layered (§3.2.1): handler-level errors (CSRF, bad path) are
295
+ * already returned with a real HTTP status BEFORE this is called. Once the
296
+ * stream is open the status is committed to 200, so an `afs.exec()` failure —
297
+ * including a provider that resolves with `success:false` (mirroring the
298
+ * buffered branch) or an effect-gate reject — surfaces as a `{"t":"error"}`
299
+ * line, never as `{"t":"done"}`.
300
+ */
301
+ function execStreamResponse(afs, path, args, opts, context) {
302
+ const encoder = new TextEncoder();
303
+ const { stream: _wireOnlyStream, ...restOpts } = opts;
304
+ let closed = false;
305
+ const stream = new ReadableStream({
306
+ async start(controller) {
307
+ const enqueue = (line) => {
308
+ if (closed) return;
309
+ try {
310
+ controller.enqueue(encoder.encode(`${JSON.stringify(line)}\n`));
311
+ } catch {
312
+ closed = true;
313
+ }
314
+ };
315
+ const execOptions = {
316
+ ...restOpts,
317
+ context,
318
+ onChunk: (chunk) => enqueue({
319
+ t: "chunk",
320
+ chunk
321
+ })
322
+ };
323
+ try {
324
+ const r = await time("op", () => afs.exec(path, args, execOptions));
325
+ if (r.success === false) enqueue({
326
+ t: "error",
327
+ ...execFailureFields(r.error)
328
+ });
329
+ else enqueue({
330
+ t: "done",
331
+ data: r.data
332
+ });
333
+ } catch (err) {
334
+ const code = err?.code;
335
+ enqueue({
336
+ t: "error",
337
+ error: errorMessage(err),
338
+ code
339
+ });
340
+ } finally {
341
+ if (!closed) try {
342
+ controller.close();
343
+ } catch {}
344
+ }
345
+ },
346
+ cancel() {
347
+ closed = true;
348
+ }
349
+ });
350
+ return new Response(stream, {
351
+ status: 200,
352
+ headers: { "Content-Type": "application/x-ndjson; charset=utf-8" }
353
+ });
354
+ }
355
+ function createAfsRpcHandler(options) {
356
+ const reqCtx = createAfsRequestContext(options);
357
+ return async function handle(request) {
358
+ const probe = { t0: Date.now() };
359
+ try {
360
+ const resp = await handleInner(request, probe);
361
+ if (logEnabled("aos:rpc", "debug")) log.debug(`rpc:done type=${probe.type ?? "?"} status=${resp.status} totalMs=${Date.now() - probe.t0}`);
362
+ return resp;
363
+ } catch (err) {
364
+ log.warn(`afs-rpc unhandled failure error=${errorMessage(err)}`);
365
+ return fail(500, errorMessage(err));
366
+ }
367
+ };
368
+ async function handleInner(request, probe) {
369
+ if (request.method !== "POST") return fail(405, "Method Not Allowed (use POST)");
370
+ const limits = options.batchLimits ?? BATCH_LIMITS_CF;
371
+ const bounded = await readBoundedBody(request, limits.maxEncodedRequestBytes);
372
+ if (bounded.tooLarge) return jsonResponse(413, {
373
+ ok: false,
374
+ error: `Request body too large (> ${limits.maxEncodedRequestBytes} bytes)`,
375
+ code: WIRE_ERROR_CODES.payloadTooLarge
376
+ });
377
+ let body;
378
+ try {
379
+ body = JSON.parse(bounded.text);
380
+ if (typeof body !== "object" || body === null) throw new Error("body must be object");
381
+ } catch (err) {
382
+ return fail(400, `Invalid JSON body: ${errorMessage(err)}`);
383
+ }
384
+ const type = body.type;
385
+ if (typeof type !== "string" || !type) return fail(400, "Missing 'type' field");
386
+ const isMutation = MUTATING_OPS.has(type);
387
+ if (!READ_ONLY_OPS.has(type) && !isMutation) return fail(400, `Unsupported op '${type}' (supported: ${[...READ_ONLY_OPS, ...MUTATING_OPS].join(", ")})`);
388
+ const isBatch = BATCH_OPS.has(type);
389
+ let batch = null;
390
+ let path = "";
391
+ if (isBatch) {
392
+ const validated = validateBatchBody(body, limits, sanitizeAfsPath);
393
+ if (!validated.ok) return jsonResponse(validated.status, {
394
+ ok: false,
395
+ error: validated.error,
396
+ ...validated.code ? { code: validated.code } : {}
397
+ });
398
+ batch = validated;
399
+ } else {
400
+ if (typeof body.path !== "string" || sanitizeAfsPath(body.path) === null) return fail(400, "Missing or invalid 'path'");
401
+ path = body.path;
402
+ }
403
+ probe.type = type;
404
+ if (logEnabled("aos:rpc", "debug")) {
405
+ const o = body.options ?? {};
406
+ const optBits = [
407
+ o.maxDepth !== void 0 ? `maxDepth=${o.maxDepth}` : "",
408
+ o.limit !== void 0 ? `limit=${o.limit}` : "",
409
+ o.offset !== void 0 ? `offset=${o.offset}` : "",
410
+ o.cursor !== void 0 ? "cursor=1" : ""
411
+ ].filter(Boolean).join(";");
412
+ const argEntries = Array.isArray(body.args?.entries) ? body.args.entries.length : void 0;
413
+ const target = isBatch ? `batch:${batch?.entries.length ?? 0}` : path;
414
+ log.debug(`rpc:begin type=${type} target=${target}${argEntries !== void 0 ? ` args.entries=${argEntries}` : ""}${optBits ? ` opt=${optBits}` : ""} blockletHint=${body.blocklet ?? "-"}`);
415
+ }
416
+ const tPre = Date.now();
417
+ const blocklet = await time("resolve", () => reqCtx.resolveBlocklet(request, body.blocklet, RPC_BLOCKLET_HINT_PRIORITY));
418
+ const tBlocklet = Date.now();
419
+ if (!blocklet) return fail(400, "Could not resolve blocklet (set body.blocklet, ?blocklet=, or use a subdomain)");
420
+ const opts = body.options ?? {};
421
+ const caller = await reqCtx.resolveCaller(request);
422
+ const tCaller = Date.now();
423
+ const sessionIdForCtx = typeof body.sessionId === "string" && body.sessionId ? body.sessionId : null;
424
+ let scope;
425
+ let afs;
426
+ let context;
427
+ try {
428
+ const scoped = await reqCtx.resolveScoped(request, {
429
+ blocklet,
430
+ sessionId: sessionIdForCtx,
431
+ caller,
432
+ opOptions: opts
433
+ });
434
+ scope = scoped.scope;
435
+ afs = scoped.afs;
436
+ context = scoped.context;
437
+ } catch (err) {
438
+ return fail(statusForError(err), errorMessage(err));
439
+ }
440
+ const tScoped = Date.now();
441
+ if (logEnabled("aos:rpc", "debug")) log.debug(`rpc:resolved type=${type} blocklet=${blocklet} scope=${scope} resolveMs=${tScoped - probe.t0} blockletMs=${tBlocklet - tPre} callerMs=${tCaller - tBlocklet} scopedMs=${tScoped - tCaller}`);
442
+ if (isMutation) {
443
+ const gatePaths = batch ? batch.entries.map((e) => e.path) : [path];
444
+ for (const gatePath of gatePaths) {
445
+ const denied = checkMutationAllowed(gatePath, caller, scope);
446
+ if (denied) return denied;
447
+ }
448
+ }
449
+ if (type === "exec") {
450
+ const csrfReason = csrfRejection(request, caller, true);
451
+ if (csrfReason) return fail(403, csrfReason);
452
+ }
453
+ try {
454
+ switch (type) {
455
+ case "read":
456
+ if (!afs.read) return fail(501, "read not supported");
457
+ return jsonResponse(200, {
458
+ ok: true,
459
+ data: encodeReadData((await time("op", () => afs.read(path, {
460
+ ...opts,
461
+ context
462
+ }))).data)
463
+ });
464
+ case "list": {
465
+ const r = await time("op", () => afs.list(path, {
466
+ ...opts,
467
+ context
468
+ }));
469
+ return jsonResponse(200, {
470
+ ok: true,
471
+ data: path === "/.actions" ? injectIngestFacadeList(r.data) : r.data,
472
+ total: r.total,
473
+ meta: r.meta,
474
+ liveSeq: r.liveSeq
475
+ });
476
+ }
477
+ case "stat":
478
+ if (!afs.stat) return fail(501, "stat not supported");
479
+ return jsonResponse(200, {
480
+ ok: true,
481
+ data: (await time("op", () => afs.stat(path, {
482
+ ...opts,
483
+ context
484
+ }))).data
485
+ });
486
+ case "search": {
487
+ if (!afs.search) return fail(501, "search not supported");
488
+ const query = String(body.args?.query ?? body.options?.query ?? "");
489
+ const filters = body.args?.filters ?? body.options?.filters;
490
+ const mode = body.args?.mode ?? body.options?.mode;
491
+ const r = await time("op", () => afs.search(path, query, {
492
+ ...opts,
493
+ context,
494
+ filters,
495
+ mode
496
+ }));
497
+ return jsonResponse(200, {
498
+ ok: true,
499
+ data: r.data,
500
+ message: r.message,
501
+ meta: r.meta
502
+ });
503
+ }
504
+ case "exec": {
505
+ if (!afs.exec) return fail(501, "exec not supported");
506
+ if (isIngestFacadePath(path)) {
507
+ const fr = await time("op", () => execIngestFacade({
508
+ afs,
509
+ path,
510
+ args: body.args ?? {},
511
+ context,
512
+ caller,
513
+ limits: options.uploadLimits ?? UPLOAD_LIMIT_DEFAULTS
514
+ }));
515
+ if ("status" in fr) return fail(fr.status, fr.error);
516
+ if (fr.ok) return jsonResponse(200, {
517
+ ok: true,
518
+ data: fr.data
519
+ });
520
+ return jsonResponse(200, {
521
+ ok: false,
522
+ error: fr.error,
523
+ ...fr.code ? { code: fr.code } : {}
524
+ });
525
+ }
526
+ const args = { ...body.args ?? {} };
527
+ delete args._scope_afs;
528
+ args._scope_afs = afs;
529
+ if (opts.stream === true) return execStreamResponse(afs, path, args, opts, context);
530
+ const r = await time("op", () => afs.exec(path, args, {
531
+ ...opts,
532
+ context
533
+ }));
534
+ const exec = r;
535
+ if (exec.success === false) return jsonResponse(200, {
536
+ ok: false,
537
+ ...execFailureFields(exec.error)
538
+ });
539
+ return jsonResponse(200, {
540
+ ok: true,
541
+ data: r.data
542
+ });
543
+ }
544
+ case "write": {
545
+ if (!afs.write) return fail(501, "write not supported");
546
+ const decoded = validateAndDecodeWrite({
547
+ type: "write",
548
+ path,
549
+ content: body.content,
550
+ encoding: body.encoding,
551
+ options: opts
552
+ });
553
+ if (!decoded.ok) return fail(decoded.status, decoded.error);
554
+ if (decoded.bytes.length > MAX_WRITE_BYTES) return jsonResponse(413, {
555
+ ok: false,
556
+ error: `Payload too large (> ${MAX_WRITE_BYTES} bytes)`,
557
+ code: WIRE_ERROR_CODES.payloadTooLarge
558
+ });
559
+ return jsonResponse(200, {
560
+ ok: true,
561
+ data: encodeReadData((await time("op", () => afs.write(path, {
562
+ content: decoded.bytes,
563
+ meta: wireMeta(body.meta)
564
+ }, {
565
+ ...opts,
566
+ context
567
+ }))).data)
568
+ });
569
+ }
570
+ case "delete":
571
+ if (!afs.delete) return fail(501, "delete not supported");
572
+ return jsonResponse(200, {
573
+ ok: true,
574
+ data: await time("op", () => afs.delete(path, {
575
+ ...opts,
576
+ context
577
+ }))
578
+ });
579
+ case "batchWrite": {
580
+ if (!afs.batchWrite) return fail(501, "write not supported");
581
+ const entries = batch.entries;
582
+ const decodes = batch.writeDecodes;
583
+ timeMeta("batch", `batchWrite n=${entries.length}`);
584
+ const results = new Array(entries.length);
585
+ const coreEntries = [];
586
+ const coreIndex = [];
587
+ for (let i = 0; i < entries.length; i++) {
588
+ const decoded = decodes[i];
589
+ if (!decoded.ok) {
590
+ results[i] = {
591
+ status: decoded.status,
592
+ ok: false,
593
+ error: decoded.error,
594
+ ...decoded.code ? { code: decoded.code } : {}
595
+ };
596
+ continue;
597
+ }
598
+ coreIndex.push(i);
599
+ coreEntries.push({
600
+ path: entries[i].path,
601
+ content: {
602
+ content: decoded.bytes,
603
+ meta: wireMeta(entries[i].meta)
604
+ },
605
+ options: entries[i].options
606
+ });
607
+ }
608
+ if (coreEntries.length > 0) {
609
+ const core = await time("op", () => afs.batchWrite(coreEntries, { context }));
610
+ for (let j = 0; j < core.results.length; j++) results[coreIndex[j]] = wireResultFromCore(core.results[j]);
611
+ }
612
+ const succeeded = results.filter((r) => r?.ok === true).length;
613
+ return jsonResponse(200, {
614
+ ok: true,
615
+ results,
616
+ succeeded,
617
+ failed: results.length - succeeded
618
+ });
619
+ }
620
+ case "batchDelete": {
621
+ if (!afs.batchDelete) return fail(501, "delete not supported");
622
+ const entries = batch.entries;
623
+ timeMeta("batch", `batchDelete n=${entries.length}`);
624
+ const core = await time("op", () => afs.batchDelete(entries.map((entry) => ({
625
+ path: entry.path,
626
+ options: entry.options
627
+ })), { context }));
628
+ return jsonResponse(200, {
629
+ ok: true,
630
+ results: core.results.map((r) => r.success ? {
631
+ status: 200,
632
+ ok: true,
633
+ data: {
634
+ path: r.path,
635
+ deleted: true
636
+ }
637
+ } : wireResultFromCore(r)),
638
+ succeeded: core.succeeded,
639
+ failed: core.failed
640
+ });
641
+ }
642
+ case "batchRead": {
643
+ if (!afs.read) return fail(501, "read not supported");
644
+ const entries = batch.entries;
645
+ timeMeta("batch", `batchRead n=${entries.length}`);
646
+ const results = [];
647
+ let succeeded = 0;
648
+ let encodedBytes = 0;
649
+ await time("op", async () => {
650
+ for (const entry of entries) {
651
+ if (encodedBytes >= limits.readTailSkipThresholdBytes) {
652
+ results.push({
653
+ status: 503,
654
+ ok: false,
655
+ error: "Batch response budget reached — retry this entry in the next batch",
656
+ code: WIRE_ERROR_CODES.batchTailSkipped
657
+ });
658
+ continue;
659
+ }
660
+ try {
661
+ const data = encodeReadData((await afs.read(entry.path, {
662
+ ...entry.options ?? {},
663
+ includeActions: "none",
664
+ context
665
+ })).data);
666
+ const content = data?.content;
667
+ if (typeof content === "string") encodedBytes += content.length;
668
+ results.push({
669
+ status: 200,
670
+ ok: true,
671
+ data
672
+ });
673
+ succeeded++;
674
+ } catch (err) {
675
+ results.push(batchEntryError(err, entry.optional === true));
676
+ }
677
+ }
678
+ });
679
+ return jsonResponse(200, {
680
+ ok: true,
681
+ results,
682
+ succeeded,
683
+ failed: results.length - succeeded
684
+ });
685
+ }
686
+ default: return fail(400, `Unsupported op '${type}'`);
687
+ }
688
+ } catch (err) {
689
+ const status = statusForError(err);
690
+ const message = errorMessage(err);
691
+ if (body.optional === true && status === 404) return jsonResponse(200, {
692
+ ok: false,
693
+ error: message,
694
+ missing: true
695
+ });
696
+ if (status === 402) {
697
+ const paymentRequired = err.paymentRequired;
698
+ const extraHeaders = paymentRequired !== void 0 ? { "PAYMENT-REQUIRED": typeof paymentRequired === "string" ? paymentRequired : JSON.stringify(paymentRequired) } : {};
699
+ return new Response(JSON.stringify({
700
+ ok: false,
701
+ error: message,
702
+ code: "AFS_PAYMENT_REQUIRED"
703
+ }), {
704
+ status: 402,
705
+ headers: {
706
+ ...JSON_HEADERS,
707
+ ...extraHeaders
708
+ }
709
+ });
710
+ }
711
+ if (status === 409) return jsonResponse(409, {
712
+ ok: false,
713
+ ...enrichConflictBody(err)
714
+ });
715
+ if (status >= 500) log.warn(`afs-rpc op failed type=${type} path=${isBatch ? "<batch>" : path} blocklet=${blocklet} status=${status} error=${message}`);
716
+ const code = err?.code;
717
+ if (code) return jsonResponse(status, {
718
+ ok: false,
719
+ error: message,
720
+ code
721
+ });
722
+ return fail(status, message);
723
+ }
724
+ }
725
+ }
726
+
727
+ //#endregion
728
+ export { createAfsRpcHandler, statusForError };
729
+ //# sourceMappingURL=afs-rpc.mjs.map