@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,264 @@
1
+ /**
2
+ * @fileoverview TagService - Tag 池管理服务
3
+ *
4
+ * 提供 Tag 的 CRUD、Tag 与 Task 关联、类似任务检索能力
5
+ *
6
+ * 设计原则:
7
+ * - Tag 池模式:新 Tag 从池中选取,无合适则新增
8
+ * - 混合存储:Task.tags JSON 快速读取 + Tag 表高效检索
9
+ */
10
+
11
+ import type { Task, TaskTag } from "./types";
12
+ import type { TaskStore } from "./storage/sqlite-task-store";
13
+ import { createLogger } from "../log-trace/logger";
14
+
15
+ const logger = createLogger("task:tag");
16
+
17
+ // ========================================================================
18
+ // TagService 接口
19
+ // ========================================================================
20
+
21
+ export interface ListTagsOptions {
22
+ limit?: number;
23
+ offset?: number;
24
+ orderBy?: "count" | "name" | "created_at";
25
+ }
26
+
27
+ export interface SearchTagsOptions {
28
+ query: string;
29
+ limit?: number;
30
+ }
31
+
32
+ export interface TagService {
33
+ // ========== Tag CRUD ==========
34
+
35
+ /**
36
+ * 创建 Tag(如果已存在则返回现有 Tag)
37
+ */
38
+ createTag(name: string): Promise<TaskTag>;
39
+
40
+ /**
41
+ * 获取 Tag by ID
42
+ */
43
+ getTag(id: number): Promise<TaskTag | undefined>;
44
+
45
+ /**
46
+ * 获取 Tag by Name
47
+ */
48
+ getTagByName(name: string): Promise<TaskTag | undefined>;
49
+
50
+ /**
51
+ * 列出所有 Tag
52
+ */
53
+ listTags(options?: ListTagsOptions): Promise<TaskTag[]>;
54
+
55
+ /**
56
+ * 搜索 Tag(模糊匹配)
57
+ */
58
+ searchTags(options: SearchTagsOptions): Promise<TaskTag[]>;
59
+
60
+ /**
61
+ * 删除 Tag(同时删除所有关联)
62
+ */
63
+ deleteTag(id: number): Promise<boolean>;
64
+
65
+ // ========== Tag 与 Task 关联 ==========
66
+
67
+ /**
68
+ * 给 Task 添加 Tags
69
+ */
70
+ addTagsToTask(taskId: number, tagIds: number[]): Promise<void>;
71
+
72
+ /**
73
+ * 从 Task 移除 Tags
74
+ */
75
+ removeTagsFromTask(taskId: number, tagIds: number[]): Promise<void>;
76
+
77
+ /**
78
+ * 获取 Task 的所有 Tags
79
+ */
80
+ getTagsForTask(taskId: number): Promise<TaskTag[]>;
81
+
82
+ /**
83
+ * 根据 Tag 名称获取关联的 Task IDs
84
+ */
85
+ getTaskIdsByTags(tagNames: string[]): Promise<number[]>;
86
+
87
+ // ========== 检索能力(核心改造)==========
88
+
89
+ /**
90
+ * 根据关键词列表搜索 Task(检索 tags、description、goals、operations)
91
+ * 这是新的核心检索方法
92
+ */
93
+ searchTasksByKeywords(keywords: string[], options?: { limit?: number; excludeTaskId?: number }): Promise<Task[]>;
94
+
95
+ /**
96
+ * 根据关键词查找类似 Task(排除自身,按相关性排序)
97
+ * 这是新的核心检索方法
98
+ */
99
+ findSimilarTasksByKeywords(keywords: string[], options?: { limit?: number; excludeTaskId?: number }): Promise<Task[]>;
100
+
101
+ // ========== 同步(混合方案 - 保留用于兼容)==========
102
+
103
+ /**
104
+ * 同步 Tags 到 Task(根据 tag 名称列表)
105
+ * - 查找或创建 Tag
106
+ * - 更新关联关系
107
+ * - 更新 task.tags JSON 字段
108
+ */
109
+ syncTagsToTask(taskId: number, tagNames: string[]): Promise<void>;
110
+
111
+ // ========== 以下为保留的兼容方法 ==========
112
+
113
+ /**
114
+ * 查找类似 Task(基于 Tag 匹配度)- 原始实现,保留兼容
115
+ * @deprecated 使用 findSimilarTasksByKeywords 代替
116
+ */
117
+ findSimilarTasks(taskId: number, limit?: number): Promise<Task[]>;
118
+
119
+ /**
120
+ * 根据关键词搜索 Task(标题 + 描述)- 原始实现,保留兼容
121
+ * @deprecated 使用 searchTasksByKeywords 代替
122
+ */
123
+ searchTasks(query: string, limit?: number): Promise<Task[]>;
124
+ }
125
+
126
+ // ========================================================================
127
+ // TagService 实现
128
+ // ========================================================================
129
+
130
+ /**
131
+ * TagService 实现
132
+ */
133
+ export class DefaultTagService implements TagService {
134
+ constructor(private store: TaskStore) {}
135
+
136
+ // ========== Tag CRUD ==========
137
+
138
+ async createTag(name: string): Promise<TaskTag> {
139
+ const tag = await this.store.createTag(name);
140
+ logger.debug(`[TagService] Created tag: ${tag.name} (id=${tag.id})`);
141
+ return tag;
142
+ }
143
+
144
+ async getTag(id: number): Promise<TaskTag | undefined> {
145
+ return this.store.getTag(id);
146
+ }
147
+
148
+ async getTagByName(name: string): Promise<TaskTag | undefined> {
149
+ return this.store.getTagByName(name);
150
+ }
151
+
152
+ async listTags(options?: ListTagsOptions): Promise<TaskTag[]> {
153
+ return this.store.listTags(options);
154
+ }
155
+
156
+ async searchTags(options: SearchTagsOptions): Promise<TaskTag[]> {
157
+ return this.store.searchTags(options);
158
+ }
159
+
160
+ async deleteTag(id: number): Promise<boolean> {
161
+ const result = await this.store.deleteTag(id);
162
+ if (result) {
163
+ logger.debug(`[TagService] Deleted tag id=${id}`);
164
+ }
165
+ return result;
166
+ }
167
+
168
+ // ========== Tag 与 Task 关联 ==========
169
+
170
+ async addTagsToTask(taskId: number, tagIds: number[]): Promise<void> {
171
+ await this.store.addTagsToTask(taskId, tagIds);
172
+ logger.debug(`[TagService] Added ${tagIds.length} tags to task ${taskId}`);
173
+ }
174
+
175
+ async removeTagsFromTask(taskId: number, tagIds: number[]): Promise<void> {
176
+ await this.store.removeTagsFromTask(taskId, tagIds);
177
+ logger.debug(`[TagService] Removed ${tagIds.length} tags from task ${taskId}`);
178
+ }
179
+
180
+ async getTagsForTask(taskId: number): Promise<TaskTag[]> {
181
+ return this.store.getTagsForTask(taskId);
182
+ }
183
+
184
+ async getTaskIdsByTags(tagNames: string[]): Promise<number[]> {
185
+ return this.store.getTaskIdsByTags(tagNames);
186
+ }
187
+
188
+ // ========== 检索能力(核心改造)==========
189
+
190
+ /**
191
+ * 根据关键词列表搜索 Task
192
+ * @deprecated 使用 findSimilarTasksByKeywords 代替
193
+ */
194
+ async findSimilarTasks(taskId: number, limit: number = 5): Promise<Task[]> {
195
+ return this.store.findSimilarTasks(taskId, limit);
196
+ }
197
+
198
+ /**
199
+ * 根据关键词搜索 Task(单字符串)- 原始实现
200
+ * @deprecated 使用 searchTasksByKeywords 代替
201
+ */
202
+ async searchTasks(query: string, limit: number = 20): Promise<Task[]> {
203
+ return this.store.searchTasks(query, limit);
204
+ }
205
+
206
+ /**
207
+ * 根据关键词列表搜索 Task
208
+ * 检索范围:tags、description、goals、operations
209
+ */
210
+ async searchTasksByKeywords(
211
+ keywords: string[],
212
+ options?: { limit?: number; excludeTaskId?: number }
213
+ ): Promise<Task[]> {
214
+ return this.store.searchTasksByKeywords(keywords, options);
215
+ }
216
+
217
+ /**
218
+ * 根据关键词查找类似 Task
219
+ */
220
+ async findSimilarTasksByKeywords(
221
+ keywords: string[],
222
+ options?: { limit?: number; excludeTaskId?: number }
223
+ ): Promise<Task[]> {
224
+ return this.store.findSimilarTasksByKeywords(keywords, options);
225
+ }
226
+
227
+ // ========== 同步 ==========
228
+
229
+ async syncTagsToTask(taskId: number, tagNames: string[]): Promise<void> {
230
+ // 1. 查找或创建每个 Tag
231
+ const tagIds: number[] = [];
232
+ for (const name of tagNames) {
233
+ let tag = await this.store.getTagByName(name);
234
+ if (!tag) {
235
+ tag = await this.store.createTag(name);
236
+ }
237
+ tagIds.push(tag.id);
238
+ }
239
+
240
+ // 2. 获取当前 Task 的所有 Tags
241
+ const currentTags = await this.store.getTagsForTask(taskId);
242
+ const currentTagIds = new Set(currentTags.map(t => t.id));
243
+ const newTagIds = new Set(tagIds);
244
+
245
+ // 3. 计算需要添加和移除的 Tags
246
+ const toAdd = tagIds.filter(id => !currentTagIds.has(id));
247
+ const toRemove = currentTags
248
+ .filter(t => !newTagIds.has(t.id))
249
+ .map(t => t.id);
250
+
251
+ // 4. 执行同步
252
+ if (toRemove.length > 0) {
253
+ await this.store.removeTagsFromTask(taskId, toRemove);
254
+ }
255
+ if (toAdd.length > 0) {
256
+ await this.store.addTagsToTask(taskId, toAdd);
257
+ }
258
+
259
+ // 5. 更新 Task.tags JSON 字段
260
+ await this.store.updateTaskTags(taskId, tagNames);
261
+
262
+ logger.info(`[TagService] Synced tags for task ${taskId}: ${tagNames.join(", ")}`);
263
+ }
264
+ }
@@ -0,0 +1,193 @@
1
+ /**
2
+ * @fileoverview TaskComponent Tests
3
+ */
4
+
5
+ import { describe, it, expect, beforeEach, afterEach } from "bun:test";
6
+ import { TaskComponent } from "./task-component";
7
+ import { ConfigComponent } from "../../config/config-component";
8
+ import { tmpdir } from "os";
9
+ import { join } from "path";
10
+
11
+ describe("TaskComponent", () => {
12
+ let taskComponent: TaskComponent;
13
+ let configComponent: ConfigComponent;
14
+
15
+ beforeEach(async () => {
16
+ configComponent = new ConfigComponent();
17
+ taskComponent = new TaskComponent();
18
+ await taskComponent.init({
19
+ options: {
20
+ configComponent,
21
+ config: {
22
+ storage: {
23
+ type: "sqlite",
24
+ dbPath: join(tmpdir(), `task-component-test-${Date.now()}.db`),
25
+ },
26
+ },
27
+ },
28
+ });
29
+ });
30
+
31
+ afterEach(async () => {
32
+ await taskComponent.stop();
33
+ });
34
+
35
+ describe("createTask", () => {
36
+ it("should create a task", async () => {
37
+ const task = await taskComponent.createTask({
38
+ title: "Test Task",
39
+ sessionId: "sess_123",
40
+ });
41
+
42
+ expect(task.id).toBeGreaterThan(0);
43
+ expect(task.title).toBe("Test Task");
44
+ expect(task.status).toBe("todo");
45
+ });
46
+
47
+ it("should auto-create operation record", async () => {
48
+ const task = await taskComponent.createTask({
49
+ title: "Test Task",
50
+ sessionId: "sess_123",
51
+ });
52
+
53
+ const ops = await taskComponent.listOperations({ taskId: task.id });
54
+ expect(ops.length).toBe(1);
55
+ expect(ops[0].actionType).toBe("create");
56
+ expect(ops[0].sessionId).toBe("sess_123");
57
+ });
58
+ });
59
+
60
+ describe("getTask", () => {
61
+ it("should get task by id", async () => {
62
+ const created = await taskComponent.createTask({
63
+ title: "Test Task",
64
+ sessionId: "sess_123",
65
+ });
66
+
67
+ const task = await taskComponent.getTask(created.id);
68
+ expect(task?.title).toBe("Test Task");
69
+ });
70
+
71
+ it("should return undefined for non-existent task", async () => {
72
+ const task = await taskComponent.getTask(99999);
73
+ expect(task).toBeUndefined();
74
+ });
75
+ });
76
+
77
+ describe("updateTask", () => {
78
+ it("should update task", async () => {
79
+ const task = await taskComponent.createTask({
80
+ title: "Test Task",
81
+ sessionId: "sess_123",
82
+ });
83
+
84
+ const updated = await taskComponent.updateTask(task.id, {
85
+ status: "active",
86
+ progress: 50,
87
+ current_status: "正在实现功能",
88
+ });
89
+
90
+ expect(updated?.status).toBe("active");
91
+ expect(updated?.progress).toBe(50);
92
+ expect(updated?.current_status).toBe("正在实现功能");
93
+ });
94
+ });
95
+
96
+ describe("completeTask", () => {
97
+ it("should complete task with operation record", async () => {
98
+ const task = await taskComponent.createTask({
99
+ title: "Test Task",
100
+ sessionId: "sess_1",
101
+ });
102
+
103
+ await taskComponent.updateTask(task.id, { status: "active" });
104
+
105
+ const completed = await taskComponent.completeTask(task.id, "sess_2");
106
+ expect(completed?.status).toBe("completed");
107
+ expect(completed?.progress).toBe(100);
108
+
109
+ // Check operation record
110
+ const ops = await taskComponent.listOperations({ taskId: task.id });
111
+ const completedOp = ops.find(op => op.actionType === "completed");
112
+ expect(completedOp?.sessionId).toBe("sess_2");
113
+ });
114
+ });
115
+
116
+ describe("listTasks", () => {
117
+ it("should list tasks", async () => {
118
+ await taskComponent.createTask({ title: "Task 1", sessionId: "sess_1" });
119
+ await taskComponent.createTask({ title: "Task 2", sessionId: "sess_1" });
120
+
121
+ const tasks = await taskComponent.listTasks();
122
+ expect(tasks.length).toBe(2);
123
+ });
124
+
125
+ it("should filter by status", async () => {
126
+ const task1 = await taskComponent.createTask({ title: "Task 1", sessionId: "sess_1" });
127
+ await taskComponent.createTask({ title: "Task 2", sessionId: "sess_1" });
128
+ await taskComponent.updateTask(task1.id, { status: "active" });
129
+
130
+ const activeTasks = await taskComponent.listTasks({ status: "active" });
131
+ expect(activeTasks.length).toBe(1);
132
+ });
133
+ });
134
+
135
+ describe("cross-session operations", () => {
136
+ it("should track operations from different sessions", async () => {
137
+ const task = await taskComponent.createTask({
138
+ title: "Cross-Session Task",
139
+ sessionId: "sess_1",
140
+ });
141
+
142
+ await taskComponent.createOperation({
143
+ taskId: task.id,
144
+ sessionId: "sess_2",
145
+ actionType: "progress",
146
+ actionTitle: "Started working",
147
+ });
148
+
149
+ await taskComponent.createOperation({
150
+ taskId: task.id,
151
+ sessionId: "sess_2",
152
+ actionType: "progress",
153
+ actionTitle: "Made progress in session 2",
154
+ });
155
+
156
+ await taskComponent.createOperation({
157
+ taskId: task.id,
158
+ sessionId: "sess_3",
159
+ actionType: "milestone",
160
+ actionTitle: "Reached milestone in session 3",
161
+ });
162
+
163
+ const ops = await taskComponent.listOperations({ taskId: task.id });
164
+ expect(ops.length).toBe(4); // 1 create + 1 progress update + 2 manual
165
+
166
+ // Check session distribution
167
+ const sessions = new Set(ops.map(op => op.sessionId));
168
+ expect(sessions.has("sess_1")).toBe(true);
169
+ expect(sessions.has("sess_2")).toBe(true);
170
+ expect(sessions.has("sess_3")).toBe(true);
171
+ });
172
+ });
173
+
174
+ describe("getTaskWithOperations", () => {
175
+ it("should return task with all operations", async () => {
176
+ const task = await taskComponent.createTask({
177
+ title: "Task with Ops",
178
+ sessionId: "sess_1",
179
+ });
180
+
181
+ await taskComponent.createOperation({
182
+ taskId: task.id,
183
+ sessionId: "sess_2",
184
+ actionType: "progress",
185
+ actionTitle: "Made progress",
186
+ });
187
+
188
+ const result = await taskComponent.getTaskWithOperations(task.id);
189
+ expect(result?.task.title).toBe("Task with Ops");
190
+ expect(result?.operations.length).toBe(2);
191
+ });
192
+ });
193
+ });