@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,393 @@
1
+ /**
2
+ * WorkflowService - Session-based Workflow Execution
3
+ *
4
+ * After session-based refactoring, workflow runs are managed via SessionComponent.
5
+ * The workflows table is still used for storing workflow definitions.
6
+ *
7
+ * Key concepts:
8
+ * - Session IS a workflow run (no separate runId concept)
9
+ * - Session.metadata stores workflow run state (status, input, agentSessions)
10
+ * - Session.messages stores node execution history with workflow.node.* roles
11
+ * - Resume is based on session state and messages
12
+ */
13
+
14
+ import type {
15
+ Workflow,
16
+ WorkflowDefinition,
17
+ RunOptions,
18
+ RunResult,
19
+ RunStatus,
20
+ WorkflowMetadata,
21
+ WorkflowConfig,
22
+ } from '../types';
23
+
24
+ // Repository interfaces (abstraction for storage layer)
25
+ export interface WorkflowRepository {
26
+ create(workflow: Omit<Workflow, 'id' | 'createdAt' | 'updatedAt'>): Workflow;
27
+ getById(id: string): Workflow | null;
28
+ getByName(name: string): Workflow | null;
29
+ list(options?: ListOptions): Workflow[];
30
+ update(id: string, updates: Partial<Workflow>): Workflow | null;
31
+ delete(id: string): boolean;
32
+ }
33
+
34
+ // Need NodeDefinition for addNode
35
+ import type { NodeDefinition } from '../types';
36
+
37
+ // ==================== Options Interfaces ====================
38
+
39
+ export interface CreateOptions {
40
+ tags?: string[];
41
+ metadata?: WorkflowMetadata;
42
+ taskId?: number;
43
+ force?: boolean;
44
+ }
45
+
46
+ export interface ListOptions {
47
+ tag?: string;
48
+ taskId?: number;
49
+ search?: string;
50
+ limit?: number;
51
+ offset?: number;
52
+ }
53
+
54
+ export interface WorkflowUpdates {
55
+ definition?: WorkflowDefinition;
56
+ config?: WorkflowConfig;
57
+ tags?: string[];
58
+ metadata?: WorkflowMetadata;
59
+ }
60
+
61
+ // Engine interface (abstraction for workflow execution)
62
+ // Note: Unified run() handles both fresh start and resume from session
63
+ // Note: pause is triggered internally by interrupts, not a manual operation
64
+ export interface WorkflowEngine {
65
+ createSession(
66
+ workflowId: string,
67
+ options?: { input?: Record<string, any>; workflowName?: string; workflowVersion?: string }
68
+ ): Promise<string>;
69
+
70
+ run(sessionId: string, options?: RunOptions): Promise<RunResult>;
71
+ runWorkflow(workflow: Workflow | WorkflowDefinition, options?: RunOptions): Promise<RunResult>;
72
+ stop(sessionId: string, reason?: string): Promise<void>;
73
+ addNode(sessionId: string, nodeDefinition: NodeDefinition): Promise<void>;
74
+ removeNode(sessionId: string, nodeId: string): Promise<void>;
75
+ }
76
+
77
+ // Engine factory type for creating new engine instances per run
78
+ export type WorkflowEngineFactory = (
79
+ workflow: Workflow,
80
+ options?: RunOptions
81
+ ) => Pick<WorkflowEngine, 'run' | 'stop' | 'runWorkflow'>;
82
+
83
+ // Session types
84
+ export interface SessionInfo {
85
+ id: string;
86
+ title: string;
87
+ metadata: WorkflowSessionMetadata;
88
+ createdAt: Date;
89
+ updatedAt: Date;
90
+ }
91
+
92
+ export interface WorkflowSessionMetadata {
93
+ type: 'workflow';
94
+ runId?: string; // Legacy runId for compatibility
95
+ workflowId?: string;
96
+ workflowName: string;
97
+ workflowVersion?: string;
98
+ status: 'running' | 'paused' | 'completed' | 'failed';
99
+ input?: any;
100
+ rootNodeId?: string;
101
+ agentSessions?: AgentSessionRef[];
102
+ }
103
+
104
+ export interface AgentSessionRef {
105
+ nodeId: string;
106
+ sessionId: string;
107
+ status: 'active' | 'paused' | 'completed';
108
+ }
109
+
110
+ // ==================== WorkflowService ====================
111
+
112
+ export class WorkflowService {
113
+ constructor(
114
+ private workflowRepository: WorkflowRepository,
115
+ private engineFactory: WorkflowEngineFactory,
116
+ private sessionComponent?: {
117
+ create(options: { id?: string; title: string; metadata: any }): Promise<{ id: string }>;
118
+ get(id: string): Promise<SessionInfo | null | undefined>;
119
+ list?(options?: { limit?: number; offset?: number }): Promise<SessionInfo[]>;
120
+ update(id: string, updates: { metadata?: any }): Promise<boolean>;
121
+ addMessage(sessionId: string, message: any): Promise<string>;
122
+ getMessages(sessionId: string): Promise<any[]>;
123
+ }
124
+ ) {}
125
+
126
+ // ==================== Workflow CRUD ====================
127
+
128
+ /**
129
+ * Create a new workflow from definition
130
+ */
131
+ async createWorkflow(
132
+ definition: WorkflowDefinition,
133
+ options?: CreateOptions
134
+ ): Promise<Workflow> {
135
+ // Check if workflow with same name exists
136
+ const existing = this.workflowRepository.getByName(definition.name);
137
+
138
+ if (existing) {
139
+ if (options?.force !== true) {
140
+ throw new Error(`Workflow already exists: ${definition.name}`);
141
+ }
142
+ // Update existing workflow
143
+ return this.workflowRepository.update(existing.id, {
144
+ name: definition.name,
145
+ version: definition.version,
146
+ description: definition.description || existing.description,
147
+ definition,
148
+ config: definition.config || {},
149
+ metadata: {
150
+ ...options.metadata || definition.metadata || existing.metadata || {},
151
+ taskId: options.taskId || definition.metadata?.taskId || existing.metadata?.taskId,
152
+ },
153
+ tags: options.tags || definition.metadata?.tags || [],
154
+ })!;
155
+ }
156
+
157
+ // Create new workflow
158
+ const workflow: Omit<Workflow, 'id' | 'createdAt' | 'updatedAt'> = {
159
+ name: definition.name,
160
+ version: definition.version,
161
+ description: definition.description,
162
+ definition,
163
+ config: definition.config || {},
164
+ metadata: {
165
+ ...options?.metadata || definition.metadata || {},
166
+ taskId: options?.taskId || definition.metadata?.taskId,
167
+ },
168
+ tags: options?.tags || definition.metadata?.tags || [],
169
+ };
170
+
171
+ return this.workflowRepository.create(workflow);
172
+ }
173
+
174
+ /**
175
+ * Get workflow by id or name
176
+ */
177
+ getWorkflow(idOrName: string): Workflow | null {
178
+ // Try by id first
179
+ let workflow = this.workflowRepository.getById(idOrName);
180
+ if (workflow) return workflow;
181
+
182
+ // Then try by name
183
+ return this.workflowRepository.getByName(idOrName);
184
+ }
185
+
186
+ /**
187
+ * Get workflow by id
188
+ */
189
+ getWorkflowById(id: string): Workflow | null {
190
+ return this.workflowRepository.getById(id);
191
+ }
192
+
193
+ /**
194
+ * Get workflow by name
195
+ */
196
+ getWorkflowByName(name: string): Workflow | null {
197
+ return this.workflowRepository.getByName(name);
198
+ }
199
+
200
+ /**
201
+ * List workflows with optional filters
202
+ */
203
+ listWorkflows(options?: ListOptions): Workflow[] {
204
+ return this.workflowRepository.list(options);
205
+ }
206
+
207
+ /**
208
+ * Update an existing workflow
209
+ */
210
+ async updateWorkflow(
211
+ idOrName: string,
212
+ updates: WorkflowUpdates,
213
+ options?: { tags?: string[] }
214
+ ): Promise<Workflow> {
215
+ // Find the workflow
216
+ let workflow = this.workflowRepository.getByName(idOrName);
217
+ if (!workflow) {
218
+ workflow = this.workflowRepository.getById(idOrName);
219
+ }
220
+
221
+ if (!workflow) {
222
+ throw new Error(`Workflow not found: ${idOrName}`);
223
+ }
224
+
225
+ const updateData: Partial<Workflow> = {
226
+ ...updates,
227
+ };
228
+
229
+ if (options?.tags !== undefined) {
230
+ updateData.tags = options.tags;
231
+ }
232
+
233
+ const updated = this.workflowRepository.update(workflow.id, updateData);
234
+ if (!updated) {
235
+ throw new Error(`Failed to update workflow: ${idOrName}`);
236
+ }
237
+
238
+ return updated;
239
+ }
240
+
241
+ /**
242
+ * Delete a workflow by name or id
243
+ */
244
+ async deleteWorkflow(idOrName: string): Promise<boolean> {
245
+ // Find the workflow
246
+ let workflow = this.workflowRepository.getByName(idOrName);
247
+ if (!workflow) {
248
+ workflow = this.workflowRepository.getById(idOrName);
249
+ }
250
+
251
+ if (!workflow) {
252
+ return false;
253
+ }
254
+
255
+ return this.workflowRepository.delete(workflow.id);
256
+ }
257
+
258
+ // ==================== Workflow Execution (Session-based) ====================
259
+
260
+ /**
261
+ * Run a workflow by definition or name
262
+ *
263
+ * This creates a Session that represents the workflow run.
264
+ * The Session ID is used as the run identifier for pause/resume.
265
+ */
266
+ async runWorkflow(
267
+ idOrNameOrDefinition: string | WorkflowDefinition,
268
+ input?: Record<string, any>,
269
+ options?: RunOptions
270
+ ): Promise<RunResult> {
271
+ // Resolve workflow
272
+ let workflow: Workflow | null = null;
273
+ let definition: WorkflowDefinition | null = null;
274
+
275
+ if (typeof idOrNameOrDefinition === 'string') {
276
+ // Running by name - workflow must exist
277
+ workflow = this.getWorkflow(idOrNameOrDefinition);
278
+ if (!workflow) {
279
+ throw new Error(`Workflow not found: ${idOrNameOrDefinition}`);
280
+ }
281
+ definition = workflow.definition;
282
+ } else {
283
+ // Running by definition - create inline workflow if needed
284
+ definition = idOrNameOrDefinition;
285
+ workflow = this.getWorkflowByName(definition.name);
286
+
287
+ // If workflow doesn't exist, create a temporary one for execution
288
+ if (!workflow) {
289
+ workflow = {
290
+ id: `wf_inline_${definition.name}`,
291
+ name: definition.name,
292
+ version: definition.version,
293
+ description: definition.description,
294
+ definition,
295
+ config: definition.config || {},
296
+ metadata: definition.metadata || {},
297
+ tags: definition.metadata?.tags || [],
298
+ createdAt: new Date(),
299
+ updatedAt: new Date(),
300
+ };
301
+ }
302
+ }
303
+
304
+ // Create engine and run workflow directly
305
+ // Note: engine.runWorkflow() handles session creation and state management
306
+ const engine = this.engineFactory(workflow, {
307
+ ...options,
308
+ input,
309
+ });
310
+
311
+ // Run the workflow (this creates the session internally)
312
+ const result = await engine.runWorkflow(workflow, {
313
+ ...options,
314
+ input,
315
+ });
316
+
317
+ return {
318
+ ...result,
319
+ runId: result.runId || result.sessionId || '',
320
+ sessionId: result.sessionId || result.runId || '',
321
+ };
322
+ }
323
+
324
+ /**
325
+ * Run workflow by name (convenience method)
326
+ */
327
+ async runWorkflowByName(
328
+ name: string,
329
+ input?: Record<string, any>,
330
+ options?: RunOptions
331
+ ): Promise<RunResult> {
332
+ const workflow = this.getWorkflowByName(name);
333
+ if (!workflow) {
334
+ throw new Error(`Workflow not found: ${name}`);
335
+ }
336
+
337
+ return this.runWorkflow(name, input, options);
338
+ }
339
+
340
+ /**
341
+ * Stop a running workflow session
342
+ */
343
+ async stopRun(sessionId: string, reason?: string): Promise<void> {
344
+ const session = await this.sessionComponent?.get(sessionId);
345
+ if (!session) {
346
+ throw new Error(`Session not found: ${sessionId}`);
347
+ }
348
+
349
+ const metadata = session.metadata as WorkflowSessionMetadata;
350
+ if (metadata.type !== 'workflow') {
351
+ throw new Error(`Session is not a workflow session: ${sessionId}`);
352
+ }
353
+
354
+ const workflow = this.getWorkflowByName(metadata.workflowName);
355
+ if (!workflow) {
356
+ throw new Error(`Workflow not found: ${metadata.workflowName}`);
357
+ }
358
+
359
+ const engine = this.engineFactory(workflow);
360
+ await engine.stop(sessionId, reason);
361
+ }
362
+
363
+ /**
364
+ * Get workflow session by ID
365
+ */
366
+ async getSession(sessionId: string): Promise<SessionInfo | null> {
367
+ if (!this.sessionComponent) {
368
+ return null;
369
+ }
370
+ const session = await this.sessionComponent.get(sessionId);
371
+ return session ?? null;
372
+ }
373
+
374
+ /**
375
+ * List workflow sessions
376
+ */
377
+ async listSessions(options?: { limit?: number; offset?: number }): Promise<SessionInfo[]> {
378
+ if (!this.sessionComponent?.list) {
379
+ return [];
380
+ }
381
+ return this.sessionComponent.list(options);
382
+ }
383
+
384
+ /**
385
+ * Get messages from a workflow session
386
+ */
387
+ async getSessionMessages(sessionId: string): Promise<any[]> {
388
+ if (!this.sessionComponent) {
389
+ return [];
390
+ }
391
+ return this.sessionComponent.getMessages(sessionId);
392
+ }
393
+ }
@@ -0,0 +1,28 @@
1
+ /**
2
+ * @fileoverview Workflow Storage Module
3
+ *
4
+ * Re-exports all storage components for the workflow component.
5
+ *
6
+ * Note: After session-based refactoring, workflow runs are now managed via SessionComponent.
7
+ * The workflows table is still used for storing workflow definitions.
8
+ */
9
+
10
+ // SQLite database utilities
11
+ export {
12
+ getDatabase,
13
+ closeDatabase,
14
+ initializeTables,
15
+ getDatabasePath,
16
+ resetDatabase,
17
+ initDatabase,
18
+ type BunDatabase,
19
+ } from './sqlite';
20
+
21
+ // Workflow Repository
22
+ export {
23
+ WorkflowRepository,
24
+ rowToWorkflow,
25
+ type WorkflowRow,
26
+ type ListWorkflowsOptions,
27
+ type UpdateWorkflowOptions,
28
+ } from './workflow-repo';