@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,59 @@
1
+ //#region src/http/aup-client.ts
2
+ /**
3
+ * AUP client HTML response factory.
4
+ *
5
+ * Wraps AUP client HTML (from @aigne/afs-ui or equivalent) into HTTP responses.
6
+ * The actual HTML is injected by the runtime — AOS provides the response wrapper.
7
+ */
8
+ const HTML_HEADERS = {
9
+ "Content-Type": "text/html; charset=utf-8",
10
+ "Cache-Control": "no-cache",
11
+ "X-Content-Type-Options": "nosniff"
12
+ };
13
+ /**
14
+ * Create a function that returns an AUP client HTML Response.
15
+ *
16
+ * @param getHtml - Function returning the AUP client HTML string.
17
+ * Called lazily so the HTML can be built/loaded once and cached.
18
+ */
19
+ function createAupClientResponder(getHtml) {
20
+ return async (_blockletName) => {
21
+ const html = getHtml();
22
+ return new Response(html, {
23
+ status: 200,
24
+ headers: { ...HTML_HEADERS }
25
+ });
26
+ };
27
+ }
28
+ /**
29
+ * Minimal fallback AUP client HTML for environments without @aigne/afs-ui.
30
+ * Shows a basic page that connects via WebSocket to the AFS service.
31
+ */
32
+ const MINIMAL_AUP_HTML = `<!DOCTYPE html>
33
+ <html lang="en">
34
+ <head>
35
+ <meta charset="UTF-8">
36
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
37
+ <title>AFS</title>
38
+ </head>
39
+ <body>
40
+ <div id="root">Loading...</div>
41
+ <script>
42
+ (function() {
43
+ var ws = new WebSocket(location.origin.replace(/^http/, 'ws'));
44
+ ws.onmessage = function(e) {
45
+ try {
46
+ var msg = JSON.parse(e.data);
47
+ if (msg.type === 'aup_render') {
48
+ document.getElementById('root').innerHTML = '<pre>' + JSON.stringify(msg, null, 2) + '</pre>';
49
+ }
50
+ } catch(err) { console.error(err); }
51
+ };
52
+ })();
53
+ <\/script>
54
+ </body>
55
+ </html>`;
56
+
57
+ //#endregion
58
+ export { MINIMAL_AUP_HTML, createAupClientResponder };
59
+ //# sourceMappingURL=aup-client.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aup-client.mjs","names":[],"sources":["../../src/http/aup-client.ts"],"sourcesContent":["/**\n * AUP client HTML response factory.\n *\n * Wraps AUP client HTML (from @aigne/afs-ui or equivalent) into HTTP responses.\n * The actual HTML is injected by the runtime — AOS provides the response wrapper.\n */\n\nconst HTML_HEADERS = {\n \"Content-Type\": \"text/html; charset=utf-8\",\n \"Cache-Control\": \"no-cache\",\n \"X-Content-Type-Options\": \"nosniff\",\n} as const;\n\n/**\n * Create a function that returns an AUP client HTML Response.\n *\n * @param getHtml - Function returning the AUP client HTML string.\n * Called lazily so the HTML can be built/loaded once and cached.\n */\nexport function createAupClientResponder(\n getHtml: () => string,\n): (blockletName?: string) => Promise<Response> {\n return async (_blockletName?: string) => {\n const html = getHtml();\n return new Response(html, {\n status: 200,\n headers: { ...HTML_HEADERS },\n });\n };\n}\n\n/**\n * Minimal fallback AUP client HTML for environments without @aigne/afs-ui.\n * Shows a basic page that connects via WebSocket to the AFS service.\n */\nexport const MINIMAL_AUP_HTML = `<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n<title>AFS</title>\n</head>\n<body>\n<div id=\"root\">Loading...</div>\n<script>\n(function() {\n var ws = new WebSocket(location.origin.replace(/^http/, 'ws'));\n ws.onmessage = function(e) {\n try {\n var msg = JSON.parse(e.data);\n if (msg.type === 'aup_render') {\n document.getElementById('root').innerHTML = '<pre>' + JSON.stringify(msg, null, 2) + '</pre>';\n }\n } catch(err) { console.error(err); }\n };\n})();\n</script>\n</body>\n</html>`;\n"],"mappings":";;;;;;;AAOA,MAAM,eAAe;CACnB,gBAAgB;CAChB,iBAAiB;CACjB,0BAA0B;CAC3B;;;;;;;AAQD,SAAgB,yBACd,SAC8C;AAC9C,QAAO,OAAO,kBAA2B;EACvC,MAAM,OAAO,SAAS;AACtB,SAAO,IAAI,SAAS,MAAM;GACxB,QAAQ;GACR,SAAS,EAAE,GAAG,cAAc;GAC7B,CAAC;;;;;;;AAQN,MAAa,mBAAmB"}
@@ -0,0 +1,100 @@
1
+ const require_csrf = require('./csrf.cjs');
2
+ let _aigne_afs = require("@aigne/afs");
3
+ let _aigne_afs_timing = require("@aigne/afs-timing");
4
+
5
+ //#region src/http/aup-event.ts
6
+ const log = (0, _aigne_afs.makeNsLog)("aos");
7
+ const JSON_HEADERS = { "Content-Type": "application/json; charset=utf-8" };
8
+ function jsonResponse(status, body) {
9
+ return new Response(JSON.stringify(body), {
10
+ status,
11
+ headers: { ...JSON_HEADERS }
12
+ });
13
+ }
14
+ function fail(status, error) {
15
+ return jsonResponse(status, {
16
+ ok: false,
17
+ error
18
+ });
19
+ }
20
+ function errorMessage(err) {
21
+ return err instanceof Error ? err.message : String(err);
22
+ }
23
+ /**
24
+ * Map dispatcher errors to HTTP status codes. The WebBackend dispatch raises
25
+ * `unknown session` and `invalid session token` as plain `Error` — pattern
26
+ * match by message rather than instance because the error class isn't
27
+ * exported across package boundaries.
28
+ */
29
+ function statusForError(err) {
30
+ const code = err?.code ?? "";
31
+ const name = err?.name ?? "";
32
+ if (code === "AFS_AUTH_REQUIRED" || name === "AFSAuthRequiredError") return 401;
33
+ if (name === "AFSForbiddenError" || code === "AFS_FORBIDDEN") return 403;
34
+ const msg = errorMessage(err);
35
+ if (/unknown session/i.test(msg)) return 404;
36
+ if (/invalid session token/i.test(msg)) return 401;
37
+ if (/AUP node not found/i.test(msg)) return 404;
38
+ return 500;
39
+ }
40
+ let warnedBodyCaller = false;
41
+ function warnDeprecatedBodyCaller() {
42
+ if (warnedBodyCaller) return;
43
+ warnedBodyCaller = true;
44
+ log.warn("[aos/aup-event] request body included `caller` — that field is no longer trusted; identity is resolved server-side from the auth cookie. Stop sending it from clients.");
45
+ }
46
+ function createAupEventHandler(options) {
47
+ const { provider, resolveCaller } = options;
48
+ return async function handle(request) {
49
+ if (request.method !== "POST") return fail(405, "Method Not Allowed (use POST)");
50
+ let body;
51
+ try {
52
+ body = await request.json();
53
+ if (typeof body !== "object" || body === null) throw new Error("body must be object");
54
+ } catch (err) {
55
+ return fail(400, `Invalid JSON body: ${errorMessage(err)}`);
56
+ }
57
+ const sessionId = body.sessionId;
58
+ if (typeof sessionId !== "string" || !sessionId) return fail(400, "Missing 'sessionId'");
59
+ const nodeId = body.nodeId;
60
+ if (typeof nodeId !== "string" || !nodeId) return fail(400, "Missing 'nodeId'");
61
+ const event = body.event;
62
+ if (typeof event !== "string" || !event) return fail(400, "Missing 'event'");
63
+ if (body.caller !== void 0) warnDeprecatedBodyCaller();
64
+ const caller = resolveCaller ? await resolveCaller(request) : null;
65
+ const csrfReason = require_csrf.csrfRejection(request, caller, true);
66
+ if (csrfReason) return fail(403, csrfReason);
67
+ try {
68
+ const dispatch = () => provider.dispatchHttpEvent({
69
+ sessionId,
70
+ sessionToken: typeof body.sessionToken === "string" ? body.sessionToken : void 0,
71
+ msg: {
72
+ nodeId,
73
+ event,
74
+ data: body.data && typeof body.data === "object" ? body.data : void 0
75
+ },
76
+ caller
77
+ });
78
+ const out = await (0, _aigne_afs_timing.time)("handler", dispatch);
79
+ return (0, _aigne_afs_timing.timeSync)("patch", () => jsonResponse(200, {
80
+ ok: true,
81
+ result: out.result,
82
+ messages: out.messages,
83
+ treeVersion: out.treeVersion
84
+ }));
85
+ } catch (err) {
86
+ const status = statusForError(err);
87
+ const errCode = err?.code;
88
+ const errName = err?.name;
89
+ const code = errCode === "AFS_AUTH_REQUIRED" || errName === "AFSAuthRequiredError" ? "AFS_AUTH_REQUIRED" : void 0;
90
+ return jsonResponse(status, {
91
+ ok: false,
92
+ error: errorMessage(err),
93
+ ...code ? { code } : {}
94
+ });
95
+ }
96
+ };
97
+ }
98
+
99
+ //#endregion
100
+ exports.createAupEventHandler = createAupEventHandler;
@@ -0,0 +1,38 @@
1
+ import { ResolveCallerFn } from "./auth-context.cjs";
2
+ import { CallerInfo } from "@aigne/afs";
3
+
4
+ //#region src/http/aup-event.d.ts
5
+ interface AupEventDispatcher {
6
+ dispatchHttpEvent(args: {
7
+ sessionId: string;
8
+ sessionToken?: string;
9
+ msg: {
10
+ nodeId: string;
11
+ event: string;
12
+ data?: Record<string, unknown>;
13
+ };
14
+ caller?: CallerInfo | null;
15
+ }): Promise<{
16
+ result: unknown;
17
+ messages: Record<string, unknown>[];
18
+ treeVersion: number;
19
+ }>;
20
+ }
21
+ interface AupEventHandlerOptions {
22
+ /**
23
+ * The AUP UI provider that owns the session registry. The handler calls
24
+ * `dispatchHttpEvent` on it. Typed loosely so this module doesn't have to
25
+ * import `@aigne/afs-ui` (which would create a cycle).
26
+ */
27
+ provider: AupEventDispatcher;
28
+ /**
29
+ * Resolve verified caller identity from the incoming request. When unset,
30
+ * dispatched events are always anonymous.
31
+ */
32
+ resolveCaller?: ResolveCallerFn;
33
+ }
34
+ type AupEventHandler = (request: Request) => Promise<Response>;
35
+ declare function createAupEventHandler(options: AupEventHandlerOptions): AupEventHandler;
36
+ //#endregion
37
+ export { AupEventHandler, AupEventHandlerOptions, createAupEventHandler };
38
+ //# sourceMappingURL=aup-event.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aup-event.d.cts","names":[],"sources":["../../src/http/aup-event.ts"],"mappings":";;;;UAuCU,kBAAA;EACR,iBAAA,CAAkB,IAAA;IAChB,SAAA;IACA,YAAA;IACA,GAAA;MAAO,MAAA;MAAgB,KAAA;MAAe,IAAA,GAAO,MAAA;IAAA;IAC7C,MAAA,GAAS,UAAA;EAAA,IACP,OAAA;IAAU,MAAA;IAAiB,QAAA,EAAU,MAAA;IAA2B,WAAA;EAAA;AAAA;AAAA,UAGrD,sBAAA;EAcuB;;;;;EARtC,QAAA,EAAU,kBAAA;EAqEI;;;;EAhEd,aAAA,GAAgB,eAAA;AAAA;AAAA,KAGN,eAAA,IAAmB,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA;AAAA,iBA6D5C,qBAAA,CAAsB,OAAA,EAAS,sBAAA,GAAyB,eAAA"}
@@ -0,0 +1,38 @@
1
+ import { ResolveCallerFn } from "./auth-context.mjs";
2
+ import { CallerInfo } from "@aigne/afs";
3
+
4
+ //#region src/http/aup-event.d.ts
5
+ interface AupEventDispatcher {
6
+ dispatchHttpEvent(args: {
7
+ sessionId: string;
8
+ sessionToken?: string;
9
+ msg: {
10
+ nodeId: string;
11
+ event: string;
12
+ data?: Record<string, unknown>;
13
+ };
14
+ caller?: CallerInfo | null;
15
+ }): Promise<{
16
+ result: unknown;
17
+ messages: Record<string, unknown>[];
18
+ treeVersion: number;
19
+ }>;
20
+ }
21
+ interface AupEventHandlerOptions {
22
+ /**
23
+ * The AUP UI provider that owns the session registry. The handler calls
24
+ * `dispatchHttpEvent` on it. Typed loosely so this module doesn't have to
25
+ * import `@aigne/afs-ui` (which would create a cycle).
26
+ */
27
+ provider: AupEventDispatcher;
28
+ /**
29
+ * Resolve verified caller identity from the incoming request. When unset,
30
+ * dispatched events are always anonymous.
31
+ */
32
+ resolveCaller?: ResolveCallerFn;
33
+ }
34
+ type AupEventHandler = (request: Request) => Promise<Response>;
35
+ declare function createAupEventHandler(options: AupEventHandlerOptions): AupEventHandler;
36
+ //#endregion
37
+ export { AupEventHandler, AupEventHandlerOptions, createAupEventHandler };
38
+ //# sourceMappingURL=aup-event.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aup-event.d.mts","names":[],"sources":["../../src/http/aup-event.ts"],"mappings":";;;;UAuCU,kBAAA;EACR,iBAAA,CAAkB,IAAA;IAChB,SAAA;IACA,YAAA;IACA,GAAA;MAAO,MAAA;MAAgB,KAAA;MAAe,IAAA,GAAO,MAAA;IAAA;IAC7C,MAAA,GAAS,UAAA;EAAA,IACP,OAAA;IAAU,MAAA;IAAiB,QAAA,EAAU,MAAA;IAA2B,WAAA;EAAA;AAAA;AAAA,UAGrD,sBAAA;EAcuB;;;;;EARtC,QAAA,EAAU,kBAAA;EAqEI;;;;EAhEd,aAAA,GAAgB,eAAA;AAAA;AAAA,KAGN,eAAA,IAAmB,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,QAAA;AAAA,iBA6D5C,qBAAA,CAAsB,OAAA,EAAS,sBAAA,GAAyB,eAAA"}
@@ -0,0 +1,101 @@
1
+ import { csrfRejection } from "./csrf.mjs";
2
+ import { makeNsLog } from "@aigne/afs";
3
+ import { time, timeSync } from "@aigne/afs-timing";
4
+
5
+ //#region src/http/aup-event.ts
6
+ const log = makeNsLog("aos");
7
+ const JSON_HEADERS = { "Content-Type": "application/json; charset=utf-8" };
8
+ function jsonResponse(status, body) {
9
+ return new Response(JSON.stringify(body), {
10
+ status,
11
+ headers: { ...JSON_HEADERS }
12
+ });
13
+ }
14
+ function fail(status, error) {
15
+ return jsonResponse(status, {
16
+ ok: false,
17
+ error
18
+ });
19
+ }
20
+ function errorMessage(err) {
21
+ return err instanceof Error ? err.message : String(err);
22
+ }
23
+ /**
24
+ * Map dispatcher errors to HTTP status codes. The WebBackend dispatch raises
25
+ * `unknown session` and `invalid session token` as plain `Error` — pattern
26
+ * match by message rather than instance because the error class isn't
27
+ * exported across package boundaries.
28
+ */
29
+ function statusForError(err) {
30
+ const code = err?.code ?? "";
31
+ const name = err?.name ?? "";
32
+ if (code === "AFS_AUTH_REQUIRED" || name === "AFSAuthRequiredError") return 401;
33
+ if (name === "AFSForbiddenError" || code === "AFS_FORBIDDEN") return 403;
34
+ const msg = errorMessage(err);
35
+ if (/unknown session/i.test(msg)) return 404;
36
+ if (/invalid session token/i.test(msg)) return 401;
37
+ if (/AUP node not found/i.test(msg)) return 404;
38
+ return 500;
39
+ }
40
+ let warnedBodyCaller = false;
41
+ function warnDeprecatedBodyCaller() {
42
+ if (warnedBodyCaller) return;
43
+ warnedBodyCaller = true;
44
+ log.warn("[aos/aup-event] request body included `caller` — that field is no longer trusted; identity is resolved server-side from the auth cookie. Stop sending it from clients.");
45
+ }
46
+ function createAupEventHandler(options) {
47
+ const { provider, resolveCaller } = options;
48
+ return async function handle(request) {
49
+ if (request.method !== "POST") return fail(405, "Method Not Allowed (use POST)");
50
+ let body;
51
+ try {
52
+ body = await request.json();
53
+ if (typeof body !== "object" || body === null) throw new Error("body must be object");
54
+ } catch (err) {
55
+ return fail(400, `Invalid JSON body: ${errorMessage(err)}`);
56
+ }
57
+ const sessionId = body.sessionId;
58
+ if (typeof sessionId !== "string" || !sessionId) return fail(400, "Missing 'sessionId'");
59
+ const nodeId = body.nodeId;
60
+ if (typeof nodeId !== "string" || !nodeId) return fail(400, "Missing 'nodeId'");
61
+ const event = body.event;
62
+ if (typeof event !== "string" || !event) return fail(400, "Missing 'event'");
63
+ if (body.caller !== void 0) warnDeprecatedBodyCaller();
64
+ const caller = resolveCaller ? await resolveCaller(request) : null;
65
+ const csrfReason = csrfRejection(request, caller, true);
66
+ if (csrfReason) return fail(403, csrfReason);
67
+ try {
68
+ const dispatch = () => provider.dispatchHttpEvent({
69
+ sessionId,
70
+ sessionToken: typeof body.sessionToken === "string" ? body.sessionToken : void 0,
71
+ msg: {
72
+ nodeId,
73
+ event,
74
+ data: body.data && typeof body.data === "object" ? body.data : void 0
75
+ },
76
+ caller
77
+ });
78
+ const out = await time("handler", dispatch);
79
+ return timeSync("patch", () => jsonResponse(200, {
80
+ ok: true,
81
+ result: out.result,
82
+ messages: out.messages,
83
+ treeVersion: out.treeVersion
84
+ }));
85
+ } catch (err) {
86
+ const status = statusForError(err);
87
+ const errCode = err?.code;
88
+ const errName = err?.name;
89
+ const code = errCode === "AFS_AUTH_REQUIRED" || errName === "AFSAuthRequiredError" ? "AFS_AUTH_REQUIRED" : void 0;
90
+ return jsonResponse(status, {
91
+ ok: false,
92
+ error: errorMessage(err),
93
+ ...code ? { code } : {}
94
+ });
95
+ }
96
+ };
97
+ }
98
+
99
+ //#endregion
100
+ export { createAupEventHandler };
101
+ //# sourceMappingURL=aup-event.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"aup-event.mjs","names":[],"sources":["../../src/http/aup-event.ts"],"sourcesContent":["/**\n * Blocklet-aware HTTP handler for `aup_event` dispatch.\n *\n * Why: `aup_event` is the second main client→server traffic class after AFS\n * RPC (covered by afs-rpc.ts). With both routed over HTTP, single-user\n * blocklet sessions never need to keep a WebSocket open — pages open one to\n * receive the initial AUP tree, then drop it. Reads (afs-rpc) and clicks\n * (aup-event) both go via short-lived HTTP requests.\n *\n * Pre-existing requirement: the session must have been created via WS\n * handshake first. The HTTP path validates `sessionToken` against the\n * session's `resumeToken` (rotated on full reconnect) — same auth model as\n * the WS handshake.\n *\n * Response shape: `{ ok, result, messages, treeVersion }`. `messages` are\n * the patches/renders that would have been pushed over the WS during this\n * event — the client applies them itself. `treeVersion` lets the client\n * detect drift on the next request.\n *\n * Auth: when `resolveCaller` is provided, the handler resolves identity\n * server-side (cookie/JWT) and forwards it to the dispatcher. The legacy\n * `body.caller` field is IGNORED — it was reserved for \"future auth\n * integration\" and that future is now. Clients that pass body.caller get\n * a one-shot deprecation warning per process.\n *\n * Out of scope (for now): events that require server-initiated round-trips\n * (prompt, inspect_request, dom_request). Those messages will appear in\n * `messages` but the client has no WS to respond on. Callers that need\n * those flows must keep the WebSocket open — same as before.\n */\n\nimport type { CallerInfo } from \"@aigne/afs\";\nimport { makeNsLog } from \"@aigne/afs\";\nimport { time, timeSync } from \"@aigne/afs-timing\";\nimport type { ResolveCallerFn } from \"./auth-context.js\";\nimport { csrfRejection } from \"./csrf.js\";\n\nconst log = makeNsLog(\"aos\");\n\ninterface AupEventDispatcher {\n dispatchHttpEvent(args: {\n sessionId: string;\n sessionToken?: string;\n msg: { nodeId: string; event: string; data?: Record<string, unknown> };\n caller?: CallerInfo | null;\n }): Promise<{ result: unknown; messages: Record<string, unknown>[]; treeVersion: number }>;\n}\n\nexport interface AupEventHandlerOptions {\n /**\n * The AUP UI provider that owns the session registry. The handler calls\n * `dispatchHttpEvent` on it. Typed loosely so this module doesn't have to\n * import `@aigne/afs-ui` (which would create a cycle).\n */\n provider: AupEventDispatcher;\n /**\n * Resolve verified caller identity from the incoming request. When unset,\n * dispatched events are always anonymous.\n */\n resolveCaller?: ResolveCallerFn;\n}\n\nexport type AupEventHandler = (request: Request) => Promise<Response>;\n\ninterface RequestBody {\n sessionId?: string;\n sessionToken?: string;\n nodeId?: string;\n event?: string;\n data?: Record<string, unknown>;\n /**\n * @deprecated Body-supplied caller is no longer trusted (the server\n * resolves identity from the auth cookie). Present here solely so we can\n * emit a one-shot deprecation warning when clients still send it.\n */\n caller?: unknown;\n}\n\nconst JSON_HEADERS = { \"Content-Type\": \"application/json; charset=utf-8\" } as const;\n\nfunction jsonResponse(status: number, body: unknown): Response {\n return new Response(JSON.stringify(body), { status, headers: { ...JSON_HEADERS } });\n}\n\nfunction fail(status: number, error: string): Response {\n return jsonResponse(status, { ok: false, error });\n}\n\nfunction errorMessage(err: unknown): string {\n return err instanceof Error ? err.message : String(err);\n}\n\n/**\n * Map dispatcher errors to HTTP status codes. The WebBackend dispatch raises\n * `unknown session` and `invalid session token` as plain `Error` — pattern\n * match by message rather than instance because the error class isn't\n * exported across package boundaries.\n */\nfunction statusForError(err: unknown): number {\n // exec-auth-gate §4.4/§4.7: an anonymous mutating exec dispatched through an\n // AUP event surfaces as AFSAuthRequiredError → 401 (was falling through to\n // 500 before). Match by code AND name (class identity isn't stable across\n // package boundaries under pnpm hoist).\n const code = (err as { code?: string } | undefined)?.code ?? \"\";\n const name = (err as { name?: string } | undefined)?.name ?? \"\";\n if (code === \"AFS_AUTH_REQUIRED\" || name === \"AFSAuthRequiredError\") return 401;\n if (name === \"AFSForbiddenError\" || code === \"AFS_FORBIDDEN\") return 403;\n const msg = errorMessage(err);\n if (/unknown session/i.test(msg)) return 404;\n if (/invalid session token/i.test(msg)) return 401;\n if (/AUP node not found/i.test(msg)) return 404;\n return 500;\n}\n\nlet warnedBodyCaller = false;\nfunction warnDeprecatedBodyCaller(): void {\n if (warnedBodyCaller) return;\n warnedBodyCaller = true;\n log.warn(\n \"[aos/aup-event] request body included `caller` — that field is no longer trusted; identity is resolved server-side from the auth cookie. Stop sending it from clients.\",\n );\n}\n\nexport function createAupEventHandler(options: AupEventHandlerOptions): AupEventHandler {\n const { provider, resolveCaller } = options;\n\n return async function handle(request: Request): Promise<Response> {\n if (request.method !== \"POST\") {\n return fail(405, \"Method Not Allowed (use POST)\");\n }\n\n let body: RequestBody;\n try {\n body = (await request.json()) as RequestBody;\n if (typeof body !== \"object\" || body === null) throw new Error(\"body must be object\");\n } catch (err) {\n return fail(400, `Invalid JSON body: ${errorMessage(err)}`);\n }\n\n const sessionId = body.sessionId;\n if (typeof sessionId !== \"string\" || !sessionId) {\n return fail(400, \"Missing 'sessionId'\");\n }\n const nodeId = body.nodeId;\n if (typeof nodeId !== \"string\" || !nodeId) {\n return fail(400, \"Missing 'nodeId'\");\n }\n const event = body.event;\n if (typeof event !== \"string\" || !event) {\n return fail(400, \"Missing 'event'\");\n }\n\n if (body.caller !== undefined) warnDeprecatedBodyCaller();\n\n const caller: CallerInfo | null = resolveCaller ? await resolveCaller(request) : null;\n\n // exec-auth-gate §4.7: an AUP event drives exec on the user's behalf — a\n // cookie session is CSRF-exposed exactly like afs-rpc exec. Validate Origin\n // for cookie-authed callers (bearer / anonymous / test-header exempt).\n const csrfReason = csrfRejection(request, caller, true);\n if (csrfReason) return fail(403, csrfReason);\n\n try {\n // server-timing Phase 3 (P3-7): split steady-state event handling into\n // `handler` (dispatch = business logic + patch generation) and `patch`\n // (response serialization). op.rt/op.prov come from ALS inside dispatch;\n // `total` is marked by the caller's outer collector. No-op when unscoped.\n const dispatch = () =>\n provider.dispatchHttpEvent({\n sessionId,\n sessionToken: typeof body.sessionToken === \"string\" ? body.sessionToken : undefined,\n msg: {\n nodeId,\n event,\n data: body.data && typeof body.data === \"object\" ? body.data : undefined,\n },\n caller,\n });\n const out = await time(\"handler\", dispatch);\n return timeSync(\"patch\", () =>\n jsonResponse(200, {\n ok: true,\n result: out.result,\n messages: out.messages,\n treeVersion: out.treeVersion,\n }),\n );\n } catch (err) {\n const status = statusForError(err);\n const errCode = (err as { code?: string } | undefined)?.code;\n const errName = (err as { name?: string } | undefined)?.name;\n // Parity with afs-rpc: surface the structured auth-required code so a\n // client can distinguish a gate 401 from other 401s.\n const code =\n errCode === \"AFS_AUTH_REQUIRED\" || errName === \"AFSAuthRequiredError\"\n ? \"AFS_AUTH_REQUIRED\"\n : undefined;\n return jsonResponse(status, {\n ok: false,\n error: errorMessage(err),\n ...(code ? { code } : {}),\n });\n }\n };\n}\n"],"mappings":";;;;;AAqCA,MAAM,MAAM,UAAU,MAAM;AAyC5B,MAAM,eAAe,EAAE,gBAAgB,mCAAmC;AAE1E,SAAS,aAAa,QAAgB,MAAyB;AAC7D,QAAO,IAAI,SAAS,KAAK,UAAU,KAAK,EAAE;EAAE;EAAQ,SAAS,EAAE,GAAG,cAAc;EAAE,CAAC;;AAGrF,SAAS,KAAK,QAAgB,OAAyB;AACrD,QAAO,aAAa,QAAQ;EAAE,IAAI;EAAO;EAAO,CAAC;;AAGnD,SAAS,aAAa,KAAsB;AAC1C,QAAO,eAAe,QAAQ,IAAI,UAAU,OAAO,IAAI;;;;;;;;AASzD,SAAS,eAAe,KAAsB;CAK5C,MAAM,OAAQ,KAAuC,QAAQ;CAC7D,MAAM,OAAQ,KAAuC,QAAQ;AAC7D,KAAI,SAAS,uBAAuB,SAAS,uBAAwB,QAAO;AAC5E,KAAI,SAAS,uBAAuB,SAAS,gBAAiB,QAAO;CACrE,MAAM,MAAM,aAAa,IAAI;AAC7B,KAAI,mBAAmB,KAAK,IAAI,CAAE,QAAO;AACzC,KAAI,yBAAyB,KAAK,IAAI,CAAE,QAAO;AAC/C,KAAI,sBAAsB,KAAK,IAAI,CAAE,QAAO;AAC5C,QAAO;;AAGT,IAAI,mBAAmB;AACvB,SAAS,2BAAiC;AACxC,KAAI,iBAAkB;AACtB,oBAAmB;AACnB,KAAI,KACF,yKACD;;AAGH,SAAgB,sBAAsB,SAAkD;CACtF,MAAM,EAAE,UAAU,kBAAkB;AAEpC,QAAO,eAAe,OAAO,SAAqC;AAChE,MAAI,QAAQ,WAAW,OACrB,QAAO,KAAK,KAAK,gCAAgC;EAGnD,IAAI;AACJ,MAAI;AACF,UAAQ,MAAM,QAAQ,MAAM;AAC5B,OAAI,OAAO,SAAS,YAAY,SAAS,KAAM,OAAM,IAAI,MAAM,sBAAsB;WAC9E,KAAK;AACZ,UAAO,KAAK,KAAK,sBAAsB,aAAa,IAAI,GAAG;;EAG7D,MAAM,YAAY,KAAK;AACvB,MAAI,OAAO,cAAc,YAAY,CAAC,UACpC,QAAO,KAAK,KAAK,sBAAsB;EAEzC,MAAM,SAAS,KAAK;AACpB,MAAI,OAAO,WAAW,YAAY,CAAC,OACjC,QAAO,KAAK,KAAK,mBAAmB;EAEtC,MAAM,QAAQ,KAAK;AACnB,MAAI,OAAO,UAAU,YAAY,CAAC,MAChC,QAAO,KAAK,KAAK,kBAAkB;AAGrC,MAAI,KAAK,WAAW,OAAW,2BAA0B;EAEzD,MAAM,SAA4B,gBAAgB,MAAM,cAAc,QAAQ,GAAG;EAKjF,MAAM,aAAa,cAAc,SAAS,QAAQ,KAAK;AACvD,MAAI,WAAY,QAAO,KAAK,KAAK,WAAW;AAE5C,MAAI;GAKF,MAAM,iBACJ,SAAS,kBAAkB;IACzB;IACA,cAAc,OAAO,KAAK,iBAAiB,WAAW,KAAK,eAAe;IAC1E,KAAK;KACH;KACA;KACA,MAAM,KAAK,QAAQ,OAAO,KAAK,SAAS,WAAW,KAAK,OAAO;KAChE;IACD;IACD,CAAC;GACJ,MAAM,MAAM,MAAM,KAAK,WAAW,SAAS;AAC3C,UAAO,SAAS,eACd,aAAa,KAAK;IAChB,IAAI;IACJ,QAAQ,IAAI;IACZ,UAAU,IAAI;IACd,aAAa,IAAI;IAClB,CAAC,CACH;WACM,KAAK;GACZ,MAAM,SAAS,eAAe,IAAI;GAClC,MAAM,UAAW,KAAuC;GACxD,MAAM,UAAW,KAAuC;GAGxD,MAAM,OACJ,YAAY,uBAAuB,YAAY,yBAC3C,sBACA;AACN,UAAO,aAAa,QAAQ;IAC1B,IAAI;IACJ,OAAO,aAAa,IAAI;IACxB,GAAI,OAAO,EAAE,MAAM,GAAG,EAAE;IACzB,CAAC"}
@@ -0,0 +1,66 @@
1
+ const require_role_level = require('../session/role-level.cjs');
2
+
3
+ //#region src/http/auth-context.ts
4
+ /**
5
+ * Shared authorization decision for the control-plane request surfaces
6
+ * (`/afs/*`, `/ws/attach`, `/mcp`) across BOTH runtimes — ONE definition so the
7
+ * previously-inline copies can't drift.
8
+ *
9
+ * - The local operator is always allowed: runtimes pass `loopback: true` only
10
+ * for a verified same-machine socket peer (never a spoofable Host /
11
+ * X-Forwarded-For header). CF has no loopback and always passes `false`.
12
+ * - A remote caller must be authenticated. `requireOwner` additionally demands
13
+ * the owner role — for the powerful, unscoped global-tree surfaces (`/afs/*`,
14
+ * `/ws/attach`). `/mcp` leaves it off (any authenticated caller; the request
15
+ * is scoped per-caller downstream).
16
+ *
17
+ * Fail-closed: a null caller or a below-owner role is rejected; `roleLevel`
18
+ * treats an unknown/empty role as 0.
19
+ */
20
+ function isControlPlaneAuthorized(caller, opts) {
21
+ if (opts.loopback) return true;
22
+ if (!caller) return false;
23
+ if (!opts.requireOwner) return true;
24
+ return require_role_level.roleLevel(caller.roles[0]) >= require_role_level.roleLevel("owner");
25
+ }
26
+ /**
27
+ * Fields a client could try to forge in a request body's `options.context`.
28
+ * They are STRIPPED before the host re-attaches verified/trusted values, so a
29
+ * body like `{ context: { instanceDid: "did:abt:zEVIL", userId: "...",
30
+ * agentRunOrigin: "system" } }` can never take effect.
31
+ */
32
+ const FORGEABLE_CONTEXT_FIELDS = [
33
+ "caller",
34
+ "userId",
35
+ "instanceDid",
36
+ "agentRunOrigin",
37
+ "persistenceClass",
38
+ "callerOrigin",
39
+ "paymentSignature"
40
+ ];
41
+ /**
42
+ * Safely merge a verified caller (and optional host-resolved trusted context)
43
+ * into an AFS op's context.
44
+ *
45
+ * Security (observability Phase 3a): the client-supplied `opts.context` is
46
+ * first STRIPPED of every forgeable field, then the verified `caller`/`userId`
47
+ * and the host-resolved `trusted` slice (instanceDid / agentRunOrigin / …) are
48
+ * layered on top. Whatever the client sent for those fields is discarded.
49
+ *
50
+ * `opts.context` is typed `unknown` (RPC body deserialises to
51
+ * `Record<string, unknown>`), so the cast is centralised here.
52
+ */
53
+ function mergeCallerContext(opts, caller, trusted) {
54
+ const existing = { ...opts.context ?? {} };
55
+ for (const field of FORGEABLE_CONTEXT_FIELDS) delete existing[field];
56
+ return {
57
+ ...existing,
58
+ ...caller?.did ? { userId: caller.did } : {},
59
+ ...caller ? { caller } : {},
60
+ ...trusted ?? {}
61
+ };
62
+ }
63
+
64
+ //#endregion
65
+ exports.isControlPlaneAuthorized = isControlPlaneAuthorized;
66
+ exports.mergeCallerContext = mergeCallerContext;
@@ -0,0 +1,64 @@
1
+ import { AFSContext, CallerInfo } from "@aigne/afs";
2
+
3
+ //#region src/http/auth-context.d.ts
4
+ /**
5
+ * Shared authorization decision for the control-plane request surfaces
6
+ * (`/afs/*`, `/ws/attach`, `/mcp`) across BOTH runtimes — ONE definition so the
7
+ * previously-inline copies can't drift.
8
+ *
9
+ * - The local operator is always allowed: runtimes pass `loopback: true` only
10
+ * for a verified same-machine socket peer (never a spoofable Host /
11
+ * X-Forwarded-For header). CF has no loopback and always passes `false`.
12
+ * - A remote caller must be authenticated. `requireOwner` additionally demands
13
+ * the owner role — for the powerful, unscoped global-tree surfaces (`/afs/*`,
14
+ * `/ws/attach`). `/mcp` leaves it off (any authenticated caller; the request
15
+ * is scoped per-caller downstream).
16
+ *
17
+ * Fail-closed: a null caller or a below-owner role is rejected; `roleLevel`
18
+ * treats an unknown/empty role as 0.
19
+ */
20
+ declare function isControlPlaneAuthorized(caller: CallerInfo | null, opts: {
21
+ loopback: boolean;
22
+ requireOwner?: boolean;
23
+ }): boolean;
24
+ /**
25
+ * Resolve a verified caller from an inbound HTTP request.
26
+ *
27
+ * Returns `null` when the request is anonymous (no cookie / invalid JWT /
28
+ * etc). Implementations MUST NOT trust any caller hint that appears in the
29
+ * request body — only verified identity (e.g. JWT cookie, mTLS client
30
+ * certificate) is acceptable.
31
+ */
32
+ type ResolveCallerFn = (request: Request) => Promise<CallerInfo | null>;
33
+ /**
34
+ * Resolve the trusted, host-controlled slice of an AFSContext for a request —
35
+ * the fields a client must never be able to forge (observability Phase 3a).
36
+ * Runs AFTER `resolveCaller` (identity) and is given the resolved blocklet /
37
+ * caller / sessionId so the host can attach `instanceDid` (the DID Space
38
+ * column key) and `agentRunOrigin`.
39
+ *
40
+ * `resolveCaller` stays the identity seam; this is the runtime-context seam.
41
+ * Keeping them separate prevents callers from mistaking instanceDid / origin /
42
+ * policy for parts of the verified identity.
43
+ */
44
+ type ResolveTrustedAfsContext = (request: Request, ctx: {
45
+ blocklet: string;
46
+ caller: CallerInfo | null;
47
+ sessionId: string | null;
48
+ }) => Promise<Partial<AFSContext>> | Partial<AFSContext>;
49
+ /**
50
+ * Safely merge a verified caller (and optional host-resolved trusted context)
51
+ * into an AFS op's context.
52
+ *
53
+ * Security (observability Phase 3a): the client-supplied `opts.context` is
54
+ * first STRIPPED of every forgeable field, then the verified `caller`/`userId`
55
+ * and the host-resolved `trusted` slice (instanceDid / agentRunOrigin / …) are
56
+ * layered on top. Whatever the client sent for those fields is discarded.
57
+ *
58
+ * `opts.context` is typed `unknown` (RPC body deserialises to
59
+ * `Record<string, unknown>`), so the cast is centralised here.
60
+ */
61
+ declare function mergeCallerContext(opts: Record<string, unknown>, caller: CallerInfo | null, trusted?: Partial<AFSContext>): Record<string, unknown>;
62
+ //#endregion
63
+ export { ResolveCallerFn, ResolveTrustedAfsContext, isControlPlaneAuthorized, mergeCallerContext };
64
+ //# sourceMappingURL=auth-context.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-context.d.cts","names":[],"sources":["../../src/http/auth-context.ts"],"mappings":";;;;;AAmBA;;;;;;;;;;;AAkBA;;;iBAlBgB,wBAAA,CACd,MAAA,EAAQ,UAAA,SACR,IAAA;EAAQ,QAAA;EAAmB,YAAA;AAAA;;;;;;;;AA6B7B;KAbY,eAAA,IAAmB,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,UAAA;;;;;;;;;;;;KAahD,wBAAA,IACV,OAAA,EAAS,OAAA,EACT,GAAA;EAAO,QAAA;EAAkB,MAAA,EAAQ,UAAA;EAAmB,SAAA;AAAA,MACjD,OAAA,CAAQ,OAAA,CAAQ,UAAA,KAAe,OAAA,CAAQ,UAAA;;;;;;;;;AA8B5C;;;;iBAAgB,kBAAA,CACd,IAAA,EAAM,MAAA,mBACN,MAAA,EAAQ,UAAA,SACR,OAAA,GAAU,OAAA,CAAQ,UAAA,IACjB,MAAA"}
@@ -0,0 +1,64 @@
1
+ import { AFSContext, CallerInfo } from "@aigne/afs";
2
+
3
+ //#region src/http/auth-context.d.ts
4
+ /**
5
+ * Shared authorization decision for the control-plane request surfaces
6
+ * (`/afs/*`, `/ws/attach`, `/mcp`) across BOTH runtimes — ONE definition so the
7
+ * previously-inline copies can't drift.
8
+ *
9
+ * - The local operator is always allowed: runtimes pass `loopback: true` only
10
+ * for a verified same-machine socket peer (never a spoofable Host /
11
+ * X-Forwarded-For header). CF has no loopback and always passes `false`.
12
+ * - A remote caller must be authenticated. `requireOwner` additionally demands
13
+ * the owner role — for the powerful, unscoped global-tree surfaces (`/afs/*`,
14
+ * `/ws/attach`). `/mcp` leaves it off (any authenticated caller; the request
15
+ * is scoped per-caller downstream).
16
+ *
17
+ * Fail-closed: a null caller or a below-owner role is rejected; `roleLevel`
18
+ * treats an unknown/empty role as 0.
19
+ */
20
+ declare function isControlPlaneAuthorized(caller: CallerInfo | null, opts: {
21
+ loopback: boolean;
22
+ requireOwner?: boolean;
23
+ }): boolean;
24
+ /**
25
+ * Resolve a verified caller from an inbound HTTP request.
26
+ *
27
+ * Returns `null` when the request is anonymous (no cookie / invalid JWT /
28
+ * etc). Implementations MUST NOT trust any caller hint that appears in the
29
+ * request body — only verified identity (e.g. JWT cookie, mTLS client
30
+ * certificate) is acceptable.
31
+ */
32
+ type ResolveCallerFn = (request: Request) => Promise<CallerInfo | null>;
33
+ /**
34
+ * Resolve the trusted, host-controlled slice of an AFSContext for a request —
35
+ * the fields a client must never be able to forge (observability Phase 3a).
36
+ * Runs AFTER `resolveCaller` (identity) and is given the resolved blocklet /
37
+ * caller / sessionId so the host can attach `instanceDid` (the DID Space
38
+ * column key) and `agentRunOrigin`.
39
+ *
40
+ * `resolveCaller` stays the identity seam; this is the runtime-context seam.
41
+ * Keeping them separate prevents callers from mistaking instanceDid / origin /
42
+ * policy for parts of the verified identity.
43
+ */
44
+ type ResolveTrustedAfsContext = (request: Request, ctx: {
45
+ blocklet: string;
46
+ caller: CallerInfo | null;
47
+ sessionId: string | null;
48
+ }) => Promise<Partial<AFSContext>> | Partial<AFSContext>;
49
+ /**
50
+ * Safely merge a verified caller (and optional host-resolved trusted context)
51
+ * into an AFS op's context.
52
+ *
53
+ * Security (observability Phase 3a): the client-supplied `opts.context` is
54
+ * first STRIPPED of every forgeable field, then the verified `caller`/`userId`
55
+ * and the host-resolved `trusted` slice (instanceDid / agentRunOrigin / …) are
56
+ * layered on top. Whatever the client sent for those fields is discarded.
57
+ *
58
+ * `opts.context` is typed `unknown` (RPC body deserialises to
59
+ * `Record<string, unknown>`), so the cast is centralised here.
60
+ */
61
+ declare function mergeCallerContext(opts: Record<string, unknown>, caller: CallerInfo | null, trusted?: Partial<AFSContext>): Record<string, unknown>;
62
+ //#endregion
63
+ export { ResolveCallerFn, ResolveTrustedAfsContext, isControlPlaneAuthorized, mergeCallerContext };
64
+ //# sourceMappingURL=auth-context.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-context.d.mts","names":[],"sources":["../../src/http/auth-context.ts"],"mappings":";;;;;AAmBA;;;;;;;;;;;AAkBA;;;iBAlBgB,wBAAA,CACd,MAAA,EAAQ,UAAA,SACR,IAAA;EAAQ,QAAA;EAAmB,YAAA;AAAA;;;;;;;;AA6B7B;KAbY,eAAA,IAAmB,OAAA,EAAS,OAAA,KAAY,OAAA,CAAQ,UAAA;;;;;;;;;;;;KAahD,wBAAA,IACV,OAAA,EAAS,OAAA,EACT,GAAA;EAAO,QAAA;EAAkB,MAAA,EAAQ,UAAA;EAAmB,SAAA;AAAA,MACjD,OAAA,CAAQ,OAAA,CAAQ,UAAA,KAAe,OAAA,CAAQ,UAAA;;;;;;;;;AA8B5C;;;;iBAAgB,kBAAA,CACd,IAAA,EAAM,MAAA,mBACN,MAAA,EAAQ,UAAA,SACR,OAAA,GAAU,OAAA,CAAQ,UAAA,IACjB,MAAA"}
@@ -0,0 +1,66 @@
1
+ import { roleLevel } from "../session/role-level.mjs";
2
+
3
+ //#region src/http/auth-context.ts
4
+ /**
5
+ * Shared authorization decision for the control-plane request surfaces
6
+ * (`/afs/*`, `/ws/attach`, `/mcp`) across BOTH runtimes — ONE definition so the
7
+ * previously-inline copies can't drift.
8
+ *
9
+ * - The local operator is always allowed: runtimes pass `loopback: true` only
10
+ * for a verified same-machine socket peer (never a spoofable Host /
11
+ * X-Forwarded-For header). CF has no loopback and always passes `false`.
12
+ * - A remote caller must be authenticated. `requireOwner` additionally demands
13
+ * the owner role — for the powerful, unscoped global-tree surfaces (`/afs/*`,
14
+ * `/ws/attach`). `/mcp` leaves it off (any authenticated caller; the request
15
+ * is scoped per-caller downstream).
16
+ *
17
+ * Fail-closed: a null caller or a below-owner role is rejected; `roleLevel`
18
+ * treats an unknown/empty role as 0.
19
+ */
20
+ function isControlPlaneAuthorized(caller, opts) {
21
+ if (opts.loopback) return true;
22
+ if (!caller) return false;
23
+ if (!opts.requireOwner) return true;
24
+ return roleLevel(caller.roles[0]) >= roleLevel("owner");
25
+ }
26
+ /**
27
+ * Fields a client could try to forge in a request body's `options.context`.
28
+ * They are STRIPPED before the host re-attaches verified/trusted values, so a
29
+ * body like `{ context: { instanceDid: "did:abt:zEVIL", userId: "...",
30
+ * agentRunOrigin: "system" } }` can never take effect.
31
+ */
32
+ const FORGEABLE_CONTEXT_FIELDS = [
33
+ "caller",
34
+ "userId",
35
+ "instanceDid",
36
+ "agentRunOrigin",
37
+ "persistenceClass",
38
+ "callerOrigin",
39
+ "paymentSignature"
40
+ ];
41
+ /**
42
+ * Safely merge a verified caller (and optional host-resolved trusted context)
43
+ * into an AFS op's context.
44
+ *
45
+ * Security (observability Phase 3a): the client-supplied `opts.context` is
46
+ * first STRIPPED of every forgeable field, then the verified `caller`/`userId`
47
+ * and the host-resolved `trusted` slice (instanceDid / agentRunOrigin / …) are
48
+ * layered on top. Whatever the client sent for those fields is discarded.
49
+ *
50
+ * `opts.context` is typed `unknown` (RPC body deserialises to
51
+ * `Record<string, unknown>`), so the cast is centralised here.
52
+ */
53
+ function mergeCallerContext(opts, caller, trusted) {
54
+ const existing = { ...opts.context ?? {} };
55
+ for (const field of FORGEABLE_CONTEXT_FIELDS) delete existing[field];
56
+ return {
57
+ ...existing,
58
+ ...caller?.did ? { userId: caller.did } : {},
59
+ ...caller ? { caller } : {},
60
+ ...trusted ?? {}
61
+ };
62
+ }
63
+
64
+ //#endregion
65
+ export { isControlPlaneAuthorized, mergeCallerContext };
66
+ //# sourceMappingURL=auth-context.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth-context.mjs","names":[],"sources":["../../src/http/auth-context.ts"],"sourcesContent":["import type { AFSContext, CallerInfo } from \"@aigne/afs\";\nimport { roleLevel } from \"../session/role-level.js\";\n\n/**\n * Shared authorization decision for the control-plane request surfaces\n * (`/afs/*`, `/ws/attach`, `/mcp`) across BOTH runtimes — ONE definition so the\n * previously-inline copies can't drift.\n *\n * - The local operator is always allowed: runtimes pass `loopback: true` only\n * for a verified same-machine socket peer (never a spoofable Host /\n * X-Forwarded-For header). CF has no loopback and always passes `false`.\n * - A remote caller must be authenticated. `requireOwner` additionally demands\n * the owner role — for the powerful, unscoped global-tree surfaces (`/afs/*`,\n * `/ws/attach`). `/mcp` leaves it off (any authenticated caller; the request\n * is scoped per-caller downstream).\n *\n * Fail-closed: a null caller or a below-owner role is rejected; `roleLevel`\n * treats an unknown/empty role as 0.\n */\nexport function isControlPlaneAuthorized(\n caller: CallerInfo | null,\n opts: { loopback: boolean; requireOwner?: boolean },\n): boolean {\n if (opts.loopback) return true;\n if (!caller) return false;\n if (!opts.requireOwner) return true;\n return roleLevel(caller.roles[0]) >= roleLevel(\"owner\");\n}\n\n/**\n * Resolve a verified caller from an inbound HTTP request.\n *\n * Returns `null` when the request is anonymous (no cookie / invalid JWT /\n * etc). Implementations MUST NOT trust any caller hint that appears in the\n * request body — only verified identity (e.g. JWT cookie, mTLS client\n * certificate) is acceptable.\n */\nexport type ResolveCallerFn = (request: Request) => Promise<CallerInfo | null>;\n\n/**\n * Resolve the trusted, host-controlled slice of an AFSContext for a request —\n * the fields a client must never be able to forge (observability Phase 3a).\n * Runs AFTER `resolveCaller` (identity) and is given the resolved blocklet /\n * caller / sessionId so the host can attach `instanceDid` (the DID Space\n * column key) and `agentRunOrigin`.\n *\n * `resolveCaller` stays the identity seam; this is the runtime-context seam.\n * Keeping them separate prevents callers from mistaking instanceDid / origin /\n * policy for parts of the verified identity.\n */\nexport type ResolveTrustedAfsContext = (\n request: Request,\n ctx: { blocklet: string; caller: CallerInfo | null; sessionId: string | null },\n) => Promise<Partial<AFSContext>> | Partial<AFSContext>;\n\n/**\n * Fields a client could try to forge in a request body's `options.context`.\n * They are STRIPPED before the host re-attaches verified/trusted values, so a\n * body like `{ context: { instanceDid: \"did:abt:zEVIL\", userId: \"...\",\n * agentRunOrigin: \"system\" } }` can never take effect.\n */\nconst FORGEABLE_CONTEXT_FIELDS = [\n \"caller\",\n \"userId\",\n \"instanceDid\",\n \"agentRunOrigin\",\n \"persistenceClass\",\n \"callerOrigin\",\n \"paymentSignature\",\n] as const;\n\n/**\n * Safely merge a verified caller (and optional host-resolved trusted context)\n * into an AFS op's context.\n *\n * Security (observability Phase 3a): the client-supplied `opts.context` is\n * first STRIPPED of every forgeable field, then the verified `caller`/`userId`\n * and the host-resolved `trusted` slice (instanceDid / agentRunOrigin / …) are\n * layered on top. Whatever the client sent for those fields is discarded.\n *\n * `opts.context` is typed `unknown` (RPC body deserialises to\n * `Record<string, unknown>`), so the cast is centralised here.\n */\nexport function mergeCallerContext(\n opts: Record<string, unknown>,\n caller: CallerInfo | null,\n trusted?: Partial<AFSContext>,\n): Record<string, unknown> {\n const existing = { ...((opts.context as Record<string, unknown> | undefined) ?? {}) };\n // Strip client-forgeable fields before re-attaching trusted values.\n for (const field of FORGEABLE_CONTEXT_FIELDS) delete existing[field];\n return {\n ...existing,\n ...(caller?.did ? { userId: caller.did } : {}),\n ...(caller ? { caller } : {}),\n ...(trusted ?? {}),\n };\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;AAmBA,SAAgB,yBACd,QACA,MACS;AACT,KAAI,KAAK,SAAU,QAAO;AAC1B,KAAI,CAAC,OAAQ,QAAO;AACpB,KAAI,CAAC,KAAK,aAAc,QAAO;AAC/B,QAAO,UAAU,OAAO,MAAM,GAAG,IAAI,UAAU,QAAQ;;;;;;;;AAmCzD,MAAM,2BAA2B;CAC/B;CACA;CACA;CACA;CACA;CACA;CACA;CACD;;;;;;;;;;;;;AAcD,SAAgB,mBACd,MACA,QACA,SACyB;CACzB,MAAM,WAAW,EAAE,GAAK,KAAK,WAAmD,EAAE,EAAG;AAErF,MAAK,MAAM,SAAS,yBAA0B,QAAO,SAAS;AAC9D,QAAO;EACL,GAAG;EACH,GAAI,QAAQ,MAAM,EAAE,QAAQ,OAAO,KAAK,GAAG,EAAE;EAC7C,GAAI,SAAS,EAAE,QAAQ,GAAG,EAAE;EAC5B,GAAI,WAAW,EAAE;EAClB"}