@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,186 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { inferNextNode } from '../utils/session-recovery';
3
+ import { isWorkflowSessionMetadata } from '../types/workflow-session';
4
+ import type { WorkflowSessionMetadata } from '../types/workflow-message';
5
+ import type { ResumePoint } from '../utils/session-recovery';
6
+
7
+ describe('Workflow Run-Resume Unification Integration', () => {
8
+ describe('Core concepts', () => {
9
+ it('should validate simplified WorkflowSessionMetadata', () => {
10
+ const metadata: WorkflowSessionMetadata = {
11
+ type: 'workflow',
12
+ workflowId: 'test-wf',
13
+ workflowName: 'Test Workflow',
14
+ status: 'running',
15
+ };
16
+
17
+ expect(isWorkflowSessionMetadata(metadata)).toBe(true);
18
+ });
19
+
20
+ it('should accept all valid statuses', () => {
21
+ const statuses = ['running', 'paused', 'completed', 'failed', 'stopped'];
22
+
23
+ for (const status of statuses) {
24
+ const metadata: WorkflowSessionMetadata = {
25
+ type: 'workflow',
26
+ workflowId: 'test-wf',
27
+ workflowName: 'Test Workflow',
28
+ status: status as any,
29
+ };
30
+ expect(isWorkflowSessionMetadata(metadata)).toBe(true);
31
+ }
32
+ });
33
+ });
34
+
35
+ describe('Next node inference from messages', () => {
36
+ it('should return entry_node for empty messages', () => {
37
+ const result = inferNextNode([], { entryNode: 'node_A' });
38
+ expect(result.type).toBe('entry_node');
39
+ expect(result.nodeId).toBe('node_A');
40
+ });
41
+
42
+ it('should return resume_node when last is workflow.node.call', () => {
43
+ const messages = [
44
+ {
45
+ role: 'workflow.node.call',
46
+ content: '{}',
47
+ metadata: {
48
+ type: 'workflow.node.call',
49
+ workflowNodeId: 'node_A',
50
+ },
51
+ },
52
+ ];
53
+
54
+ const result = inferNextNode(messages as any, {});
55
+ expect(result.type).toBe('resume_node');
56
+ expect(result.nodeId).toBe('node_A');
57
+ });
58
+
59
+ it('should return ask_user when last is workflow.node.interrupt', () => {
60
+ const messages = [
61
+ {
62
+ role: 'workflow.node.interrupt',
63
+ content: 'Continue?',
64
+ metadata: {
65
+ type: 'workflow.node.interrupt',
66
+ workflowNodeId: 'ask_1',
67
+ query: 'Continue?',
68
+ agentSessionId: 'agent_123',
69
+ },
70
+ },
71
+ ];
72
+
73
+ const result = inferNextNode(messages as any, {});
74
+ expect(result.type).toBe('ask_user');
75
+ expect(result.nodeId).toBe('ask_1');
76
+ expect(result.agentSessionId).toBe('agent_123');
77
+ });
78
+
79
+ it('should return next_nodes when last is workflow.node.result', () => {
80
+ const messages = [
81
+ {
82
+ role: 'workflow.node.call',
83
+ content: '{}',
84
+ metadata: { type: 'workflow.node.call', workflowNodeId: 'node_A' },
85
+ },
86
+ {
87
+ role: 'workflow.node.result',
88
+ content: '{"output":"done"}',
89
+ metadata: {
90
+ type: 'workflow.node.result',
91
+ workflowNodeId: 'node_A',
92
+ success: true,
93
+ },
94
+ },
95
+ ];
96
+
97
+ const definition = {
98
+ edges: [
99
+ { from: 'node_A', to: 'node_B' },
100
+ { from: 'node_A', to: 'node_C' },
101
+ ],
102
+ };
103
+
104
+ const result = inferNextNode(messages as any, definition);
105
+ expect(result.type).toBe('next_nodes');
106
+ expect(result.nodeIds).toEqual(['node_B', 'node_C']);
107
+ });
108
+ });
109
+
110
+ describe('CLI Interface', () => {
111
+ it('should document new run command syntax', () => {
112
+ // New syntax:
113
+ // tong workflow run <workflowId> [--input <input>]
114
+ // tong workflow run -s <sessionId> [--input <input>]
115
+ // tong workflow stop -s <sessionId>
116
+
117
+ const expectedCommands = [
118
+ 'tong workflow run my-workflow',
119
+ 'tong workflow run my-workflow --input \'{"key": "value"}\'',
120
+ 'tong workflow run -s workflow_abc123',
121
+ 'tong workflow run -s workflow_abc123 --input "yes"',
122
+ 'tong workflow stop -s workflow_abc123',
123
+ ];
124
+
125
+ expect(expectedCommands.length).toBe(5);
126
+ });
127
+ });
128
+ });
129
+
130
+ describe('Resume point decision table', () => {
131
+ interface TestCase {
132
+ name: string;
133
+ messages: any[];
134
+ definition: any;
135
+ expected: ResumePoint;
136
+ }
137
+
138
+ const testCases: TestCase[] = [
139
+ {
140
+ name: 'First run - no messages',
141
+ messages: [],
142
+ definition: { entryNode: 'start' },
143
+ expected: { type: 'entry_node', nodeId: 'start' },
144
+ },
145
+ {
146
+ name: 'Resume interrupted node',
147
+ messages: [
148
+ { role: 'workflow.node.call', content: '{}', metadata: { type: 'workflow.node.call', workflowNodeId: 'task' } },
149
+ ],
150
+ definition: {},
151
+ expected: { type: 'resume_node', nodeId: 'task' },
152
+ },
153
+ {
154
+ name: 'Resume ask_user interrupt',
155
+ messages: [
156
+ { role: 'workflow.node.interrupt', content: 'Continue?', metadata: { type: 'workflow.node.interrupt', workflowNodeId: 'ask', agentSessionId: 'agent_1' } },
157
+ ],
158
+ definition: {},
159
+ expected: { type: 'ask_user', nodeId: 'ask', agentSessionId: 'agent_1' },
160
+ },
161
+ {
162
+ name: 'Continue to next nodes',
163
+ messages: [
164
+ { role: 'workflow.node.result', content: '{}', metadata: { type: 'workflow.node.result', workflowNodeId: 'step1' } },
165
+ ],
166
+ definition: { edges: [{ from: 'step1', to: 'step2' }] },
167
+ expected: { type: 'next_nodes', nodeIds: ['step2'] },
168
+ },
169
+ ];
170
+
171
+ testCases.forEach(tc => {
172
+ it(`should handle: ${tc.name}`, () => {
173
+ const result = inferNextNode(tc.messages as any, tc.definition);
174
+ expect(result.type).toBe(tc.expected.type);
175
+ if (tc.expected.nodeId) {
176
+ expect(result.nodeId).toBe(tc.expected.nodeId);
177
+ }
178
+ if (tc.expected.nodeIds) {
179
+ expect(result.nodeIds).toEqual(tc.expected.nodeIds);
180
+ }
181
+ if (tc.expected.agentSessionId) {
182
+ expect(result.agentSessionId).toBe(tc.expected.agentSessionId);
183
+ }
184
+ });
185
+ });
186
+ });
@@ -0,0 +1,267 @@
1
+ /**
2
+ * @fileoverview Workflow Integration Tests - Service Layer
3
+ *
4
+ * Integration tests for WorkflowService with mocked repositories and engine.
5
+ * Tests the session-based workflow lifecycle: create → run → complete/pause/resume/stop
6
+ */
7
+
8
+ import { describe, it, expect, beforeEach, vi } from 'bun:test';
9
+ import { WorkflowService, type WorkflowRepository } from '../service/workflow-service';
10
+ import type { Workflow, WorkflowDefinition, RunResult } from '../types';
11
+ import * as workflows from '../fixtures';
12
+
13
+ // Export short names for convenience
14
+ const { singleNodeWorkflow, sequentialWorkflow, parallelWorkflow, diamondWorkflow } = workflows;
15
+
16
+ // =============================================================================
17
+ // Mock Implementations
18
+ // =============================================================================
19
+
20
+ /**
21
+ * Create an in-memory workflow repository for testing
22
+ */
23
+ function createMockWorkflowRepository() {
24
+ const workflows = new Map<string, Workflow>();
25
+ let idCounter = 0;
26
+
27
+ return {
28
+ workflows,
29
+ create: (data: Omit<Workflow, 'id' | 'createdAt' | 'updatedAt'>) => {
30
+ const id = `wf_${++idCounter}`;
31
+ const now = new Date();
32
+ const workflow: Workflow = {
33
+ id,
34
+ name: data.name,
35
+ version: data.version || '1.0.0',
36
+ description: data.description,
37
+ definition: data.definition,
38
+ config: data.config || {},
39
+ metadata: data.metadata || {},
40
+ tags: data.tags || [],
41
+ createdAt: now,
42
+ updatedAt: now,
43
+ };
44
+ workflows.set(id, workflow);
45
+ workflows.set(data.name, workflow);
46
+ return workflow;
47
+ },
48
+ getById: (id: string) => workflows.get(id) || null,
49
+ getByName: (name: string) => workflows.get(name) || null,
50
+ list: (options?: { tag?: string; limit?: number; offset?: number }) => {
51
+ let result = Array.from(workflows.values());
52
+ if (options?.tag) {
53
+ result = result.filter(w => w.tags.includes(options.tag!));
54
+ }
55
+ if (options?.offset) result = result.slice(options.offset);
56
+ if (options?.limit) result = result.slice(0, options.limit);
57
+ return result;
58
+ },
59
+ update: (id: string, updates: Partial<Workflow>) => {
60
+ const wf = workflows.get(id);
61
+ if (!wf) return null;
62
+ const updated = { ...wf, ...updates, updatedAt: new Date() };
63
+ workflows.set(id, updated);
64
+ return updated;
65
+ },
66
+ delete: (id: string) => workflows.delete(id),
67
+ };
68
+ }
69
+
70
+ /**
71
+ * Create a mock engine factory that returns a mock engine
72
+ * Updated for session-based design
73
+ */
74
+ function createMockEngineFactory() {
75
+ return (workflow: Workflow) => {
76
+ const mockEngine = {
77
+ createSession: vi.fn().mockImplementation(async (workflowId: string, options?: any) => {
78
+ return `workflow_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
79
+ }),
80
+ createRun: vi.fn().mockImplementation(async (definition: any, options?: any) => {
81
+ return `run_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
82
+ }),
83
+ run: vi.fn().mockImplementation(async (runId: string, options?: any) => {
84
+ return {
85
+ runId,
86
+ sessionId: runId,
87
+ status: 'completed',
88
+ output: { result: 'mock_output' },
89
+ durationMs: 100,
90
+ };
91
+ }),
92
+ runWorkflow: vi.fn().mockImplementation(async (wf: any, options?: any) => {
93
+ const runId = `run_${Date.now()}_${Math.random().toString(36).slice(2, 8)}`;
94
+ return {
95
+ runId,
96
+ sessionId: runId,
97
+ status: 'completed',
98
+ output: { result: 'mock_output' },
99
+ durationMs: 100,
100
+ };
101
+ }),
102
+ pause: vi.fn().mockResolvedValue(undefined),
103
+ stop: vi.fn().mockResolvedValue(undefined),
104
+ addNode: vi.fn().mockResolvedValue(undefined),
105
+ removeNode: vi.fn().mockResolvedValue(undefined),
106
+ };
107
+ return mockEngine;
108
+ };
109
+ }
110
+
111
+ // =============================================================================
112
+ // Test Suite
113
+ // =============================================================================
114
+
115
+ describe('WorkflowService Integration Tests', () => {
116
+ let workflowRepo: ReturnType<typeof createMockWorkflowRepository>;
117
+ let mockEngineFactory: ReturnType<typeof createMockEngineFactory>;
118
+ let service: WorkflowService;
119
+
120
+ beforeEach(() => {
121
+ workflowRepo = createMockWorkflowRepository();
122
+ mockEngineFactory = createMockEngineFactory();
123
+ service = new WorkflowService(workflowRepo as any, mockEngineFactory as any);
124
+ });
125
+
126
+ // ===========================================================================
127
+ // CRUD Tests
128
+ // ===========================================================================
129
+
130
+ describe('Workflow CRUD', () => {
131
+ it('should create a workflow from definition', async () => {
132
+ const workflow = await service.createWorkflow(singleNodeWorkflow);
133
+
134
+ expect(workflow).toBeDefined();
135
+ expect(workflow.id).toBeDefined();
136
+ expect(workflow.name).toBe(singleNodeWorkflow.name);
137
+ expect(workflow.definition).toEqual(singleNodeWorkflow);
138
+ });
139
+
140
+ it('should get workflow by name', async () => {
141
+ const created = await service.createWorkflow(sequentialWorkflow);
142
+ const retrieved = service.getWorkflowByName(created.name);
143
+
144
+ expect(retrieved).toBeDefined();
145
+ expect(retrieved!.id).toBe(created.id);
146
+ });
147
+
148
+ it('should get workflow by id', async () => {
149
+ const created = await service.createWorkflow(sequentialWorkflow);
150
+ const retrieved = service.getWorkflowById(created.id);
151
+
152
+ expect(retrieved).toBeDefined();
153
+ expect(retrieved!.id).toBe(created.id);
154
+ });
155
+
156
+ it('should list all workflows', async () => {
157
+ await service.createWorkflow(singleNodeWorkflow);
158
+ await service.createWorkflow(sequentialWorkflow);
159
+ await service.createWorkflow(parallelWorkflow);
160
+
161
+ const list = service.listWorkflows();
162
+
163
+ expect(list.length).toBeGreaterThanOrEqual(3);
164
+ });
165
+
166
+ it('should update workflow', async () => {
167
+ const created = await service.createWorkflow(singleNodeWorkflow);
168
+ const updated = await service.updateWorkflow(created.id, {
169
+ description: 'Updated description',
170
+ });
171
+
172
+ expect(updated.description).toBe('Updated description');
173
+ });
174
+
175
+ it('should delete workflow', async () => {
176
+ const created = await service.createWorkflow(singleNodeWorkflow);
177
+ const deleted = await service.deleteWorkflow(created.id);
178
+
179
+ expect(deleted).toBe(true);
180
+ expect(service.getWorkflow(created.id)).toBeNull();
181
+ });
182
+ });
183
+
184
+ // ===========================================================================
185
+ // Session-based Run Lifecycle Tests
186
+ // ===========================================================================
187
+
188
+ describe('Session-based Run Lifecycle', () => {
189
+ it('should run workflow and create session', async () => {
190
+ await service.createWorkflow(singleNodeWorkflow);
191
+
192
+ const result = await service.runWorkflow(singleNodeWorkflow);
193
+
194
+ expect(result).toBeDefined();
195
+ expect(result.sessionId || result.runId).toBeDefined();
196
+ expect(result.status).toBe('completed');
197
+ });
198
+
199
+ it('should pass input to workflow run', async () => {
200
+ await service.createWorkflow(sequentialWorkflow);
201
+
202
+ const result = await service.runWorkflow(sequentialWorkflow, { test: 'input' });
203
+
204
+ expect(result).toBeDefined();
205
+ });
206
+
207
+ it('should run workflow by name', async () => {
208
+ await service.createWorkflow(parallelWorkflow);
209
+
210
+ const result = await service.runWorkflow(parallelWorkflow.name);
211
+
212
+ expect(result).toBeDefined();
213
+ expect(result.sessionId || result.runId).toBeDefined();
214
+ });
215
+
216
+ it('should run workflow by name using convenience method', async () => {
217
+ await service.createWorkflow(diamondWorkflow);
218
+
219
+ const result = await service.runWorkflowByName(diamondWorkflow.name);
220
+
221
+ expect(result).toBeDefined();
222
+ });
223
+
224
+ it('should throw error for non-existent workflow', async () => {
225
+ await expect(service.runWorkflow('nonexistent')).rejects.toThrow('Workflow not found');
226
+ });
227
+ });
228
+
229
+ // ===========================================================================
230
+ // Session-based Resume Tests
231
+ // ===========================================================================
232
+
233
+ describe('Session-based Resume (Mocked)', () => {
234
+ it('should have engine factory that creates new engine for each resume', async () => {
235
+ await service.createWorkflow(singleNodeWorkflow);
236
+
237
+ // Create mock session component
238
+ const mockSessionComponent = {
239
+ create: vi.fn().mockResolvedValue({ id: 'workflow_test_123' }),
240
+ get: vi.fn().mockResolvedValue({
241
+ id: 'workflow_test_123',
242
+ metadata: {
243
+ type: 'workflow',
244
+ workflowName: 'single-node-workflow',
245
+ status: 'paused',
246
+ },
247
+ }),
248
+ update: vi.fn().mockResolvedValue(true),
249
+ addMessage: vi.fn().mockResolvedValue('msg_id'),
250
+ getMessages: vi.fn().mockResolvedValue([]),
251
+ };
252
+
253
+ // Create service with session component
254
+ const serviceWithSession = new WorkflowService(
255
+ workflowRepo as any,
256
+ mockEngineFactory as any,
257
+ mockSessionComponent as any
258
+ );
259
+
260
+ // Run workflow first
261
+ const result = await serviceWithSession.runWorkflow(singleNodeWorkflow);
262
+
263
+ expect(result).toBeDefined();
264
+ expect(result.sessionId || result.runId).toBeDefined();
265
+ });
266
+ });
267
+ });
@@ -0,0 +1,12 @@
1
+ /**
2
+ * 元数据存储的 Symbol 键
3
+ */
4
+
5
+ // Workflow 元数据键
6
+ export const WORKFLOW_METADATA_KEY = Symbol('workflow:metadata');
7
+
8
+ // Node 元数据键 (用于存储方法上的 @NodeAs 元数据)
9
+ export const NODE_METADATA_KEY = Symbol('workflow:node');
10
+
11
+ // Edge 元数据键 (用于存储类上的 @WorkflowEdges 元数据)
12
+ export const EDGE_METADATA_KEY = Symbol('workflow:edges');