@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,352 @@
1
+ /**
2
+ * Run Workflow Tool Tests - Phase 7
3
+ */
4
+
5
+ import { describe, it, expect, vi, beforeEach, afterEach } from "bun:test";
6
+ import { z } from "zod";
7
+ import { createRunWorkflowTool, resetRunWorkflowTool } from "./run-workflow";
8
+ import type { WorkflowService } from "../service/workflow-service";
9
+ import type { ToolContext } from "../../../env/tool/types";
10
+
11
+ // Mock logger
12
+ vi.mock("../../../env/log-trace/logger", () => ({
13
+ createLogger: () => ({
14
+ info: vi.fn(),
15
+ warn: vi.fn(),
16
+ error: vi.fn(),
17
+ debug: vi.fn(),
18
+ }),
19
+ }));
20
+
21
+ describe("RunWorkflowTool", () => {
22
+ let mockWorkflowService: Partial<WorkflowService>;
23
+ let tool: ReturnType<typeof createRunWorkflowTool>;
24
+ let mockContext: ToolContext;
25
+
26
+ beforeEach(() => {
27
+ // Reset state
28
+ resetRunWorkflowTool();
29
+
30
+ // Create mock WorkflowService
31
+ mockWorkflowService = {
32
+ runWorkflow: vi.fn(),
33
+ };
34
+
35
+ // Create the tool
36
+ tool = createRunWorkflowTool(mockWorkflowService as WorkflowService);
37
+
38
+ // Create mock context
39
+ mockContext = {
40
+ workdir: "/tmp",
41
+ };
42
+ });
43
+
44
+ afterEach(() => {
45
+ vi.clearAllMocks();
46
+ });
47
+
48
+ describe("Tool Definition", () => {
49
+ it("should have correct name", () => {
50
+ expect(tool.name).toBe("run-workflow");
51
+ });
52
+
53
+ it("should have correct description", () => {
54
+ expect(tool.description).toBe(
55
+ "Run a workflow by name with optional input. Returns run_id, status, output, error, and duration_ms."
56
+ );
57
+ });
58
+
59
+ it("should have correct category in metadata", () => {
60
+ expect(tool.metadata?.category).toBe("workflow");
61
+ });
62
+
63
+ it("should have workflow tags", () => {
64
+ expect(tool.metadata?.tags).toEqual(["workflow", "execute", "run"]);
65
+ });
66
+
67
+ it("should have sandbox disabled", () => {
68
+ expect(tool.sandbox?.enabled).toBe(false);
69
+ });
70
+
71
+ it("should have safe permission level", () => {
72
+ expect(tool.permission?.level).toBe("safe");
73
+ });
74
+ });
75
+
76
+ describe("Parameter Schema", () => {
77
+ it("should handle missing workflow_name gracefully", async () => {
78
+ // When called directly (without ToolComponent validation),
79
+ // the tool should handle missing required params
80
+ const result = await tool.execute({}, mockContext);
81
+ // The tool receives undefined as workflow_name and fails when trying to use it
82
+ expect(result.success).toBe(false);
83
+ expect(result.error).toContain("Failed to run workflow");
84
+ });
85
+
86
+ it("should accept valid workflow_name", async () => {
87
+ // Mock the service to avoid actual execution
88
+ (mockWorkflowService.runWorkflow as any).mockResolvedValue({
89
+ runId: "run-123",
90
+ status: "completed",
91
+ output: { result: "success" },
92
+ });
93
+
94
+ const result = await tool.execute(
95
+ { workflow_name: "test-workflow" },
96
+ mockContext
97
+ );
98
+ expect(result.success).toBe(true);
99
+ });
100
+
101
+ it("should accept optional input parameter", async () => {
102
+ (mockWorkflowService.runWorkflow as any).mockResolvedValue({
103
+ runId: "run-123",
104
+ status: "completed",
105
+ output: { result: "success" },
106
+ });
107
+
108
+ const result = await tool.execute(
109
+ { workflow_name: "test-workflow", input: { key: "value" } },
110
+ mockContext
111
+ );
112
+ expect(result.success).toBe(true);
113
+ expect(mockWorkflowService.runWorkflow).toHaveBeenCalledWith(
114
+ "test-workflow",
115
+ { key: "value" },
116
+ { sync: true }
117
+ );
118
+ });
119
+
120
+ it("should accept sync parameter", async () => {
121
+ (mockWorkflowService.runWorkflow as any).mockResolvedValue({
122
+ runId: "run-123",
123
+ status: "completed",
124
+ });
125
+
126
+ await tool.execute(
127
+ { workflow_name: "test-workflow", sync: false },
128
+ mockContext
129
+ );
130
+ expect(mockWorkflowService.runWorkflow).toHaveBeenCalledWith(
131
+ "test-workflow",
132
+ undefined,
133
+ { sync: false }
134
+ );
135
+ });
136
+
137
+ it("should accept timeout parameter", async () => {
138
+ (mockWorkflowService.runWorkflow as any).mockResolvedValue({
139
+ runId: "run-123",
140
+ status: "completed",
141
+ });
142
+
143
+ await tool.execute(
144
+ { workflow_name: "test-workflow", timeout: 5000 },
145
+ mockContext
146
+ );
147
+ expect(mockWorkflowService.runWorkflow).toHaveBeenCalledWith(
148
+ "test-workflow",
149
+ undefined,
150
+ { sync: true }
151
+ );
152
+ });
153
+ });
154
+
155
+ describe("Sync Execution", () => {
156
+ it("should return completed status for successful sync execution", async () => {
157
+ (mockWorkflowService.runWorkflow as any).mockResolvedValue({
158
+ runId: "run-123",
159
+ status: "completed",
160
+ output: { result: "success" },
161
+ durationMs: 100,
162
+ });
163
+
164
+ const result = await tool.execute(
165
+ { workflow_name: "test-workflow", sync: true },
166
+ mockContext
167
+ );
168
+
169
+ expect(result.success).toBe(true);
170
+ expect(result.output).toEqual({
171
+ run_id: "run-123",
172
+ status: "completed",
173
+ output: { result: "success" },
174
+ error: undefined,
175
+ duration_ms: 100,
176
+ });
177
+ });
178
+
179
+ it("should return failed status for failed sync execution", async () => {
180
+ (mockWorkflowService.runWorkflow as any).mockResolvedValue({
181
+ runId: "run-123",
182
+ status: "failed",
183
+ error: "Something went wrong",
184
+ durationMs: 50,
185
+ });
186
+
187
+ const result = await tool.execute(
188
+ { workflow_name: "test-workflow", sync: true },
189
+ mockContext
190
+ );
191
+
192
+ expect(result.success).toBe(false);
193
+ expect(result.output).toEqual({
194
+ run_id: "run-123",
195
+ status: "failed",
196
+ output: undefined,
197
+ error: "Something went wrong",
198
+ duration_ms: 50,
199
+ });
200
+ });
201
+
202
+ it("should include execution_time_ms in metadata", async () => {
203
+ (mockWorkflowService.runWorkflow as any).mockResolvedValue({
204
+ runId: "run-123",
205
+ status: "completed",
206
+ });
207
+
208
+ const result = await tool.execute(
209
+ { workflow_name: "test-workflow" },
210
+ mockContext
211
+ );
212
+
213
+ expect(result.metadata?.execution_time_ms).toBeDefined();
214
+ expect(typeof result.metadata?.execution_time_ms).toBe("number");
215
+ });
216
+ });
217
+
218
+ describe("Async Execution", () => {
219
+ it("should return immediately with run_id for async execution", async () => {
220
+ (mockWorkflowService.runWorkflow as any).mockResolvedValue({
221
+ runId: "run-456",
222
+ status: "running",
223
+ });
224
+
225
+ const result = await tool.execute(
226
+ { workflow_name: "test-workflow", sync: false },
227
+ mockContext
228
+ );
229
+
230
+ expect(result.success).toBe(true);
231
+ expect(result.output).toEqual({
232
+ run_id: "run-456",
233
+ status: "running",
234
+ duration_ms: expect.any(Number),
235
+ });
236
+ // Should not include full output for async
237
+ expect((result.output as any).output).toBeUndefined();
238
+ });
239
+ });
240
+
241
+ describe("Error Handling", () => {
242
+ it("should handle workflow not found error", async () => {
243
+ (mockWorkflowService.runWorkflow as any).mockRejectedValue(
244
+ new Error("Workflow not found: non-existent-workflow")
245
+ );
246
+
247
+ const result = await tool.execute(
248
+ { workflow_name: "non-existent-workflow" },
249
+ mockContext
250
+ );
251
+
252
+ expect(result.success).toBe(false);
253
+ expect(result.error).toBe(
254
+ "Workflow not found: non-existent-workflow"
255
+ );
256
+ });
257
+
258
+ it("should handle execution errors", async () => {
259
+ (mockWorkflowService.runWorkflow as any).mockRejectedValue(
260
+ new Error("Internal error")
261
+ );
262
+
263
+ const result = await tool.execute(
264
+ { workflow_name: "test-workflow" },
265
+ mockContext
266
+ );
267
+
268
+ expect(result.success).toBe(false);
269
+ expect(result.error).toContain("Failed to run workflow");
270
+ expect(result.error).toContain("Internal error");
271
+ });
272
+
273
+ it("should handle timeout errors", async () => {
274
+ // Create a tool with a short timeout
275
+ const slowTool = createRunWorkflowTool(mockWorkflowService as WorkflowService);
276
+
277
+ // Mock a slow-running workflow
278
+ (mockWorkflowService.runWorkflow as any).mockImplementation(
279
+ () => new Promise((resolve) => setTimeout(resolve, 1000))
280
+ );
281
+
282
+ const result = await slowTool.execute(
283
+ { workflow_name: "slow-workflow", timeout: 100 },
284
+ mockContext
285
+ );
286
+
287
+ expect(result.success).toBe(false);
288
+ expect(result.error).toContain("timed out");
289
+ });
290
+ });
291
+
292
+ describe("External Abort Signal", () => {
293
+ it("should handle external abort signal", async () => {
294
+ const abortController = new AbortController();
295
+
296
+ (mockWorkflowService.runWorkflow as any).mockImplementation(
297
+ () =>
298
+ new Promise((_, reject) => {
299
+ abortController.signal.addEventListener("abort", () => {
300
+ reject(new Error("The operation was aborted"));
301
+ });
302
+ })
303
+ );
304
+
305
+ const contextWithAbort: ToolContext = {
306
+ ...mockContext,
307
+ abort: abortController.signal,
308
+ };
309
+
310
+ // Abort after a short delay
311
+ setTimeout(() => abortController.abort(), 50);
312
+
313
+ const result = await tool.execute(
314
+ { workflow_name: "test-workflow" },
315
+ contextWithAbort
316
+ );
317
+
318
+ expect(result.success).toBe(false);
319
+ // Should handle abort-related errors
320
+ expect(result.error).toMatch(/aborted|timed out/i);
321
+ });
322
+ });
323
+ });
324
+
325
+ describe("RunWorkflowInputSchema", () => {
326
+ it("should validate correct input", () => {
327
+ const { RunWorkflowInputSchema } = require("./run-workflow");
328
+ const result = RunWorkflowInputSchema.safeParse({
329
+ workflow_name: "test",
330
+ input: { key: "value" },
331
+ sync: true,
332
+ timeout: 5000,
333
+ });
334
+ expect(result.success).toBe(true);
335
+ });
336
+
337
+ it("should require workflow_name", () => {
338
+ const { RunWorkflowInputSchema } = require("./run-workflow");
339
+ const result = RunWorkflowInputSchema.safeParse({});
340
+ expect(result.success).toBe(false);
341
+ expect(result.error?.issues[0].path).toContain("workflow_name");
342
+ });
343
+
344
+ it("should have default sync=true", () => {
345
+ const { RunWorkflowInputSchema } = require("./run-workflow");
346
+ const result = RunWorkflowInputSchema.safeParse({
347
+ workflow_name: "test",
348
+ });
349
+ expect(result.success).toBe(true);
350
+ expect(result.data?.sync).toBe(true);
351
+ });
352
+ });
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Run Workflow Tool - Phase 7
3
+ *
4
+ * A Tool for executing workflows by name from within other workflows or agents.
5
+ */
6
+
7
+ import { z } from "zod";
8
+ import type { Tool, ToolContext, ToolResult } from "../../../env/tool/types";
9
+ import type { WorkflowService } from "../service/workflow-service";
10
+ import { createLogger } from "../../../env/log-trace/logger";
11
+
12
+ // 创建日志器
13
+ const logger = createLogger("run-workflow-tool");
14
+
15
+ /**
16
+ * Input schema for run-workflow tool
17
+ */
18
+ export const RunWorkflowInputSchema = z.object({
19
+ workflow_name: z.string().describe("Name of the workflow to run"),
20
+ input: z.record(z.any()).optional().describe("Input to pass to the workflow"),
21
+ sync: z.boolean().default(true).describe("Wait for completion (default: true)"),
22
+ timeout: z.number().positive().optional().describe("Timeout in milliseconds"),
23
+ });
24
+
25
+ export type RunWorkflowInput = z.infer<typeof RunWorkflowInputSchema>;
26
+
27
+ /**
28
+ * Run Workflow Tool interface for type-safe access
29
+ */
30
+ export interface RunWorkflowToolInterface {
31
+ name: "run-workflow";
32
+ description: string;
33
+ inputSchema: typeof RunWorkflowInputSchema;
34
+ }
35
+
36
+ /**
37
+ * Create a run-workflow tool with the given WorkflowService
38
+ *
39
+ * @param workflowService - The WorkflowService instance for executing workflows
40
+ * @returns A Tool instance for running workflows
41
+ */
42
+ export function createRunWorkflowTool(workflowService: WorkflowService): Tool {
43
+ return {
44
+ name: "run-workflow",
45
+ description: "Run a workflow by name with optional input. Returns run_id, status, output, error, and duration_ms.",
46
+ parameters: RunWorkflowInputSchema,
47
+ sandbox: {
48
+ enabled: false, // Workflow execution doesn't need sandbox
49
+ },
50
+ permission: {
51
+ level: "safe",
52
+ },
53
+ metadata: {
54
+ category: "workflow",
55
+ tags: ["workflow", "execute", "run"],
56
+ version: "1.0.0",
57
+ experimental: false,
58
+ },
59
+ execute: async (args, ctx: ToolContext): Promise<ToolResult> => {
60
+ const startTime = Date.now();
61
+ const { workflow_name, input, sync = true, timeout } = args;
62
+
63
+ logger.info(`Running workflow: ${workflow_name}`, { input, sync, timeout });
64
+
65
+ let timeoutHandle: NodeJS.Timeout | undefined;
66
+ let durationMs: number;
67
+
68
+ try {
69
+ let result;
70
+
71
+ if (timeout) {
72
+ // Execute workflow with timeout wrapper
73
+ result = await Promise.race([
74
+ workflowService.runWorkflow(workflow_name, input, { sync }),
75
+ new Promise<never>((_, reject) => {
76
+ timeoutHandle = setTimeout(() => {
77
+ reject(new Error("Workflow execution timed out"));
78
+ }, timeout);
79
+ }),
80
+ ]);
81
+ } else {
82
+ // No timeout - execute directly
83
+ result = await workflowService.runWorkflow(workflow_name, input, { sync });
84
+ }
85
+
86
+ // Clear timeout
87
+ if (timeoutHandle) {
88
+ clearTimeout(timeoutHandle);
89
+ }
90
+
91
+ durationMs = Date.now() - startTime;
92
+
93
+ // Handle the result based on execution mode
94
+ if (sync) {
95
+ // Synchronous execution - return full result
96
+ return {
97
+ success: result.status === "completed",
98
+ output: {
99
+ run_id: result.runId,
100
+ status: result.status,
101
+ output: result.output,
102
+ error: result.error,
103
+ duration_ms: result.durationMs || durationMs,
104
+ },
105
+ metadata: {
106
+ execution_time_ms: durationMs,
107
+ },
108
+ };
109
+ } else {
110
+ // Asynchronous execution - return run_id immediately
111
+ return {
112
+ success: true,
113
+ output: {
114
+ run_id: result.runId,
115
+ status: result.status,
116
+ duration_ms: durationMs,
117
+ },
118
+ metadata: {
119
+ execution_time_ms: durationMs,
120
+ },
121
+ };
122
+ }
123
+ } catch (error) {
124
+ // Clear timeout on error
125
+ if (timeoutHandle) {
126
+ clearTimeout(timeoutHandle);
127
+ }
128
+
129
+ durationMs = Date.now() - startTime;
130
+ const errorMessage = error instanceof Error ? error.message : String(error);
131
+
132
+ // Handle specific error types
133
+ if (errorMessage.includes("Workflow not found")) {
134
+ return {
135
+ success: false,
136
+ output: "",
137
+ error: `Workflow not found: ${workflow_name}`,
138
+ metadata: {
139
+ execution_time_ms: durationMs,
140
+ },
141
+ };
142
+ }
143
+
144
+ if (errorMessage.includes("abort") || errorMessage.includes("timed out")) {
145
+ return {
146
+ success: false,
147
+ output: "",
148
+ error: `Workflow execution timed out or was aborted: ${workflow_name}`,
149
+ metadata: {
150
+ execution_time_ms: durationMs,
151
+ },
152
+ };
153
+ }
154
+
155
+ // Safe logging - don't throw if logger is not available
156
+ if (logger?.error) {
157
+ logger.error(`Failed to run workflow: ${workflow_name}`, { error: errorMessage });
158
+ }
159
+
160
+ return {
161
+ success: false,
162
+ output: "",
163
+ error: `Failed to run workflow ${workflow_name}: ${errorMessage}`,
164
+ metadata: {
165
+ execution_time_ms: durationMs,
166
+ },
167
+ };
168
+ }
169
+ },
170
+ };
171
+ }
172
+
173
+ /**
174
+ * Default run-workflow tool instance (lazy initialization)
175
+ * This is a placeholder that should be replaced with the actual tool
176
+ * created via createRunWorkflowTool(workflowService) in the application
177
+ */
178
+ let _runWorkflowTool: Tool | null = null;
179
+ let _workflowService: WorkflowService | null = null;
180
+
181
+ /**
182
+ * Initialize the run-workflow tool with a WorkflowService
183
+ *
184
+ * @param workflowService - The WorkflowService instance
185
+ */
186
+ export function initRunWorkflowTool(workflowService: WorkflowService): void {
187
+ _workflowService = workflowService;
188
+ _runWorkflowTool = createRunWorkflowTool(workflowService);
189
+ }
190
+
191
+ /**
192
+ * Get the run-workflow tool instance
193
+ *
194
+ * @throws Error if the tool has not been initialized
195
+ */
196
+ export function getRunWorkflowTool(): Tool {
197
+ if (!_runWorkflowTool || !_workflowService) {
198
+ throw new Error(
199
+ "run-workflow tool not initialized. Call initRunWorkflowTool(workflowService) first."
200
+ );
201
+ }
202
+ return _runWorkflowTool;
203
+ }
204
+
205
+ /**
206
+ * Reset the run-workflow tool (for testing)
207
+ */
208
+ export function resetRunWorkflowTool(): void {
209
+ _runWorkflowTool = null;
210
+ _workflowService = null;
211
+ }
212
+
213
+ // Re-export the tool interface for type checking
214
+ export type RunWorkflowTool = ReturnType<typeof createRunWorkflowTool>;
@@ -0,0 +1,18 @@
1
+ /**
2
+ * askUser 选项
3
+ */
4
+ export interface AskUserOptions {
5
+ options?: string[];
6
+ required_confirm?: boolean;
7
+ }
8
+
9
+ /**
10
+ * 从 Session 恢复的运行时状态
11
+ */
12
+ export interface RuntimeState {
13
+ sessionId: string;
14
+ nodeOutputs: Map<string, unknown>;
15
+ pendingNodeId: string | null;
16
+ waitingForUser: boolean;
17
+ agentSessionId?: string;
18
+ }