@alneas/eaos-server 0.0.0-stage → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (360) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/LICENSE +21 -0
  3. package/README.ja.md +49 -0
  4. package/README.md +46 -2
  5. package/dist/agentic/agent-jobs.d.ts +333 -0
  6. package/dist/agentic/agent-jobs.js +15 -0
  7. package/dist/agentic/agent-jobs.js.map +1 -0
  8. package/dist/agentic/agent-node.d.ts +40 -0
  9. package/dist/agentic/agent-node.js +7 -0
  10. package/dist/agentic/agent-node.js.map +1 -0
  11. package/dist/agentic/agent-runner.d.ts +33 -0
  12. package/dist/agentic/agent-runner.js +7 -0
  13. package/dist/agentic/agent-runner.js.map +1 -0
  14. package/dist/agentic/ai-broker.d.ts +169 -0
  15. package/dist/agentic/ai-broker.js +8 -0
  16. package/dist/agentic/ai-broker.js.map +1 -0
  17. package/dist/agentic/atomic-checkpointer.d.ts +137 -0
  18. package/dist/agentic/atomic-checkpointer.js +9 -0
  19. package/dist/agentic/atomic-checkpointer.js.map +1 -0
  20. package/dist/agentic/autonomous-worker.d.ts +122 -0
  21. package/dist/agentic/autonomous-worker.js +10 -0
  22. package/dist/agentic/autonomous-worker.js.map +1 -0
  23. package/dist/agentic/event-bridge.d.ts +350 -0
  24. package/dist/agentic/event-bridge.js +9 -0
  25. package/dist/agentic/event-bridge.js.map +1 -0
  26. package/dist/agentic/executor.d.ts +91 -0
  27. package/dist/agentic/executor.js +12 -0
  28. package/dist/agentic/executor.js.map +1 -0
  29. package/dist/agentic/graph-projection.d.ts +119 -0
  30. package/dist/agentic/graph-projection.js +7 -0
  31. package/dist/agentic/graph-projection.js.map +1 -0
  32. package/dist/agentic/graph.d.ts +524 -0
  33. package/dist/agentic/graph.js +7 -0
  34. package/dist/agentic/graph.js.map +1 -0
  35. package/dist/agentic/index.d.ts +28 -0
  36. package/dist/agentic/index.js +87 -0
  37. package/dist/agentic/index.js.map +1 -0
  38. package/dist/agentic/local-runner.d.ts +106 -0
  39. package/dist/agentic/local-runner.js +7 -0
  40. package/dist/agentic/local-runner.js.map +1 -0
  41. package/dist/agentic/remote-executor.d.ts +67 -0
  42. package/dist/agentic/remote-executor.js +8 -0
  43. package/dist/agentic/remote-executor.js.map +1 -0
  44. package/dist/agentic/types.d.ts +157 -0
  45. package/dist/agentic/types.js +7 -0
  46. package/dist/agentic/types.js.map +1 -0
  47. package/dist/agentic/workflow-catalog.d.ts +152 -0
  48. package/dist/agentic/workflow-catalog.js +7 -0
  49. package/dist/agentic/workflow-catalog.js.map +1 -0
  50. package/dist/agentic/workflow-compiler.d.ts +44 -0
  51. package/dist/agentic/workflow-compiler.js +8 -0
  52. package/dist/agentic/workflow-compiler.js.map +1 -0
  53. package/dist/agentic/workflow-coordinator.d.ts +170 -0
  54. package/dist/agentic/workflow-coordinator.js +8 -0
  55. package/dist/agentic/workflow-coordinator.js.map +1 -0
  56. package/dist/agentic/workflow-manager.d.ts +91 -0
  57. package/dist/agentic/workflow-manager.js +7 -0
  58. package/dist/agentic/workflow-manager.js.map +1 -0
  59. package/dist/agentic/workflow-registry.d.ts +334 -0
  60. package/dist/agentic/workflow-registry.js +7 -0
  61. package/dist/agentic/workflow-registry.js.map +1 -0
  62. package/dist/artifacts-CteHmCMI.d.ts +614 -0
  63. package/dist/auth-hooks/api-key.d.ts +75 -0
  64. package/dist/auth-hooks/api-key.js +7 -0
  65. package/dist/auth-hooks/api-key.js.map +1 -0
  66. package/dist/auth-hooks/index.d.ts +80 -0
  67. package/dist/auth-hooks/index.js +28 -0
  68. package/dist/auth-hooks/index.js.map +1 -0
  69. package/dist/browser-auth/account-memberships.d.ts +213 -0
  70. package/dist/browser-auth/account-memberships.js +13 -0
  71. package/dist/browser-auth/account-memberships.js.map +1 -0
  72. package/dist/browser-auth/index.d.ts +8 -0
  73. package/dist/browser-auth/index.js +59 -0
  74. package/dist/browser-auth/index.js.map +1 -0
  75. package/dist/browser-auth/kratos-session.d.ts +37 -0
  76. package/dist/browser-auth/kratos-session.js +7 -0
  77. package/dist/browser-auth/kratos-session.js.map +1 -0
  78. package/dist/browser-auth/platform-session.d.ts +120 -0
  79. package/dist/browser-auth/platform-session.js +7 -0
  80. package/dist/browser-auth/platform-session.js.map +1 -0
  81. package/dist/browser-auth/public-memberships.d.ts +22 -0
  82. package/dist/browser-auth/public-memberships.js +7 -0
  83. package/dist/browser-auth/public-memberships.js.map +1 -0
  84. package/dist/cache/index.d.ts +181 -0
  85. package/dist/cache/index.js +197 -0
  86. package/dist/cache/index.js.map +1 -0
  87. package/dist/chunk-32746UQZ.js +131 -0
  88. package/dist/chunk-32746UQZ.js.map +1 -0
  89. package/dist/chunk-3NLSWP2Y.js +223 -0
  90. package/dist/chunk-3NLSWP2Y.js.map +1 -0
  91. package/dist/chunk-3P4XTTQH.js +346 -0
  92. package/dist/chunk-3P4XTTQH.js.map +1 -0
  93. package/dist/chunk-3VITSHN3.js +15 -0
  94. package/dist/chunk-3VITSHN3.js.map +1 -0
  95. package/dist/chunk-46UWPEW2.js +226 -0
  96. package/dist/chunk-46UWPEW2.js.map +1 -0
  97. package/dist/chunk-4BARRLJR.js +180 -0
  98. package/dist/chunk-4BARRLJR.js.map +1 -0
  99. package/dist/chunk-4VORUFKR.js +45 -0
  100. package/dist/chunk-4VORUFKR.js.map +1 -0
  101. package/dist/chunk-55D4ERWO.js +1 -0
  102. package/dist/chunk-55D4ERWO.js.map +1 -0
  103. package/dist/chunk-5TBBZIND.js +18 -0
  104. package/dist/chunk-5TBBZIND.js.map +1 -0
  105. package/dist/chunk-5WOZWPZA.js +211 -0
  106. package/dist/chunk-5WOZWPZA.js.map +1 -0
  107. package/dist/chunk-6CBVZ6CT.js +168 -0
  108. package/dist/chunk-6CBVZ6CT.js.map +1 -0
  109. package/dist/chunk-6XZXYNJR.js +74 -0
  110. package/dist/chunk-6XZXYNJR.js.map +1 -0
  111. package/dist/chunk-753HWDSC.js +222 -0
  112. package/dist/chunk-753HWDSC.js.map +1 -0
  113. package/dist/chunk-7AHSS7SO.js +81 -0
  114. package/dist/chunk-7AHSS7SO.js.map +1 -0
  115. package/dist/chunk-7FTJN4SA.js +1 -0
  116. package/dist/chunk-7FTJN4SA.js.map +1 -0
  117. package/dist/chunk-AVDMLTPF.js +24 -0
  118. package/dist/chunk-AVDMLTPF.js.map +1 -0
  119. package/dist/chunk-BKAHUEIT.js +95 -0
  120. package/dist/chunk-BKAHUEIT.js.map +1 -0
  121. package/dist/chunk-CJ7OFEF7.js +134 -0
  122. package/dist/chunk-CJ7OFEF7.js.map +1 -0
  123. package/dist/chunk-EJKWDZIU.js +111 -0
  124. package/dist/chunk-EJKWDZIU.js.map +1 -0
  125. package/dist/chunk-F2J6IQ6I.js +247 -0
  126. package/dist/chunk-F2J6IQ6I.js.map +1 -0
  127. package/dist/chunk-F3O7CELI.js +23 -0
  128. package/dist/chunk-F3O7CELI.js.map +1 -0
  129. package/dist/chunk-F4IITPGX.js +221 -0
  130. package/dist/chunk-F4IITPGX.js.map +1 -0
  131. package/dist/chunk-FD6VC2NA.js +66 -0
  132. package/dist/chunk-FD6VC2NA.js.map +1 -0
  133. package/dist/chunk-FRRRWAHO.js +14 -0
  134. package/dist/chunk-FRRRWAHO.js.map +1 -0
  135. package/dist/chunk-HCKAGLLB.js +17 -0
  136. package/dist/chunk-HCKAGLLB.js.map +1 -0
  137. package/dist/chunk-HVC7FG6B.js +191 -0
  138. package/dist/chunk-HVC7FG6B.js.map +1 -0
  139. package/dist/chunk-HXFVOR7Z.js +496 -0
  140. package/dist/chunk-HXFVOR7Z.js.map +1 -0
  141. package/dist/chunk-IJWYS2PF.js +122 -0
  142. package/dist/chunk-IJWYS2PF.js.map +1 -0
  143. package/dist/chunk-INCHXAFK.js +1395 -0
  144. package/dist/chunk-INCHXAFK.js.map +1 -0
  145. package/dist/chunk-JT6BRGQM.js +1 -0
  146. package/dist/chunk-JT6BRGQM.js.map +1 -0
  147. package/dist/chunk-L6PMAEMB.js +115 -0
  148. package/dist/chunk-L6PMAEMB.js.map +1 -0
  149. package/dist/chunk-LOUGW6MU.js +126 -0
  150. package/dist/chunk-LOUGW6MU.js.map +1 -0
  151. package/dist/chunk-LYPZPE53.js +129 -0
  152. package/dist/chunk-LYPZPE53.js.map +1 -0
  153. package/dist/chunk-NNCCN7JP.js +186 -0
  154. package/dist/chunk-NNCCN7JP.js.map +1 -0
  155. package/dist/chunk-PBC3MZUL.js +212 -0
  156. package/dist/chunk-PBC3MZUL.js.map +1 -0
  157. package/dist/chunk-R4ADP2DC.js +20 -0
  158. package/dist/chunk-R4ADP2DC.js.map +1 -0
  159. package/dist/chunk-RHN4Y6VS.js +44 -0
  160. package/dist/chunk-RHN4Y6VS.js.map +1 -0
  161. package/dist/chunk-SDJNYPYK.js +770 -0
  162. package/dist/chunk-SDJNYPYK.js.map +1 -0
  163. package/dist/chunk-UGNTCOVR.js +28 -0
  164. package/dist/chunk-UGNTCOVR.js.map +1 -0
  165. package/dist/chunk-VC2PCK2S.js +31 -0
  166. package/dist/chunk-VC2PCK2S.js.map +1 -0
  167. package/dist/chunk-VF5YDZJC.js +305 -0
  168. package/dist/chunk-VF5YDZJC.js.map +1 -0
  169. package/dist/chunk-VISRDVTK.js +675 -0
  170. package/dist/chunk-VISRDVTK.js.map +1 -0
  171. package/dist/chunk-W6O3LVBY.js +102 -0
  172. package/dist/chunk-W6O3LVBY.js.map +1 -0
  173. package/dist/chunk-WFEAKJLR.js +47 -0
  174. package/dist/chunk-WFEAKJLR.js.map +1 -0
  175. package/dist/chunk-XIEY2OF4.js +67 -0
  176. package/dist/chunk-XIEY2OF4.js.map +1 -0
  177. package/dist/chunk-XITLHDG3.js +37 -0
  178. package/dist/chunk-XITLHDG3.js.map +1 -0
  179. package/dist/chunk-XMWPYZWZ.js +61 -0
  180. package/dist/chunk-XMWPYZWZ.js.map +1 -0
  181. package/dist/chunk-XUP6CNOM.js +34 -0
  182. package/dist/chunk-XUP6CNOM.js.map +1 -0
  183. package/dist/chunk-YABTQZDJ.js +25 -0
  184. package/dist/chunk-YABTQZDJ.js.map +1 -0
  185. package/dist/chunk-YMHVRBUU.js +199 -0
  186. package/dist/chunk-YMHVRBUU.js.map +1 -0
  187. package/dist/chunk-YMJ7BRKU.js +510 -0
  188. package/dist/chunk-YMJ7BRKU.js.map +1 -0
  189. package/dist/chunk-ZC3XWU7B.js +28 -0
  190. package/dist/chunk-ZC3XWU7B.js.map +1 -0
  191. package/dist/chunk-ZHMTD5KV.js +90 -0
  192. package/dist/chunk-ZHMTD5KV.js.map +1 -0
  193. package/dist/chunk-ZWZDLOE7.js +160 -0
  194. package/dist/chunk-ZWZDLOE7.js.map +1 -0
  195. package/dist/db-package/db/local-first-sqlite-adapter.d.ts +432 -0
  196. package/dist/db-package/db/local-first-sqlite-adapter.js +7 -0
  197. package/dist/db-package/db/local-first-sqlite-adapter.js.map +1 -0
  198. package/dist/db-package/index.d.ts +7 -0
  199. package/dist/db-package/index.js +16 -0
  200. package/dist/db-package/index.js.map +1 -0
  201. package/dist/db-package/migration/aggregator.d.ts +86 -0
  202. package/dist/db-package/migration/aggregator.js +7 -0
  203. package/dist/db-package/migration/aggregator.js.map +1 -0
  204. package/dist/db-package/migration/index.d.ts +3 -0
  205. package/dist/db-package/migration/index.js +8 -0
  206. package/dist/db-package/migration/index.js.map +1 -0
  207. package/dist/engine.d.ts +205 -0
  208. package/dist/engine.js +20 -0
  209. package/dist/engine.js.map +1 -0
  210. package/dist/entitlements/index.d.ts +313 -0
  211. package/dist/entitlements/index.js +23 -0
  212. package/dist/entitlements/index.js.map +1 -0
  213. package/dist/execution/chat.d.ts +7 -0
  214. package/dist/execution/chat.js +7 -0
  215. package/dist/execution/chat.js.map +1 -0
  216. package/dist/execution/index.d.ts +342 -0
  217. package/dist/execution/index.js +66 -0
  218. package/dist/execution/index.js.map +1 -0
  219. package/dist/execution/tool-agent.d.ts +7 -0
  220. package/dist/execution/tool-agent.js +8 -0
  221. package/dist/execution/tool-agent.js.map +1 -0
  222. package/dist/extensions/index.d.ts +172 -0
  223. package/dist/extensions/index.js +95 -0
  224. package/dist/extensions/index.js.map +1 -0
  225. package/dist/health/index.d.ts +35 -0
  226. package/dist/health/index.js +7 -0
  227. package/dist/health/index.js.map +1 -0
  228. package/dist/index.d.ts +43 -0
  229. package/dist/index.js +161 -0
  230. package/dist/index.js.map +1 -0
  231. package/dist/lifecycle/index.d.ts +133 -0
  232. package/dist/lifecycle/index.js +13 -0
  233. package/dist/lifecycle/index.js.map +1 -0
  234. package/dist/lifecycle-engine/backend-migration.d.ts +2 -0
  235. package/dist/lifecycle-engine/backend-migration.js +11 -0
  236. package/dist/lifecycle-engine/backend-migration.js.map +1 -0
  237. package/dist/lifecycle-engine/baseline.d.ts +2 -0
  238. package/dist/lifecycle-engine/baseline.js +9 -0
  239. package/dist/lifecycle-engine/baseline.js.map +1 -0
  240. package/dist/lifecycle-engine/index.d.ts +1497 -0
  241. package/dist/lifecycle-engine/index.js +41 -0
  242. package/dist/lifecycle-engine/index.js.map +1 -0
  243. package/dist/lifecycle-engine/platform/artifacts.d.ts +4 -0
  244. package/dist/lifecycle-engine/platform/artifacts.js +7 -0
  245. package/dist/lifecycle-engine/platform/artifacts.js.map +1 -0
  246. package/dist/lifecycle-engine/platform/control-plane.d.ts +12 -0
  247. package/dist/lifecycle-engine/platform/control-plane.js +2 -0
  248. package/dist/lifecycle-engine/platform/control-plane.js.map +1 -0
  249. package/dist/lifecycle-engine/platform/database-router.d.ts +118 -0
  250. package/dist/lifecycle-engine/platform/database-router.js +7 -0
  251. package/dist/lifecycle-engine/platform/database-router.js.map +1 -0
  252. package/dist/lifecycle-engine/platform/deployment-placements.d.ts +464 -0
  253. package/dist/lifecycle-engine/platform/deployment-placements.js +16 -0
  254. package/dist/lifecycle-engine/platform/deployment-placements.js.map +1 -0
  255. package/dist/lifecycle-engine/platform/deployment.d.ts +4 -0
  256. package/dist/lifecycle-engine/platform/deployment.js +17 -0
  257. package/dist/lifecycle-engine/platform/deployment.js.map +1 -0
  258. package/dist/lifecycle-engine/platform/index.d.ts +737 -0
  259. package/dist/lifecycle-engine/platform/index.js +60 -0
  260. package/dist/lifecycle-engine/platform/index.js.map +1 -0
  261. package/dist/lifecycle-engine/platform/runtime.d.ts +80 -0
  262. package/dist/lifecycle-engine/platform/runtime.js +11 -0
  263. package/dist/lifecycle-engine/platform/runtime.js.map +1 -0
  264. package/dist/lifecycle-engine/platform/site-publication.d.ts +102 -0
  265. package/dist/lifecycle-engine/platform/site-publication.js +7 -0
  266. package/dist/lifecycle-engine/platform/site-publication.js.map +1 -0
  267. package/dist/lifecycle-engine/platform/user-directory.d.ts +139 -0
  268. package/dist/lifecycle-engine/platform/user-directory.js +13 -0
  269. package/dist/lifecycle-engine/platform/user-directory.js.map +1 -0
  270. package/dist/mcp.d.ts +92 -0
  271. package/dist/mcp.js +10 -0
  272. package/dist/mcp.js.map +1 -0
  273. package/dist/middleware/auth.d.ts +118 -0
  274. package/dist/middleware/auth.js +7 -0
  275. package/dist/middleware/auth.js.map +1 -0
  276. package/dist/middleware/error-handler.d.ts +35 -0
  277. package/dist/middleware/error-handler.js +7 -0
  278. package/dist/middleware/error-handler.js.map +1 -0
  279. package/dist/middleware/module-guard.d.ts +33 -0
  280. package/dist/middleware/module-guard.js +7 -0
  281. package/dist/middleware/module-guard.js.map +1 -0
  282. package/dist/platform-admin/index.d.ts +37 -0
  283. package/dist/platform-admin/index.js +11 -0
  284. package/dist/platform-admin/index.js.map +1 -0
  285. package/dist/platform-admin/store.d.ts +346 -0
  286. package/dist/platform-admin/store.js +7 -0
  287. package/dist/platform-admin/store.js.map +1 -0
  288. package/dist/plugin-data/annotations.d.ts +6 -0
  289. package/dist/plugin-data/annotations.js +12 -0
  290. package/dist/plugin-data/annotations.js.map +1 -0
  291. package/dist/plugin-data/atomic-context.d.ts +41 -0
  292. package/dist/plugin-data/atomic-context.js +9 -0
  293. package/dist/plugin-data/atomic-context.js.map +1 -0
  294. package/dist/plugin-data/atomic.d.ts +6 -0
  295. package/dist/plugin-data/atomic.js +26 -0
  296. package/dist/plugin-data/atomic.js.map +1 -0
  297. package/dist/plugin-data/audit.d.ts +6 -0
  298. package/dist/plugin-data/audit.js +12 -0
  299. package/dist/plugin-data/audit.js.map +1 -0
  300. package/dist/plugin-data/commands.d.ts +6 -0
  301. package/dist/plugin-data/commands.js +8 -0
  302. package/dist/plugin-data/commands.js.map +1 -0
  303. package/dist/plugin-data/composite.d.ts +6 -0
  304. package/dist/plugin-data/composite.js +8 -0
  305. package/dist/plugin-data/composite.js.map +1 -0
  306. package/dist/plugin-data/delivery.d.ts +6 -0
  307. package/dist/plugin-data/delivery.js +16 -0
  308. package/dist/plugin-data/delivery.js.map +1 -0
  309. package/dist/plugin-data/index.d.ts +2798 -0
  310. package/dist/plugin-data/index.js +102 -0
  311. package/dist/plugin-data/index.js.map +1 -0
  312. package/dist/plugin-data/json-documents.d.ts +6 -0
  313. package/dist/plugin-data/json-documents.js +16 -0
  314. package/dist/plugin-data/json-documents.js.map +1 -0
  315. package/dist/plugin-data/outbox.d.ts +6 -0
  316. package/dist/plugin-data/outbox.js +16 -0
  317. package/dist/plugin-data/outbox.js.map +1 -0
  318. package/dist/plugin-data/scoped-records.d.ts +6 -0
  319. package/dist/plugin-data/scoped-records.js +10 -0
  320. package/dist/plugin-data/scoped-records.js.map +1 -0
  321. package/dist/plugin-sdk.d.ts +41 -0
  322. package/dist/plugin-sdk.js +10 -0
  323. package/dist/plugin-sdk.js.map +1 -0
  324. package/dist/sql-lifecycle/index.d.ts +138 -0
  325. package/dist/sql-lifecycle/index.js +167 -0
  326. package/dist/sql-lifecycle/index.js.map +1 -0
  327. package/dist/storage/index.d.ts +2 -0
  328. package/dist/storage/index.js +13 -0
  329. package/dist/storage/index.js.map +1 -0
  330. package/dist/storage/s3-compatible.d.ts +139 -0
  331. package/dist/storage/s3-compatible.js +11 -0
  332. package/dist/storage/s3-compatible.js.map +1 -0
  333. package/dist/tenant.d.ts +108 -0
  334. package/dist/tenant.js +9 -0
  335. package/dist/tenant.js.map +1 -0
  336. package/dist/workspace-context.d.ts +119 -0
  337. package/dist/workspace-context.js +9 -0
  338. package/dist/workspace-context.js.map +1 -0
  339. package/docs/api.md +30560 -0
  340. package/docs/db/README.md +49 -0
  341. package/docs/db/docs/api.md +1613 -0
  342. package/docs/db/docs/guide.md +47 -0
  343. package/docs/entitlements.md +60 -0
  344. package/docs/guide.md +92 -0
  345. package/docs/index.md +57 -0
  346. package/docs/ja/db/README.md +46 -0
  347. package/docs/ja/db/docs/guide.md +53 -0
  348. package/docs/ja/guide.md +46 -0
  349. package/docs/ja/lifecycle/README.md +46 -0
  350. package/docs/ja/lifecycle/docs/guide.md +45 -0
  351. package/docs/ja/storage/README.md +46 -0
  352. package/docs/ja/storage/docs/guide.md +43 -0
  353. package/docs/lifecycle/README.md +49 -0
  354. package/docs/lifecycle/docs/api.md +3770 -0
  355. package/docs/lifecycle/docs/baseline.md +50 -0
  356. package/docs/lifecycle/docs/guide.md +47 -0
  357. package/docs/storage/README.md +49 -0
  358. package/docs/storage/docs/api.md +470 -0
  359. package/docs/storage/docs/guide.md +47 -0
  360. package/package.json +354 -4
