@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,18 @@
1
+ /**
2
+ * @fileoverview Delegate Tools Index
3
+ */
4
+
5
+ export { createDelegateTool, BackgroundTaskManager } from "./delegate-tool";
6
+ export { createStopTool } from "./stop-tool";
7
+ export type { DelegateToolResult, DelegateToolParams, DelegateToolParameters } from "./delegate-tool";
8
+ export type { BackgroundTask, SubAgentSpec } from "./delegate-tool";
9
+
10
+ // Event types
11
+ export {
12
+ TaskEventTypes,
13
+ type TaskEventType,
14
+ type TaskStartedPayload,
15
+ type TaskProgressPayload,
16
+ type TaskCompletedPayload,
17
+ type BaseTaskEventPayload,
18
+ } from "./task-events";
@@ -0,0 +1,140 @@
1
+ /**
2
+ * @fileoverview stop_task Tool Tests
3
+ *
4
+ * TDD: 红色阶段 - 编写失败的测试
5
+ */
6
+
7
+ import { describe, test, expect, beforeEach, afterEach, vi } from "vitest";
8
+ import type { Tool, ToolContext, ToolResult } from "../../tool/types";
9
+
10
+ // Mock the tool factory
11
+ const createStopTool = async (backgroundTaskManager: any): Promise<Tool> => {
12
+ const module = await import("./stop-tool");
13
+ return module.createStopTool(backgroundTaskManager);
14
+ };
15
+
16
+ describe("stop_task Tool", () => {
17
+ let mockBackgroundTaskManager: any;
18
+ let tool: Tool;
19
+
20
+ beforeEach(async () => {
21
+ // Mock BackgroundTaskManager
22
+ mockBackgroundTaskManager = {
23
+ stopTask: vi.fn(),
24
+ getTask: vi.fn(),
25
+ };
26
+
27
+ tool = await createStopTool(mockBackgroundTaskManager);
28
+ });
29
+
30
+ afterEach(() => {
31
+ vi.clearAllMocks();
32
+ });
33
+
34
+ describe("Tool Definition", () => {
35
+ test("should have correct tool name", () => {
36
+ expect(tool.name).toBe("stop_task");
37
+ });
38
+
39
+ test("should have description", () => {
40
+ expect(tool.description).toBeDefined();
41
+ expect(tool.description.length).toBeGreaterThan(0);
42
+ });
43
+
44
+ test("should have parameters schema", () => {
45
+ expect(tool.parameters).toBeDefined();
46
+ expect(tool.parameters.shape).toBeDefined();
47
+ });
48
+
49
+ test("should have task_id field in parameters", () => {
50
+ const shape = tool.parameters.shape;
51
+ expect(shape.task_id).toBeDefined();
52
+ });
53
+ });
54
+
55
+ describe("Execution", () => {
56
+ test("should stop a running task successfully", async () => {
57
+ const mockTask = {
58
+ id: "task_123",
59
+ description: "Test task",
60
+ status: "running",
61
+ startedAt: Date.now() - 60000,
62
+ };
63
+
64
+ mockBackgroundTaskManager.stopTask.mockReturnValue({
65
+ success: true,
66
+ task: mockTask,
67
+ message: "Task has been stopped",
68
+ });
69
+
70
+ const result = await tool.execute(
71
+ { task_id: "task_123" },
72
+ { session_id: "test-session" }
73
+ );
74
+
75
+ expect(result.success).toBe(true);
76
+ expect(result.output).toContain("Task stopped successfully");
77
+ expect(mockBackgroundTaskManager.stopTask).toHaveBeenCalledWith("task_123");
78
+ });
79
+
80
+ test("should return error when task not found", async () => {
81
+ mockBackgroundTaskManager.stopTask.mockReturnValue({
82
+ success: false,
83
+ message: "Task not found",
84
+ });
85
+
86
+ const result = await tool.execute(
87
+ { task_id: "non-existent-task" },
88
+ { session_id: "test-session" }
89
+ );
90
+
91
+ expect(result.success).toBe(false);
92
+ expect(result.error).toContain("Task not found");
93
+ });
94
+
95
+ test("should return error when task already completed", async () => {
96
+ const mockTask = {
97
+ id: "task_456",
98
+ description: "Completed task",
99
+ status: "completed",
100
+ };
101
+
102
+ mockBackgroundTaskManager.stopTask.mockReturnValue({
103
+ success: false,
104
+ task: mockTask,
105
+ message: "Cannot stop task with status: completed",
106
+ });
107
+
108
+ const result = await tool.execute(
109
+ { task_id: "task_456" },
110
+ { session_id: "test-session" }
111
+ );
112
+
113
+ expect(result.success).toBe(false);
114
+ expect(result.output).toContain("Cannot stop task");
115
+ });
116
+
117
+ test("should include task info in output", async () => {
118
+ const mockTask = {
119
+ id: "task_789",
120
+ description: "Running task",
121
+ status: "running",
122
+ startedAt: Date.now() - 120000,
123
+ };
124
+
125
+ mockBackgroundTaskManager.stopTask.mockReturnValue({
126
+ success: true,
127
+ task: mockTask,
128
+ message: "Task has been stopped",
129
+ });
130
+
131
+ const result = await tool.execute(
132
+ { task_id: "task_789" },
133
+ { session_id: "test-session" }
134
+ );
135
+
136
+ expect(result.output).toContain("task_789");
137
+ expect(result.output).toContain("Running task");
138
+ });
139
+ });
140
+ });
@@ -0,0 +1,119 @@
1
+ /**
2
+ * @fileoverview stop_task Tool
3
+ *
4
+ * 基于 agent-core 的 stop_task 实现
5
+ * 参考: packages/core/src/core/environment/expend/task/stop-task-tool.ts
6
+ *
7
+ * 功能:
8
+ * - 停止正在运行的后台任务
9
+ */
10
+
11
+ import { z } from "zod";
12
+ import type { Tool, ToolContext, ToolResult } from "../../tool/types";
13
+ import type { BackgroundTaskManager } from "./delegate-tool";
14
+
15
+ const StopTaskToolParameters = z.object({
16
+ task_id: z.string().describe("The ID of the background task to stop"),
17
+ });
18
+
19
+ type StopTaskToolParams = z.infer<typeof StopTaskToolParameters>;
20
+
21
+ const STOP_TASK_DESCRIPTION = `Stop a running background task.
22
+
23
+ Use this tool to stop a background task that is currently running. This is useful when:
24
+ - The user wants to cancel a long-running task
25
+ - The task is taking too long and needs to be stopped
26
+ - The user wants to change direction and doesn't need the task result anymore
27
+
28
+ When stopped, the task will be terminated immediately and you will receive a confirmation.
29
+
30
+ Parameters:
31
+ - task_id: The ID of the background task to stop (obtained from the delegate_task response)`;
32
+
33
+ function formatDuration(ms: number): string {
34
+ const seconds = Math.floor(ms / 1000);
35
+ const minutes = Math.floor(seconds / 60);
36
+ const hours = Math.floor(minutes / 60);
37
+
38
+ if (hours > 0) {
39
+ return `${hours}h ${minutes % 60}m ${seconds % 60}s`;
40
+ } else if (minutes > 0) {
41
+ return `${minutes}m ${seconds % 60}s`;
42
+ } else {
43
+ return `${seconds}s`;
44
+ }
45
+ }
46
+
47
+ export function createStopTool(taskManager: BackgroundTaskManager): Tool {
48
+ return {
49
+ name: "stop_task",
50
+ description: STOP_TASK_DESCRIPTION,
51
+ parameters: StopTaskToolParameters,
52
+ execute: async (args: unknown, ctx: ToolContext): Promise<ToolResult> => {
53
+ const startTime = Date.now();
54
+ const params = StopTaskToolParameters.parse(args);
55
+ const { task_id } = params;
56
+
57
+ const result = taskManager.stopTask(task_id);
58
+
59
+ if (result.success) {
60
+ const task = result.task!;
61
+ const elapsedMs = task.startedAt ? Date.now() - task.startedAt : Date.now() - task.createdAt;
62
+
63
+ const output = [
64
+ `✅ Task stopped successfully`,
65
+ "",
66
+ `📋 Task ID: ${task_id}`,
67
+ `📝 Description: ${task.description}`,
68
+ `🔄 Status: ${task.status} → stopped`,
69
+ `⏱️ Elapsed Time: ${formatDuration(elapsedMs)}`,
70
+ "",
71
+ result.message,
72
+ ].join("\n");
73
+
74
+ return {
75
+ success: true,
76
+ output,
77
+ metadata: {
78
+ execution_time_ms: Date.now() - startTime,
79
+ task_id,
80
+ previous_status: task.status,
81
+ },
82
+ };
83
+ } else {
84
+ const task = result.task;
85
+ let output: string;
86
+
87
+ if (task) {
88
+ output = [
89
+ `⚠️ Cannot stop task`,
90
+ "",
91
+ `📋 Task ID: ${task_id}`,
92
+ `📝 Description: ${task.description}`,
93
+ `🔄 Current Status: ${task.status}`,
94
+ "",
95
+ result.message,
96
+ ].join("\n");
97
+ } else {
98
+ output = [
99
+ `❌ Task not found`,
100
+ "",
101
+ `📋 Task ID: ${task_id}`,
102
+ "",
103
+ result.message,
104
+ ].join("\n");
105
+ }
106
+
107
+ return {
108
+ success: false,
109
+ output,
110
+ error: result.message,
111
+ metadata: {
112
+ execution_time_ms: Date.now() - startTime,
113
+ task_id,
114
+ },
115
+ };
116
+ }
117
+ },
118
+ };
119
+ }
@@ -0,0 +1,178 @@
1
+ /**
2
+ * @fileoverview Task Events Tests
3
+ */
4
+
5
+ import { describe, test, expect } from "vitest";
6
+ import {
7
+ TaskEventTypes,
8
+ createTaskStartedPayload,
9
+ createTaskProgressPayload,
10
+ createTaskCompletedPayload,
11
+ } from "./task-events";
12
+ import type { BackgroundTask } from "./delegate-tool";
13
+
14
+ describe("Task Events", () => {
15
+ describe("TaskEventTypes", () => {
16
+ test("should have all required event types", () => {
17
+ expect(TaskEventTypes.TASK_STARTED).toBe("task.started");
18
+ expect(TaskEventTypes.TASK_PROGRESS).toBe("task.progress");
19
+ expect(TaskEventTypes.TASK_COMPLETED).toBe("task.completed");
20
+ expect(TaskEventTypes.TASK_FAILED).toBe("task.failed");
21
+ expect(TaskEventTypes.TASK_TIMEOUT).toBe("task.timeout");
22
+ expect(TaskEventTypes.TASK_STOPPED).toBe("task.stopped");
23
+ });
24
+
25
+ test("event types should be unique strings", () => {
26
+ const types = Object.values(TaskEventTypes);
27
+ const uniqueTypes = new Set(types);
28
+ expect(uniqueTypes.size).toBe(types.length);
29
+ });
30
+ });
31
+
32
+ describe("createTaskStartedPayload", () => {
33
+ test("should create correct payload", () => {
34
+ const task: BackgroundTask = {
35
+ id: "task_123",
36
+ subSessionId: "sub_session_456",
37
+ parentSessionId: "parent_789",
38
+ description: "Test task",
39
+ subagentType: "general",
40
+ status: "pending",
41
+ createdAt: Date.now(),
42
+ taskId: 100,
43
+ };
44
+
45
+ const payload = createTaskStartedPayload(task, "parent_789");
46
+
47
+ expect(payload.taskId).toBe("task_123");
48
+ expect(payload.subSessionId).toBe("sub_session_456");
49
+ expect(payload.parentSessionId).toBe("parent_789");
50
+ expect(payload.description).toBe("Test task");
51
+ expect(payload.subagentType).toBe("general");
52
+ expect(payload.associatedTaskId).toBe(100);
53
+ });
54
+
55
+ test("should handle missing taskId", () => {
56
+ const task: BackgroundTask = {
57
+ id: "task_123",
58
+ subSessionId: "sub_session_456",
59
+ parentSessionId: "parent_789",
60
+ description: "Test task",
61
+ subagentType: "general",
62
+ status: "pending",
63
+ createdAt: Date.now(),
64
+ };
65
+
66
+ const payload = createTaskStartedPayload(task, "parent_789");
67
+
68
+ expect(payload.associatedTaskId).toBeUndefined();
69
+ });
70
+ });
71
+
72
+ describe("createTaskProgressPayload", () => {
73
+ test("should create correct payload", () => {
74
+ const task: BackgroundTask = {
75
+ id: "task_123",
76
+ subSessionId: "sub_session_456",
77
+ parentSessionId: "parent_789",
78
+ description: "Test task",
79
+ subagentType: "general",
80
+ status: "running",
81
+ createdAt: Date.now(),
82
+ progress: 50,
83
+ progressMessage: "Processing...",
84
+ };
85
+
86
+ const payload = createTaskProgressPayload(task, "parent_789");
87
+
88
+ expect(payload.taskId).toBe("task_123");
89
+ expect(payload.status).toBe("running");
90
+ expect(payload.progress).toBe(50);
91
+ expect(payload.progressMessage).toBe("Processing...");
92
+ });
93
+ });
94
+
95
+ describe("createTaskCompletedPayload", () => {
96
+ test("should create completed payload", () => {
97
+ const task: BackgroundTask = {
98
+ id: "task_123",
99
+ subSessionId: "sub_session_456",
100
+ parentSessionId: "parent_789",
101
+ description: "Test task",
102
+ subagentType: "general",
103
+ status: "completed",
104
+ createdAt: Date.now(),
105
+ startedAt: Date.now() - 10000,
106
+ completedAt: Date.now(),
107
+ result: "Task completed successfully",
108
+ taskId: 100,
109
+ };
110
+
111
+ const payload = createTaskCompletedPayload(task, "parent_789", 10000);
112
+
113
+ expect(payload.taskId).toBe("task_123");
114
+ expect(payload.status).toBe("completed");
115
+ expect(payload.result).toBe("Task completed successfully");
116
+ expect(payload.executionTimeMs).toBe(10000);
117
+ expect(payload.associatedTaskId).toBe(100);
118
+ });
119
+
120
+ test("should create failed payload", () => {
121
+ const task: BackgroundTask = {
122
+ id: "task_123",
123
+ subSessionId: "sub_session_456",
124
+ parentSessionId: "parent_789",
125
+ description: "Test task",
126
+ subagentType: "general",
127
+ status: "failed",
128
+ createdAt: Date.now(),
129
+ startedAt: Date.now() - 5000,
130
+ completedAt: Date.now(),
131
+ error: "Something went wrong",
132
+ taskId: 100,
133
+ };
134
+
135
+ const payload = createTaskCompletedPayload(task, "parent_789", 5000);
136
+
137
+ expect(payload.status).toBe("failed");
138
+ expect(payload.error).toBe("Something went wrong");
139
+ });
140
+
141
+ test("should create timeout payload", () => {
142
+ const task: BackgroundTask = {
143
+ id: "task_123",
144
+ subSessionId: "sub_session_456",
145
+ parentSessionId: "parent_789",
146
+ description: "Test task",
147
+ subagentType: "general",
148
+ status: "timeout",
149
+ createdAt: Date.now(),
150
+ startedAt: Date.now() - 900000,
151
+ completedAt: Date.now(),
152
+ error: "Task execution timeout after 900000ms",
153
+ };
154
+
155
+ const payload = createTaskCompletedPayload(task, "parent_789", 900000);
156
+
157
+ expect(payload.status).toBe("timeout");
158
+ });
159
+
160
+ test("should create stopped payload", () => {
161
+ const task: BackgroundTask = {
162
+ id: "task_123",
163
+ subSessionId: "sub_session_456",
164
+ parentSessionId: "parent_789",
165
+ description: "Test task",
166
+ subagentType: "general",
167
+ status: "stopped",
168
+ createdAt: Date.now(),
169
+ startedAt: Date.now() - 3000,
170
+ completedAt: Date.now(),
171
+ };
172
+
173
+ const payload = createTaskCompletedPayload(task, "parent_789", 3000);
174
+
175
+ expect(payload.status).toBe("stopped");
176
+ });
177
+ });
178
+ });
@@ -0,0 +1,143 @@
1
+ /**
2
+ * @fileoverview Task Event Types
3
+ *
4
+ * 定义任务相关的 EnvEvent 类型
5
+ */
6
+
7
+ import type { EnvEvent } from "../../types";
8
+
9
+ // ============================================================================
10
+ // Task Event Types
11
+ // ============================================================================
12
+
13
+ /**
14
+ * 任务事件类型枚举
15
+ */
16
+ export const TaskEventTypes = {
17
+ /** 任务开始执行 */
18
+ TASK_STARTED: "task.started",
19
+ /** 任务进度更新 */
20
+ TASK_PROGRESS: "task.progress",
21
+ /** 任务完成 */
22
+ TASK_COMPLETED: "task.completed",
23
+ /** 任务失败 */
24
+ TASK_FAILED: "task.failed",
25
+ /** 任务超时 */
26
+ TASK_TIMEOUT: "task.timeout",
27
+ /** 任务被停止 */
28
+ TASK_STOPPED: "task.stopped",
29
+ } as const;
30
+
31
+ export type TaskEventType = (typeof TaskEventTypes)[keyof typeof TaskEventTypes];
32
+
33
+ // ============================================================================
34
+ // Task Event Payloads
35
+ // ============================================================================
36
+
37
+ /**
38
+ * 任务开始事件负载
39
+ */
40
+ export interface TaskStartedPayload {
41
+ taskId: string;
42
+ subSessionId: string;
43
+ parentSessionId: string;
44
+ description: string;
45
+ subagentType: string;
46
+ associatedTaskId?: number;
47
+ }
48
+
49
+ /**
50
+ * 任务进度事件负载
51
+ */
52
+ export interface TaskProgressPayload {
53
+ taskId: string;
54
+ subSessionId: string;
55
+ parentSessionId: string;
56
+ status: string;
57
+ progress?: number;
58
+ progressMessage?: string;
59
+ description?: string;
60
+ subagentType?: string;
61
+ }
62
+
63
+ /**
64
+ * 任务完成事件负载
65
+ */
66
+ export interface TaskCompletedPayload {
67
+ taskId: string;
68
+ subSessionId: string;
69
+ parentSessionId: string;
70
+ status: "completed" | "failed" | "timeout" | "stopped";
71
+ result?: string;
72
+ error?: string;
73
+ executionTimeMs: number;
74
+ associatedTaskId?: number;
75
+ description?: string;
76
+ subagentType?: string;
77
+ }
78
+
79
+ /**
80
+ * 任务事件基类
81
+ */
82
+ export interface BaseTaskEventPayload {
83
+ taskId: string;
84
+ subSessionId: string;
85
+ parentSessionId: string;
86
+ description: string;
87
+ subagentType: string;
88
+ associatedTaskId?: number;
89
+ }
90
+
91
+ // ============================================================================
92
+ // Event Creators
93
+ // ============================================================================
94
+
95
+ import type { BackgroundTask } from "./delegate-tool";
96
+
97
+ /**
98
+ * 从 BackgroundTask 创建事件负载
99
+ */
100
+ export function createTaskStartedPayload(task: BackgroundTask, parentSessionId: string): TaskStartedPayload {
101
+ return {
102
+ taskId: task.id,
103
+ subSessionId: task.subSessionId,
104
+ parentSessionId,
105
+ description: task.description,
106
+ subagentType: task.subagentType,
107
+ associatedTaskId: task.taskId,
108
+ };
109
+ }
110
+
111
+ export function createTaskProgressPayload(task: BackgroundTask, parentSessionId: string): TaskProgressPayload {
112
+ return {
113
+ taskId: task.id,
114
+ subSessionId: task.subSessionId,
115
+ parentSessionId,
116
+ status: task.status,
117
+ progress: task.progress,
118
+ progressMessage: task.progressMessage,
119
+ // 添加 description 和 subagentType 以便 EventMessageFormatter 使用
120
+ description: task.description,
121
+ subagentType: task.subagentType,
122
+ };
123
+ }
124
+
125
+ export function createTaskCompletedPayload(
126
+ task: BackgroundTask,
127
+ parentSessionId: string,
128
+ executionTimeMs: number
129
+ ): TaskCompletedPayload {
130
+ return {
131
+ taskId: task.id,
132
+ subSessionId: task.subSessionId,
133
+ parentSessionId,
134
+ status: task.status as "completed" | "failed" | "timeout" | "stopped",
135
+ result: task.result,
136
+ error: task.error,
137
+ executionTimeMs,
138
+ associatedTaskId: task.taskId,
139
+ // 添加 description 和 subagentType 以便 EventMessageFormatter 使用
140
+ description: task.description,
141
+ subagentType: task.subagentType,
142
+ };
143
+ }
@@ -0,0 +1,92 @@
1
+ /**
2
+ * @fileoverview Task Hook Contexts Tests
3
+ */
4
+
5
+ import { describe, test, expect } from "vitest";
6
+ import type {
7
+ TaskCreateContext,
8
+ TaskUpdateContext,
9
+ TaskDeleteContext,
10
+ TaskDelegateContext,
11
+ TaskOperationCreateContext,
12
+ TaskHookContextMap,
13
+ } from "./contexts";
14
+
15
+ describe("Task Hook Contexts", () => {
16
+ test("TaskCreateContext should have required fields", () => {
17
+ const ctx: TaskCreateContext = {
18
+ options: {
19
+ title: "Test Task",
20
+ sessionId: "test-session",
21
+ },
22
+ sessionId: "test-session",
23
+ tagService: {} as any,
24
+ };
25
+
26
+ expect(ctx.options.title).toBe("Test Task");
27
+ expect(ctx.sessionId).toBe("test-session");
28
+ expect(ctx.tagService).toBeDefined();
29
+ });
30
+
31
+ test("TaskUpdateContext should have required fields", () => {
32
+ const ctx: TaskUpdateContext = {
33
+ id: 1,
34
+ options: { title: "Updated Task" },
35
+ tagService: {} as any,
36
+ };
37
+
38
+ expect(ctx.id).toBe(1);
39
+ expect(ctx.options.title).toBe("Updated Task");
40
+ });
41
+
42
+ test("TaskDeleteContext should have required fields", () => {
43
+ const ctx: TaskDeleteContext = { id: 1 };
44
+ expect(ctx.id).toBe(1);
45
+ });
46
+
47
+ test("TaskDelegateContext should have required fields", () => {
48
+ const ctx: TaskDelegateContext = {
49
+ taskId: 1,
50
+ prompt: "Do something",
51
+ subagentType: "general",
52
+ background: false,
53
+ tagService: {} as any,
54
+ };
55
+
56
+ expect(ctx.taskId).toBe(1);
57
+ expect(ctx.prompt).toBe("Do something");
58
+ expect(ctx.subagentType).toBe("general");
59
+ expect(ctx.background).toBe(false);
60
+ });
61
+
62
+ test("TaskOperationCreateContext should have required fields", () => {
63
+ const ctx: TaskOperationCreateContext = {
64
+ options: {
65
+ taskId: 1,
66
+ sessionId: "test-session",
67
+ actionType: "create",
68
+ actionTitle: "Test",
69
+ },
70
+ };
71
+
72
+ expect(ctx.options.taskId).toBe(1);
73
+ expect(ctx.options.actionType).toBe("create");
74
+ });
75
+
76
+ test("TaskHookContextMap should map all hook points", () => {
77
+ const map: TaskHookContextMap = {
78
+ "task:before.create": {} as any,
79
+ "task:after.create": {} as any,
80
+ "task:before.update": {} as any,
81
+ "task:after.update": {} as any,
82
+ "task:before.delete": {} as any,
83
+ "task:after.delete": {} as any,
84
+ "task:delegate:before": {} as any,
85
+ "task:delegate:after": {} as any,
86
+ "task:operation:before.create": {} as any,
87
+ "task:operation:after.create": {} as any,
88
+ };
89
+
90
+ expect(Object.keys(map)).toHaveLength(10);
91
+ });
92
+ });