@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,503 @@
1
+ /**
2
+ * @fileoverview MemoryComponent - Simplified
3
+ *
4
+ * 记忆管理核心组件
5
+ *
6
+ * 简化设计:
7
+ * - 移除 DraftManager、MemoryOrganizer、AccessLog 依赖
8
+ * - 只保留核心的 memory 文件操作
9
+ * - 提供 recallMemory(scope) 方法支持 project/global scope
10
+ */
11
+
12
+ import { BaseComponent, type ComponentConfig } from "../component";
13
+ import { createLogger } from "../log-trace/logger";
14
+ import type { ToolComponent } from "../tool";
15
+ import type { Tool } from "../tool/types";
16
+ import type {
17
+ MemoryConfig,
18
+ MemoryPath,
19
+ RecordMemoryMode,
20
+ RecordMemoryResult,
21
+ } from "./types";
22
+ import { DEFAULT_MEMORY_CONFIG } from "./memory-config";
23
+ import { createMemoryTools } from "./built-in";
24
+ import { MEMORY_CONFIG_REGISTRATION, MEMORY_DEFAULTS } from "./memory-config-registration";
25
+ import type { ConfigComponent } from "../../config/config-component";
26
+ import { envKeyToConfigKey } from "../../config/env-key";
27
+
28
+ import path from "path";
29
+ import fs from "fs/promises";
30
+
31
+ const logger = createLogger("memory");
32
+
33
+ /**
34
+ * MemoryComponent 配置选项(通过 options 传递)
35
+ */
36
+ export interface MemoryComponentOptions {
37
+ /** ConfigComponent 实例(必填) */
38
+ configComponent: ConfigComponent;
39
+
40
+ /** 配置文件相对路径(可选,基于 XDG_DATA_HOME) */
41
+ configPath?: string;
42
+
43
+ /** 环境变量前缀(可选,默认 "MEMORY") */
44
+ envPrefix?: string;
45
+
46
+ /** 直接传入的配置对象(可选,优先级最高) */
47
+ config?: Partial<MemoryConfig>;
48
+ }
49
+
50
+ /**
51
+ * MemoryComponent - Simplified
52
+ *
53
+ * 简化的记忆管理组件,只负责:
54
+ * - 管理本地文件系统记忆存储
55
+ * - 注册记忆操作工具
56
+ * - 提供目录扫描和缓存
57
+ *
58
+ * 复杂功能已移除:
59
+ * - DraftManager(草稿管理)
60
+ * - MemoryOrganizer(记忆整理)
61
+ * - AccessLog(访问日志)
62
+ */
63
+ export class MemoryComponent extends BaseComponent {
64
+ name = "memory";
65
+ version = "2.0.0";
66
+
67
+ private config!: MemoryConfig;
68
+ private toolComponent?: ToolComponent;
69
+ private configComponent?: ConfigComponent;
70
+
71
+ // 缓存
72
+ private cache: Map<string, { data: unknown; timestamp: number }> = new Map();
73
+
74
+ /** 配置变更 watcher 清理函数 */
75
+ private configWatcher?: () => void;
76
+
77
+ // ====================
78
+ // Lifecycle
79
+ // ====================
80
+
81
+ async init(config?: ComponentConfig): Promise<void> {
82
+ await super.init(config);
83
+
84
+ // 从 options 获取 ConfigComponent
85
+ const options = config?.options as unknown as MemoryComponentOptions | undefined;
86
+ if (!options?.configComponent) {
87
+ throw new Error("ConfigComponent is required for MemoryComponent initialization");
88
+ }
89
+
90
+ this.configComponent = options.configComponent;
91
+ await this.registerConfig(options);
92
+
93
+ logger.info("[MemoryComponent] Initialized (simplified)");
94
+ }
95
+
96
+ /**
97
+ * 注册配置到 ConfigComponent
98
+ */
99
+ private async registerConfig(options: MemoryComponentOptions): Promise<void> {
100
+ const configComponent = this.configComponent;
101
+ if (!configComponent) return;
102
+
103
+ const { configPath, envPrefix, config } = options;
104
+ const prefix = envPrefix ?? "MEMORY";
105
+
106
+ // 1. 使用 registerComponent 注册配置结构
107
+ configComponent.registerComponent(MEMORY_CONFIG_REGISTRATION);
108
+
109
+ // 2. 注册 FileSource
110
+ if (configPath) {
111
+ configComponent.registerSource({
112
+ type: "file",
113
+ relativePath: configPath,
114
+ optional: true,
115
+ watch: false
116
+ });
117
+ }
118
+
119
+ // 3. 注册 EnvSource
120
+ configComponent.registerSource({
121
+ type: "env",
122
+ envPrefix: prefix,
123
+ priority: 20,
124
+ watch: false
125
+ });
126
+
127
+ // 4. 从 sources 加载配置
128
+ await configComponent.load("memory");
129
+
130
+ // 5. 后备方案:直接读取环境变量
131
+ for (const envKey of Object.keys(process.env)) {
132
+ const configKey = envKeyToConfigKey(envKey, prefix, "memory");
133
+ if (!configKey) continue;
134
+ const value = process.env[envKey];
135
+ if (value !== undefined) {
136
+ await configComponent.set(configKey, value);
137
+ }
138
+ }
139
+
140
+ // 6. 设置默认值
141
+ for (const [key, value] of Object.entries(MEMORY_DEFAULTS)) {
142
+ if (configComponent.get(key) === undefined) {
143
+ await configComponent.set(key, value);
144
+ }
145
+ }
146
+
147
+ // 7. 直接配置对象(最高优先级)
148
+ if (config) {
149
+ const flatConfig = this.flattenConfig(config);
150
+ for (const [key, value] of Object.entries(flatConfig)) {
151
+ await configComponent.set(key, value);
152
+ }
153
+ }
154
+
155
+ // 8. 注册配置热更新监听
156
+ this.registerConfigWatcher(configComponent);
157
+
158
+ // 9. 解析最终配置
159
+ this.buildConfig(configComponent);
160
+ }
161
+
162
+ /**
163
+ * 构建最终配置对象
164
+ */
165
+ private buildConfig(configComponent: ConfigComponent): void {
166
+ const recursive = (configComponent.get("memory.recursive") as boolean) ?? true;
167
+ const cacheEnabled = (configComponent.get("memory.cacheEnabled") as boolean) ?? true;
168
+ const cacheTTL = (configComponent.get("memory.cacheTTL") as number) ?? 300000;
169
+ const memoryFile = (configComponent.get("memory.memoryFile") as string) ?? "memory.md";
170
+
171
+ // 从配置获取 memoryPaths
172
+ const memoryPathsConfig = configComponent.get("memory.memoryPaths");
173
+ let memoryPaths: MemoryPath[] = [];
174
+
175
+ if (Array.isArray(memoryPathsConfig)) {
176
+ memoryPaths = memoryPathsConfig as MemoryPath[];
177
+ } else if (typeof memoryPathsConfig === "string") {
178
+ try {
179
+ memoryPaths = JSON.parse(memoryPathsConfig);
180
+ } catch {
181
+ memoryPaths = DEFAULT_MEMORY_CONFIG.memoryPaths;
182
+ }
183
+ }
184
+
185
+ if (memoryPaths.length === 0) {
186
+ memoryPaths = DEFAULT_MEMORY_CONFIG.memoryPaths;
187
+ }
188
+
189
+ this.config = {
190
+ memoryPaths,
191
+ recursive,
192
+ cacheEnabled,
193
+ cacheTTL,
194
+ memoryFile,
195
+ };
196
+ }
197
+
198
+ /**
199
+ * 将配置对象展平为点号路径
200
+ */
201
+ private flattenConfig(
202
+ obj: Record<string, unknown>,
203
+ prefix = "memory"
204
+ ): Record<string, unknown> {
205
+ const result: Record<string, unknown> = {};
206
+ for (const [key, value] of Object.entries(obj)) {
207
+ const fullKey = `${prefix}.${key}`;
208
+ if (value && typeof value === "object" && !Array.isArray(value)) {
209
+ Object.assign(
210
+ result,
211
+ this.flattenConfig(value as Record<string, unknown>, fullKey)
212
+ );
213
+ } else {
214
+ result[fullKey] = value;
215
+ }
216
+ }
217
+ return result;
218
+ }
219
+
220
+ /**
221
+ * 注册配置热更新监听
222
+ */
223
+ private registerConfigWatcher(configComponent: ConfigComponent): void {
224
+ if (typeof configComponent.watch !== "function") {
225
+ return;
226
+ }
227
+
228
+ this.configWatcher = configComponent.watch("memory.*", (event) => {
229
+ this.onConfigChange(event);
230
+ });
231
+ }
232
+
233
+ /**
234
+ * 处理配置变更
235
+ */
236
+ protected onConfigChange(event: { key: string; oldValue?: unknown; newValue?: unknown }): void {
237
+ logger.info(`[MemoryComponent] Config changed: ${event.key}`, {
238
+ oldValue: event.oldValue,
239
+ newValue: event.newValue
240
+ });
241
+ if (this.configComponent) {
242
+ this.buildConfig(this.configComponent);
243
+ }
244
+ this.cache.clear();
245
+ }
246
+
247
+ async start(): Promise<void> {
248
+ await super.start();
249
+
250
+ // 获取 ToolComponent
251
+ this.toolComponent = this.env?.getComponent("tool");
252
+ if (!this.toolComponent) {
253
+ logger.warn("[MemoryComponent] ToolComponent not found, skipping tool registration");
254
+ return;
255
+ }
256
+
257
+ // 注册工具
258
+ await this.registerTools();
259
+
260
+ this.setStatus("running");
261
+ logger.info(`[MemoryComponent] Started with ${this.toolComponent.getToolCount()} tools`);
262
+ }
263
+
264
+ async stop(): Promise<void> {
265
+ // 清理配置 watcher
266
+ if (this.configWatcher) {
267
+ this.configWatcher();
268
+ this.configWatcher = undefined;
269
+ }
270
+
271
+ // 取消注册工具
272
+ if (this.toolComponent) {
273
+ this.toolComponent.unregister("record_memory");
274
+ this.toolComponent.unregister("recall_memory");
275
+ }
276
+
277
+ // 清理缓存
278
+ this.cache.clear();
279
+
280
+ await super.stop();
281
+ logger.info("[MemoryComponent] Stopped");
282
+ }
283
+
284
+ // ====================
285
+ // Tool Registration
286
+ // ====================
287
+
288
+ private async registerTools(): Promise<void> {
289
+ if (!this.toolComponent) return;
290
+
291
+ // 创建工具
292
+ const tools = createMemoryTools(
293
+ (args) => this.recordMemory(args),
294
+ (scope) => this.recallMemory(scope),
295
+ {
296
+ getMemoryPaths: () => this.getMemoryPaths(),
297
+ getMemoryFile: () => this.getMemoryFile(),
298
+ }
299
+ );
300
+
301
+ // 注册到 ToolComponent
302
+ for (const tool of tools) {
303
+ this.toolComponent.register(tool);
304
+ }
305
+
306
+ logger.info("[MemoryComponent] Registered memory tools");
307
+ }
308
+
309
+ // ====================
310
+ // Memory Operations
311
+ // ====================
312
+
313
+ /**
314
+ * 获取所有配置的 memory 路径
315
+ */
316
+ getMemoryPaths(): MemoryPath[] {
317
+ return this.config.memoryPaths;
318
+ }
319
+
320
+ /**
321
+ * 更新 memory paths
322
+ */
323
+ updateMemoryPaths(paths: MemoryPath[]): void {
324
+ this.config.memoryPaths = paths;
325
+ this.clearCache();
326
+ }
327
+
328
+ /**
329
+ * 获取记忆文件名
330
+ */
331
+ getMemoryFile(): string {
332
+ return this.config.memoryFile ?? "memory.md";
333
+ }
334
+
335
+ /**
336
+ * 记录记忆
337
+ *
338
+ * @param args.mode 操作模式
339
+ * @param args.content 记忆内容
340
+ * @param args.title 标题
341
+ * @param args.filename 文件名
342
+ * @param args.scope 作用域 (project/global),用于选择正确的 memory path
343
+ */
344
+ async recordMemory(args: {
345
+ mode: RecordMemoryMode;
346
+ content?: string;
347
+ title?: string;
348
+ filename?: string;
349
+ scope?: "project" | "global";
350
+ }): Promise<RecordMemoryResult | null> {
351
+ const { mode, content, title, filename, scope } = args;
352
+ const memoryFile = filename ?? this.getMemoryFile();
353
+ const paths = this.config.memoryPaths;
354
+
355
+ if (paths.length === 0) {
356
+ return null;
357
+ }
358
+
359
+ // 根据 scope 选择正确的路径
360
+ let basePath: string;
361
+ if (scope) {
362
+ const targetPath = paths.find(p => p.type === scope);
363
+ if (!targetPath) {
364
+ logger.warn(`[recordMemory] No ${scope} path configured, using first available path`);
365
+ basePath = paths[0].path;
366
+ } else {
367
+ basePath = targetPath.path;
368
+ }
369
+ } else {
370
+ // 默认使用第一个路径
371
+ basePath = paths[0].path;
372
+ }
373
+ const filePath = path.join(basePath, memoryFile);
374
+
375
+ try {
376
+ let existingContent = "";
377
+ let fileExists = false;
378
+ try {
379
+ existingContent = await fs.readFile(filePath, "utf-8");
380
+ fileExists = true;
381
+ } catch {
382
+ // 文件不存在
383
+ }
384
+
385
+ let newContent: string;
386
+ let action: RecordMemoryResult["action"];
387
+
388
+ switch (mode) {
389
+ case "delete":
390
+ if (fileExists) {
391
+ await fs.unlink(filePath);
392
+ this.clearCache();
393
+ return { path: filePath, action: "delete" };
394
+ }
395
+ return null;
396
+
397
+ case "overwrite":
398
+ if (title && content) {
399
+ newContent = `## ${title}\n\n${content}\n`;
400
+ } else {
401
+ newContent = content ?? "";
402
+ }
403
+ action = fileExists ? "overwrite" : "created";
404
+ break;
405
+
406
+ case "append":
407
+ if (!content) {
408
+ throw new Error("content is required for append mode");
409
+ }
410
+ if (title) {
411
+ newContent = existingContent + `\n## ${title}\n\n${content}\n`;
412
+ } else {
413
+ newContent = existingContent + `\n${content}\n`;
414
+ }
415
+ action = fileExists ? "append" : "created";
416
+ break;
417
+
418
+ case "prepend":
419
+ if (!content) {
420
+ throw new Error("content is required for prepend mode");
421
+ }
422
+ if (title) {
423
+ newContent = `## ${title}\n\n${content}\n\n---\n\n${existingContent}`;
424
+ } else {
425
+ newContent = `${content}\n\n---\n\n${existingContent}`;
426
+ }
427
+ action = fileExists ? "prepend" : "created";
428
+ break;
429
+
430
+ default:
431
+ throw new Error(`Unknown mode: ${mode}`);
432
+ }
433
+
434
+ await fs.mkdir(basePath, { recursive: true });
435
+ await fs.writeFile(filePath, newContent, "utf-8");
436
+ this.clearCache();
437
+
438
+ return { path: filePath, action };
439
+ } catch (error) {
440
+ logger.error(`[recordMemory] Failed: ${error}`);
441
+ throw error;
442
+ }
443
+ }
444
+
445
+ /**
446
+ * 回忆记忆 - 读取所有记忆文件内容
447
+ *
448
+ * @param scope 可选:project 或 global,默认读取所有
449
+ */
450
+ async recallMemory(scope?: "project" | "global"): Promise<string> {
451
+ const memoryFile = this.getMemoryFile();
452
+ const paths = this.config.memoryPaths;
453
+ const results: string[] = [];
454
+
455
+ for (const memoryPath of paths) {
456
+ // 如果指定了 scope,只读取匹配的记忆
457
+ if (scope && memoryPath.type !== scope) {
458
+ continue;
459
+ }
460
+
461
+ const filePath = path.join(memoryPath.path, memoryFile);
462
+
463
+ try {
464
+ const content = await fs.readFile(filePath, "utf-8");
465
+ if (content.trim()) {
466
+ results.push(`## [${memoryPath.type}] ${memoryFile}\n${content}`);
467
+ }
468
+ } catch {
469
+ // 文件不存在,跳过
470
+ }
471
+ }
472
+
473
+ return results.join("\n\n");
474
+ }
475
+
476
+ // ====================
477
+ // Cache
478
+ // ====================
479
+
480
+ private clearCache(): void {
481
+ this.cache.clear();
482
+ }
483
+
484
+ private getCache<T>(key: string): T | undefined {
485
+ if (!this.config.cacheEnabled) return undefined;
486
+
487
+ const entry = this.cache.get(key);
488
+ if (!entry) return undefined;
489
+
490
+ const age = Date.now() - entry.timestamp;
491
+ if (age > (this.config.cacheTTL ?? 300000)) {
492
+ this.cache.delete(key);
493
+ return undefined;
494
+ }
495
+
496
+ return entry.data as T;
497
+ }
498
+
499
+ private setCache<T>(key: string, data: T): void {
500
+ if (!this.config.cacheEnabled) return;
501
+ this.cache.set(key, { data, timestamp: Date.now() });
502
+ }
503
+ }
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @fileoverview Memory Component 配置注册测试
3
+ */
4
+
5
+ import { describe, it, expect, beforeEach } from "vitest";
6
+ import { ConfigComponent } from "../../config/config-component";
7
+ import { MEMORY_CONFIG_REGISTRATION, MEMORY_DEFAULTS } from "./memory-config-registration";
8
+
9
+ describe("Memory Config Registration", () => {
10
+ let configComponent: ConfigComponent;
11
+
12
+ beforeEach(() => {
13
+ configComponent = new ConfigComponent();
14
+ });
15
+
16
+ describe("MEMORY_CONFIG_REGISTRATION", () => {
17
+ it("应该包含正确的 name", () => {
18
+ expect(MEMORY_CONFIG_REGISTRATION.name).toBe("memory");
19
+ });
20
+
21
+ it("应该包含 env source 配置", () => {
22
+ const envSource = MEMORY_CONFIG_REGISTRATION.sources.find(
23
+ (s) => s.type === "env"
24
+ );
25
+ expect(envSource).toBeDefined();
26
+ expect(envSource?.envPrefix).toBe("MEMORY");
27
+ expect(envSource?.priority).toBe(20);
28
+ });
29
+
30
+ it("应该包含所有配置 keys", () => {
31
+ const keys = MEMORY_CONFIG_REGISTRATION.keys;
32
+ expect(keys).toContainEqual(
33
+ expect.objectContaining({ key: "memory.recursive" })
34
+ );
35
+ expect(keys).toContainEqual(
36
+ expect.objectContaining({ key: "memory.cacheEnabled" })
37
+ );
38
+ expect(keys).toContainEqual(
39
+ expect.objectContaining({ key: "memory.cacheTTL" })
40
+ );
41
+ expect(keys).toContainEqual(
42
+ expect.objectContaining({ key: "memory.memoryPaths" })
43
+ );
44
+ });
45
+ });
46
+
47
+ describe("MEMORY_DEFAULTS", () => {
48
+ it("应该包含 recursive 默认值(完整格式)", () => {
49
+ expect(MEMORY_DEFAULTS["memory.recursive"]).toBe(true);
50
+ });
51
+
52
+ it("应该包含 cacheEnabled 默认值(完整格式)", () => {
53
+ expect(MEMORY_DEFAULTS["memory.cacheEnabled"]).toBe(true);
54
+ });
55
+
56
+ it("应该包含 cacheTTL 默认值(完整格式)", () => {
57
+ expect(MEMORY_DEFAULTS["memory.cacheTTL"]).toBe(300000);
58
+ });
59
+ });
60
+
61
+ describe("配置注册到 ConfigComponent", () => {
62
+ it("应该能够注册 MEMORY_CONFIG_REGISTRATION", () => {
63
+ configComponent.registerComponent(MEMORY_CONFIG_REGISTRATION);
64
+ expect(() => configComponent.registerComponent(MEMORY_CONFIG_REGISTRATION)).not.toThrow();
65
+ });
66
+ });
67
+ });
@@ -0,0 +1,48 @@
1
+ /**
2
+ * @fileoverview Memory Component 配置注册
3
+ *
4
+ * 使用 ConfigComponent.registerComponent() 机制统一管理配置
5
+ */
6
+
7
+ import path from "path";
8
+ import os from "os";
9
+ import type { ComponentRegistration } from "../../config/config-component";
10
+
11
+ /**
12
+ * Memory Component 默认配置值
13
+ *
14
+ * 注意:键使用完整格式(带 "memory." 前缀),在 registerConfig 中手动设置
15
+ */
16
+ export const MEMORY_DEFAULTS: Record<string, unknown> = {
17
+ "memory.recursive": true,
18
+ "memory.cacheEnabled": true,
19
+ "memory.cacheTTL": 300000, // 5 分钟
20
+ "memory.memoryFile": "memory.md", // 默认记忆文件名
21
+ // memoryPaths 的默认值(统一在 ConfigComponent 中管理)
22
+ "memory.memoryPaths": [
23
+ { type: "global", path: path.join(os.homedir(), ".config", "roy-agent", "memory") },
24
+ { type: "project", path: ".roy/memory" },
25
+ ],
26
+ };
27
+
28
+ /**
29
+ * Memory Component 配置注册常量
30
+ *
31
+ * 定义了所有 Memory 相关的配置项和来源
32
+ */
33
+ export const MEMORY_CONFIG_REGISTRATION: ComponentRegistration = {
34
+ name: "memory",
35
+
36
+ sources: [
37
+ { type: "env", envPrefix: "MEMORY", priority: 20, watch: false },
38
+ ],
39
+
40
+ keys: [
41
+ { key: "memory.recursive", sources: ["env", "file"] },
42
+ { key: "memory.cacheEnabled", sources: ["env", "file"] },
43
+ { key: "memory.cacheTTL", sources: ["env", "file"] },
44
+ { key: "memory.memoryPaths", sources: ["env", "file"] },
45
+ { key: "memory.memoryFile", sources: ["env", "file"] },
46
+ ],
47
+ // 注意:不使用 defaults 字段,默认值在 registerConfig 中手动 set
48
+ };
@@ -0,0 +1,45 @@
1
+ /**
2
+ * @fileoverview Memory Component Configuration
3
+ *
4
+ * 定义 Memory 组件的默认配置
5
+ */
6
+
7
+ import path from "path";
8
+ import os from "os";
9
+ import { type MemoryConfig } from "./types";
10
+
11
+ /**
12
+ * 默认配置
13
+ */
14
+ export const DEFAULT_MEMORY_CONFIG: MemoryConfig = {
15
+ memoryPaths: [
16
+ // 全局路径 (~/.config/roy-agent/memory/)
17
+ {
18
+ type: "global",
19
+ path: path.join(os.homedir(), ".config", "roy-agent", "memory"),
20
+ },
21
+ // 项目路径 (.roy/memory/)
22
+ {
23
+ type: "project",
24
+ path: ".roy/memory",
25
+ },
26
+ ],
27
+ recursive: true,
28
+ cacheEnabled: true,
29
+ cacheTTL: 5 * 60 * 1000, // 5 分钟
30
+ };
31
+
32
+ /**
33
+ * 优先级映射(后面的优先级更高)
34
+ */
35
+ export const SOURCE_PRIORITY: Record<string, number> = {
36
+ "global": 0,
37
+ "project": 1,
38
+ };
39
+
40
+ /**
41
+ * 获取来源优先级
42
+ */
43
+ export function getSourcePriority(source: string): number {
44
+ return SOURCE_PRIORITY[source] ?? 0;
45
+ }