@@ -0,0 +1,496 @@
1
+ // src/agentic/graph.ts
2
+ import { Command, END, interrupt, MemorySaver, START, StateGraph, Annotation } from "@langchain/langgraph";
3
+ import { createApprovalBinding, validateApprovalBinding } from "@alneas/eaos-core";
4
+ import { randomUUID } from "node:crypto";
5
+ var GraphState = Annotation.Root({
6
+ sessionId: Annotation,
7
+ tenantId: Annotation,
8
+ userId: Annotation,
9
+ currentStep: Annotation,
10
+ history: Annotation({ reducer: (_left, right) => right, default: () => [] }),
11
+ context: Annotation({
12
+ reducer: (left, right) => {
13
+ if (right === void 0) return left;
14
+ const merged = { ...left, ...right };
15
+ if (merged.__eaosSubgraphResume === null) delete merged.__eaosSubgraphResume;
16
+ return merged;
17
+ },
18
+ default: () => void 0
19
+ }),
20
+ citations: Annotation,
21
+ pendingApproval: Annotation,
22
+ checkpointRevision: Annotation,
23
+ lastApproval: Annotation,
24
+ isComplete: Annotation,
25
+ error: Annotation
26
+ });
27
+ var AgentGraphEngine = class {
28
+ nodes = /* @__PURE__ */ new Map();
29
+ edges = /* @__PURE__ */ new Map();
30
+ edgeVisuals = /* @__PURE__ */ new Map();
31
+ nodeOptions = /* @__PURE__ */ new Map();
32
+ conditionalRoutes = /* @__PURE__ */ new Map();
33
+ checkpointer;
34
+ authorizeResume;
35
+ workflowId;
36
+ workflowVersion;
37
+ entryNode = "start";
38
+ compiled;
39
+ graphVersion = 0;
40
+ compiledVersion = -1;
41
+ /**
42
+ * Creates a graph builder with a host saver or options; compilation is deferred until execution/checkpoint reads.
43
+ * @param checkpointerOrOptions - LangGraph saver or options; omission uses an independent MemorySaver.
44
+ * @param options - Additional options used only when the first argument is a saver; otherwise ignored.
45
+ */
46
+ constructor(checkpointerOrOptions = {}, options = {}) {
47
+ const supplied = isCheckpointSaver(checkpointerOrOptions) ? { ...options, checkpointer: checkpointerOrOptions } : checkpointerOrOptions;
48
+ this.checkpointer = supplied.checkpointer ?? new MemorySaver();
49
+ this.authorizeResume = supplied.authorizeResume;
50
+ this.workflowId = supplied.workflowId;
51
+ this.workflowVersion = supplied.workflowVersion;
52
+ }
53
+ /**
54
+ * Registers or replaces a named handler and invalidates compiled topology.
55
+ * @param name - Nonblank node name; __eaos_approval__ is reserved. Names are retained without trimming.
56
+ * @param handler - Async callback receiving a cloned state and resolving partial state updates.
57
+ * @param options - Optional LangGraph retry policy and serializable display metadata.
58
+ * @returns This builder for chaining.
59
+ * @throws For blank/reserved names; handler failures occur later during execution.
60
+ * @example
61
+ * ```typescript
62
+ * import { AgentGraphEngine } from "@alneas/eaos-server/agentic/graph";
63
+ * const graph = new AgentGraphEngine();
64
+ * graph.addNode("start", async () => ({ isComplete: true }));
65
+ * graph.addNode("finish", async () => ({ isComplete: true }));
66
+ * ```
67
+ */
68
+ addNode(name, handler, options = {}) {
69
+ if (!name.trim() || name === "__eaos_approval__") throw new Error("Invalid workflow node name");
70
+ this.nodes.set(name, handler);
71
+ this.nodeOptions.set(name, options);
72
+ this.invalidate();
73
+ return this;
74
+ }
75
+ /**
76
+ * Mount a plugin-owned compiled LangGraph as one parent-graph node.
77
+ * Input/output mapping is explicit so plugin state does not silently leak into
78
+ * the EAOS state, while the nested graph still gets its own checkpoint thread.
79
+ * @param name - Parent node identifier, subject to addNode validation.
80
+ * @param subgraph - Compiled graph with invoke and optional state/resume capabilities.
81
+ * @param options - Input/output mapping and child-thread identity; defaults pass state/output through and use sessionId:name as thread ID.
82
+ * @returns This graph builder.
83
+ * @throws If subgraph lacks invoke or the name is invalid. Execution propagates mapping/subgraph errors except recognized interrupts handled by mapInterrupted.
84
+ * @remarks Child config uses checkpoint_ns=name. A mapped interrupt stores resume metadata in context; host mappings must preserve tenant boundaries and avoid leaking child state.
85
+ * @example
86
+ * ```typescript
87
+ * import { AgentGraphEngine, type GraphSubgraph } from "@alneas/eaos-server/agentic/graph";
88
+ * export function nested(subgraph: GraphSubgraph) {
89
+ * return new AgentGraphEngine().addSubgraph("start", subgraph, { mapOutput: output => ({ context: { child: output } }) });
90
+ * }
91
+ * ```
92
+ */
93
+ addSubgraph(name, subgraph, options = {}) {
94
+ if (!subgraph || typeof subgraph.invoke !== "function") throw new Error("Compiled workflow subgraph is required");
95
+ return this.addNode(name, async (state) => {
96
+ const input = options.mapInput ? options.mapInput(state) : state;
97
+ const threadId = options.threadId?.(state) ?? `${state.sessionId}:${name}`;
98
+ if (!threadId.trim()) throw new Error("Subgraph thread id is required");
99
+ const config = { configurable: { thread_id: threadId, checkpoint_ns: name } };
100
+ const resume = state.context?.__eaosSubgraphResume;
101
+ let output;
102
+ try {
103
+ output = resume?.node === name && resume.decision && subgraph.resume ? await subgraph.resume(input, resume.decision, config) : await subgraph.invoke(input, config);
104
+ } catch (error) {
105
+ if (!options.mapInterrupted || !isLangGraphInterrupt(error)) throw error;
106
+ const subgraphState = subgraph.getState ? await subgraph.getState(config) : void 0;
107
+ const mapped2 = await options.mapInterrupted(error, state, subgraphState);
108
+ return { ...mapped2, context: { ...mapped2.context, __eaosSubgraphResume: { node: name } } };
109
+ }
110
+ const context = { ...state.context ?? {} };
111
+ if (context.__eaosSubgraphResume) context.__eaosSubgraphResume = null;
112
+ const mapped = options.mapOutput ? options.mapOutput(output, state) : output;
113
+ return { ...mapped, context: { ...context, ...mapped.context ?? {} } };
114
+ }, { visual: options.visual ?? { kind: "subgraph", label: name } });
115
+ }
116
+ /**
117
+ * Adds a declared edge and its display metadata.
118
+ * @param from - Nonblank source node name.
119
+ * @param to - Nonblank destination node name.
120
+ * @param options - Optional serializable display metadata, cloned on insertion.
121
+ * @returns This graph builder.
122
+ * @throws For blank endpoints or uncloneable display metadata. Missing node references can fail compilation later.
123
+ * @remarks Without conditional routing, execution follows only the first declared outgoing edge; describe may list additional declared edges.
124
+ * @example
125
+ * ```typescript
126
+ * import { AgentGraphEngine } from "@alneas/eaos-server/agentic/graph";
127
+ * const graph = new AgentGraphEngine();
128
+ * graph.addNode("start", async () => ({ isComplete: true }));
129
+ * graph.addNode("finish", async () => ({}));
130
+ * graph.addEdge("start", "finish");
131
+ * ```
132
+ */
133
+ addEdge(from, to, options = {}) {
134
+ if (!from.trim() || !to.trim()) throw new Error("Invalid workflow edge");
135
+ this.edges.set(from, [...this.edges.get(from) ?? [], to]);
136
+ this.edgeVisuals.set(from, [...this.edgeVisuals.get(from) ?? [], structuredClone(options.visual ?? {})]);
137
+ this.invalidate();
138
+ return this;
139
+ }
140
+ /**
141
+ * Sets a source node's conditional router and complete allowed destination set.
142
+ * @param from - Nonblank source node name.
143
+ * @param router - Called synchronously after the node with a state clone; must return one declared destination.
144
+ * @param destinations - Nonempty list of nonblank destination names; duplicates are collapsed.
145
+ * @param options - Cloned optional edge metadata and destination labels.
146
+ * @returns This graph builder.
147
+ * @throws For invalid source/destinations or uncloneable options; runtime routing rejects undeclared destinations and callback errors.
148
+ * @remarks A pending approval overrides conditional routing and enters the approval node. This replaces an existing conditional route for from.
149
+ * @example
150
+ * ```typescript
151
+ * import { AgentGraphEngine } from "@alneas/eaos-server/agentic/graph";
152
+ * const graph = new AgentGraphEngine();
153
+ * graph.addNode("start", async () => ({ isComplete: true }));
154
+ * graph.addNode("finish", async () => ({}));
155
+ * graph.addConditionalEdges("start", () => "finish", ["finish"]);
156
+ * ```
157
+ */
158
+ addConditionalEdges(from, router, destinations, options = {}) {
159
+ if (!from.trim() || !destinations.length || destinations.some((destination) => !destination.trim())) throw new Error("Invalid conditional workflow route");
160
+ this.conditionalRoutes.set(from, { router, destinations: [...new Set(destinations)], visual: structuredClone(options) });
161
+ this.invalidate();
162
+ return this;
163
+ }
164
+ /**
165
+ * Selects the registered node where future graph execution starts.
166
+ * @param nodeName - Nonblank node name; existence is checked on deferred compilation.
167
+ * @returns This builder after invalidating compiled topology.
168
+ * @throws For a blank name; missing entry registration fails later on compilation.
169
+ * @example
170
+ * ```typescript
171
+ * import { AgentGraphEngine } from "@alneas/eaos-server/agentic/graph";
172
+ * const graph = new AgentGraphEngine();
173
+ * graph.addNode("start", async () => ({ isComplete: true }));
174
+ * graph.setEntryPoint("start");
175
+ * ```
176
+ */
177
+ setEntryPoint(nodeName) {
178
+ if (!nodeName.trim()) throw new Error("Invalid workflow entry node");
179
+ this.entryNode = nodeName;
180
+ this.invalidate();
181
+ return this;
182
+ }
183
+ /**
184
+ * Reads the first statically declared outgoing edge without evaluating conditional routing.
185
+ * @param fromNode - Exact source node identifier.
186
+ * @returns First declared destination, or undefined when no static edge exists.
187
+ * @example
188
+ * ```typescript
189
+ * import { AgentGraphEngine } from "@alneas/eaos-server/agentic/graph";
190
+ * const graph = new AgentGraphEngine();
191
+ * graph.addNode("start", async () => ({ isComplete: true }));
192
+ * console.log(graph.getNextNode("start")); // undefined
193
+ * ```
194
+ */
195
+ getNextNode(fromNode) {
196
+ return this.edges.get(fromNode)?.[0];
197
+ }
198
+ /**
199
+ * Return a serializable graph description for UI/API/diagram consumers.
200
+ * Handlers and router functions are intentionally omitted: this is metadata,
201
+ * not a remotely executable workflow definition.
202
+ * @returns A structured clone of versioned node/edge display metadata in insertion order; may describe an incomplete graph before compilation.
203
+ * @throws If retained metadata has become uncloneable.
204
+ * @example
205
+ * ```typescript
206
+ * import { AgentGraphEngine } from "@alneas/eaos-server/agentic/graph";
207
+ * const graph = new AgentGraphEngine();
208
+ * graph.addNode("start", async () => ({ isComplete: true }));
209
+ * console.log(graph.describe().nodes.length); // 1
210
+ * ```
211
+ */
212
+ describe() {
213
+ const nodes = [...this.nodes.keys()].map((id) => {
214
+ const visual = this.nodeOptions.get(id)?.visual ?? {};
215
+ return {
216
+ id,
217
+ kind: visual.kind ?? "task",
218
+ label: visual.label?.trim() || id,
219
+ ...visual.description === void 0 ? {} : { description: visual.description },
220
+ ...visual.pluginId === void 0 ? {} : { pluginId: visual.pluginId },
221
+ ...visual.approvalLevel === void 0 ? {} : { approvalLevel: visual.approvalLevel },
222
+ ...visual.riskLevel === void 0 ? {} : { riskLevel: visual.riskLevel },
223
+ ...visual.toolName === void 0 ? {} : { toolName: visual.toolName },
224
+ canRequestApproval: visual.canRequestApproval ?? true,
225
+ ...visual.retryable === void 0 ? {} : { retryable: visual.retryable },
226
+ ...visual.subgraphId === void 0 ? {} : { subgraphId: visual.subgraphId },
227
+ ...visual.subgraphVersion === void 0 ? {} : { subgraphVersion: visual.subgraphVersion }
228
+ };
229
+ });
230
+ const edges = [];
231
+ for (const [from, destinations] of this.edges) {
232
+ if (this.conditionalRoutes.has(from)) continue;
233
+ destinations.forEach((to, index) => {
234
+ const visual = this.edgeVisuals.get(from)?.[index] ?? {};
235
+ edges.push({ from, to, kind: visual.kind ?? "normal", ...visual.label === void 0 ? {} : { label: visual.label }, ...visual.condition === void 0 ? {} : { condition: visual.condition } });
236
+ });
237
+ }
238
+ for (const [from, route] of this.conditionalRoutes) {
239
+ for (const to of route.destinations) {
240
+ const visual = route.visual?.visual ?? {};
241
+ const label = route.visual?.labels?.[to] ?? visual.label;
242
+ edges.push({ from, to, kind: visual.kind ?? "conditional", ...label === void 0 ? {} : { label }, ...visual.condition === void 0 ? {} : { condition: visual.condition } });
243
+ }
244
+ }
245
+ return structuredClone({ schemaVersion: "1.0", ...this.workflowId ? { workflowId: this.workflowId } : {}, ...this.workflowVersion ? { workflowVersion: this.workflowVersion } : {}, entryNode: this.entryNode, nodes, edges });
246
+ }
247
+ /**
248
+ * Extracts runtime status and approval display metadata without history, context, or approval args.
249
+ * @param state - Authorized checkpoint state to summarize.
250
+ * @returns Status prioritized as waiting_approval, failed, completed, running, then idle, plus current node/revision and optional error/approval display details.
251
+ * @remarks Reasons and errors remain visible; the host must control their content and authorize access to this overlay.
252
+ * @example
253
+ * ```typescript
254
+ * import { AgentGraphEngine, type AgentGraphState } from "@alneas/eaos-server/agentic/graph";
255
+ * export function overlay(state: AgentGraphState) {
256
+ * return new AgentGraphEngine().describeRuntime(state);
257
+ * }
258
+ * ```
259
+ */
260
+ describeRuntime(state) {
261
+ const status = state.pendingApproval ? "waiting_approval" : state.error ? "failed" : state.isComplete ? "completed" : state.currentStep ? "running" : "idle";
262
+ return {
263
+ status,
264
+ ...state.currentStep && state.currentStep !== END ? { currentNodeId: state.currentStep } : {},
265
+ ...state.checkpointRevision === void 0 ? {} : { checkpointRevision: state.checkpointRevision },
266
+ ...state.pendingApproval ? {
267
+ pendingApproval: {
268
+ ...state.pendingApproval.approvalId === void 0 ? {} : { approvalId: state.pendingApproval.approvalId },
269
+ toolName: state.pendingApproval.toolName,
270
+ approvalLevel: state.pendingApproval.approvalLevel,
271
+ riskLevel: state.pendingApproval.riskLevel,
272
+ reason: state.pendingApproval.reason
273
+ }
274
+ } : {},
275
+ ...state.error === void 0 ? {} : { error: state.error }
276
+ };
277
+ }
278
+ /**
279
+ * Reads a session checkpoint and combines its display overlay with the current static graph.
280
+ * @param sessionId - Authorized host session/thread identifier.
281
+ * @returns Graph description and runtime overlay when a checkpoint exists, or only graph metadata otherwise.
282
+ * @throws Rejects compilation, saver, or description failures.
283
+ * @remarks This method does not authenticate the caller or authorize session access.
284
+ * @example
285
+ * ```typescript
286
+ * import { AgentGraphEngine } from "@alneas/eaos-server/agentic/graph";
287
+ * const graph = new AgentGraphEngine();
288
+ * graph.addNode("start", async () => ({ isComplete: true }));
289
+ * const visualization = await graph.getVisualization("example-session");
290
+ * console.log(visualization.graph.nodes.length);
291
+ * ```
292
+ */
293
+ async getVisualization(sessionId) {
294
+ const state = await this.getCheckpoint(sessionId);
295
+ return { graph: this.describe(), ...state ? { runtime: this.describeRuntime(state) } : {} };
296
+ }
297
+ /**
298
+ * Reads the current saved state for one graph session.
299
+ * @param sessionId - Authorized LangGraph thread ID.
300
+ * @returns A structured clone of persisted state, or null when no session state exists.
301
+ * @throws Rejects deferred compilation, saver, or clone failures.
302
+ * @remarks The host authorizes tenant/session access; sessionId alone is not an authentication claim.
303
+ * @example
304
+ * ```typescript
305
+ * import { AgentGraphEngine } from "@alneas/eaos-server/agentic/graph";
306
+ * const graph = new AgentGraphEngine();
307
+ * graph.addNode("start", async () => ({ isComplete: true }));
308
+ * console.log(await graph.getCheckpoint("example-session")); // null
309
+ * ```
310
+ */
311
+ async getCheckpoint(sessionId) {
312
+ const snapshot = await this.ensureCompiled().getState(this.config(sessionId));
313
+ return snapshot.values && typeof snapshot.values === "object" && "sessionId" in snapshot.values ? toAgentState(snapshot.values) : null;
314
+ }
315
+ /**
316
+ * Runs the graph until completion or a LangGraph approval interrupt.
317
+ * @param initialState - Verified host session/tenant/user state; a nonblank sessionId is required. Existing pendingApproval returns an immediate clone without invoking the graph.
318
+ * @returns Latest checkpoint state after execution, interrupted approval state, or the supplied initial state when no checkpoint is available.
319
+ * @throws Rejects invalid sessionId, compilation, handler/retry, saver, binding, or clone errors except recognized approval interrupts.
320
+ * @remarks This method runs multiple nodes, despite its name. The host must serialize writers and make retried handlers safe for side effects. It installs no timeout or cancellation itself.
321
+ * @example
322
+ * ```typescript
323
+ * import { AgentGraphEngine } from "@alneas/eaos-server/agentic/graph";
324
+ * const graph = new AgentGraphEngine();
325
+ * graph.addNode("start", async () => ({ isComplete: true }));
326
+ * const state = await graph.runStep({ sessionId: "example-session", tenantId: "example", userId: "example-user", currentStep: "start", history: [], isComplete: false });
327
+ * console.log(state.isComplete); // true
328
+ * ```
329
+ */
330
+ async runStep(initialState) {
331
+ if (!initialState?.sessionId?.trim()) throw new Error("Workflow sessionId is required");
332
+ if (initialState.pendingApproval) return structuredClone(initialState);
333
+ try {
334
+ await this.ensureCompiled().invoke(initialState, this.config(initialState.sessionId));
335
+ } catch (error) {
336
+ const interrupted = await this.getCheckpoint(initialState.sessionId);
337
+ if (interrupted?.pendingApproval && isLangGraphInterrupt(error)) return interrupted;
338
+ throw error;
339
+ }
340
+ return await this.getCheckpoint(initialState.sessionId) ?? initialState;
341
+ }
342
+ /**
343
+ * Validates a pending approval binding and host authority before resuming its LangGraph thread.
344
+ * @param input - Session ID, verified approver ID/role, boolean decision, optional comment, optional expected approvalId/bindingHash, and optional live authorizer overriding constructor settings.
345
+ * @returns Resumed state on success, or resumed:false with an error for absent/mismatched approval, denied authorization, or normalized invocation failure. A denial decision completes the graph as rejected.
346
+ * @throws Can reject saver/compilation errors, live authorizer rejection, or post-resume checkpoint failures.
347
+ * @remarks An approved decision requires a live authorizer returning exactly true; a supplied authorizer also checks rejection decisions. Host writer serialization is required: this method does not acquire an independent lock or compare-and-swap checkpoint revisions. Missing optional expected IDs skip those comparisons. Resume failures can follow side effects; no rollback or automatic retry occurs.
348
+ * @example
349
+ * ```typescript
350
+ * import { AgentGraphEngine } from "@alneas/eaos-server/agentic/graph";
351
+ * export async function decide(graph: AgentGraphEngine, input: Parameters<AgentGraphEngine["resumeAfterApproval"]>[0]) {
352
+ * // Authenticate the approver and supply live authorization before approving.
353
+ * return graph.resumeAfterApproval(input);
354
+ * }
355
+ * ```
356
+ */
357
+ async resumeAfterApproval(input) {
358
+ const graph = this.ensureCompiled();
359
+ const checkpoint = await this.getCheckpoint(input.sessionId);
360
+ if (!checkpoint) return { resumed: false, error: `Workflow session '${input.sessionId}' not found` };
361
+ const pending = checkpoint.pendingApproval;
362
+ if (!pending) return { resumed: false, error: "Workflow is not awaiting approval" };
363
+ try {
364
+ if (input.approvalId && input.approvalId !== pending.approvalId) return { resumed: false, error: "Approval ticket does not match workflow state" };
365
+ if (!pending.binding || input.bindingHash && input.bindingHash !== pending.binding.bindingHash) return { resumed: false, error: "Approval binding does not match workflow state" };
366
+ validateApprovalBinding(pending.binding);
367
+ } catch (error) {
368
+ return { resumed: false, error: error instanceof Error ? error.message : "Invalid approval binding" };
369
+ }
370
+ if (!input.approverId.trim() || !input.approverRole.trim()) return { resumed: false, error: "Approver identity is required" };
371
+ const authorizeResume = input.authorizeResume ?? this.authorizeResume;
372
+ if (input.approved && !authorizeResume) return { resumed: false, error: "Current authorization verifier is required before workflow resume" };
373
+ if (authorizeResume && await authorizeResume(structuredClone(checkpoint), { approverId: input.approverId, approverRole: input.approverRole, approved: input.approved }) !== true) return { resumed: false, error: "Current authorization no longer permits workflow resume" };
374
+ const decision = { approved: input.approved, approverId: input.approverId, approverRole: input.approverRole, comment: input.comment };
375
+ try {
376
+ await graph.invoke(new Command({ resume: decision }), this.config(input.sessionId));
377
+ } catch (error) {
378
+ if (!isLangGraphInterrupt(error)) return { resumed: false, error: error instanceof Error ? error.message : "Workflow resume failed" };
379
+ }
380
+ const state = await this.getCheckpoint(input.sessionId);
381
+ return state ? { resumed: true, state } : { resumed: false, error: "Workflow checkpoint disappeared after resume" };
382
+ }
383
+ invalidate() {
384
+ this.graphVersion += 1;
385
+ this.compiled = void 0;
386
+ }
387
+ config(sessionId) {
388
+ return { configurable: { thread_id: sessionId } };
389
+ }
390
+ ensureCompiled() {
391
+ if (this.compiled && this.compiledVersion === this.graphVersion) return this.compiled;
392
+ if (!this.nodes.has(this.entryNode)) throw new Error(`Workflow entry node '${this.entryNode}' is not registered`);
393
+ const builder = new StateGraph(GraphState);
394
+ for (const [name, handler] of this.nodes) {
395
+ builder.addNode(name, async (state) => this.runNode(name, handler, state), this.nodeOptions.get(name));
396
+ }
397
+ builder.addNode("__eaos_approval__", async (state) => this.runApprovalNode(state));
398
+ builder.addEdge(START, this.entryNode);
399
+ for (const name of this.nodes.keys()) {
400
+ const route = this.conditionalRoutes.get(name);
401
+ const next = this.edges.get(name)?.[0] ?? END;
402
+ if (route) {
403
+ const destinations = [.../* @__PURE__ */ new Set([...route.destinations, "__eaos_approval__"])];
404
+ builder.addConditionalEdges(
405
+ name,
406
+ (state) => state.pendingApproval ? "__eaos_approval__" : routeToDestination(route, state),
407
+ destinations
408
+ );
409
+ } else {
410
+ const destinations = next === END ? [END, "__eaos_approval__"] : [next, "__eaos_approval__"];
411
+ builder.addConditionalEdges(name, (state) => state.pendingApproval ? "__eaos_approval__" : next, destinations);
412
+ }
413
+ }
414
+ const approvalDestinations = [...this.nodes.keys(), END, "__eaos_approval__"];
415
+ builder.addConditionalEdges("__eaos_approval__", (state) => state.pendingApproval ? "__eaos_approval__" : state.currentStep || END, approvalDestinations);
416
+ this.compiled = builder.compile({ checkpointer: this.checkpointer });
417
+ this.compiledVersion = this.graphVersion;
418
+ return this.compiled;
419
+ }
420
+ async runNode(name, handler, state) {
421
+ const update = await handler(toAgentState(state));
422
+ const nextState = { ...update, currentStep: update.currentStep ?? name };
423
+ if (nextState.pendingApproval) {
424
+ nextState.pendingApproval = this.bindApproval(state, nextState.pendingApproval);
425
+ nextState.isComplete = false;
426
+ } else if (!this.edges.get(name)?.length && !this.conditionalRoutes.has(name)) {
427
+ nextState.isComplete = true;
428
+ }
429
+ return nextState;
430
+ }
431
+ runApprovalNode(state) {
432
+ if (!state.pendingApproval) return { currentStep: END, isComplete: true };
433
+ const decision = interrupt({ type: "approval", pendingApproval: state.pendingApproval });
434
+ if (!decision || typeof decision.approved !== "boolean" || !decision.approverId || !decision.approverRole) throw new Error("Invalid approval decision");
435
+ const lastApproval = { ...decision, approvalId: state.pendingApproval.approvalId, bindingHash: state.pendingApproval.binding.bindingHash, decidedAt: (/* @__PURE__ */ new Date()).toISOString() };
436
+ if (!decision.approved) {
437
+ return {
438
+ pendingApproval: void 0,
439
+ lastApproval,
440
+ currentStep: END,
441
+ isComplete: true,
442
+ error: `Rejected by ${decision.approverRole} (${decision.approverId}): ${decision.comment || "No reason provided"}`
443
+ };
444
+ }
445
+ const next = this.edges.get(state.currentStep)?.[0] ?? END;
446
+ return {
447
+ pendingApproval: void 0,
448
+ lastApproval,
449
+ currentStep: state.context?.__eaosSubgraphResume ? state.currentStep : next,
450
+ isComplete: state.context?.__eaosSubgraphResume ? false : next === END,
451
+ context: state.context?.__eaosSubgraphResume ? { ...state.context, __eaosSubgraphResume: { ...state.context.__eaosSubgraphResume, decision } } : state.context,
452
+ history: [...state.history, { role: "human_approver", content: `Approved by ${decision.approverRole} (${decision.approverId})`, timestamp: (/* @__PURE__ */ new Date()).toISOString() }]
453
+ };
454
+ }
455
+ bindApproval(state, pending) {
456
+ const approvalId = pending.approvalId ?? randomUUID();
457
+ const binding = pending.binding ? validateApprovalBinding(pending.binding) : createApprovalBinding({
458
+ tenantId: state.tenantId,
459
+ requestedBy: state.userId,
460
+ operation: pending.toolName,
461
+ ...pending.target ? { target: pending.target } : {},
462
+ input: pending.args,
463
+ contract: {
464
+ operation: pending.toolName,
465
+ version: pending.contractVersion ?? "1.0.0",
466
+ /** Optional generated binding permission; defaults to toolName. */
467
+ permission: pending.permission ?? pending.toolName,
468
+ sideEffect: "external",
469
+ riskLevel: ["low", "medium", "high", "critical"].includes(pending.riskLevel) ? pending.riskLevel : "high",
470
+ approvalLevel: pending.approvalLevel,
471
+ inputSchema: { type: "object", additionalProperties: true }
472
+ }
473
+ });
474
+ if (binding.tenantId !== state.tenantId || binding.requestedBy !== state.userId || binding.operation !== pending.toolName) throw new Error("Approval binding does not match workflow state");
475
+ return { ...pending, approvalId, binding };
476
+ }
477
+ };
478
+ function isCheckpointSaver(value) {
479
+ return typeof value === "object" && value !== null && "getTuple" in value && "put" in value;
480
+ }
481
+ function routeToDestination(route, state) {
482
+ const destination = route.router(toAgentState(state));
483
+ if (!route.destinations.includes(destination)) throw new Error(`Workflow router returned undeclared destination '${destination}'`);
484
+ return destination;
485
+ }
486
+ function toAgentState(value) {
487
+ return structuredClone(value);
488
+ }
489
+ function isLangGraphInterrupt(error) {
490
+ return Boolean(error && typeof error === "object" && ("lc_error_code" in error && error.lc_error_code === "GRAPH_INTERRUPT" || error.constructor?.name === "GraphInterrupt"));
491
+ }
492
+
493
+ export {
494
+ AgentGraphEngine
495
+ };
496
+ //# sourceMappingURL=chunk-HXFVOR7Z.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/agentic/graph.ts"],"sourcesContent":["import { Command, END, interrupt, MemorySaver, START, StateGraph, Annotation, type BaseCheckpointSaver, type RetryPolicy } from '@langchain/langgraph'\nimport { createApprovalBinding, validateApprovalBinding, type ApprovalBinding, type ApprovalLevel, type RiskLevel, type WorkflowGraphDescription, type WorkflowGraphEdgeInput, type WorkflowGraphNodeInput, type WorkflowGraphRuntimeSnapshot, type WorkflowGraphVisualization } from '@alneas/eaos-core'\nimport { randomUUID } from 'node:crypto'\n\n/**\n * Serializable workflow identity, history, context, and approval state persisted by the graph checkpointer.\n * @see AgentGraphEngine.runStep for a complete usage example.\n */\nexport interface AgentGraphState {\n /** Host-authorized checkpoint thread ID. */\n sessionId: string\n /** Verified tenant that owns this workflow. */\n tenantId: string\n /** Verified requesting user, bound into generated approvals. */\n userId: string\n /** Current node identifier used for display and approval continuation. */\n currentStep: string\n /** Ordered conversation/history entries; returned history replaces rather than appends automatically. */\n history: Array<{\n /** Speaker/category label supplied by the host or runtime. */\n role: string\n /** Human-readable history text. */\n content: string\n /** ISO timestamp for runtime-generated entries; host entries are not validated here. */\n timestamp: string\n }>\n /** Optional domain state merged by key; reserved __eaos keys belong to runtime internals. */\n context?: Record<string, unknown>\n /** Optional supporting source metadata carried through state. */\n citations?: Array<{\n /** Display title supplied by the citing node. */\n title: string\n /** Source identifier or URL supplied by the node. */\n source: string\n /** Host/model relevance score; this engine imposes no numeric range. */\n score: number\n }>\n /** Optional pending human decision, bound to tenant/user/operation before checkpointing. */\n pendingApproval?: {\n /** Optional ticket ID; generated when absent during binding. */\n approvalId?: string\n /** Operation name bound to the approval and requested permission by default. */\n toolName: string\n /** Required human-approval level for the operation. */\n approvalLevel: ApprovalLevel\n /** Risk label; generated binding normalizes unknown labels to high. */\n riskLevel: string\n /** Human-readable approval justification, visible in runtime overlays. */\n reason: string\n /** Operation input used to construct the approval binding. */\n args: Record<string, unknown>\n /** Optional prebuilt binding validated against workflow tenant/user/operation. */\n binding?: ApprovalBinding\n /** Optional resource identity and revision included in generated binding. */\n target?: {\n /** Resource category included in the approval binding. */\n type: string\n /** Resource identifier included in the approval binding. */\n id: string\n /** Optional expected resource revision for host approval/admission. */\n revision?: number\n }\n /** Optional generated binding contract version; defaults to 1.0.0. */\n contractVersion?: string\n /** Optional generated binding permission; defaults to toolName. */\n permission?: string\n }\n /** Optional host checkpoint revision metadata; this engine does not increment it itself. */\n checkpointRevision?: number\n /** Optional last decision plus approval ID, binding hash, and ISO decision timestamp. */\n lastApproval?: GraphApprovalDecision & { \n /**\n * Identity of the pending review ticket consumed by this completed approval decision.\n */\n approvalId: string; \n /**\n * Exact approved request/contract binding hash copied from the consumed pending approval.\n */\n bindingHash: string; \n /**\n * ISO timestamp generated when the graph processes the resumed review decision.\n */\n decidedAt: string }\n /** True when execution has completed or a decision rejected the workflow. */\n isComplete: boolean\n /** Optional domain/runtime failure description included in runtime display overlays. */\n error?: string\n}\n\n/**\n * Async node operation receiving an isolated graph-state clone and returning partial state updates.\n * @param state - Current graph state; mutating it alone does not persist changes unless returned.\n * @returns Partial update; context is merged, while supplied history replaces the existing history.\n * @throws Handler failures propagate through LangGraph retry policy and graph execution.\n * @see AgentGraphEngine.addNode for a complete example.\n */\nexport type GraphNodeHandler = (state: AgentGraphState) => Promise<Partial<AgentGraphState>>\n/**\n * Synchronous conditional route selector over a cloned graph state.\n * @param state - Current state after the source node has run.\n * @returns One exact declared destination name; undeclared destinations fail execution.\n * @see AgentGraphEngine.addConditionalEdges for a complete example.\n */\nexport type GraphRouter = (state: AgentGraphState) => string\n\n/** Minimal boundary for a compiled LangGraph subgraph. The plugin owns its state schema.\n * @see AgentGraphEngine.addSubgraph for setup and usage.\n */\nexport interface GraphSubgraph {\n /**\n * Invokes the compiled child graph.\n * @param input - Host-mapped child input.\n * @param config - Parent-supplied checkpoint thread/namespace configuration.\n * @returns Child output, interpreted by the parent mapOutput callback.\n * @throws Child execution/checkpoint failures propagate or can be mapped for recognized interrupts.\n \n * @example\n * ```typescript\n * import type { GraphSubgraph } from \"@alneas/eaos-server\";\n * export async function invokeHostSubgraph(\n * subgraph: GraphSubgraph,\n * input: Parameters<GraphSubgraph[\"invoke\"]>[0],\n * config: Parameters<GraphSubgraph[\"invoke\"]>[1],\n * ) {\n * // Supply the host's admitted input and checkpoint/thread configuration.\n * return await subgraph.invoke(input, config);\n * }\n * ```\n */\n invoke(input: unknown, config?: unknown): Promise<unknown>\n /**\n * Inspects child state when a recognized interrupt needs mapping.\n * @param config - Child checkpoint thread/namespace configuration.\n * @returns Host-specific child checkpoint state.\n * @throws Inspection failures propagate to parent execution.\n \n * @example\n * ```typescript\n * import type { GraphSubgraph } from \"@alneas/eaos-server\";\n * export async function inspectHostSubgraph(\n * subgraph: GraphSubgraph, config: Parameters<NonNullable<GraphSubgraph[\"getState\"]>>[0],\n * ) {\n * if (!subgraph.getState) throw new Error(\"Subgraph state inspection is unavailable\");\n * return await subgraph.getState(config);\n * }\n * ```\n */\n getState?(config?: unknown): Promise<unknown>\n /**\n * Continues a child after a verified parent approval.\n * @param input - Host-mapped child input.\n * @param decision - Parent-approved human decision.\n * @param config - Child checkpoint thread/namespace configuration.\n * @returns Resumed child output.\n * @throws Child execution/checkpoint failures propagate.\n \n * @example\n * ```typescript\n * import type { GraphSubgraph } from \"@alneas/eaos-server\";\n * export async function resumeHostSubgraph(\n * subgraph: GraphSubgraph,\n * input: Parameters<NonNullable<GraphSubgraph[\"resume\"]>>[0],\n * verifiedDecision: Parameters<NonNullable<GraphSubgraph[\"resume\"]>>[1],\n * config: Parameters<NonNullable<GraphSubgraph[\"resume\"]>>[2],\n * ) {\n * if (!subgraph.resume) throw new Error(\"Subgraph resumption is unavailable\");\n * // The host authenticates/authorizes this decision before entering the subgraph.\n * return await subgraph.resume(input, verifiedDecision, config);\n * }\n * ```\n */\n resume?(input: unknown, decision: GraphApprovalDecision, config?: unknown): Promise<unknown>\n}\n\n/**\n * Host-verified human decision supplied to a pending graph approval.\n * @see AgentGraphEngine.resumeAfterApproval.\n */\nexport interface GraphApprovalDecision {\n /** True to continue; false to finish with a rejection error. */\n approved: boolean\n /** Authenticated human approver identifier. */\n approverId: string\n /** Verified role associated with the decision. */\n approverRole: string\n /** Optional human note; rejection uses a default description when blank. */\n comment?: string\n}\n\n/**\n * Explicit state mapping, child-thread identity, and interrupt translation for {@link AgentGraphEngine.addSubgraph}.\n */\nexport interface GraphSubgraphOptions {\n /** Optional synchronous parent-state to child-input mapping; defaults to passing parent state. */\n mapInput?: (state: AgentGraphState) => unknown\n /** Optional synchronous child-output/parent-state to update mapping; absent treats output as a partial parent state. */\n mapOutput?: (output: unknown, state: AgentGraphState) => Partial<AgentGraphState>\n /** Optional synchronous child thread ID builder; defaults to sessionId:name and must be nonblank. */\n threadId?: (state: AgentGraphState) => string\n /** Called for a recognized nested LangGraph interrupt with error, parent state, and optional child checkpoint; resolves a parent update, normally pendingApproval. Errors propagate. */\n mapInterrupted?: (error: unknown, state: AgentGraphState, subgraphState: unknown) => Partial<AgentGraphState> | Promise<Partial<AgentGraphState>>\n /** Serializable metadata used by workflow viewers; never executed. */\n visual?: WorkflowGraphNodeInput\n}\n\n/**\n * Checkpoint persistence, live approval authority, and workflow metadata for {@link AgentGraphEngine}.\n */\nexport interface AgentGraphEngineOptions {\n /** Host-owned live membership/lifecycle/resource re-check at resume time. */\n authorizeResume?: (state: AgentGraphState, input: {\n /**\n * Nonblank authenticated approver identifier supplied by the host.\n */\n approverId: string;\n /**\n * Nonblank verified role associated with this human decision.\n */\n approverRole: string;\n /**\n * True requests continuation and requires a current authorizer; false rejects the workflow but is also checked when an authorizer exists.\n */\n approved: boolean }) => Promise<boolean>\n /** Official LangGraph checkpointer. MemorySaver is local/test-only when omitted. */\n checkpointer?: BaseCheckpointSaver\n /** Stable identity shown by workflow viewers and exported graph documents. */\n workflowId?: string\n /** Optional workflow version included in graph descriptions. */\n workflowVersion?: string\n}\n\n/**\n * Execution retry and display settings for {@link AgentGraphEngine.addNode}.\n */\nexport interface GraphNodeOptions {\n /** Optional LangGraph retry settings; retries can repeat handler side effects and must be safe by host design. */\n retryPolicy?: RetryPolicy\n /** Serializable metadata used by workflow viewers; never executed. */\n visual?: WorkflowGraphNodeInput\n}\n\n/**\n * Serializable display metadata for {@link AgentGraphEngine.addEdge}.\n */\nexport interface GraphEdgeOptions {\n /** Serializable metadata used by workflow viewers; never executed. */\n visual?: WorkflowGraphEdgeInput\n}\n\n/**\n * Display metadata for declared branches in {@link AgentGraphEngine.addConditionalEdges}.\n */\nexport interface GraphConditionalEdgeOptions extends GraphEdgeOptions {\n /** Per-destination labels such as `approved` or `needs_correction`. */\n labels?: Readonly<Record<string, string>>\n}\n\ninterface ConditionalRoute {\n router: GraphRouter\n destinations: string[]\n visual?: GraphConditionalEdgeOptions\n}\n\ntype RuntimeState = AgentGraphState\n\nconst GraphState = Annotation.Root({\n sessionId: Annotation<string>,\n tenantId: Annotation<string>,\n userId: Annotation<string>,\n currentStep: Annotation<string>,\n history: Annotation<AgentGraphState['history']>({ reducer: (_left, right) => right, default: () => [] }),\n context: Annotation<Record<string, unknown> | undefined>({\n reducer: (left, right) => {\n if (right === undefined) return left\n const merged = { ...left, ...right }\n if (merged.__eaosSubgraphResume === null) delete merged.__eaosSubgraphResume\n return merged\n },\n default: () => undefined,\n }),\n citations: Annotation<AgentGraphState['citations']>,\n pendingApproval: Annotation<AgentGraphState['pendingApproval']>,\n checkpointRevision: Annotation<number | undefined>,\n lastApproval: Annotation<AgentGraphState['lastApproval']>,\n isComplete: Annotation<boolean>,\n error: Annotation<string | undefined>,\n})\n\n/**\n * EAOS workflow runtime backed by the official LangGraph StateGraph.\n * EAOS remains responsible for authorization, approval bindings and side effects.\n * @remarks The default MemorySaver is process-local/test storage. Production hosts must supply durable, tenant-scoped checkpoint persistence, verified initial identity, live resume authorization, and writer serialization. This class does not serialize concurrent calls for the same session or implement transactional side effects. Mutating topology invalidates the compiled graph; configure it before starting workflow sessions.\n * @example\n * ```typescript\n * import { AgentGraphEngine } from \"@alneas/eaos-server/agentic/graph\";\n * const graph = new AgentGraphEngine();\n * graph.addNode(\"start\", async () => ({ isComplete: true }));\n * console.log(graph.describe().entryNode); // \"start\"\n * ```\n */\nexport class AgentGraphEngine {\n private readonly nodes = new Map<string, GraphNodeHandler>()\n private readonly edges = new Map<string, string[]>()\n private readonly edgeVisuals = new Map<string, WorkflowGraphEdgeInput[]>()\n private readonly nodeOptions = new Map<string, GraphNodeOptions>()\n private readonly conditionalRoutes = new Map<string, ConditionalRoute>()\n private readonly checkpointer: BaseCheckpointSaver\n private readonly authorizeResume?: AgentGraphEngineOptions['authorizeResume']\n private readonly workflowId?: string\n private readonly workflowVersion?: string\n private entryNode = 'start'\n private compiled?: ReturnType<StateGraph<typeof GraphState, RuntimeState, Partial<RuntimeState>, string>['compile']>\n private graphVersion = 0\n private compiledVersion = -1\n\n /**\n * Creates a graph builder with a host saver or options; compilation is deferred until execution/checkpoint reads.\n * @param checkpointerOrOptions - LangGraph saver or options; omission uses an independent MemorySaver.\n * @param options - Additional options used only when the first argument is a saver; otherwise ignored.\n */\n constructor(\n checkpointerOrOptions: BaseCheckpointSaver | AgentGraphEngineOptions = {},\n options: AgentGraphEngineOptions = {},\n ) {\n const supplied = isCheckpointSaver(checkpointerOrOptions)\n ? { ...options, checkpointer: checkpointerOrOptions }\n : checkpointerOrOptions\n this.checkpointer = supplied.checkpointer ?? new MemorySaver()\n this.authorizeResume = supplied.authorizeResume\n this.workflowId = supplied.workflowId\n this.workflowVersion = supplied.workflowVersion\n }\n\n /**\n * Registers or replaces a named handler and invalidates compiled topology.\n * @param name - Nonblank node name; __eaos_approval__ is reserved. Names are retained without trimming.\n * @param handler - Async callback receiving a cloned state and resolving partial state updates.\n * @param options - Optional LangGraph retry policy and serializable display metadata.\n * @returns This builder for chaining.\n * @throws For blank/reserved names; handler failures occur later during execution.\n * @example\n * ```typescript\n * import { AgentGraphEngine } from \"@alneas/eaos-server/agentic/graph\";\n * const graph = new AgentGraphEngine();\n * graph.addNode(\"start\", async () => ({ isComplete: true }));\n * graph.addNode(\"finish\", async () => ({ isComplete: true }));\n * ```\n */\n addNode(name: string, handler: GraphNodeHandler, options: GraphNodeOptions = {}): this {\n if (!name.trim() || name === '__eaos_approval__') throw new Error('Invalid workflow node name')\n this.nodes.set(name, handler)\n this.nodeOptions.set(name, options)\n this.invalidate()\n return this\n }\n\n /**\n * Mount a plugin-owned compiled LangGraph as one parent-graph node.\n * Input/output mapping is explicit so plugin state does not silently leak into\n * the EAOS state, while the nested graph still gets its own checkpoint thread.\n * @param name - Parent node identifier, subject to addNode validation.\n * @param subgraph - Compiled graph with invoke and optional state/resume capabilities.\n * @param options - Input/output mapping and child-thread identity; defaults pass state/output through and use sessionId:name as thread ID.\n * @returns This graph builder.\n * @throws If subgraph lacks invoke or the name is invalid. Execution propagates mapping/subgraph errors except recognized interrupts handled by mapInterrupted.\n * @remarks Child config uses checkpoint_ns=name. A mapped interrupt stores resume metadata in context; host mappings must preserve tenant boundaries and avoid leaking child state.\n * @example\n * ```typescript\n * import { AgentGraphEngine, type GraphSubgraph } from \"@alneas/eaos-server/agentic/graph\";\n * export function nested(subgraph: GraphSubgraph) {\n * return new AgentGraphEngine().addSubgraph(\"start\", subgraph, { mapOutput: output => ({ context: { child: output } }) });\n * }\n * ```\n */\n addSubgraph(name: string, subgraph: GraphSubgraph, options: GraphSubgraphOptions = {}): this {\n if (!subgraph || typeof subgraph.invoke !== 'function') throw new Error('Compiled workflow subgraph is required')\n return this.addNode(name, async state => {\n const input = options.mapInput ? options.mapInput(state) : state\n const threadId = options.threadId?.(state) ?? `${state.sessionId}:${name}`\n if (!threadId.trim()) throw new Error('Subgraph thread id is required')\n const config = { configurable: { thread_id: threadId, checkpoint_ns: name } }\n const resume = state.context?.__eaosSubgraphResume as { node?: string; decision?: GraphApprovalDecision } | undefined\n let output: unknown\n try {\n output = resume?.node === name && resume.decision && subgraph.resume\n ? await subgraph.resume(input, resume.decision, config)\n : await subgraph.invoke(input, config)\n } catch (error) {\n if (!options.mapInterrupted || !isLangGraphInterrupt(error)) throw error\n const subgraphState = subgraph.getState ? await subgraph.getState(config) : undefined\n const mapped = await options.mapInterrupted(error, state, subgraphState)\n return { ...mapped, context: { ...mapped.context, __eaosSubgraphResume: { node: name } } }\n }\n const context = { ...(state.context ?? {}) }\n if (context.__eaosSubgraphResume) context.__eaosSubgraphResume = null\n const mapped = options.mapOutput ? options.mapOutput(output, state) : (output as Partial<AgentGraphState>)\n return { ...mapped, context: { ...context, ...(mapped.context ?? {}) } }\n }, { visual: options.visual ?? { kind: 'subgraph', label: name } })\n }\n\n /**\n * Adds a declared edge and its display metadata.\n * @param from - Nonblank source node name.\n * @param to - Nonblank destination node name.\n * @param options - Optional serializable display metadata, cloned on insertion.\n * @returns This graph builder.\n * @throws For blank endpoints or uncloneable display metadata. Missing node references can fail compilation later.\n * @remarks Without conditional routing, execution follows only the first declared outgoing edge; describe may list additional declared edges.\n * @example\n * ```typescript\n * import { AgentGraphEngine } from \"@alneas/eaos-server/agentic/graph\";\n * const graph = new AgentGraphEngine();\n * graph.addNode(\"start\", async () => ({ isComplete: true }));\n * graph.addNode(\"finish\", async () => ({}));\n * graph.addEdge(\"start\", \"finish\");\n * ```\n */\n addEdge(from: string, to: string, options: GraphEdgeOptions = {}): this {\n if (!from.trim() || !to.trim()) throw new Error('Invalid workflow edge')\n this.edges.set(from, [...this.edges.get(from) ?? [], to])\n this.edgeVisuals.set(from, [...this.edgeVisuals.get(from) ?? [], structuredClone(options.visual ?? {})])\n this.invalidate()\n return this\n }\n\n /**\n * Sets a source node's conditional router and complete allowed destination set.\n * @param from - Nonblank source node name.\n * @param router - Called synchronously after the node with a state clone; must return one declared destination.\n * @param destinations - Nonempty list of nonblank destination names; duplicates are collapsed.\n * @param options - Cloned optional edge metadata and destination labels.\n * @returns This graph builder.\n * @throws For invalid source/destinations or uncloneable options; runtime routing rejects undeclared destinations and callback errors.\n * @remarks A pending approval overrides conditional routing and enters the approval node. This replaces an existing conditional route for from.\n * @example\n * ```typescript\n * import { AgentGraphEngine } from \"@alneas/eaos-server/agentic/graph\";\n * const graph = new AgentGraphEngine();\n * graph.addNode(\"start\", async () => ({ isComplete: true }));\n * graph.addNode(\"finish\", async () => ({}));\n * graph.addConditionalEdges(\"start\", () => \"finish\", [\"finish\"]);\n * ```\n */\n addConditionalEdges(from: string, router: GraphRouter, destinations: string[], options: GraphConditionalEdgeOptions = {}): this {\n if (!from.trim() || !destinations.length || destinations.some(destination => !destination.trim())) throw new Error('Invalid conditional workflow route')\n this.conditionalRoutes.set(from, { router, destinations: [...new Set(destinations)], visual: structuredClone(options) })\n this.invalidate()\n return this\n }\n\n /**\n * Selects the registered node where future graph execution starts.\n * @param nodeName - Nonblank node name; existence is checked on deferred compilation.\n * @returns This builder after invalidating compiled topology.\n * @throws For a blank name; missing entry registration fails later on compilation.\n * @example\n * ```typescript\n * import { AgentGraphEngine } from \"@alneas/eaos-server/agentic/graph\";\n * const graph = new AgentGraphEngine();\n * graph.addNode(\"start\", async () => ({ isComplete: true }));\n * graph.setEntryPoint(\"start\");\n * ```\n */\n setEntryPoint(nodeName: string): this {\n if (!nodeName.trim()) throw new Error('Invalid workflow entry node')\n this.entryNode = nodeName\n this.invalidate()\n return this\n }\n\n /**\n * Reads the first statically declared outgoing edge without evaluating conditional routing.\n * @param fromNode - Exact source node identifier.\n * @returns First declared destination, or undefined when no static edge exists.\n * @example\n * ```typescript\n * import { AgentGraphEngine } from \"@alneas/eaos-server/agentic/graph\";\n * const graph = new AgentGraphEngine();\n * graph.addNode(\"start\", async () => ({ isComplete: true }));\n * console.log(graph.getNextNode(\"start\")); // undefined\n * ```\n */\n getNextNode(fromNode: string): string | undefined {\n return this.edges.get(fromNode)?.[0]\n }\n\n /**\n * Return a serializable graph description for UI/API/diagram consumers.\n * Handlers and router functions are intentionally omitted: this is metadata,\n * not a remotely executable workflow definition.\n * @returns A structured clone of versioned node/edge display metadata in insertion order; may describe an incomplete graph before compilation.\n * @throws If retained metadata has become uncloneable.\n * @example\n * ```typescript\n * import { AgentGraphEngine } from \"@alneas/eaos-server/agentic/graph\";\n * const graph = new AgentGraphEngine();\n * graph.addNode(\"start\", async () => ({ isComplete: true }));\n * console.log(graph.describe().nodes.length); // 1\n * ```\n */\n describe(): WorkflowGraphDescription {\n const nodes = [...this.nodes.keys()].map(id => {\n const visual = this.nodeOptions.get(id)?.visual ?? {}\n return {\n id,\n kind: visual.kind ?? 'task',\n label: visual.label?.trim() || id,\n ...(visual.description === undefined ? {} : { description: visual.description }),\n ...(visual.pluginId === undefined ? {} : { pluginId: visual.pluginId }),\n ...(visual.approvalLevel === undefined ? {} : { approvalLevel: visual.approvalLevel }),\n ...(visual.riskLevel === undefined ? {} : { riskLevel: visual.riskLevel }),\n ...(visual.toolName === undefined ? {} : { toolName: visual.toolName }),\n canRequestApproval: visual.canRequestApproval ?? true,\n ...(visual.retryable === undefined ? {} : { retryable: visual.retryable }),\n ...(visual.subgraphId === undefined ? {} : { subgraphId: visual.subgraphId }),\n ...(visual.subgraphVersion === undefined ? {} : { subgraphVersion: visual.subgraphVersion }),\n }\n })\n const edges = [] as WorkflowGraphDescription['edges'][number][]\n for (const [from, destinations] of this.edges) {\n if (this.conditionalRoutes.has(from)) continue\n destinations.forEach((to, index) => {\n const visual = this.edgeVisuals.get(from)?.[index] ?? {}\n edges.push({ from, to, kind: visual.kind ?? 'normal', ...(visual.label === undefined ? {} : { label: visual.label }), ...(visual.condition === undefined ? {} : { condition: visual.condition }) })\n })\n }\n for (const [from, route] of this.conditionalRoutes) {\n for (const to of route.destinations) {\n const visual = route.visual?.visual ?? {}\n const label = route.visual?.labels?.[to] ?? visual.label\n edges.push({ from, to, kind: visual.kind ?? 'conditional', ...(label === undefined ? {} : { label }), ...(visual.condition === undefined ? {} : { condition: visual.condition }) })\n }\n }\n return structuredClone({ schemaVersion: '1.0' as const, ...(this.workflowId ? { workflowId: this.workflowId } : {}), ...(this.workflowVersion ? { workflowVersion: this.workflowVersion } : {}), entryNode: this.entryNode, nodes, edges })\n }\n\n /**\n * Extracts runtime status and approval display metadata without history, context, or approval args.\n * @param state - Authorized checkpoint state to summarize.\n * @returns Status prioritized as waiting_approval, failed, completed, running, then idle, plus current node/revision and optional error/approval display details.\n * @remarks Reasons and errors remain visible; the host must control their content and authorize access to this overlay.\n * @example\n * ```typescript\n * import { AgentGraphEngine, type AgentGraphState } from \"@alneas/eaos-server/agentic/graph\";\n * export function overlay(state: AgentGraphState) {\n * return new AgentGraphEngine().describeRuntime(state);\n * }\n * ```\n */\n describeRuntime(state: AgentGraphState): WorkflowGraphRuntimeSnapshot {\n const status: WorkflowGraphRuntimeSnapshot['status'] = state.pendingApproval ? 'waiting_approval' : state.error ? 'failed' : state.isComplete ? 'completed' : state.currentStep ? 'running' : 'idle'\n return {\n status,\n ...(state.currentStep && state.currentStep !== END ? { currentNodeId: state.currentStep } : {}),\n ...(state.checkpointRevision === undefined ? {} : { checkpointRevision: state.checkpointRevision }),\n ...(state.pendingApproval ? {\n pendingApproval: {\n ...(state.pendingApproval.approvalId === undefined ? {} : { approvalId: state.pendingApproval.approvalId }),\n toolName: state.pendingApproval.toolName,\n approvalLevel: state.pendingApproval.approvalLevel,\n riskLevel: state.pendingApproval.riskLevel,\n reason: state.pendingApproval.reason,\n },\n } : {}),\n ...(state.error === undefined ? {} : { error: state.error }),\n }\n }\n\n /**\n * Reads a session checkpoint and combines its display overlay with the current static graph.\n * @param sessionId - Authorized host session/thread identifier.\n * @returns Graph description and runtime overlay when a checkpoint exists, or only graph metadata otherwise.\n * @throws Rejects compilation, saver, or description failures.\n * @remarks This method does not authenticate the caller or authorize session access.\n * @example\n * ```typescript\n * import { AgentGraphEngine } from \"@alneas/eaos-server/agentic/graph\";\n * const graph = new AgentGraphEngine();\n * graph.addNode(\"start\", async () => ({ isComplete: true }));\n * const visualization = await graph.getVisualization(\"example-session\");\n * console.log(visualization.graph.nodes.length);\n * ```\n */\n async getVisualization(sessionId: string): Promise<WorkflowGraphVisualization> {\n const state = await this.getCheckpoint(sessionId)\n return { graph: this.describe(), ...(state ? { runtime: this.describeRuntime(state) } : {}) }\n }\n\n /**\n * Reads the current saved state for one graph session.\n * @param sessionId - Authorized LangGraph thread ID.\n * @returns A structured clone of persisted state, or null when no session state exists.\n * @throws Rejects deferred compilation, saver, or clone failures.\n * @remarks The host authorizes tenant/session access; sessionId alone is not an authentication claim.\n * @example\n * ```typescript\n * import { AgentGraphEngine } from \"@alneas/eaos-server/agentic/graph\";\n * const graph = new AgentGraphEngine();\n * graph.addNode(\"start\", async () => ({ isComplete: true }));\n * console.log(await graph.getCheckpoint(\"example-session\")); // null\n * ```\n */\n async getCheckpoint(sessionId: string): Promise<AgentGraphState | null> {\n const snapshot = await this.ensureCompiled().getState(this.config(sessionId))\n return snapshot.values && typeof snapshot.values === 'object' && 'sessionId' in snapshot.values\n ? toAgentState(snapshot.values as RuntimeState)\n : null\n }\n\n /**\n * Runs the graph until completion or a LangGraph approval interrupt.\n * @param initialState - Verified host session/tenant/user state; a nonblank sessionId is required. Existing pendingApproval returns an immediate clone without invoking the graph.\n * @returns Latest checkpoint state after execution, interrupted approval state, or the supplied initial state when no checkpoint is available.\n * @throws Rejects invalid sessionId, compilation, handler/retry, saver, binding, or clone errors except recognized approval interrupts.\n * @remarks This method runs multiple nodes, despite its name. The host must serialize writers and make retried handlers safe for side effects. It installs no timeout or cancellation itself.\n * @example\n * ```typescript\n * import { AgentGraphEngine } from \"@alneas/eaos-server/agentic/graph\";\n * const graph = new AgentGraphEngine();\n * graph.addNode(\"start\", async () => ({ isComplete: true }));\n * const state = await graph.runStep({ sessionId: \"example-session\", tenantId: \"example\", userId: \"example-user\", currentStep: \"start\", history: [], isComplete: false });\n * console.log(state.isComplete); // true\n * ```\n */\n async runStep(initialState: AgentGraphState): Promise<AgentGraphState> {\n if (!initialState?.sessionId?.trim()) throw new Error('Workflow sessionId is required')\n if (initialState.pendingApproval) return structuredClone(initialState)\n try {\n await this.ensureCompiled().invoke(initialState as RuntimeState, this.config(initialState.sessionId))\n } catch (error) {\n const interrupted = await this.getCheckpoint(initialState.sessionId)\n if (interrupted?.pendingApproval && isLangGraphInterrupt(error)) return interrupted\n throw error\n }\n return (await this.getCheckpoint(initialState.sessionId)) ?? initialState\n }\n\n /**\n * Validates a pending approval binding and host authority before resuming its LangGraph thread.\n * @param input - Session ID, verified approver ID/role, boolean decision, optional comment, optional expected approvalId/bindingHash, and optional live authorizer overriding constructor settings.\n * @returns Resumed state on success, or resumed:false with an error for absent/mismatched approval, denied authorization, or normalized invocation failure. A denial decision completes the graph as rejected.\n * @throws Can reject saver/compilation errors, live authorizer rejection, or post-resume checkpoint failures.\n * @remarks An approved decision requires a live authorizer returning exactly true; a supplied authorizer also checks rejection decisions. Host writer serialization is required: this method does not acquire an independent lock or compare-and-swap checkpoint revisions. Missing optional expected IDs skip those comparisons. Resume failures can follow side effects; no rollback or automatic retry occurs.\n * @example\n * ```typescript\n * import { AgentGraphEngine } from \"@alneas/eaos-server/agentic/graph\";\n * export async function decide(graph: AgentGraphEngine, input: Parameters<AgentGraphEngine[\"resumeAfterApproval\"]>[0]) {\n * // Authenticate the approver and supply live authorization before approving.\n * return graph.resumeAfterApproval(input);\n * }\n * ```\n */\n async resumeAfterApproval(input: {\n \n /**\n * LangGraph thread/session identity whose saved pending approval is loaded and resumed.\n */\n sessionId: string\n \n /**\n * Optional expected ticket identity; when truthy it must equal the saved pending ticket, while omission skips this comparison.\n */\n approvalId?: string\n \n /**\n * Optional expected request/contract binding hash; when truthy it must match the saved binding, while omission skips this comparison.\n */\n bindingHash?: string\n \n /**\n * Verified review decision; true requires live authorization returning exactly true, while false resumes the graph as rejected.\n */\n approved: boolean\n \n /**\n * Nonblank host-verified reviewer identity supplied to the live authorizer and recorded in lastApproval.\n */\n approverId: string\n \n /**\n * Nonblank host-verified reviewer role supplied to the live authorizer and recorded in lastApproval.\n */\n approverRole: string\n \n /**\n * Optional reviewer comment retained in the graph decision; the host owns content/privacy policy.\n */\n comment?: string\n \n /**\n * Optional live reviewer-authority callback overriding the constructor authorizer for this resume attempt.\n * @remarks Uses AgentGraphEngineOptions.authorizeResume: receives a cloned checkpoint and reviewer/decision metadata, resolves exactly true to permit resumption, and may reject. Required from either source for approved=true; when supplied it also checks rejected decisions. Omission uses the constructor callback.\n * @see {@link AgentGraphEngineOptions.authorizeResume}\n */\n authorizeResume?: AgentGraphEngineOptions['authorizeResume']\n }): Promise<{ \n /** True when verification/resumption reaches a readable checkpoint, including a resumed rejection decision; false on normalized failures and not proof that no side effect occurred. */\n resumed: boolean; \n /** Graph state loaded after resumption when available; may represent completion, rejection or another pending interrupt rather than final workflow success. */\n state?: AgentGraphState; \n /** Optional explanation for a missing/mismatched approval, denied authority, invocation failure or disappeared checkpoint; some saver/authorizer errors reject instead. */\n error?: string }> {\n const graph = this.ensureCompiled()\n const checkpoint = await this.getCheckpoint(input.sessionId)\n if (!checkpoint) return { resumed: false, error: `Workflow session '${input.sessionId}' not found` }\n const pending = checkpoint.pendingApproval\n if (!pending) return { resumed: false, error: 'Workflow is not awaiting approval' }\n try {\n if (input.approvalId && input.approvalId !== pending.approvalId) return { resumed: false, error: 'Approval ticket does not match workflow state' }\n if (!pending.binding || (input.bindingHash && input.bindingHash !== pending.binding.bindingHash)) return { resumed: false, error: 'Approval binding does not match workflow state' }\n validateApprovalBinding(pending.binding)\n } catch (error) {\n return { resumed: false, error: error instanceof Error ? error.message : 'Invalid approval binding' }\n }\n if (!input.approverId.trim() || !input.approverRole.trim()) return { resumed: false, error: 'Approver identity is required' }\n const authorizeResume = input.authorizeResume ?? this.authorizeResume\n if (input.approved && !authorizeResume) return { resumed: false, error: 'Current authorization verifier is required before workflow resume' }\n if (authorizeResume && await authorizeResume(structuredClone(checkpoint), { approverId: input.approverId, approverRole: input.approverRole, approved: input.approved }) !== true) return { resumed: false, error: 'Current authorization no longer permits workflow resume' }\n\n const decision: GraphApprovalDecision = { approved: input.approved, approverId: input.approverId, approverRole: input.approverRole, comment: input.comment }\n try {\n await graph.invoke(new Command({ resume: decision }), this.config(input.sessionId))\n } catch (error) {\n if (!isLangGraphInterrupt(error)) return { resumed: false, error: error instanceof Error ? error.message : 'Workflow resume failed' }\n }\n const state = await this.getCheckpoint(input.sessionId)\n return state ? { resumed: true, state } : { resumed: false, error: 'Workflow checkpoint disappeared after resume' }\n }\n\n private invalidate() {\n this.graphVersion += 1\n this.compiled = undefined\n }\n\n private config(sessionId: string) {\n return { configurable: { thread_id: sessionId } }\n }\n\n private ensureCompiled() {\n if (this.compiled && this.compiledVersion === this.graphVersion) return this.compiled\n if (!this.nodes.has(this.entryNode)) throw new Error(`Workflow entry node '${this.entryNode}' is not registered`)\n\n const builder = new StateGraph<typeof GraphState, RuntimeState, Partial<RuntimeState>, string>(GraphState)\n for (const [name, handler] of this.nodes) {\n builder.addNode(name, async (state) => this.runNode(name, handler, state as RuntimeState), this.nodeOptions.get(name))\n }\n builder.addNode('__eaos_approval__', async (state) => this.runApprovalNode(state as RuntimeState))\n builder.addEdge(START, this.entryNode)\n\n for (const name of this.nodes.keys()) {\n const route = this.conditionalRoutes.get(name)\n const next = this.edges.get(name)?.[0] ?? END\n if (route) {\n const destinations = [...new Set([...route.destinations, '__eaos_approval__'])]\n builder.addConditionalEdges(\n name,\n state => state.pendingApproval ? '__eaos_approval__' : routeToDestination(route, state as RuntimeState),\n destinations,\n )\n } else {\n const destinations = next === END ? [END, '__eaos_approval__'] : [next, '__eaos_approval__']\n builder.addConditionalEdges(name, state => (state.pendingApproval ? '__eaos_approval__' : next), destinations)\n }\n }\n const approvalDestinations = [...this.nodes.keys(), END, '__eaos_approval__']\n builder.addConditionalEdges('__eaos_approval__', state => state.pendingApproval ? '__eaos_approval__' : (state.currentStep || END), approvalDestinations)\n\n this.compiled = builder.compile({ checkpointer: this.checkpointer })\n this.compiledVersion = this.graphVersion\n return this.compiled\n }\n\n private async runNode(name: string, handler: GraphNodeHandler, state: RuntimeState) {\n const update = await handler(toAgentState(state))\n const nextState: Partial<RuntimeState> = { ...update, currentStep: update.currentStep ?? name }\n if (nextState.pendingApproval) {\n nextState.pendingApproval = this.bindApproval(state, nextState.pendingApproval)\n nextState.isComplete = false\n } else if (!this.edges.get(name)?.length && !this.conditionalRoutes.has(name)) {\n nextState.isComplete = true\n }\n return nextState\n }\n\n private runApprovalNode(state: RuntimeState) {\n if (!state.pendingApproval) return { currentStep: END, isComplete: true }\n const decision = interrupt({ type: 'approval', pendingApproval: state.pendingApproval }) as { approved?: boolean; approverId?: string; approverRole?: string; comment?: string }\n if (!decision || typeof decision.approved !== 'boolean' || !decision.approverId || !decision.approverRole) throw new Error('Invalid approval decision')\n const lastApproval = { ...decision, approvalId: state.pendingApproval.approvalId!, bindingHash: state.pendingApproval.binding!.bindingHash, decidedAt: new Date().toISOString() }\n if (!decision.approved) {\n return {\n pendingApproval: undefined,\n lastApproval,\n currentStep: END,\n isComplete: true,\n error: `Rejected by ${decision.approverRole} (${decision.approverId}): ${decision.comment || 'No reason provided'}`,\n }\n }\n const next = this.edges.get(state.currentStep)?.[0] ?? END\n return {\n pendingApproval: undefined,\n lastApproval,\n currentStep: state.context?.__eaosSubgraphResume ? state.currentStep : next,\n isComplete: state.context?.__eaosSubgraphResume ? false : next === END,\n context: state.context?.__eaosSubgraphResume ? { ...state.context, __eaosSubgraphResume: { ...state.context.__eaosSubgraphResume as object, decision } } : state.context,\n history: [...state.history, { role: 'human_approver', content: `Approved by ${decision.approverRole} (${decision.approverId})`, timestamp: new Date().toISOString() }],\n }\n }\n\n private bindApproval(state: RuntimeState, pending: NonNullable<AgentGraphState['pendingApproval']>) {\n const approvalId = pending.approvalId ?? randomUUID()\n const binding = pending.binding ? validateApprovalBinding(pending.binding) : createApprovalBinding({\n tenantId: state.tenantId,\n requestedBy: state.userId,\n operation: pending.toolName,\n ...(pending.target ? { target: pending.target } : {}),\n input: pending.args,\n contract: {\n operation: pending.toolName,\n version: pending.contractVersion ?? '1.0.0',\n /** Optional generated binding permission; defaults to toolName. */\n permission: pending.permission ?? pending.toolName,\n sideEffect: 'external',\n riskLevel: (['low', 'medium', 'high', 'critical'].includes(pending.riskLevel) ? pending.riskLevel : 'high') as RiskLevel,\n approvalLevel: pending.approvalLevel,\n inputSchema: { type: 'object', additionalProperties: true },\n },\n })\n if (binding.tenantId !== state.tenantId || binding.requestedBy !== state.userId || binding.operation !== pending.toolName) throw new Error('Approval binding does not match workflow state')\n return { ...pending, approvalId, binding }\n }\n}\n\nfunction isCheckpointSaver(value: BaseCheckpointSaver | AgentGraphEngineOptions): value is BaseCheckpointSaver {\n return typeof value === 'object' && value !== null && 'getTuple' in value && 'put' in value\n}\n\nfunction routeToDestination(route: ConditionalRoute, state: RuntimeState): string {\n const destination = route.router(toAgentState(state))\n if (!route.destinations.includes(destination)) throw new Error(`Workflow router returned undeclared destination '${destination}'`)\n return destination\n}\n\nfunction toAgentState(value: RuntimeState): AgentGraphState {\n return structuredClone(value)\n}\n\nfunction isLangGraphInterrupt(error: unknown): boolean {\n return Boolean(error && typeof error === 'object' && ('lc_error_code' in error && (error as { lc_error_code?: unknown }).lc_error_code === 'GRAPH_INTERRUPT' || error.constructor?.name === 'GraphInterrupt'))\n}\n"],"mappings":"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","names":["mapped"]}