@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,133 @@
1
+ /**
2
+ * Registry Tests
3
+ */
4
+
5
+ import { describe, it, expect, beforeEach } from 'vitest';
6
+ import { WorkflowServiceRegistry, registerWorkflowService, getWorkflowService } from './registry';
7
+ import { WorkflowService } from './workflow-service';
8
+ import { MockWorkflowRepository, MockRunRepository, MockWorkflowEngine } from '../storage/mock-repositories';
9
+
10
+ describe('WorkflowServiceRegistry', () => {
11
+ let mockEngine: MockWorkflowEngine;
12
+
13
+ beforeEach(() => {
14
+ // Reset registry before each test
15
+ WorkflowServiceRegistry.getInstance().reset();
16
+ mockEngine = new MockWorkflowEngine();
17
+ });
18
+
19
+ const createService = () => new WorkflowService(
20
+ new MockWorkflowRepository(),
21
+ new MockRunRepository(),
22
+ (workflow, options) => mockEngine as any
23
+ );
24
+
25
+ describe('getInstance', () => {
26
+ it('should return the same instance on multiple calls', () => {
27
+ const instance1 = WorkflowServiceRegistry.getInstance();
28
+ const instance2 = WorkflowServiceRegistry.getInstance();
29
+
30
+ expect(instance1).toBe(instance2);
31
+ });
32
+ });
33
+
34
+ describe('register', () => {
35
+ it('should register a service', () => {
36
+ const registry = WorkflowServiceRegistry.getInstance();
37
+ const service = createService();
38
+
39
+ registry.register(service);
40
+
41
+ expect(registry.isRegistered()).toBe(true);
42
+ });
43
+ });
44
+
45
+ describe('get', () => {
46
+ it('should return the registered service', () => {
47
+ const registry = WorkflowServiceRegistry.getInstance();
48
+ const service = createService();
49
+
50
+ registry.register(service);
51
+
52
+ expect(registry.get()).toBe(service);
53
+ });
54
+
55
+ it('should throw error if no service registered', () => {
56
+ const registry = WorkflowServiceRegistry.getInstance();
57
+
58
+ expect(() => registry.get()).toThrow('WorkflowService is not registered');
59
+ });
60
+ });
61
+
62
+ describe('isRegistered', () => {
63
+ it('should return false if no service registered', () => {
64
+ const registry = WorkflowServiceRegistry.getInstance();
65
+
66
+ expect(registry.isRegistered()).toBe(false);
67
+ });
68
+
69
+ it('should return true after service is registered', () => {
70
+ const registry = WorkflowServiceRegistry.getInstance();
71
+ const service = new WorkflowService(
72
+ new MockWorkflowRepository(),
73
+ new MockRunRepository(),
74
+ mockEngine as any
75
+ );
76
+
77
+ registry.register(service);
78
+
79
+ expect(registry.isRegistered()).toBe(true);
80
+ });
81
+ });
82
+
83
+ describe('reset', () => {
84
+ it('should reset the registry', () => {
85
+ const registry = WorkflowServiceRegistry.getInstance();
86
+ const service = createService();
87
+
88
+ registry.register(service);
89
+ registry.reset();
90
+
91
+ expect(registry.isRegistered()).toBe(false);
92
+ });
93
+ });
94
+ });
95
+
96
+ describe('convenience functions', () => {
97
+ let mockEngine: MockWorkflowEngine;
98
+
99
+ beforeEach(() => {
100
+ WorkflowServiceRegistry.getInstance().reset();
101
+ mockEngine = new MockWorkflowEngine();
102
+ });
103
+
104
+ const createService = () => new WorkflowService(
105
+ new MockWorkflowRepository(),
106
+ new MockRunRepository(),
107
+ (workflow, options) => mockEngine as any
108
+ );
109
+
110
+ describe('registerWorkflowService', () => {
111
+ it('should register service via convenience function', () => {
112
+ const service = createService();
113
+
114
+ registerWorkflowService(service);
115
+
116
+ expect(WorkflowServiceRegistry.getInstance().isRegistered()).toBe(true);
117
+ });
118
+ });
119
+
120
+ describe('getWorkflowService', () => {
121
+ it('should get service via convenience function', () => {
122
+ const service = createService();
123
+
124
+ registerWorkflowService(service);
125
+
126
+ expect(getWorkflowService()).toBe(service);
127
+ });
128
+
129
+ it('should throw if service not registered', () => {
130
+ expect(() => getWorkflowService()).toThrow('WorkflowService is not registered');
131
+ });
132
+ });
133
+ });
@@ -0,0 +1,71 @@
1
+ /**
2
+ * Registry - Singleton registry for accessing WorkflowService
3
+ */
4
+
5
+ import { WorkflowService } from './workflow-service';
6
+
7
+ /**
8
+ * Singleton registry for WorkflowService
9
+ * Provides centralized access to the workflow service instance
10
+ */
11
+ export class WorkflowServiceRegistry {
12
+ private static instance: WorkflowServiceRegistry;
13
+ private service: WorkflowService | null = null;
14
+
15
+ private constructor() {}
16
+
17
+ /**
18
+ * Get the singleton registry instance
19
+ */
20
+ static getInstance(): WorkflowServiceRegistry {
21
+ if (!WorkflowServiceRegistry.instance) {
22
+ WorkflowServiceRegistry.instance = new WorkflowServiceRegistry();
23
+ }
24
+ return WorkflowServiceRegistry.instance;
25
+ }
26
+
27
+ /**
28
+ * Register a WorkflowService instance
29
+ */
30
+ register(service: WorkflowService): void {
31
+ this.service = service;
32
+ }
33
+
34
+ /**
35
+ * Get the registered WorkflowService instance
36
+ * @throws Error if no service is registered
37
+ */
38
+ get(): WorkflowService {
39
+ if (!this.service) {
40
+ throw new Error('WorkflowService is not registered. Call register() first.');
41
+ }
42
+ return this.service;
43
+ }
44
+
45
+ /**
46
+ * Check if a service is registered
47
+ */
48
+ isRegistered(): boolean {
49
+ return this.service !== null;
50
+ }
51
+
52
+ /**
53
+ * Reset the registry (primarily for testing)
54
+ */
55
+ reset(): void {
56
+ this.service = null;
57
+ }
58
+ }
59
+
60
+ // Convenience function to get the service
61
+ export function getWorkflowService(): WorkflowService {
62
+ return WorkflowServiceRegistry.getInstance().get();
63
+ }
64
+
65
+ // Convenience function to register the service
66
+ export function registerWorkflowService(service: WorkflowService): void {
67
+ WorkflowServiceRegistry.getInstance().register(service);
68
+ }
69
+
70
+ // Type for the registry
71
+ export type { WorkflowService };
@@ -0,0 +1,310 @@
1
+ /**
2
+ * WorkflowService Tests - Session-based Design
3
+ */
4
+
5
+ import { describe, it, expect, beforeEach, vi } from 'bun:test';
6
+ import { WorkflowService } from './workflow-service';
7
+ import { MockWorkflowRepository, MockWorkflowEngine } from '../storage/mock-repositories';
8
+ import type { WorkflowDefinition, Workflow } from '../types';
9
+
10
+ describe('WorkflowService', () => {
11
+ let workflowRepo: MockWorkflowRepository;
12
+ let mockEngine: MockWorkflowEngine;
13
+ let service: WorkflowService;
14
+
15
+ const sampleDefinition: WorkflowDefinition = {
16
+ name: 'test-workflow',
17
+ version: '1.0',
18
+ description: 'A test workflow',
19
+ nodes: [
20
+ {
21
+ id: 'node1',
22
+ type: 'tool',
23
+ config: { tool: 'test-tool' },
24
+ },
25
+ {
26
+ id: 'node2',
27
+ type: 'tool',
28
+ config: { tool: 'test-tool-2' },
29
+ depends_on: ['node1'],
30
+ },
31
+ ],
32
+ };
33
+
34
+ beforeEach(() => {
35
+ workflowRepo = new MockWorkflowRepository();
36
+ mockEngine = new MockWorkflowEngine();
37
+
38
+ // Create engine factory that returns the mock engine
39
+ const engineFactory = (workflow: Workflow) => {
40
+ mockEngine.setWorkflowName(workflow.name);
41
+ return mockEngine as any;
42
+ };
43
+
44
+ service = new WorkflowService(
45
+ workflowRepo,
46
+ engineFactory
47
+ );
48
+ });
49
+
50
+ // ==================== Workflow CRUD Tests ====================
51
+
52
+ describe('createWorkflow', () => {
53
+ it('should create a workflow from definition', async () => {
54
+ const workflow = await service.createWorkflow(sampleDefinition);
55
+
56
+ expect(workflow).toBeDefined();
57
+ expect(workflow.name).toBe('test-workflow');
58
+ expect(workflow.version).toBe('1.0');
59
+ expect(workflow.definition).toEqual(sampleDefinition);
60
+ expect(workflow.id).toBeDefined();
61
+ });
62
+
63
+ it('should create workflow with tags from options', async () => {
64
+ const workflow = await service.createWorkflow(sampleDefinition, {
65
+ tags: ['test', 'example'],
66
+ });
67
+
68
+ expect(workflow.tags).toEqual(['test', 'example']);
69
+ });
70
+
71
+ it('should create workflow with metadata from options', async () => {
72
+ const workflow = await service.createWorkflow(sampleDefinition, {
73
+ metadata: { author: 'tester' },
74
+ });
75
+
76
+ expect(workflow.metadata.author).toBe('tester');
77
+ });
78
+
79
+ it('should throw error if workflow with same name exists', async () => {
80
+ await service.createWorkflow(sampleDefinition);
81
+
82
+ await expect(service.createWorkflow(sampleDefinition)).rejects.toThrow(
83
+ 'Workflow already exists'
84
+ );
85
+ });
86
+
87
+ it('should allow creating workflow with force option to overwrite', async () => {
88
+ await service.createWorkflow(sampleDefinition);
89
+
90
+ const updatedDef = { ...sampleDefinition, description: 'Updated' };
91
+ const workflow = await service.createWorkflow(updatedDef, { force: true });
92
+
93
+ expect(workflow.description).toBe('Updated');
94
+ });
95
+ });
96
+
97
+ describe('getWorkflow', () => {
98
+ it('should get workflow by id', async () => {
99
+ const created = await service.createWorkflow(sampleDefinition);
100
+
101
+ const workflow = service.getWorkflow(created.id);
102
+
103
+ expect(workflow).toBeDefined();
104
+ expect(workflow?.name).toBe('test-workflow');
105
+ });
106
+
107
+ it('should get workflow by name', () => {
108
+ service.createWorkflow(sampleDefinition);
109
+
110
+ const workflow = service.getWorkflow('test-workflow');
111
+
112
+ expect(workflow).toBeDefined();
113
+ expect(workflow?.id).toBeDefined();
114
+ });
115
+
116
+ it('should return null if workflow not found', () => {
117
+ const workflow = service.getWorkflow('nonexistent');
118
+
119
+ expect(workflow).toBeNull();
120
+ });
121
+ });
122
+
123
+ describe('listWorkflows', () => {
124
+ it('should list all workflows', async () => {
125
+ await service.createWorkflow(sampleDefinition);
126
+ await service.createWorkflow({
127
+ ...sampleDefinition,
128
+ name: 'workflow2',
129
+ });
130
+
131
+ const workflows = service.listWorkflows();
132
+
133
+ expect(workflows.length).toBeGreaterThanOrEqual(2);
134
+ });
135
+
136
+ it('should filter workflows by tag', async () => {
137
+ await service.createWorkflow(sampleDefinition, { tags: ['test'] });
138
+ await service.createWorkflow({
139
+ ...sampleDefinition,
140
+ name: 'workflow2',
141
+ }, { tags: ['other'] });
142
+
143
+ const workflows = service.listWorkflows({ tag: 'test' });
144
+
145
+ expect(workflows.length).toBeGreaterThanOrEqual(1);
146
+ expect(workflows.every(w => w.tags.includes('test'))).toBe(true);
147
+ });
148
+
149
+ it('should support pagination with limit and offset', async () => {
150
+ for (let i = 0; i < 5; i++) {
151
+ await service.createWorkflow({
152
+ ...sampleDefinition,
153
+ name: `workflow${i}`,
154
+ });
155
+ }
156
+
157
+ const workflows = service.listWorkflows({ limit: 2, offset: 0 });
158
+
159
+ expect(workflows.length).toBeLessThanOrEqual(2);
160
+ });
161
+ });
162
+
163
+ describe('updateWorkflow', () => {
164
+ it('should update workflow definition', async () => {
165
+ await service.createWorkflow(sampleDefinition);
166
+
167
+ const updatedDef = {
168
+ ...sampleDefinition,
169
+ nodes: [
170
+ ...sampleDefinition.nodes,
171
+ { id: 'new-node', type: 'tool', config: { tool: 'new-tool' } },
172
+ ],
173
+ };
174
+
175
+ const workflow = await service.updateWorkflow('test-workflow', {
176
+ definition: updatedDef,
177
+ });
178
+
179
+ expect(workflow.definition.nodes.length).toBe(3);
180
+ });
181
+
182
+ it('should update workflow tags', async () => {
183
+ await service.createWorkflow(sampleDefinition);
184
+
185
+ const workflow = await service.updateWorkflow('test-workflow', {}, {
186
+ tags: ['updated', 'tags'],
187
+ });
188
+
189
+ expect(workflow.tags).toEqual(['updated', 'tags']);
190
+ });
191
+
192
+ it('should throw error if workflow not found', async () => {
193
+ await expect(
194
+ service.updateWorkflow('nonexistent', { definition: sampleDefinition })
195
+ ).rejects.toThrow('Workflow not found');
196
+ });
197
+ });
198
+
199
+ describe('deleteWorkflow', () => {
200
+ it('should delete workflow by name', async () => {
201
+ await service.createWorkflow(sampleDefinition);
202
+
203
+ const result = await service.deleteWorkflow('test-workflow');
204
+
205
+ expect(result).toBe(true);
206
+ expect(service.getWorkflow('test-workflow')).toBeNull();
207
+ });
208
+
209
+ it('should return false if workflow not found', async () => {
210
+ const result = await service.deleteWorkflow('nonexistent');
211
+
212
+ expect(result).toBe(false);
213
+ });
214
+ });
215
+
216
+ // ==================== Workflow Execution Tests (Session-based) ====================
217
+
218
+ describe('runWorkflow', () => {
219
+ it('should run workflow by definition', async () => {
220
+ await service.createWorkflow(sampleDefinition);
221
+
222
+ const result = await service.runWorkflow(sampleDefinition);
223
+
224
+ expect(result).toBeDefined();
225
+ expect(result.sessionId || result.runId).toBeDefined();
226
+ expect(mockEngine.getCallsByMethod('runWorkflow')).toHaveLength(1);
227
+ });
228
+
229
+ it('should pass input to workflow run', async () => {
230
+ await service.createWorkflow(sampleDefinition);
231
+
232
+ const result = await service.runWorkflow(sampleDefinition, {
233
+ key: 'value',
234
+ });
235
+
236
+ expect(result).toBeDefined();
237
+ const runCall = mockEngine.getCallsByMethod('runWorkflow')[0];
238
+ expect(runCall.args[1]).toBeDefined();
239
+ });
240
+
241
+ it('should run workflow by name', async () => {
242
+ await service.createWorkflow(sampleDefinition);
243
+
244
+ const result = await service.runWorkflow('test-workflow');
245
+
246
+ expect(result).toBeDefined();
247
+ expect(result.sessionId || result.runId).toBeDefined();
248
+ });
249
+ });
250
+
251
+ describe('runWorkflowByName', () => {
252
+ it('should run workflow by name and return result', async () => {
253
+ await service.createWorkflow(sampleDefinition);
254
+
255
+ const result = await service.runWorkflowByName('test-workflow', { test: 'input' });
256
+
257
+ expect(result).toBeDefined();
258
+ expect(result.sessionId || result.runId).toBeDefined();
259
+ expect(mockEngine.getLastCall()?.method).toBe('runWorkflow');
260
+ });
261
+
262
+ it('should throw error if workflow not found', async () => {
263
+ await expect(
264
+ service.runWorkflowByName('nonexistent')
265
+ ).rejects.toThrow('Workflow not found');
266
+ });
267
+ });
268
+
269
+ // ==================== Session-based Lifecycle Tests ====================
270
+
271
+ describe('Session-based Resume', () => {
272
+ it('should have engine factory that creates new engine for each resume', async () => {
273
+ await service.createWorkflow(sampleDefinition);
274
+
275
+ // Create a mock session component
276
+ const mockSessionComponent = {
277
+ create: vi.fn().mockResolvedValue({ id: 'workflow_test_123' }),
278
+ get: vi.fn().mockResolvedValue({
279
+ id: 'workflow_test_123',
280
+ metadata: {
281
+ type: 'workflow',
282
+ workflowName: 'test-workflow',
283
+ status: 'paused',
284
+ },
285
+ }),
286
+ update: vi.fn().mockResolvedValue(true),
287
+ addMessage: vi.fn().mockResolvedValue('msg_id'),
288
+ getMessages: vi.fn().mockResolvedValue([]),
289
+ };
290
+
291
+ // Create service with session component
292
+ const engineFactory = (workflow: Workflow) => {
293
+ mockEngine.setWorkflowName(workflow.name);
294
+ return mockEngine as any;
295
+ };
296
+
297
+ const serviceWithSession = new WorkflowService(
298
+ workflowRepo,
299
+ engineFactory,
300
+ mockSessionComponent
301
+ );
302
+
303
+ // Run workflow first
304
+ const result = await serviceWithSession.runWorkflow('test-workflow');
305
+
306
+ // Verify engine was created
307
+ expect(mockEngine.getCallsByMethod('runWorkflow')).toHaveLength(1);
308
+ });
309
+ });
310
+ });