@ai-setting/roy-agent-core 1.0.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 (378) hide show
  1. package/dist/index.js +99145 -0
  2. package/package.json +114 -0
  3. package/src/config/config-component.test.ts +627 -0
  4. package/src/config/config-component.ts +906 -0
  5. package/src/config/config-parser.test.ts +319 -0
  6. package/src/config/config-parser.ts +203 -0
  7. package/src/config/decentralized-config.test.ts +740 -0
  8. package/src/config/env-key.ts +210 -0
  9. package/src/config/env-source.test.ts +252 -0
  10. package/src/config/env-source.ts +301 -0
  11. package/src/config/file-source.test.ts +357 -0
  12. package/src/config/file-source.ts +421 -0
  13. package/src/config/index.ts +24 -0
  14. package/src/config/protocol-resolver.test.ts +217 -0
  15. package/src/config/protocol-resolver.ts +228 -0
  16. package/src/env/agent/agent-component.abort.test.ts +511 -0
  17. package/src/env/agent/agent-component.record-session.test.ts +349 -0
  18. package/src/env/agent/agent-component.test.ts +1389 -0
  19. package/src/env/agent/agent-component.tool-error.test.ts +327 -0
  20. package/src/env/agent/agent-component.ts +1711 -0
  21. package/src/env/agent/agent-config-registration.test.ts +226 -0
  22. package/src/env/agent/agent-config-registration.ts +46 -0
  23. package/src/env/agent/agent-reminder-plugin.integration.test.ts +243 -0
  24. package/src/env/agent/index.ts +10 -0
  25. package/src/env/agent/summary-agent.parse-hint.test.ts +360 -0
  26. package/src/env/agent/summary-agent.ts +508 -0
  27. package/src/env/agent/types.ts +536 -0
  28. package/src/env/commands/commands-component.test.ts +364 -0
  29. package/src/env/commands/commands-component.ts +604 -0
  30. package/src/env/commands/commands-config-registration.test.ts +198 -0
  31. package/src/env/commands/commands-config-registration.ts +38 -0
  32. package/src/env/commands/index.ts +21 -0
  33. package/src/env/commands/parser.test.ts +203 -0
  34. package/src/env/commands/parser.ts +115 -0
  35. package/src/env/commands/types.ts +184 -0
  36. package/src/env/commands-prompt-integration.test.ts +243 -0
  37. package/src/env/component-env.test.ts +119 -0
  38. package/src/env/component.ts +335 -0
  39. package/src/env/constants.test.ts +72 -0
  40. package/src/env/constants.ts +123 -0
  41. package/src/env/debug/debug-component.test.ts +114 -0
  42. package/src/env/debug/debug-component.ts +547 -0
  43. package/src/env/debug/formatters/index.ts +9 -0
  44. package/src/env/debug/formatters/repl-formatter.test.ts +139 -0
  45. package/src/env/debug/formatters/repl-formatter.ts +358 -0
  46. package/src/env/debug/formatters/trace-formatter.test.ts +119 -0
  47. package/src/env/debug/formatters/trace-formatter.ts +191 -0
  48. package/src/env/debug/formatters/tree-formatter.test.ts +107 -0
  49. package/src/env/debug/formatters/tree-formatter.ts +325 -0
  50. package/src/env/debug/index.ts +38 -0
  51. package/src/env/debug/parser/regex-parser.test.ts +201 -0
  52. package/src/env/debug/parser/regex-parser.ts +196 -0
  53. package/src/env/debug/parser/span-builder.test.ts +241 -0
  54. package/src/env/debug/parser/span-builder.ts +386 -0
  55. package/src/env/debug/reader/log-reader.test.ts +170 -0
  56. package/src/env/debug/reader/log-reader.ts +186 -0
  57. package/src/env/debug/reader/span-db-reader.test.ts +118 -0
  58. package/src/env/debug/reader/span-db-reader.ts +201 -0
  59. package/src/env/debug/types.test.ts +187 -0
  60. package/src/env/debug/types.ts +171 -0
  61. package/src/env/environment-init.test.ts +183 -0
  62. package/src/env/environment-lifecycle.test.ts +516 -0
  63. package/src/env/environment-service.test.ts +332 -0
  64. package/src/env/environment.handle-query.test.ts +96 -0
  65. package/src/env/environment.test.ts +232 -0
  66. package/src/env/environment.ts +708 -0
  67. package/src/env/errors.test.ts +165 -0
  68. package/src/env/errors.ts +157 -0
  69. package/src/env/event-source/event-source-agent-handler.test.ts +193 -0
  70. package/src/env/event-source/event-source-agent-handler.ts +111 -0
  71. package/src/env/event-source/event-source-component.process-cleanup.test.ts +236 -0
  72. package/src/env/event-source/event-source-component.stop.test.ts +346 -0
  73. package/src/env/event-source/event-source-component.test.ts +1207 -0
  74. package/src/env/event-source/event-source-component.ts +1379 -0
  75. package/src/env/event-source/event-source-config-registration.test.ts +242 -0
  76. package/src/env/event-source/event-source-config-registration.ts +37 -0
  77. package/src/env/event-source/event-source-integration.test.ts +320 -0
  78. package/src/env/event-source/event-source-platform.test.ts +630 -0
  79. package/src/env/event-source/types.ts +298 -0
  80. package/src/env/hook/global-hook-manager.ts +162 -0
  81. package/src/env/hook/hook-manager.test.ts +374 -0
  82. package/src/env/hook/hook-manager.ts +309 -0
  83. package/src/env/hook/index.ts +38 -0
  84. package/src/env/hook/types.ts +138 -0
  85. package/src/env/index.ts +144 -0
  86. package/src/env/interface.ts +203 -0
  87. package/src/env/llm/hooks.test.ts +293 -0
  88. package/src/env/llm/hooks.ts +316 -0
  89. package/src/env/llm/index.ts +61 -0
  90. package/src/env/llm/invoke-threshold-check.test.ts +88 -0
  91. package/src/env/llm/invoke-timeout.test.ts +54 -0
  92. package/src/env/llm/invoke.test.ts +71 -0
  93. package/src/env/llm/invoke.ts +1039 -0
  94. package/src/env/llm/llm-config.test.ts +523 -0
  95. package/src/env/llm/llm.test.ts +233 -0
  96. package/src/env/llm/llm.ts +568 -0
  97. package/src/env/llm/provider.test.ts +182 -0
  98. package/src/env/llm/provider.ts +108 -0
  99. package/src/env/llm/transform.test.ts +251 -0
  100. package/src/env/llm/transform.ts +286 -0
  101. package/src/env/llm/types.test.ts +580 -0
  102. package/src/env/llm/types.ts +424 -0
  103. package/src/env/log-trace/decorator-otel.test.ts +182 -0
  104. package/src/env/log-trace/decorator.ts +230 -0
  105. package/src/env/log-trace/index.ts +79 -0
  106. package/src/env/log-trace/log-trace-component.test.ts +242 -0
  107. package/src/env/log-trace/log-trace-component.ts +497 -0
  108. package/src/env/log-trace/log-trace-config-registration.test.ts +348 -0
  109. package/src/env/log-trace/log-trace-config-registration.ts +45 -0
  110. package/src/env/log-trace/logger.test.ts +149 -0
  111. package/src/env/log-trace/logger.ts +522 -0
  112. package/src/env/log-trace/opentelemetry/cli-propagation.test.ts +147 -0
  113. package/src/env/log-trace/opentelemetry/cli-propagation.ts +194 -0
  114. package/src/env/log-trace/opentelemetry/integration.test.ts +668 -0
  115. package/src/env/log-trace/opentelemetry/mod.ts +25 -0
  116. package/src/env/log-trace/opentelemetry/propagation-env.test.ts +181 -0
  117. package/src/env/log-trace/opentelemetry/propagation-env.ts +136 -0
  118. package/src/env/log-trace/opentelemetry/propagation.test.ts +259 -0
  119. package/src/env/log-trace/opentelemetry/propagation.ts +215 -0
  120. package/src/env/log-trace/opentelemetry/tracer-provider-context.test.ts +166 -0
  121. package/src/env/log-trace/opentelemetry/tracer-provider.test.ts +379 -0
  122. package/src/env/log-trace/opentelemetry/tracer-provider.ts +612 -0
  123. package/src/env/log-trace/span-storage.test.ts +145 -0
  124. package/src/env/log-trace/span-storage.ts +230 -0
  125. package/src/env/log-trace/trace-context.test.ts +187 -0
  126. package/src/env/log-trace/trace-context.ts +162 -0
  127. package/src/env/log-trace/types.test.ts +63 -0
  128. package/src/env/log-trace/types.ts +172 -0
  129. package/src/env/mcp/README.md +244 -0
  130. package/src/env/mcp/__integration__/mcp-component.integration.test.ts +373 -0
  131. package/src/env/mcp/config.test.ts +74 -0
  132. package/src/env/mcp/config.ts +116 -0
  133. package/src/env/mcp/index.ts +41 -0
  134. package/src/env/mcp/loader.test.ts +161 -0
  135. package/src/env/mcp/loader.ts +209 -0
  136. package/src/env/mcp/mcp-component.test.ts +111 -0
  137. package/src/env/mcp/mcp-component.ts +358 -0
  138. package/src/env/mcp/mcp-config-registration.test.ts +304 -0
  139. package/src/env/mcp/mcp-config-registration.ts +50 -0
  140. package/src/env/mcp/scanner.test.ts +170 -0
  141. package/src/env/mcp/scanner.ts +246 -0
  142. package/src/env/mcp/tool/adapter.test.ts +520 -0
  143. package/src/env/mcp/tool/adapter.ts +521 -0
  144. package/src/env/mcp/tool/index.ts +5 -0
  145. package/src/env/mcp/types.test.ts +171 -0
  146. package/src/env/mcp/types.ts +79 -0
  147. package/src/env/memory/README.md +177 -0
  148. package/src/env/memory/built-in/index.ts +59 -0
  149. package/src/env/memory/built-in/recall-memory.ts +103 -0
  150. package/src/env/memory/built-in/record-memory.ts +148 -0
  151. package/src/env/memory/index.ts +20 -0
  152. package/src/env/memory/memory-component.test.ts +239 -0
  153. package/src/env/memory/memory-component.ts +503 -0
  154. package/src/env/memory/memory-config-registration.test.ts +67 -0
  155. package/src/env/memory/memory-config-registration.ts +48 -0
  156. package/src/env/memory/memory-config.ts +45 -0
  157. package/src/env/memory/memory-file.test.ts +268 -0
  158. package/src/env/memory/plugin/index.ts +48 -0
  159. package/src/env/memory/plugin/memory-agent.test.ts +249 -0
  160. package/src/env/memory/plugin/memory-agent.ts +365 -0
  161. package/src/env/memory/plugin/memory-manager.ts +198 -0
  162. package/src/env/memory/plugin/memory-plugin-agent.test.ts +145 -0
  163. package/src/env/memory/plugin/memory-plugin.ts +210 -0
  164. package/src/env/memory/plugin/plugin-simplified.test.ts +51 -0
  165. package/src/env/memory/plugin/recall-memory.test.ts +106 -0
  166. package/src/env/memory/plugin/recall-memory.ts +53 -0
  167. package/src/env/memory/plugin/types.ts +101 -0
  168. package/src/env/memory/tools/memory-agent-tools.ts +228 -0
  169. package/src/env/memory/types.ts +85 -0
  170. package/src/env/paths.ts +118 -0
  171. package/src/env/prompt/index.ts +18 -0
  172. package/src/env/prompt/memory-prompts.test.ts +91 -0
  173. package/src/env/prompt/prompt-component.test.ts +491 -0
  174. package/src/env/prompt/prompt-component.ts +619 -0
  175. package/src/env/prompt/prompt-config-registration.test.ts +213 -0
  176. package/src/env/prompt/prompt-config-registration.ts +39 -0
  177. package/src/env/prompt/prompts-index.ts +504 -0
  178. package/src/env/prompt/renderer.ts +67 -0
  179. package/src/env/prompt/types.ts +136 -0
  180. package/src/env/session/hooks.ts +18 -0
  181. package/src/env/session/index.ts +37 -0
  182. package/src/env/session/search-query-parser.test.ts +425 -0
  183. package/src/env/session/search-query-parser.ts +171 -0
  184. package/src/env/session/session-checkpoint.test.ts +523 -0
  185. package/src/env/session/session-component.extract-recent-messages.test.ts +209 -0
  186. package/src/env/session/session-component.test.ts +132 -0
  187. package/src/env/session/session-component.ts +1249 -0
  188. package/src/env/session/session-config-registration.test.ts +138 -0
  189. package/src/env/session/session-config-registration.ts +52 -0
  190. package/src/env/session/session-message-converter.test.ts +763 -0
  191. package/src/env/session/session-message-converter.ts +415 -0
  192. package/src/env/session/session-message-e2e.test.ts +448 -0
  193. package/src/env/session/session-search.test.ts +391 -0
  194. package/src/env/session/session-store.test.ts +362 -0
  195. package/src/env/session/session-store.ts +141 -0
  196. package/src/env/session/storage/index.ts +6 -0
  197. package/src/env/session/storage/memory.ts +502 -0
  198. package/src/env/session/storage/sqlite.ts +794 -0
  199. package/src/env/session/types.ts +742 -0
  200. package/src/env/skill/config.ts +39 -0
  201. package/src/env/skill/index.ts +6 -0
  202. package/src/env/skill/parser.test.ts +116 -0
  203. package/src/env/skill/parser.ts +77 -0
  204. package/src/env/skill/scanner.test.ts +211 -0
  205. package/src/env/skill/scanner.ts +119 -0
  206. package/src/env/skill/skill-component.test.ts +234 -0
  207. package/src/env/skill/skill-component.ts +352 -0
  208. package/src/env/skill/skill-config-registration.test.ts +60 -0
  209. package/src/env/skill/skill-config-registration.ts +43 -0
  210. package/src/env/skill/tool/index.ts +1 -0
  211. package/src/env/skill/tool/skill-tool.test.ts +100 -0
  212. package/src/env/skill/tool/skill-tool.ts +72 -0
  213. package/src/env/skill/types.ts +64 -0
  214. package/src/env/task/delegate/delegate-tool.test.ts +498 -0
  215. package/src/env/task/delegate/delegate-tool.ts +1014 -0
  216. package/src/env/task/delegate/index.ts +18 -0
  217. package/src/env/task/delegate/stop-tool.test.ts +140 -0
  218. package/src/env/task/delegate/stop-tool.ts +119 -0
  219. package/src/env/task/delegate/task-events.test.ts +178 -0
  220. package/src/env/task/delegate/task-events.ts +143 -0
  221. package/src/env/task/hooks/contexts.test.ts +92 -0
  222. package/src/env/task/hooks/contexts.ts +192 -0
  223. package/src/env/task/hooks/index.ts +23 -0
  224. package/src/env/task/hooks/task-hook-points.test.ts +32 -0
  225. package/src/env/task/hooks/task-hook-points.ts +54 -0
  226. package/src/env/task/index.ts +7 -0
  227. package/src/env/task/plugins/index.ts +13 -0
  228. package/src/env/task/plugins/task-plugin.test.ts +74 -0
  229. package/src/env/task/plugins/task-plugin.ts +89 -0
  230. package/src/env/task/plugins/task-tag-plugin.test.ts +377 -0
  231. package/src/env/task/plugins/task-tag-plugin.ts +319 -0
  232. package/src/env/task/plugins/task-workflow-extractor.integration.test.ts +226 -0
  233. package/src/env/task/plugins/workflow-extractor-agent.test.ts +107 -0
  234. package/src/env/task/plugins/workflow-extractor-agent.ts +225 -0
  235. package/src/env/task/storage/index.ts +6 -0
  236. package/src/env/task/storage/sqlite-task-store.test.ts +283 -0
  237. package/src/env/task/storage/sqlite-task-store.ts +903 -0
  238. package/src/env/task/storage/task-search.test.ts +291 -0
  239. package/src/env/task/tag-service.test.ts +198 -0
  240. package/src/env/task/tag-service.ts +264 -0
  241. package/src/env/task/task-component.test.ts +193 -0
  242. package/src/env/task/task-component.ts +658 -0
  243. package/src/env/task/task-config-registration.test.ts +57 -0
  244. package/src/env/task/task-config-registration.ts +37 -0
  245. package/src/env/task/task-types.test.ts +137 -0
  246. package/src/env/task/tools/complete-tool.ts +44 -0
  247. package/src/env/task/tools/create-tool.ts +49 -0
  248. package/src/env/task/tools/delete-tool.ts +43 -0
  249. package/src/env/task/tools/get-tool.ts +59 -0
  250. package/src/env/task/tools/index.ts +10 -0
  251. package/src/env/task/tools/list-tool.ts +40 -0
  252. package/src/env/task/tools/operation/create-tool.ts +48 -0
  253. package/src/env/task/tools/operation/delete-tool.ts +43 -0
  254. package/src/env/task/tools/operation/get-tool.ts +43 -0
  255. package/src/env/task/tools/operation/index.ts +9 -0
  256. package/src/env/task/tools/operation/list-tool.ts +40 -0
  257. package/src/env/task/tools/operation/operation-tools.test.ts +274 -0
  258. package/src/env/task/tools/operation/operation-types.ts +75 -0
  259. package/src/env/task/tools/operation/update-tool.ts +47 -0
  260. package/src/env/task/tools/task-tools.test.ts +203 -0
  261. package/src/env/task/tools/task-types.test.ts +75 -0
  262. package/src/env/task/tools/task-types.ts +68 -0
  263. package/src/env/task/tools/update-tool.ts +70 -0
  264. package/src/env/task/types.ts +160 -0
  265. package/src/env/tool/built-in/bash.ts +201 -0
  266. package/src/env/tool/built-in/echo.ts +29 -0
  267. package/src/env/tool/built-in/edit-file.test.ts +136 -0
  268. package/src/env/tool/built-in/edit-file.ts +92 -0
  269. package/src/env/tool/built-in/glob.test.ts +94 -0
  270. package/src/env/tool/built-in/glob.ts +65 -0
  271. package/src/env/tool/built-in/grep.test.ts +122 -0
  272. package/src/env/tool/built-in/grep.ts +108 -0
  273. package/src/env/tool/built-in/index.ts +44 -0
  274. package/src/env/tool/built-in/read-file.test.ts +84 -0
  275. package/src/env/tool/built-in/read-file.ts +75 -0
  276. package/src/env/tool/built-in/write-file.test.ts +119 -0
  277. package/src/env/tool/built-in/write-file.ts +68 -0
  278. package/src/env/tool/index.ts +24 -0
  279. package/src/env/tool/registry.test.ts +257 -0
  280. package/src/env/tool/registry.ts +167 -0
  281. package/src/env/tool/tool-component.test.ts +559 -0
  282. package/src/env/tool/tool-component.ts +563 -0
  283. package/src/env/tool/tool-config-registration.test.ts +249 -0
  284. package/src/env/tool/tool-config-registration.ts +46 -0
  285. package/src/env/tool/types.ts +267 -0
  286. package/src/env/tool/validator.test.ts +143 -0
  287. package/src/env/tool/validator.ts +44 -0
  288. package/src/env/types.ts +180 -0
  289. package/src/env/workflow/ask-user-tool-registration.test.ts +216 -0
  290. package/src/env/workflow/complex-workflow.integration.test.ts +1900 -0
  291. package/src/env/workflow/decorators/decorator-node.ts +229 -0
  292. package/src/env/workflow/decorators/decorator.test.ts +196 -0
  293. package/src/env/workflow/decorators/edge.ts +82 -0
  294. package/src/env/workflow/decorators/index.ts +31 -0
  295. package/src/env/workflow/decorators/node-as.ts +98 -0
  296. package/src/env/workflow/decorators/workflow.ts +54 -0
  297. package/src/env/workflow/engine/dag-manager.test.ts +570 -0
  298. package/src/env/workflow/engine/dag-manager.ts +594 -0
  299. package/src/env/workflow/engine/engine.ts +1422 -0
  300. package/src/env/workflow/engine/event-bus.test.ts +359 -0
  301. package/src/env/workflow/engine/event-bus.ts +156 -0
  302. package/src/env/workflow/engine/executor-agent-session.test.ts +84 -0
  303. package/src/env/workflow/engine/executor.test.ts +619 -0
  304. package/src/env/workflow/engine/executor.ts +593 -0
  305. package/src/env/workflow/engine/index.ts +24 -0
  306. package/src/env/workflow/engine/node-registry.test.ts +560 -0
  307. package/src/env/workflow/engine/node-registry.ts +289 -0
  308. package/src/env/workflow/engine/resume-removed.test.ts +22 -0
  309. package/src/env/workflow/engine/scheduler.test.ts +715 -0
  310. package/src/env/workflow/engine/scheduler.ts +318 -0
  311. package/src/env/workflow/engine/workflow-engine.test.ts +815 -0
  312. package/src/env/workflow/extractor/workflow-converter.ts +306 -0
  313. package/src/env/workflow/fixtures.ts +380 -0
  314. package/src/env/workflow/index.ts +38 -0
  315. package/src/env/workflow/integration/run-resume-unified.test.ts +186 -0
  316. package/src/env/workflow/integration/service-integration.test.ts +267 -0
  317. package/src/env/workflow/metadata/keys.ts +12 -0
  318. package/src/env/workflow/nodes/agent-component-adapter.test.ts +318 -0
  319. package/src/env/workflow/nodes/agent-component-adapter.ts +448 -0
  320. package/src/env/workflow/nodes/agent-node.test.ts +371 -0
  321. package/src/env/workflow/nodes/agent-node.ts +598 -0
  322. package/src/env/workflow/nodes/ask-user-node.ts +113 -0
  323. package/src/env/workflow/nodes/condition-node.ts +200 -0
  324. package/src/env/workflow/nodes/index.ts +9 -0
  325. package/src/env/workflow/nodes/merge-node.ts +141 -0
  326. package/src/env/workflow/nodes/skill-node.test.ts +253 -0
  327. package/src/env/workflow/nodes/skill-node.ts +393 -0
  328. package/src/env/workflow/nodes/tool-node.test.ts +251 -0
  329. package/src/env/workflow/nodes/tool-node.ts +493 -0
  330. package/src/env/workflow/nodes/workflow-llm-history.test.ts +455 -0
  331. package/src/env/workflow/nodes/workflow-node.test.ts +315 -0
  332. package/src/env/workflow/nodes/workflow-node.ts +311 -0
  333. package/src/env/workflow/service/index.ts +27 -0
  334. package/src/env/workflow/service/registry.test.ts +133 -0
  335. package/src/env/workflow/service/registry.ts +71 -0
  336. package/src/env/workflow/service/workflow-service.test.ts +310 -0
  337. package/src/env/workflow/service/workflow-service.ts +393 -0
  338. package/src/env/workflow/storage/index.ts +28 -0
  339. package/src/env/workflow/storage/mock-repositories.ts +385 -0
  340. package/src/env/workflow/storage/sqlite.test.ts +179 -0
  341. package/src/env/workflow/storage/sqlite.ts +163 -0
  342. package/src/env/workflow/storage/workflow-repo.test.ts +780 -0
  343. package/src/env/workflow/storage/workflow-repo.ts +342 -0
  344. package/src/env/workflow/tools/ask-user-tool.ts +82 -0
  345. package/src/env/workflow/tools/index.ts +26 -0
  346. package/src/env/workflow/tools/run-workflow.test.ts +352 -0
  347. package/src/env/workflow/tools/run-workflow.ts +214 -0
  348. package/src/env/workflow/types/context.ts +18 -0
  349. package/src/env/workflow/types/decorators-types.ts +198 -0
  350. package/src/env/workflow/types/event.test.ts +515 -0
  351. package/src/env/workflow/types/event.ts +193 -0
  352. package/src/env/workflow/types/index.ts +49 -0
  353. package/src/env/workflow/types/run.test.ts +437 -0
  354. package/src/env/workflow/types/run.ts +173 -0
  355. package/src/env/workflow/types/workflow-hil.ts +114 -0
  356. package/src/env/workflow/types/workflow-message.test.ts +138 -0
  357. package/src/env/workflow/types/workflow-message.ts +196 -0
  358. package/src/env/workflow/types/workflow-session.test.ts +95 -0
  359. package/src/env/workflow/types/workflow-session.ts +59 -0
  360. package/src/env/workflow/types/workflow.test.ts +495 -0
  361. package/src/env/workflow/types/workflow.ts +195 -0
  362. package/src/env/workflow/types_compat.ts +51 -0
  363. package/src/env/workflow/utils/create-workflow.ts +47 -0
  364. package/src/env/workflow/utils/execution-state.ts +245 -0
  365. package/src/env/workflow/utils/index.ts +18 -0
  366. package/src/env/workflow/utils/node-registry-helper.ts +58 -0
  367. package/src/env/workflow/utils/recovery-validator.test.ts +460 -0
  368. package/src/env/workflow/utils/recovery-validator.ts +377 -0
  369. package/src/env/workflow/utils/session-parser.test.ts +111 -0
  370. package/src/env/workflow/utils/session-parser.ts +94 -0
  371. package/src/env/workflow/utils/session-recovery.test.ts +334 -0
  372. package/src/env/workflow/utils/session-recovery.ts +188 -0
  373. package/src/env/workflow/utils/template-resolver.test.ts +258 -0
  374. package/src/env/workflow/utils/template-resolver.ts +436 -0
  375. package/src/env/workflow/utils/validation-rules.ts +149 -0
  376. package/src/env/workflow/workflow-component.ts +544 -0
  377. package/src/index.ts +422 -0
  378. package/src/utils/id.ts +21 -0
