@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,560 @@
1
+ /**
2
+ * @fileoverview NodeRegistry Tests
3
+ *
4
+ * TDD tests for the NodeRegistry class that manages node creation
5
+ * from NodeDefinition instances.
6
+ */
7
+
8
+ import { describe, it, expect, beforeEach, vi } from 'vitest';
9
+ import { NodeRegistry } from './node-registry';
10
+ import { NodeDefinition, Node, NodeExecutionContext, NodeExecutionResult } from '../types';
11
+ import { ToolNode } from '../nodes/tool-node';
12
+ import { SkillNode } from '../nodes/skill-node';
13
+ import { AgentNode } from '../nodes/agent-node';
14
+ import { WorkflowNode } from '../nodes/workflow-node';
15
+ import { EventBus } from './event-bus';
16
+ import type { ToolRegistry, Tool } from '../nodes/tool-node';
17
+ import type { SkillRegistry, Skill } from '../nodes/skill-node';
18
+ import type { AgentRunner, AgentConfig, AgentResult } from '../nodes/agent-node';
19
+ import type { WorkflowRunner, WorkflowRunResult } from '../nodes/workflow-node';
20
+
21
+ // ============================================================================
22
+ // Test Setup
23
+ // ============================================================================
24
+
25
+ /**
26
+ * Create a mock ToolRegistry for testing
27
+ */
28
+ function createMockToolRegistry(): ToolRegistry {
29
+ return {
30
+ getTool: vi.fn(),
31
+ hasTool: vi.fn(),
32
+ };
33
+ }
34
+
35
+ /**
36
+ * Create a mock SkillRegistry for testing
37
+ */
38
+ function createMockSkillRegistry(): SkillRegistry {
39
+ return {
40
+ getSkill: vi.fn(),
41
+ hasSkill: vi.fn(),
42
+ };
43
+ }
44
+
45
+ /**
46
+ * Create a mock AgentRunner for testing
47
+ */
48
+ function createMockAgentRunner(): AgentRunner {
49
+ return {
50
+ run: vi.fn(),
51
+ };
52
+ }
53
+
54
+ /**
55
+ * Create a mock WorkflowRunner for testing
56
+ */
57
+ function createMockWorkflowRunner(): WorkflowRunner {
58
+ return {
59
+ run: vi.fn(),
60
+ getRun: vi.fn(),
61
+ };
62
+ }
63
+
64
+ /**
65
+ * Create a NodeContext for testing
66
+ */
67
+ function createNodeContext(): {
68
+ context: NodeExecutionContext;
69
+ eventBus: EventBus;
70
+ } {
71
+ const eventBus = new EventBus();
72
+ const context: NodeExecutionContext = {
73
+ sessionId: 'test-session',
74
+ nodeOutputs: {},
75
+ previousOutputs: new Map(),
76
+ };
77
+ return { context, eventBus };
78
+ }
79
+
80
+ /**
81
+ * Create a basic NodeDefinition for testing
82
+ */
83
+ function createDefinition(overrides: Partial<NodeDefinition> = {}): NodeDefinition {
84
+ return {
85
+ id: 'test-node',
86
+ type: 'tool',
87
+ config: {},
88
+ ...overrides,
89
+ };
90
+ }
91
+
92
+ // ============================================================================
93
+ // Test Suites
94
+ // ============================================================================
95
+
96
+ describe('NodeRegistry', () => {
97
+ let toolRegistry: ToolRegistry;
98
+ let skillRegistry: SkillRegistry;
99
+ let agentRunner: AgentRunner;
100
+ let workflowRunner: WorkflowRunner;
101
+
102
+ beforeEach(() => {
103
+ toolRegistry = createMockToolRegistry();
104
+ skillRegistry = createMockSkillRegistry();
105
+ agentRunner = createMockAgentRunner();
106
+ workflowRunner = createMockWorkflowRunner();
107
+ });
108
+
109
+ describe('constructor', () => {
110
+ it('should create a NodeRegistry with no arguments', () => {
111
+ const registry = new NodeRegistry();
112
+ expect(registry).toBeDefined();
113
+ });
114
+
115
+ it('should create a NodeRegistry with all registries using options object', () => {
116
+ const registry = new NodeRegistry({
117
+ toolRegistry,
118
+ skillRegistry,
119
+ agentRunner,
120
+ workflowRunner,
121
+ });
122
+ expect(registry).toBeDefined();
123
+ });
124
+
125
+ it('should support legacy positional arguments for backward compatibility', () => {
126
+ // Note: This tests that the options object format works
127
+ const registry = new NodeRegistry({
128
+ toolRegistry,
129
+ skillRegistry,
130
+ agentRunner,
131
+ workflowRunner,
132
+ });
133
+ expect(registry).toBeDefined();
134
+ expect(registry.has('tool')).toBe(true);
135
+ expect(registry.has('skill')).toBe(true);
136
+ expect(registry.has('agent')).toBe(true);
137
+ expect(registry.has('workflow')).toBe(true);
138
+ });
139
+ });
140
+
141
+ describe('built-in node types', () => {
142
+ it('should have tool type registered by default', () => {
143
+ const registry = new NodeRegistry({ toolRegistry });
144
+ expect(registry.has('tool')).toBe(true);
145
+ });
146
+
147
+ it('should have skill type registered by default', () => {
148
+ const registry = new NodeRegistry({ skillRegistry });
149
+ expect(registry.has('skill')).toBe(true);
150
+ });
151
+
152
+ it('should have agent type registered by default', () => {
153
+ const registry = new NodeRegistry({ agentRunner });
154
+ expect(registry.has('agent')).toBe(true);
155
+ });
156
+
157
+ it('should have workflow type registered by default', () => {
158
+ const registry = new NodeRegistry({ workflowRunner });
159
+ expect(registry.has('workflow')).toBe(true);
160
+ });
161
+ });
162
+
163
+ describe('has()', () => {
164
+ it('should return false for unknown types', () => {
165
+ const registry = new NodeRegistry();
166
+ expect(registry.has('unknown')).toBe(false);
167
+ });
168
+
169
+ it('should return true for built-in types', () => {
170
+ const registry = new NodeRegistry();
171
+ expect(registry.has('tool')).toBe(true);
172
+ expect(registry.has('skill')).toBe(true);
173
+ expect(registry.has('agent')).toBe(true);
174
+ expect(registry.has('workflow')).toBe(true);
175
+ });
176
+
177
+ it('should return true for registered custom types', () => {
178
+ const registry = new NodeRegistry();
179
+ registry.register('custom', () => {
180
+ return {} as Node;
181
+ });
182
+ expect(registry.has('custom')).toBe(true);
183
+ });
184
+ });
185
+
186
+ describe('list()', () => {
187
+ it('should list all registered types', () => {
188
+ const registry = new NodeRegistry();
189
+ const types = registry.list();
190
+
191
+ expect(types).toContain('tool');
192
+ expect(types).toContain('skill');
193
+ expect(types).toContain('agent');
194
+ expect(types).toContain('workflow');
195
+ });
196
+
197
+ it('should include custom registered types', () => {
198
+ const registry = new NodeRegistry();
199
+ registry.register('custom1', () => ({ type: 'custom1', id: 'x', execute: async () => ({ success: true }) } as Node));
200
+ registry.register('custom2', () => ({ type: 'custom2', id: 'y', execute: async () => ({ success: true }) } as Node));
201
+
202
+ const types = registry.list();
203
+
204
+ expect(types).toContain('custom1');
205
+ expect(types).toContain('custom2');
206
+ });
207
+ });
208
+
209
+ describe('register()', () => {
210
+ it('should register a custom node factory', () => {
211
+ const registry = new NodeRegistry();
212
+ const factory = vi.fn();
213
+
214
+ registry.register('custom', factory);
215
+
216
+ expect(registry.has('custom')).toBe(true);
217
+ });
218
+
219
+ it('should allow overriding existing types', () => {
220
+ const registry = new NodeRegistry();
221
+ const newFactory = vi.fn();
222
+
223
+ // This should not throw
224
+ registry.register('tool', newFactory);
225
+
226
+ expect(registry.has('tool')).toBe(true);
227
+ });
228
+ });
229
+
230
+ describe('createNode()', () => {
231
+ describe('tool node', () => {
232
+ it('should create a ToolNode instance', () => {
233
+ const registry = new NodeRegistry({ toolRegistry });
234
+
235
+ const definition = createDefinition({
236
+ type: 'tool',
237
+ config: { tool: 'test-tool' },
238
+ });
239
+
240
+ const node = registry.createNode(definition);
241
+
242
+ expect(node).toBeInstanceOf(ToolNode);
243
+ expect(node.type).toBe('tool');
244
+ expect(node.id).toBe('test-node');
245
+ });
246
+
247
+ it('should throw error when tool registry is not provided', () => {
248
+ const registry = new NodeRegistry();
249
+
250
+ const definition = createDefinition({
251
+ type: 'tool',
252
+ config: { tool: 'test-tool' },
253
+ });
254
+
255
+ expect(() => registry.createNode(definition)).toThrow('ToolRegistry is required');
256
+ });
257
+
258
+ it('should create ToolNode with proper tool registry', async () => {
259
+ const mockTool: Tool = {
260
+ name: 'test-tool',
261
+ execute: vi.fn().mockResolvedValue({ result: 'success' }),
262
+ };
263
+ (toolRegistry.getTool as ReturnType<typeof vi.fn>).mockReturnValue(mockTool);
264
+
265
+ const registry = new NodeRegistry({ toolRegistry });
266
+
267
+ const definition = createDefinition({
268
+ id: 'tool-1',
269
+ type: 'tool',
270
+ config: { tool: 'test-tool', input: {} },
271
+ });
272
+
273
+ const node = registry.createNode(definition);
274
+ const { context } = createNodeContext();
275
+
276
+ await node.execute(context);
277
+
278
+ expect(toolRegistry.getTool).toHaveBeenCalledWith('test-tool');
279
+ });
280
+ });
281
+
282
+ describe('skill node', () => {
283
+ it('should create a SkillNode instance', () => {
284
+ const registry = new NodeRegistry({ skillRegistry });
285
+
286
+ const definition = createDefinition({
287
+ type: 'skill',
288
+ config: { skill: 'test-skill' },
289
+ });
290
+
291
+ const node = registry.createNode(definition);
292
+
293
+ expect(node).toBeInstanceOf(SkillNode);
294
+ expect(node.type).toBe('skill');
295
+ expect(node.id).toBe('test-node');
296
+ });
297
+
298
+ it('should throw error when skill registry is not provided', () => {
299
+ const registry = new NodeRegistry();
300
+
301
+ const definition = createDefinition({
302
+ type: 'skill',
303
+ config: { skill: 'test-skill' },
304
+ });
305
+
306
+ expect(() => registry.createNode(definition)).toThrow('SkillRegistry is required');
307
+ });
308
+
309
+ it('should create SkillNode with proper skill registry', async () => {
310
+ const mockSkill: Skill = {
311
+ name: 'test-skill',
312
+ invoke: vi.fn().mockResolvedValue({ result: 'success' }),
313
+ };
314
+ (skillRegistry.getSkill as ReturnType<typeof vi.fn>).mockReturnValue(mockSkill);
315
+
316
+ const registry = new NodeRegistry({ skillRegistry });
317
+
318
+ const definition = createDefinition({
319
+ id: 'skill-1',
320
+ type: 'skill',
321
+ config: { skill: 'test-skill', input: {} },
322
+ });
323
+
324
+ const node = registry.createNode(definition);
325
+ const { context } = createNodeContext();
326
+
327
+ await node.execute(context);
328
+
329
+ expect(skillRegistry.getSkill).toHaveBeenCalledWith('test-skill');
330
+ });
331
+ });
332
+
333
+ describe('agent node', () => {
334
+ it('should create an AgentNode instance', () => {
335
+ const registry = new NodeRegistry({ agentRunner });
336
+
337
+ const definition = createDefinition({
338
+ type: 'agent',
339
+ config: { prompt: 'Do something' },
340
+ });
341
+
342
+ const node = registry.createNode(definition);
343
+
344
+ expect(node).toBeInstanceOf(AgentNode);
345
+ expect(node.type).toBe('agent');
346
+ expect(node.id).toBe('test-node');
347
+ });
348
+
349
+ it('should throw error when agent runner is not provided', () => {
350
+ const registry = new NodeRegistry();
351
+
352
+ const definition = createDefinition({
353
+ type: 'agent',
354
+ config: { prompt: 'Do something' },
355
+ });
356
+
357
+ expect(() => registry.createNode(definition)).toThrow('AgentRunner is required');
358
+ });
359
+
360
+ it('should create AgentNode with proper agent runner', async () => {
361
+ (agentRunner.run as ReturnType<typeof vi.fn>).mockResolvedValue({
362
+ output: 'agent response',
363
+ metadata: { tokens: 100 },
364
+ });
365
+
366
+ const registry = new NodeRegistry({ agentRunner });
367
+
368
+ const definition = createDefinition({
369
+ id: 'agent-1',
370
+ type: 'agent',
371
+ config: { prompt: 'Test prompt' },
372
+ });
373
+
374
+ const node = registry.createNode(definition);
375
+ const { context } = createNodeContext();
376
+
377
+ await node.execute(context);
378
+
379
+ expect(agentRunner.run).toHaveBeenCalled();
380
+ });
381
+ });
382
+
383
+ describe('workflow node', () => {
384
+ it('should create a WorkflowNode instance', () => {
385
+ const registry = new NodeRegistry({ workflowRunner });
386
+
387
+ const definition = createDefinition({
388
+ type: 'workflow',
389
+ config: { workflow_name: 'test-workflow' },
390
+ });
391
+
392
+ const node = registry.createNode(definition);
393
+
394
+ expect(node).toBeInstanceOf(WorkflowNode);
395
+ expect(node.type).toBe('workflow');
396
+ expect(node.id).toBe('test-node');
397
+ });
398
+
399
+ it('should throw error when workflow runner is not provided', () => {
400
+ const registry = new NodeRegistry();
401
+
402
+ const definition = createDefinition({
403
+ type: 'workflow',
404
+ config: { workflow_name: 'test-workflow' },
405
+ });
406
+
407
+ expect(() => registry.createNode(definition)).toThrow('WorkflowRunner is required');
408
+ });
409
+
410
+ it('should create WorkflowNode with proper workflow runner', async () => {
411
+ (workflowRunner.run as ReturnType<typeof vi.fn>).mockResolvedValue({
412
+ runId: 'run-123',
413
+ status: 'completed',
414
+ output: { result: 'success' },
415
+ });
416
+
417
+ const registry = new NodeRegistry({ workflowRunner });
418
+
419
+ const definition = createDefinition({
420
+ id: 'workflow-1',
421
+ type: 'workflow',
422
+ config: { workflow_name: 'test-workflow' },
423
+ });
424
+
425
+ const node = registry.createNode(definition);
426
+ const { context } = createNodeContext();
427
+
428
+ await node.execute(context);
429
+
430
+ expect(workflowRunner.run).toHaveBeenCalledWith('test-workflow', {});
431
+ });
432
+ });
433
+
434
+ describe('custom registered node', () => {
435
+ it('should create a custom registered node', () => {
436
+ const registry = new NodeRegistry();
437
+
438
+ const customNode: Node = {
439
+ type: 'custom',
440
+ id: 'custom-node',
441
+ execute: async () => ({ success: true, output: 'custom' }),
442
+ };
443
+
444
+ registry.register('custom', () => customNode);
445
+
446
+ const definition = createDefinition({ type: 'custom' });
447
+ const node = registry.createNode(definition);
448
+
449
+ expect(node).toBe(customNode);
450
+ expect(node.type).toBe('custom');
451
+ });
452
+
453
+ it('should call factory function with definition and context', () => {
454
+ const registry = new NodeRegistry();
455
+ const factory = vi.fn().mockReturnValue({
456
+ type: 'factory-test',
457
+ id: 'factory-node',
458
+ execute: async () => ({ success: true }),
459
+ } as Node);
460
+
461
+ registry.register('factory-test', factory);
462
+
463
+ const definition = createDefinition({ type: 'factory-test' });
464
+ registry.createNode(definition);
465
+
466
+ expect(factory).toHaveBeenCalled();
467
+ });
468
+ });
469
+
470
+ describe('unknown node type', () => {
471
+ it('should throw error for unknown node type', () => {
472
+ const registry = new NodeRegistry();
473
+
474
+ const definition = createDefinition({ type: 'unknown-type' });
475
+
476
+ expect(() => registry.createNode(definition)).toThrow(
477
+ 'Unknown node type: unknown-type'
478
+ );
479
+ });
480
+
481
+ it('should include available types in error message', () => {
482
+ const registry = new NodeRegistry();
483
+
484
+ const definition = createDefinition({ type: 'nonexistent' });
485
+
486
+ expect(() => registry.createNode(definition)).toThrow('tool');
487
+ expect(() => registry.createNode(definition)).toThrow('skill');
488
+ expect(() => registry.createNode(definition)).toThrow('agent');
489
+ expect(() => registry.createNode(definition)).toThrow('workflow');
490
+ });
491
+ });
492
+ });
493
+
494
+ describe('integration scenarios', () => {
495
+ it('should create multiple different node types from same registry', () => {
496
+ const registry = new NodeRegistry({
497
+ toolRegistry,
498
+ skillRegistry,
499
+ agentRunner,
500
+ workflowRunner,
501
+ });
502
+
503
+ const toolDef = createDefinition({ id: 'n1', type: 'tool' });
504
+ const skillDef = createDefinition({ id: 'n2', type: 'skill' });
505
+ const agentDef = createDefinition({ id: 'n3', type: 'agent' });
506
+ const workflowDef = createDefinition({ id: 'n4', type: 'workflow' });
507
+
508
+ const toolNode = registry.createNode(toolDef);
509
+ const skillNode = registry.createNode(skillDef);
510
+ const agentNode = registry.createNode(agentDef);
511
+ const workflowNode = registry.createNode(workflowDef);
512
+
513
+ expect(toolNode).toBeInstanceOf(ToolNode);
514
+ expect(skillNode).toBeInstanceOf(SkillNode);
515
+ expect(agentNode).toBeInstanceOf(AgentNode);
516
+ expect(workflowNode).toBeInstanceOf(WorkflowNode);
517
+ });
518
+
519
+ it('should maintain separate node instances for same definition', () => {
520
+ const registry = new NodeRegistry({ toolRegistry });
521
+
522
+ const definition = createDefinition({ id: 'shared', type: 'tool' });
523
+
524
+ const node1 = registry.createNode(definition);
525
+ const node2 = registry.createNode(definition);
526
+
527
+ // Nodes should be separate instances (unless factory is stateless)
528
+ expect(node1).toBeInstanceOf(ToolNode);
529
+ expect(node2).toBeInstanceOf(ToolNode);
530
+ });
531
+ });
532
+
533
+ describe('AgentComponent integration', () => {
534
+ it('should create AgentRunner from AgentComponent when provided', () => {
535
+ // Mock AgentComponent
536
+ const mockAgentComponent = {
537
+ registerAgent: vi.fn(),
538
+ getAgent: vi.fn(),
539
+ listAgents: vi.fn().mockReturnValue([]),
540
+ run: vi.fn(),
541
+ };
542
+
543
+ const registry = new NodeRegistry({
544
+ agentComponent: mockAgentComponent as any,
545
+ });
546
+
547
+ // AgentNode should be createable now
548
+ expect(registry.has('agent')).toBe(true);
549
+
550
+ const definition = createDefinition({
551
+ id: 'test-agent',
552
+ type: 'agent',
553
+ config: { prompt: 'Test' },
554
+ });
555
+
556
+ const node = registry.createNode(definition);
557
+ expect(node).toBeInstanceOf(AgentNode);
558
+ });
559
+ });
560
+ });