@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,516 @@
1
+ /**
2
+ * @fileoverview Environment Lifecycle Integration Tests
3
+ *
4
+ * 测试 Environment 生命周期中组件 start() 方法的正确调用
5
+ *
6
+ * 背景:依赖 start() 生命周期钩子的组件(如 TaskComponent, MemoryComponent)
7
+ * 需要在 start() 中注册工具到 ToolComponent
8
+ *
9
+ * 验收标准:
10
+ * 1. env.start() 必须在 env.init() 之后被调用
11
+ * 2. TaskComponent.start() 必须被调用并注册 task tools
12
+ * 3. MemoryComponent.start() 必须被调用并注册 memory tools
13
+ * 4. AgentComponent 能从 ToolComponent 获取到这些工具
14
+ */
15
+
16
+ import { describe, it, expect, vi, beforeEach, afterEach, test } from "vitest";
17
+ import { BaseEnvironment } from "./environment";
18
+ import { BaseComponent } from "./component";
19
+ import type { Tool } from "../tool/types";
20
+
21
+ // ============================================================================
22
+ // Mock ToolComponent
23
+ // ============================================================================
24
+
25
+ interface RegisteredTool {
26
+ name: string;
27
+ description?: string;
28
+ execute: Function;
29
+ }
30
+
31
+ class MockToolComponent extends BaseComponent {
32
+ name = "tool";
33
+ version = "1.0.0";
34
+
35
+ private tools = new Map<string, RegisteredTool>();
36
+
37
+ // Track calls for verification
38
+ calls = {
39
+ init: 0,
40
+ start: 0,
41
+ stop: 0,
42
+ register: [] as string[],
43
+ unregister: [] as string[],
44
+ };
45
+
46
+ async onInit(): Promise<void> {
47
+ this.calls.init++;
48
+ }
49
+
50
+ async onStart(): Promise<void> {
51
+ this.calls.start++;
52
+ }
53
+
54
+ async onStop(): Promise<void> {
55
+ this.calls.stop++;
56
+ }
57
+
58
+ register(tool: Tool): void {
59
+ this.tools.set(tool.name, tool as RegisteredTool);
60
+ this.calls.register.push(tool.name);
61
+ }
62
+
63
+ unregister(name: string): void {
64
+ this.tools.delete(name);
65
+ this.calls.unregister.push(name);
66
+ }
67
+
68
+ getTool(name: string): RegisteredTool | undefined {
69
+ return this.tools.get(name);
70
+ }
71
+
72
+ listTools(): RegisteredTool[] {
73
+ return Array.from(this.tools.values());
74
+ }
75
+
76
+ getToolCount(): number {
77
+ return this.tools.size;
78
+ }
79
+ }
80
+
81
+ // ============================================================================
82
+ // Mock TaskComponent (依赖 start() 注册工具)
83
+ // ============================================================================
84
+
85
+ class MockTaskComponent extends BaseComponent {
86
+ name = "task";
87
+ version = "1.0.0";
88
+
89
+ private toolComponent?: MockToolComponent;
90
+
91
+ // Track lifecycle
92
+ calls = {
93
+ init: 0,
94
+ start: 0,
95
+ stop: 0,
96
+ registerTools: 0,
97
+ };
98
+
99
+ // Expected tools that should be registered
100
+ static readonly EXPECTED_TOOLS = [
101
+ "task_create",
102
+ "task_get",
103
+ "task_list",
104
+ "task_update",
105
+ "task_delete",
106
+ "task_complete",
107
+ "operation_create",
108
+ "operation_get",
109
+ "operation_list",
110
+ "operation_update",
111
+ "operation_delete",
112
+ "task_delegate",
113
+ "task_stop",
114
+ ];
115
+
116
+ async onInit(): Promise<void> {
117
+ this.calls.init++;
118
+ }
119
+
120
+ async onStart(): Promise<void> {
121
+ this.calls.start++;
122
+
123
+ // 获取 ToolComponent(必须在 start() 中获取,因为此时其他组件已初始化)
124
+ if (this.env) {
125
+ this.toolComponent = this.env.getComponent("tool") as unknown as MockToolComponent;
126
+ }
127
+
128
+ if (this.toolComponent) {
129
+ await this.registerTools();
130
+ }
131
+ }
132
+
133
+ async onStop(): Promise<void> {
134
+ this.calls.stop++;
135
+ }
136
+
137
+ private async registerTools(): Promise<void> {
138
+ if (!this.toolComponent) return;
139
+
140
+ this.calls.registerTools++;
141
+
142
+ // 注册所有 task tools
143
+ for (const toolName of MockTaskComponent.EXPECTED_TOOLS) {
144
+ this.toolComponent.register({
145
+ name: toolName,
146
+ description: `Task tool: ${toolName}`,
147
+ execute: vi.fn(),
148
+ });
149
+ }
150
+ }
151
+ }
152
+
153
+ // ============================================================================
154
+ // Mock MemoryComponent (依赖 start() 注册工具)
155
+ // ============================================================================
156
+
157
+ class MockMemoryComponent extends BaseComponent {
158
+ name = "memory";
159
+ version = "1.0.0";
160
+
161
+ private toolComponent?: MockToolComponent;
162
+
163
+ // Track lifecycle
164
+ calls = {
165
+ init: 0,
166
+ start: 0,
167
+ stop: 0,
168
+ registerTools: 0,
169
+ };
170
+
171
+ // Expected tools that should be registered
172
+ static readonly EXPECTED_TOOLS = [
173
+ "record_memory",
174
+ "recall_memory",
175
+ ];
176
+
177
+ async onInit(): Promise<void> {
178
+ this.calls.init++;
179
+ }
180
+
181
+ async onStart(): Promise<void> {
182
+ this.calls.start++;
183
+
184
+ // 获取 ToolComponent
185
+ if (this.env) {
186
+ this.toolComponent = this.env.getComponent("tool") as unknown as MockToolComponent;
187
+ }
188
+
189
+ if (this.toolComponent) {
190
+ await this.registerTools();
191
+ }
192
+ }
193
+
194
+ async onStop(): Promise<void> {
195
+ this.calls.stop++;
196
+ }
197
+
198
+ private async registerTools(): Promise<void> {
199
+ if (!this.toolComponent) return;
200
+
201
+ this.calls.registerTools++;
202
+
203
+ // 注册所有 memory tools
204
+ for (const toolName of MockMemoryComponent.EXPECTED_TOOLS) {
205
+ this.toolComponent.register({
206
+ name: toolName,
207
+ description: `Memory tool: ${toolName}`,
208
+ execute: vi.fn(),
209
+ });
210
+ }
211
+ }
212
+ }
213
+
214
+ // ============================================================================
215
+ // Mock AgentComponent (用于验证工具可用性)
216
+ // ============================================================================
217
+
218
+ class MockAgentComponent extends BaseComponent {
219
+ name = "agent";
220
+ version = "1.0.0";
221
+
222
+ private toolComponent?: MockToolComponent;
223
+ private llmComponent?: any;
224
+
225
+ async onInit(): Promise<void> {
226
+ // AgentComponent 的初始化逻辑
227
+ }
228
+
229
+ refreshDependencies(): void {
230
+ if (this.env) {
231
+ this.toolComponent = this.env.getComponent("tool") as unknown as MockToolComponent;
232
+ this.llmComponent = this.env.getComponent("llm");
233
+ }
234
+ }
235
+
236
+ getAvailableTools(): Tool[] {
237
+ if (!this.toolComponent) return [];
238
+ return this.toolComponent.listTools() as unknown as Tool[];
239
+ }
240
+ }
241
+
242
+ // ============================================================================
243
+ // Mock ConfigComponent
244
+ // ============================================================================
245
+
246
+ class MockConfigComponent extends BaseComponent {
247
+ name = "config";
248
+ version = "1.0.0";
249
+
250
+ async onInit(): Promise<void> {
251
+ // ConfigComponent 初始化
252
+ }
253
+ }
254
+
255
+ // ============================================================================
256
+ // Tests
257
+ // ============================================================================
258
+
259
+ describe("Environment Lifecycle - Component start() invocation", () => {
260
+
261
+ describe("Complete lifecycle: init() + start()", () => {
262
+
263
+ it("should call start() to register tools from TaskComponent and MemoryComponent", async () => {
264
+ // 创建环境
265
+ const env = new BaseEnvironment({ name: "test-env" });
266
+
267
+ // 创建并注册 mock components
268
+ const toolComponent = new MockToolComponent();
269
+ const taskComponent = new MockTaskComponent();
270
+ const memoryComponent = new MockMemoryComponent();
271
+ const agentComponent = new MockAgentComponent();
272
+
273
+ env.registerComponent(toolComponent);
274
+ env.registerComponent(taskComponent);
275
+ env.registerComponent(memoryComponent);
276
+ env.registerComponent(agentComponent);
277
+
278
+ // 调用完整的生命周期:init() + start()
279
+ await env.init();
280
+ await env.start();
281
+
282
+ // 验证:init() 和 start() 都被调用
283
+ expect(taskComponent.calls.init).toBe(1);
284
+ expect(taskComponent.calls.start).toBe(1);
285
+ expect(memoryComponent.calls.init).toBe(1);
286
+ expect(memoryComponent.calls.start).toBe(1);
287
+
288
+ // 验证:工具被注册
289
+ expect(taskComponent.calls.registerTools).toBe(1);
290
+ expect(memoryComponent.calls.registerTools).toBe(1);
291
+
292
+ // 验证:ToolComponent 收到注册
293
+ const expectedToolCount = MockTaskComponent.EXPECTED_TOOLS.length + MockMemoryComponent.EXPECTED_TOOLS.length;
294
+ expect(toolComponent.calls.register).toHaveLength(expectedToolCount);
295
+
296
+ // 验证:AgentComponent 能获取到工具
297
+ agentComponent.refreshDependencies();
298
+ const availableTools = agentComponent.getAvailableTools();
299
+
300
+ expect(availableTools.length).toBe(expectedToolCount);
301
+
302
+ // 验证:包含所有 task tools
303
+ for (const toolName of MockTaskComponent.EXPECTED_TOOLS) {
304
+ expect(availableTools.find(t => t.name === toolName)).toBeDefined();
305
+ }
306
+
307
+ // 验证:包含所有 memory tools
308
+ for (const toolName of MockMemoryComponent.EXPECTED_TOOLS) {
309
+ expect(availableTools.find(t => t.name === toolName)).toBeDefined();
310
+ }
311
+
312
+ // 清理
313
+ await env.stop();
314
+ });
315
+
316
+ });
317
+
318
+ describe("Component initialization order", () => {
319
+
320
+ it("should initialize ConfigComponent first, then other components", async () => {
321
+ const env = new BaseEnvironment({ name: "test-env" });
322
+
323
+ const initOrder: string[] = [];
324
+
325
+ class TrackedComponent extends BaseComponent {
326
+ name: string;
327
+
328
+ constructor(name: string) {
329
+ super();
330
+ this.name = name;
331
+ }
332
+
333
+ async onInit(): Promise<void> {
334
+ initOrder.push(`init:${this.name}`);
335
+ }
336
+
337
+ async onStart(): Promise<void> {
338
+ initOrder.push(`start:${this.name}`);
339
+ }
340
+ }
341
+
342
+ // 注册顺序不重要,重要的是 ConfigComponent 应该在 init 阶段最先初始化
343
+ env.registerComponent(new TrackedComponent("tool"));
344
+ env.registerComponent(new TrackedComponent("agent"));
345
+ env.registerComponent(new TrackedComponent("config"));
346
+ env.registerComponent(new TrackedComponent("task"));
347
+ env.registerComponent(new TrackedComponent("memory"));
348
+
349
+ await env.init();
350
+ await env.start();
351
+
352
+ // 验证:init 阶段 ConfigComponent 最先
353
+ expect(initOrder[0]).toBe("init:config");
354
+
355
+ // 验证:start 阶段顺序按注册顺序
356
+ const startOrder = initOrder.filter(s => s.startsWith("start:"));
357
+ // ConfigComponent 应该在 start 阶段也有记录
358
+ expect(startOrder.length).toBeGreaterThan(0);
359
+
360
+ await env.stop();
361
+ });
362
+
363
+ });
364
+
365
+ describe("Tool availability after complete lifecycle", () => {
366
+
367
+ it("should provide complete tool set to AgentComponent after init() + start()", async () => {
368
+ // 模拟真实的 Environment 创建流程
369
+ const env = new BaseEnvironment({ name: "test-env" });
370
+
371
+ // 创建 components
372
+ const configComponent = new MockConfigComponent();
373
+ const toolComponent = new MockToolComponent();
374
+ const taskComponent = new MockTaskComponent();
375
+ const memoryComponent = new MockMemoryComponent();
376
+ const agentComponent = new MockAgentComponent();
377
+
378
+ // 注册
379
+ env.registerComponent(configComponent);
380
+ env.registerComponent(toolComponent);
381
+ env.registerComponent(taskComponent);
382
+ env.registerComponent(memoryComponent);
383
+ env.registerComponent(agentComponent);
384
+
385
+ // 完整的生命周期
386
+ await env.init();
387
+ await env.start();
388
+
389
+ // 刷新 AgentComponent 的依赖
390
+ agentComponent.refreshDependencies();
391
+
392
+ // 获取可用工具
393
+ const availableTools = agentComponent.getAvailableTools();
394
+
395
+ // 验证:工具总数
396
+ const expectedCount = MockTaskComponent.EXPECTED_TOOLS.length + MockMemoryComponent.EXPECTED_TOOLS.length;
397
+ expect(availableTools.length).toBe(expectedCount);
398
+
399
+ // 验证:task tools 都存在
400
+ for (const toolName of MockTaskComponent.EXPECTED_TOOLS) {
401
+ expect(availableTools.some(t => t.name === toolName)).toBe(true);
402
+ }
403
+
404
+ // 验证:memory tools 都存在
405
+ for (const toolName of MockMemoryComponent.EXPECTED_TOOLS) {
406
+ expect(availableTools.some(t => t.name === toolName)).toBe(true);
407
+ }
408
+
409
+ // 清理
410
+ await env.stop();
411
+ });
412
+
413
+ });
414
+
415
+ });
416
+
417
+ // ============================================================================
418
+ // Regression Tests: Prevent future regressions
419
+ // ============================================================================
420
+
421
+ describe("Environment lifecycle regression prevention", () => {
422
+
423
+ it("should ensure start() is called for all registered components", async () => {
424
+ const env = new BaseEnvironment({ name: "regression-test" });
425
+
426
+ const components: BaseComponent[] = [];
427
+ const startCalls: string[] = [];
428
+
429
+ // 创建 5 个组件
430
+ for (let i = 0; i < 5; i++) {
431
+ class TrackedComp extends BaseComponent {
432
+ name = `component_${i}`;
433
+
434
+ async onInit(): Promise<void> {
435
+ this.setStatus("running");
436
+ }
437
+
438
+ async onStart(): Promise<void> {
439
+ startCalls.push(this.name);
440
+ }
441
+ }
442
+
443
+ const comp = new TrackedComp();
444
+ components.push(comp);
445
+ env.registerComponent(comp);
446
+ }
447
+
448
+ // 初始化并启动
449
+ await env.init();
450
+ await env.start();
451
+
452
+ // 验证:所有组件的 start() 都被调用
453
+ expect(startCalls).toHaveLength(5);
454
+ expect(startCalls).toContain("component_0");
455
+ expect(startCalls).toContain("component_1");
456
+ expect(startCalls).toContain("component_2");
457
+ expect(startCalls).toContain("component_3");
458
+ expect(startCalls).toContain("component_4");
459
+
460
+ await env.stop();
461
+ });
462
+
463
+ it("should prevent duplicate start() calls", async () => {
464
+ const env = new BaseEnvironment({ name: "duplicate-test" });
465
+
466
+ let startCount = 0;
467
+
468
+ class CountingComponent extends BaseComponent {
469
+ name = "counting";
470
+
471
+ async onInit(): Promise<void> {
472
+ this.setStatus("running");
473
+ }
474
+
475
+ async onStart(): Promise<void> {
476
+ startCount++;
477
+ }
478
+ }
479
+
480
+ env.registerComponent(new CountingComponent());
481
+
482
+ await env.init();
483
+ await env.start();
484
+ await env.start(); // 重复调用
485
+
486
+ // BaseEnvironment.start() 内部应该有防重复机制
487
+ expect(startCount).toBe(1);
488
+
489
+ await env.stop();
490
+ });
491
+
492
+ it("should have env reference available in component's onStart()", async () => {
493
+ const env = new BaseEnvironment({ name: "env-ref-test" });
494
+
495
+ let envRefInStart: any = null;
496
+
497
+ class TestComponent extends BaseComponent {
498
+ name = "test";
499
+
500
+ async onStart(): Promise<void> {
501
+ envRefInStart = this.env;
502
+ }
503
+ }
504
+
505
+ env.registerComponent(new TestComponent());
506
+
507
+ await env.init();
508
+ await env.start();
509
+
510
+ // 验证:onStart() 中可以访问 env
511
+ expect(envRefInStart).toBe(env);
512
+
513
+ await env.stop();
514
+ });
515
+
516
+ });