@@ -0,0 +1,619 @@
1
+ /**
2
+ * Executor Tests
3
+ *
4
+ * Tests for Executor class functionality:
5
+ * - Constructor and options
6
+ * - Session message writing methods (writeNodeCall, writeNodeResult, writeNodeResume)
7
+ * - @TracedAs decorator presence
8
+ * - Cancellation handling
9
+ */
10
+
11
+ import { describe, it, expect, beforeEach, vi } from 'bun:test';
12
+ import { Executor, ExecutorOptions } from './executor';
13
+ import { EventBus } from './event-bus';
14
+ import { NodeRegistry } from './node-registry';
15
+ import type { NodeDefinition, NodeExecutionContext } from '../types';
16
+
17
+ // Mock SessionComponent
18
+ const mockSessionComponent = {
19
+ addMessage: vi.fn().mockResolvedValue('msg_123'),
20
+ getMessages: vi.fn().mockResolvedValue([]),
21
+ };
22
+
23
+ describe('Executor', () => {
24
+ let eventBus: EventBus;
25
+ let nodeRegistry: NodeRegistry;
26
+
27
+ beforeEach(() => {
28
+ eventBus = new EventBus();
29
+ nodeRegistry = new NodeRegistry({});
30
+ mockSessionComponent.addMessage.mockClear();
31
+ mockSessionComponent.getMessages.mockClear();
32
+ });
33
+
34
+ describe('constructor', () => {
35
+ it('should create an Executor instance', () => {
36
+ const executor = new Executor(
37
+ nodeRegistry,
38
+ eventBus,
39
+ { globalTimeout: null, globalRetry: null, debug: false }
40
+ );
41
+
42
+ expect(executor).toBeDefined();
43
+ });
44
+
45
+ it('should accept sessionComponent as optional parameter', () => {
46
+ const executor = new Executor(
47
+ nodeRegistry,
48
+ eventBus,
49
+ { globalTimeout: null, globalRetry: null, debug: false },
50
+ mockSessionComponent as any
51
+ );
52
+
53
+ expect(executor).toBeDefined();
54
+ });
55
+
56
+ it('should create with global timeout option', () => {
57
+ const executor = new Executor(
58
+ nodeRegistry,
59
+ eventBus,
60
+ { globalTimeout: 60000, globalRetry: null, debug: false }
61
+ );
62
+
63
+ expect(executor).toBeDefined();
64
+ });
65
+
66
+ it('should create with global retry option', () => {
67
+ const executor = new Executor(
68
+ nodeRegistry,
69
+ eventBus,
70
+ {
71
+ globalTimeout: null,
72
+ globalRetry: { max_attempts: 3, backoff: 'exponential', initial_delay: 1000 },
73
+ debug: false,
74
+ }
75
+ );
76
+
77
+ expect(executor).toBeDefined();
78
+ });
79
+
80
+ it('should create with debug mode enabled', () => {
81
+ const executor = new Executor(
82
+ nodeRegistry,
83
+ eventBus,
84
+ { globalTimeout: null, globalRetry: null, debug: true }
85
+ );
86
+
87
+ expect(executor).toBeDefined();
88
+ });
89
+ });
90
+
91
+ describe('trace integration', () => {
92
+ it('should have @TracedAs decorator on executeNode method', () => {
93
+ const executor = new Executor(
94
+ nodeRegistry,
95
+ eventBus,
96
+ { globalTimeout: null, globalRetry: null, debug: false }
97
+ );
98
+
99
+ // The @TracedAs decorator wraps methods, verify the method exists
100
+ expect(typeof executor.executeNode).toBe('function');
101
+
102
+ // The method should be callable (decorator wraps it)
103
+ expect(executor.executeNode).toBeDefined();
104
+ });
105
+
106
+ it('should have @TracedAs decorator on writeNodeCall method', () => {
107
+ const executor = new Executor(
108
+ nodeRegistry,
109
+ eventBus,
110
+ { globalTimeout: null, globalRetry: null, debug: false }
111
+ );
112
+
113
+ expect(typeof executor.writeNodeCall).toBe('function');
114
+ });
115
+
116
+ it('should have @TracedAs decorator on writeNodeResult method', () => {
117
+ const executor = new Executor(
118
+ nodeRegistry,
119
+ eventBus,
120
+ { globalTimeout: null, globalRetry: null, debug: false }
121
+ );
122
+
123
+ expect(typeof executor.writeNodeResult).toBe('function');
124
+ });
125
+
126
+ it('should have @TracedAs decorator on writeNodeResume method', () => {
127
+ const executor = new Executor(
128
+ nodeRegistry,
129
+ eventBus,
130
+ { globalTimeout: null, globalRetry: null, debug: false }
131
+ );
132
+
133
+ expect(typeof executor.writeNodeResume).toBe('function');
134
+ });
135
+ });
136
+
137
+ describe('writeNodeCall', () => {
138
+ it('should write workflow.node.call message', async () => {
139
+ const executor = new Executor(
140
+ nodeRegistry,
141
+ eventBus,
142
+ { globalTimeout: null, globalRetry: null, debug: false },
143
+ mockSessionComponent as any
144
+ );
145
+
146
+ await executor.writeNodeCall(
147
+ 'session_1',
148
+ 'node_1',
149
+ 'tool',
150
+ { value: 42 }
151
+ );
152
+
153
+ expect(mockSessionComponent.addMessage).toHaveBeenCalledWith(
154
+ 'session_1',
155
+ expect.objectContaining({
156
+ role: 'workflow.node.call',
157
+ metadata: expect.objectContaining({
158
+ type: 'workflow.node.call',
159
+ workflowNodeId: 'node_1',
160
+ workflowNodeType: 'tool',
161
+ }),
162
+ })
163
+ );
164
+ });
165
+
166
+ it('should not write if sessionComponent is not provided', async () => {
167
+ const executorWithoutSession = new Executor(
168
+ nodeRegistry,
169
+ eventBus,
170
+ { globalTimeout: null, globalRetry: null, debug: false }
171
+ );
172
+
173
+ // Should not throw, just silently skip
174
+ await executorWithoutSession.writeNodeCall(
175
+ 'session_1',
176
+ 'node_1',
177
+ 'tool',
178
+ { value: 42 }
179
+ );
180
+
181
+ expect(mockSessionComponent.addMessage).not.toHaveBeenCalled();
182
+ });
183
+
184
+ it('should include agentSessionId when provided', async () => {
185
+ const executor = new Executor(
186
+ nodeRegistry,
187
+ eventBus,
188
+ { globalTimeout: null, globalRetry: null, debug: false },
189
+ mockSessionComponent as any
190
+ );
191
+
192
+ await executor.writeNodeCall(
193
+ 'session_1',
194
+ 'node_1',
195
+ 'agent',
196
+ { prompt: 'Hello' },
197
+ 'agent_session_123'
198
+ );
199
+
200
+ expect(mockSessionComponent.addMessage).toHaveBeenCalledWith(
201
+ 'session_1',
202
+ expect.objectContaining({
203
+ metadata: expect.objectContaining({
204
+ agentSessionId: 'agent_session_123',
205
+ }),
206
+ })
207
+ );
208
+ });
209
+
210
+ it('should handle undefined input', async () => {
211
+ const executor = new Executor(
212
+ nodeRegistry,
213
+ eventBus,
214
+ { globalTimeout: null, globalRetry: null, debug: false },
215
+ mockSessionComponent as any
216
+ );
217
+
218
+ await executor.writeNodeCall(
219
+ 'session_1',
220
+ 'node_1',
221
+ 'tool',
222
+ undefined
223
+ );
224
+
225
+ expect(mockSessionComponent.addMessage).toHaveBeenCalled();
226
+ });
227
+
228
+ it('should handle complex input objects', async () => {
229
+ const executor = new Executor(
230
+ nodeRegistry,
231
+ eventBus,
232
+ { globalTimeout: null, globalRetry: null, debug: false },
233
+ mockSessionComponent as any
234
+ );
235
+
236
+ const complexInput = {
237
+ items: [1, 2, 3],
238
+ nested: { key: 'value' },
239
+ flag: true,
240
+ };
241
+
242
+ await executor.writeNodeCall(
243
+ 'session_1',
244
+ 'node_1',
245
+ 'tool',
246
+ complexInput
247
+ );
248
+
249
+ expect(mockSessionComponent.addMessage).toHaveBeenCalledWith(
250
+ 'session_1',
251
+ expect.objectContaining({
252
+ metadata: expect.objectContaining({
253
+ workflowNodeId: 'node_1',
254
+ workflowNodeType: 'tool',
255
+ }),
256
+ })
257
+ );
258
+ });
259
+ });
260
+
261
+ describe('writeNodeResult', () => {
262
+ it('should write success result', async () => {
263
+ const executor = new Executor(
264
+ nodeRegistry,
265
+ eventBus,
266
+ { globalTimeout: null, globalRetry: null, debug: false },
267
+ mockSessionComponent as any
268
+ );
269
+
270
+ await executor.writeNodeResult(
271
+ 'session_1',
272
+ 'node_1',
273
+ 'tool',
274
+ { result: 'success' },
275
+ undefined,
276
+ 1000
277
+ );
278
+
279
+ expect(mockSessionComponent.addMessage).toHaveBeenCalledWith(
280
+ 'session_1',
281
+ expect.objectContaining({
282
+ role: 'workflow.node.result',
283
+ metadata: expect.objectContaining({
284
+ type: 'workflow.node.result',
285
+ workflowNodeId: 'node_1',
286
+ workflowNodeType: 'tool',
287
+ success: true,
288
+ }),
289
+ })
290
+ );
291
+ });
292
+
293
+ it('should write error result', async () => {
294
+ const executor = new Executor(
295
+ nodeRegistry,
296
+ eventBus,
297
+ { globalTimeout: null, globalRetry: null, debug: false },
298
+ mockSessionComponent as any
299
+ );
300
+
301
+ await executor.writeNodeResult(
302
+ 'session_1',
303
+ 'node_1',
304
+ 'tool',
305
+ undefined,
306
+ 'Something went wrong',
307
+ 500
308
+ );
309
+
310
+ expect(mockSessionComponent.addMessage).toHaveBeenCalledWith(
311
+ 'session_1',
312
+ expect.objectContaining({
313
+ role: 'workflow.node.result',
314
+ metadata: expect.objectContaining({
315
+ type: 'workflow.node.result',
316
+ workflowNodeId: 'node_1',
317
+ workflowNodeType: 'tool',
318
+ success: false,
319
+ }),
320
+ })
321
+ );
322
+ });
323
+
324
+ it('should not write if sessionComponent is not provided', async () => {
325
+ const executorWithoutSession = new Executor(
326
+ nodeRegistry,
327
+ eventBus,
328
+ { globalTimeout: null, globalRetry: null, debug: false }
329
+ );
330
+
331
+ // Should not throw
332
+ await executorWithoutSession.writeNodeResult(
333
+ 'session_1',
334
+ 'node_1',
335
+ 'tool',
336
+ { result: 'success' },
337
+ undefined,
338
+ 1000
339
+ );
340
+
341
+ expect(mockSessionComponent.addMessage).not.toHaveBeenCalled();
342
+ });
343
+
344
+ it('should include duration in metadata', async () => {
345
+ const executor = new Executor(
346
+ nodeRegistry,
347
+ eventBus,
348
+ { globalTimeout: null, globalRetry: null, debug: false },
349
+ mockSessionComponent as any
350
+ );
351
+
352
+ await executor.writeNodeResult(
353
+ 'session_1',
354
+ 'node_1',
355
+ 'tool',
356
+ { result: 'success' },
357
+ undefined,
358
+ 2500
359
+ );
360
+
361
+ expect(mockSessionComponent.addMessage).toHaveBeenCalledWith(
362
+ 'session_1',
363
+ expect.objectContaining({
364
+ metadata: expect.objectContaining({
365
+ type: 'workflow.node.result',
366
+ }),
367
+ })
368
+ );
369
+ });
370
+ });
371
+
372
+ describe('writeNodeResume', () => {
373
+ it('should write resume message', async () => {
374
+ const executor = new Executor(
375
+ nodeRegistry,
376
+ eventBus,
377
+ { globalTimeout: null, globalRetry: null, debug: false },
378
+ mockSessionComponent as any
379
+ );
380
+
381
+ await executor.writeNodeResume(
382
+ 'session_1',
383
+ 'Yes, continue'
384
+ );
385
+
386
+ expect(mockSessionComponent.addMessage).toHaveBeenCalledWith(
387
+ 'session_1',
388
+ expect.objectContaining({
389
+ role: 'workflow.node.resume',
390
+ content: 'Yes, continue',
391
+ })
392
+ );
393
+ });
394
+
395
+ it('should not write if sessionComponent is not provided', async () => {
396
+ const executorWithoutSession = new Executor(
397
+ nodeRegistry,
398
+ eventBus,
399
+ { globalTimeout: null, globalRetry: null, debug: false }
400
+ );
401
+
402
+ // Should not throw
403
+ await executorWithoutSession.writeNodeResume(
404
+ 'session_1',
405
+ 'User response'
406
+ );
407
+
408
+ expect(mockSessionComponent.addMessage).not.toHaveBeenCalled();
409
+ });
410
+
411
+ it('should handle empty response', async () => {
412
+ const executor = new Executor(
413
+ nodeRegistry,
414
+ eventBus,
415
+ { globalTimeout: null, globalRetry: null, debug: false },
416
+ mockSessionComponent as any
417
+ );
418
+
419
+ await executor.writeNodeResume(
420
+ 'session_1',
421
+ ''
422
+ );
423
+
424
+ expect(mockSessionComponent.addMessage).toHaveBeenCalledWith(
425
+ 'session_1',
426
+ expect.objectContaining({
427
+ role: 'workflow.node.resume',
428
+ content: '',
429
+ })
430
+ );
431
+ });
432
+
433
+ it('should handle long response', async () => {
434
+ const executor = new Executor(
435
+ nodeRegistry,
436
+ eventBus,
437
+ { globalTimeout: null, globalRetry: null, debug: false },
438
+ mockSessionComponent as any
439
+ );
440
+
441
+ const longResponse = 'A'.repeat(10000);
442
+
443
+ await executor.writeNodeResume(
444
+ 'session_1',
445
+ longResponse
446
+ );
447
+
448
+ expect(mockSessionComponent.addMessage).toHaveBeenCalledWith(
449
+ 'session_1',
450
+ expect.objectContaining({
451
+ role: 'workflow.node.resume',
452
+ content: longResponse,
453
+ })
454
+ );
455
+ });
456
+ });
457
+
458
+ describe('writeNodeInterrupt', () => {
459
+ it('should write interrupt message when sessionComponent is provided', async () => {
460
+ const executor = new Executor(
461
+ nodeRegistry,
462
+ eventBus,
463
+ { globalTimeout: null, globalRetry: null, debug: false },
464
+ mockSessionComponent as any
465
+ );
466
+
467
+ await executor.writeNodeInterrupt(
468
+ 'session_1',
469
+ 'node_1',
470
+ 'agent',
471
+ 'Should I continue?'
472
+ );
473
+
474
+ expect(mockSessionComponent.addMessage).toHaveBeenCalledWith(
475
+ 'session_1',
476
+ expect.objectContaining({
477
+ role: 'workflow.node.interrupt',
478
+ content: 'Should I continue?',
479
+ metadata: expect.objectContaining({
480
+ type: 'workflow.node.interrupt',
481
+ workflowNodeId: 'node_1',
482
+ workflowNodeType: 'agent',
483
+ query: 'Should I continue?',
484
+ }),
485
+ })
486
+ );
487
+ });
488
+
489
+ it('should include agentSessionId when provided', async () => {
490
+ const executor = new Executor(
491
+ nodeRegistry,
492
+ eventBus,
493
+ { globalTimeout: null, globalRetry: null, debug: false },
494
+ mockSessionComponent as any
495
+ );
496
+
497
+ await executor.writeNodeInterrupt(
498
+ 'session_1',
499
+ 'node_1',
500
+ 'agent',
501
+ 'Should I continue?',
502
+ 'agent_session_456'
503
+ );
504
+
505
+ expect(mockSessionComponent.addMessage).toHaveBeenCalledWith(
506
+ 'session_1',
507
+ expect.objectContaining({
508
+ metadata: expect.objectContaining({
509
+ agentSessionId: 'agent_session_456',
510
+ }),
511
+ })
512
+ );
513
+ });
514
+
515
+ it('should not write if sessionComponent is not provided', async () => {
516
+ const executorWithoutSession = new Executor(
517
+ nodeRegistry,
518
+ eventBus,
519
+ { globalTimeout: null, globalRetry: null, debug: false }
520
+ );
521
+
522
+ // Should not throw
523
+ await executorWithoutSession.writeNodeInterrupt(
524
+ 'session_1',
525
+ 'node_1',
526
+ 'agent',
527
+ 'Should I continue?'
528
+ );
529
+
530
+ expect(mockSessionComponent.addMessage).not.toHaveBeenCalled();
531
+ });
532
+ });
533
+
534
+ describe('cancelNode', () => {
535
+ it('should have cancelNode method', () => {
536
+ const executor = new Executor(
537
+ nodeRegistry,
538
+ eventBus,
539
+ { globalTimeout: null, globalRetry: null, debug: false }
540
+ );
541
+
542
+ expect(typeof executor.cancelNode).toBe('function');
543
+ });
544
+
545
+ it('should not throw when cancelling unknown node', () => {
546
+ const executor = new Executor(
547
+ nodeRegistry,
548
+ eventBus,
549
+ { globalTimeout: null, globalRetry: null, debug: false }
550
+ );
551
+
552
+ expect(() => executor.cancelNode('unknown_node')).not.toThrow();
553
+ });
554
+
555
+ it('should be callable multiple times', () => {
556
+ const executor = new Executor(
557
+ nodeRegistry,
558
+ eventBus,
559
+ { globalTimeout: null, globalRetry: null, debug: false }
560
+ );
561
+
562
+ executor.cancelNode('node_1');
563
+ executor.cancelNode('node_2');
564
+ executor.cancelNode('node_1');
565
+
566
+ expect(true).toBe(true); // No errors thrown
567
+ });
568
+ });
569
+
570
+ describe('cancelAll', () => {
571
+ it('should have cancelAll method', () => {
572
+ const executor = new Executor(
573
+ nodeRegistry,
574
+ eventBus,
575
+ { globalTimeout: null, globalRetry: null, debug: false }
576
+ );
577
+
578
+ expect(typeof executor.cancelAll).toBe('function');
579
+ });
580
+
581
+ it('should not throw when no nodes are running', () => {
582
+ const executor = new Executor(
583
+ nodeRegistry,
584
+ eventBus,
585
+ { globalTimeout: null, globalRetry: null, debug: false }
586
+ );
587
+
588
+ expect(() => executor.cancelAll()).not.toThrow();
589
+ });
590
+
591
+ it('should be callable multiple times', () => {
592
+ const executor = new Executor(
593
+ nodeRegistry,
594
+ eventBus,
595
+ { globalTimeout: null, globalRetry: null, debug: false }
596
+ );
597
+
598
+ executor.cancelAll();
599
+ executor.cancelAll();
600
+ executor.cancelAll();
601
+
602
+ expect(true).toBe(true); // No errors thrown
603
+ });
604
+ });
605
+
606
+ describe('integration with EventBus', () => {
607
+ it('should use the provided EventBus', () => {
608
+ const executor = new Executor(
609
+ nodeRegistry,
610
+ eventBus,
611
+ { globalTimeout: null, globalRetry: null, debug: false }
612
+ );
613
+
614
+ // The executor should be able to publish to the event bus
615
+ // We can verify this by checking it was created with the event bus
616
+ expect(eventBus).toBeInstanceOf(EventBus);
617
+ });
618
+ });
619
+ });