@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,68 @@
1
+ /**
2
+ * @fileoverview Task Tool Parameter Schemas
3
+ */
4
+
5
+ import { z } from "zod";
6
+
7
+ /**
8
+ * task_create tool parameters
9
+ */
10
+ export const CreateTaskToolSchema = z.object({
11
+ title: z.string().describe("Task title"),
12
+ description: z.string().optional().describe("Task description"),
13
+ priority: z.enum(["low", "medium", "high"]).optional().describe("Task priority"),
14
+ goals_and_expected_deliverables: z.string().optional().describe("Goals and expected deliverables"),
15
+ due_date: z.string().optional().describe("Due date (ISO format)"),
16
+ tags: z.array(z.string()).optional().describe("Task tags (for search, stored in task.tags JSON field)"),
17
+ });
18
+
19
+ export type CreateTaskToolParams = z.infer<typeof CreateTaskToolSchema>;
20
+
21
+ /**
22
+ * task_get tool parameters
23
+ */
24
+ export const GetTaskToolSchema = z.object({
25
+ task_id: z.number().describe("Task ID"),
26
+ include_operations: z.boolean().optional().default(false).describe("Include operation records"),
27
+ });
28
+
29
+ export type GetTaskToolParams = z.infer<typeof GetTaskToolSchema>;
30
+
31
+ /**
32
+ * task_list tool parameters
33
+ */
34
+ export const ListTasksToolSchema = z.object({
35
+ status: z.enum(["todo", "active", "completed", "paused", "cancelled"]).optional(),
36
+ priority: z.enum(["low", "medium", "high"]).optional(),
37
+ limit: z.number().optional().default(20),
38
+ offset: z.number().optional().default(0),
39
+ });
40
+
41
+ export type ListTasksToolParams = z.infer<typeof ListTasksToolSchema>;
42
+
43
+ /**
44
+ * task_update tool parameters
45
+ */
46
+ export const UpdateTaskToolSchema = z.object({
47
+ task_id: z.number().describe("Task ID"),
48
+ title: z.string().optional(),
49
+ description: z.string().optional(),
50
+ status: z.enum(["todo", "active", "completed", "paused", "cancelled"]).optional(),
51
+ priority: z.enum(["low", "medium", "high"]).optional(),
52
+ progress: z.number().min(0).max(100).optional(),
53
+ current_status: z.string().optional(),
54
+ goals_and_expected_deliverables: z.string().optional(),
55
+ due_date: z.string().optional(),
56
+ tags: z.array(z.string()).optional(),
57
+ });
58
+
59
+ export type UpdateTaskToolParams = z.infer<typeof UpdateTaskToolSchema>;
60
+
61
+ /**
62
+ * task_delete tool parameters
63
+ */
64
+ export const DeleteTaskToolSchema = z.object({
65
+ task_id: z.number().describe("Task ID"),
66
+ });
67
+
68
+ export type DeleteTaskToolParams = z.infer<typeof DeleteTaskToolSchema>;
@@ -0,0 +1,70 @@
1
+ /**
2
+ * @fileoverview Task Update Tool
3
+ */
4
+
5
+ import type { Tool, ToolContext, ToolResult } from "../../tool/types";
6
+ import { UpdateTaskToolSchema, type UpdateTaskToolParams } from "./task-types";
7
+ import type { TaskComponent } from "../task-component";
8
+
9
+ export function updateTaskTool(taskComponent: TaskComponent): Tool {
10
+ return {
11
+ name: "task_update",
12
+ description: "Update an existing task's properties. Status and progress changes will create operation records.",
13
+ parameters: UpdateTaskToolSchema,
14
+ execute: async (args: unknown, ctx: ToolContext): Promise<ToolResult> => {
15
+ const params = UpdateTaskToolSchema.parse(args) as UpdateTaskToolParams;
16
+ const sessionId = ctx.session_id || "unknown";
17
+
18
+ try {
19
+ const task = await taskComponent.updateTask(params.task_id, {
20
+ title: params.title,
21
+ description: params.description,
22
+ status: params.status,
23
+ priority: params.priority,
24
+ progress: params.progress,
25
+ current_status: params.current_status,
26
+ goals_and_expected_deliverables: params.goals_and_expected_deliverables,
27
+ due_date: params.due_date,
28
+ tags: params.tags,
29
+ });
30
+
31
+ if (!task) {
32
+ return {
33
+ success: false,
34
+ output: "",
35
+ error: `Task not found: ${params.task_id}`,
36
+ metadata: { execution_time_ms: 0 },
37
+ };
38
+ }
39
+
40
+ // Create operation record for status/progress changes
41
+ if (params.status || params.progress !== undefined || params.current_status) {
42
+ await taskComponent.createOperation({
43
+ taskId: params.task_id,
44
+ sessionId,
45
+ actionType: "progress",
46
+ actionTitle: params.current_status || `Updated: ${params.status || `${params.progress}%`}`,
47
+ actionDescription: JSON.stringify({
48
+ status: params.status,
49
+ progress: params.progress,
50
+ current_status: params.current_status,
51
+ }),
52
+ });
53
+ }
54
+
55
+ return {
56
+ success: true,
57
+ output: `Task updated: #${task.id} - ${task.title}`,
58
+ metadata: { execution_time_ms: 0, task },
59
+ };
60
+ } catch (error) {
61
+ return {
62
+ success: false,
63
+ output: "",
64
+ error: error instanceof Error ? error.message : String(error),
65
+ metadata: { execution_time_ms: 0 },
66
+ };
67
+ }
68
+ },
69
+ };
70
+ }
@@ -0,0 +1,160 @@
1
+ /**
2
+ * @fileoverview Task Component Types
3
+ */
4
+
5
+ import { z } from "zod";
6
+
7
+ // ============================================================================
8
+ // Enums
9
+ // ============================================================================
10
+
11
+ /**
12
+ * Task status enum
13
+ */
14
+ export const TaskStatusEnum = z.enum(["todo", "active", "completed", "paused", "cancelled"]);
15
+ export type TaskStatus = z.infer<typeof TaskStatusEnum>;
16
+
17
+ /**
18
+ * Task priority enum
19
+ */
20
+ export const TaskPriorityEnum = z.enum(["low", "medium", "high"]);
21
+ export type TaskPriority = z.infer<typeof TaskPriorityEnum>;
22
+
23
+ /**
24
+ * Action type for task operations
25
+ */
26
+ export const ActionTypeEnum = z.enum([
27
+ "create",
28
+ "progress",
29
+ "milestone",
30
+ "problem",
31
+ "solution",
32
+ "decision",
33
+ "review",
34
+ "completed",
35
+ "workflow_extracted",
36
+ ]);
37
+ export type ActionType = z.infer<typeof ActionTypeEnum>;
38
+
39
+ // ============================================================================
40
+ // Task Entity
41
+ // ============================================================================
42
+
43
+ /**
44
+ * Task entity
45
+ */
46
+ export interface Task {
47
+ id: number;
48
+ title: string;
49
+ description: string;
50
+ status: TaskStatus;
51
+ priority: TaskPriority;
52
+ progress: number;
53
+ current_status: string;
54
+ goals_and_expected_deliverables: string;
55
+ parent_task_id?: number;
56
+ createdAt: string;
57
+ updatedAt: string;
58
+ due_date?: string;
59
+ tags?: string[];
60
+ }
61
+
62
+ // ============================================================================
63
+ // TaskOperation Entity
64
+ // ============================================================================
65
+
66
+ /**
67
+ * TaskOperation entity
68
+ *
69
+ * 记录任务的操作历史,每个操作关联到一个 sessionId
70
+ */
71
+ export interface TaskOperation {
72
+ id: number;
73
+ taskId: number;
74
+ sessionId: string; // 必填!标记在哪发生
75
+ actionType: ActionType;
76
+ actionTitle: string;
77
+ actionDescription: string;
78
+ timestamp: string;
79
+ mdPath?: string;
80
+ }
81
+
82
+ // ============================================================================
83
+ // TaskTag Entity
84
+ // ============================================================================
85
+
86
+ /**
87
+ * TaskTag entity
88
+ *
89
+ * Tag 池中的单个 Tag
90
+ */
91
+ export interface TaskTag {
92
+ id: number;
93
+ name: string;
94
+ createdAt: string;
95
+ taskCount: number;
96
+ }
97
+
98
+ // ============================================================================
99
+ // Config Schema
100
+ // ============================================================================
101
+
102
+ export const TaskConfigSchema = z.object({
103
+ storage: z.object({
104
+ type: z.enum(["memory", "sqlite"]).default("sqlite"),
105
+ dbPath: z.string().optional(),
106
+ }).default({}),
107
+ }).default({});
108
+
109
+ export type TaskConfig = z.infer<typeof TaskConfigSchema>;
110
+
111
+ // ============================================================================
112
+ // Operation Options
113
+ // ============================================================================
114
+
115
+ export interface CreateTaskOptions {
116
+ title: string;
117
+ description?: string;
118
+ priority?: TaskPriority;
119
+ parent_task_id?: number;
120
+ goals_and_expected_deliverables?: string;
121
+ due_date?: string;
122
+ tags?: string[];
123
+ sessionId: string; // 必填
124
+ }
125
+
126
+ export interface UpdateTaskOptions {
127
+ title?: string;
128
+ description?: string;
129
+ status?: TaskStatus;
130
+ priority?: TaskPriority;
131
+ progress?: number;
132
+ current_status?: string;
133
+ goals_and_expected_deliverables?: string;
134
+ due_date?: string;
135
+ tags?: string[];
136
+ }
137
+
138
+ export interface ListTasksOptions {
139
+ status?: TaskStatus;
140
+ priority?: TaskPriority;
141
+ parent_task_id?: number;
142
+ limit?: number;
143
+ offset?: number;
144
+ }
145
+
146
+ export interface CreateOperationOptions {
147
+ taskId: number;
148
+ sessionId: string; // 必填
149
+ actionType: ActionType;
150
+ actionTitle: string;
151
+ actionDescription?: string;
152
+ mdPath?: string;
153
+ }
154
+
155
+ export interface ListOperationsOptions {
156
+ taskId: number;
157
+ actionType?: ActionType;
158
+ limit?: number;
159
+ offset?: number;
160
+ }
@@ -0,0 +1,201 @@
1
+ import { z } from "zod";
2
+ import { exec } from "child_process";
3
+ import { promisify } from "util";
4
+ import type { Tool, ToolContext, ToolResult } from "../types";
5
+ import { propagation } from "../../log-trace/opentelemetry/propagation";
6
+
7
+ const execAsync = promisify(exec);
8
+
9
+ /**
10
+ * 获取当前 Span Context(用于设置父 span)
11
+ */
12
+ function getCurrentSpanContext(): { traceId: string; spanId: string; parentSpanId?: string } | undefined {
13
+ try {
14
+ const { getTracerProvider } = require("../../log-trace/opentelemetry/tracer-provider");
15
+ const provider = getTracerProvider();
16
+ if (!provider.isInitialized()) {
17
+ throw new Error("Provider not initialized");
18
+ }
19
+ const tracer = provider.getTracer('roy-tracer');
20
+ const ctx = tracer.getCurrentContext();
21
+ if (ctx && ctx.traceId && ctx.spanId) {
22
+ return ctx;
23
+ }
24
+ } catch {
25
+ // OTel tracer 未初始化或没有当前上下文
26
+ }
27
+ return undefined;
28
+ }
29
+
30
+ /**
31
+ * 获取当前 traceId
32
+ */
33
+ function getCurrentTraceId(): string | undefined {
34
+ const ctx = getCurrentSpanContext();
35
+ if (ctx) {
36
+ return ctx.traceId;
37
+ }
38
+
39
+ // Fallback: 从环境变量读取
40
+ return process.env.TRACE_ID;
41
+ }
42
+
43
+ /**
44
+ * Bash 工具
45
+ * 执行 shell 命令
46
+ *
47
+ * 支持 OpenTelemetry W3C TraceContext 跨进程追踪:
48
+ * - 通过 TRACEPARENT 环境变量传递 traceId 和 parentSpanId
49
+ * - 子进程可以正确关联到父 trace
50
+ */
51
+ export const bashTool: Tool = {
52
+ name: "bash",
53
+ description: "Execute shell commands in the terminal. Use this to run system commands, scripts, or interact with the file system.",
54
+ parameters: z.object({
55
+ command: z.string().describe("The shell command to execute"),
56
+ workdir: z.string().optional().describe("Working directory for the command"),
57
+ timeout: z.number().int().positive().optional().describe("Timeout in milliseconds"),
58
+ env: z.record(z.string()).optional().describe("Additional environment variables"),
59
+ }),
60
+ sandbox: {
61
+ enabled: true,
62
+ config: {
63
+ filesystem: {
64
+ denyRead: ["/etc/shadow", "/etc/sudoers", "/etc/sudoers.d/*"],
65
+ denyWrite: ["/etc", "/usr/bin", "/usr/sbin", "/bin", "/sbin"],
66
+ },
67
+ },
68
+ },
69
+ permission: {
70
+ requireConfirmation: true,
71
+ level: "dangerous",
72
+ },
73
+ metadata: {
74
+ category: "system",
75
+ tags: ["shell", "command", "terminal", "exec"],
76
+ version: "1.2.0",
77
+ },
78
+ execute: async (args, ctx: ToolContext): Promise<ToolResult> => {
79
+ const startTime = Date.now();
80
+ const { command, workdir, timeout = 60000, env } = args;
81
+
82
+ // 获取当前 span 上下文
83
+ const currentSpanCtx = getCurrentSpanContext();
84
+ const traceId = currentSpanCtx?.traceId || getCurrentTraceId();
85
+
86
+ // 构建执行选项
87
+ const options: {
88
+ cwd?: string;
89
+ timeout?: number;
90
+ env?: Record<string, string>;
91
+ } = {
92
+ timeout,
93
+ };
94
+
95
+ if (workdir || ctx.workdir) {
96
+ options.cwd = workdir || ctx.workdir;
97
+ }
98
+
99
+ // 构建子进程的环境变量
100
+ const childEnv: Record<string, string> = {};
101
+ for (const [key, value] of Object.entries(process.env)) {
102
+ if (value !== undefined) {
103
+ childEnv[key] = value;
104
+ }
105
+ }
106
+
107
+ // 使用 W3C TraceContext 注入 TRACEPARENT
108
+ if (currentSpanCtx) {
109
+ const carrier: Record<string, string | undefined> = {};
110
+ propagation.inject(carrier, currentSpanCtx);
111
+ if (carrier['TRACEPARENT']) {
112
+ childEnv['TRACEPARENT'] = carrier['TRACEPARENT'];
113
+ }
114
+ // 保留向后兼容的环境变量
115
+ childEnv['TRACE_ID'] = currentSpanCtx.traceId;
116
+ childEnv['PARENT_SPAN_ID'] = currentSpanCtx.spanId;
117
+ } else if (traceId) {
118
+ // 如果没有当前上下文但有 traceId,创建根 span 的 traceparent
119
+ const spanId = Math.floor(Math.random() * 0xFFFFFFFFFFFFFFFF)
120
+ .toString(16)
121
+ .padStart(16, "0");
122
+ childEnv['TRACEPARENT'] = `00-${traceId}-${spanId}-01`;
123
+ childEnv['TRACE_ID'] = traceId;
124
+ }
125
+
126
+ // 用户提供的 env 优先级最高
127
+ if (env) {
128
+ Object.assign(childEnv, env);
129
+ }
130
+ options.env = childEnv;
131
+
132
+ // 使用 OTel tracer 创建 span
133
+ let otelSpan: any = undefined;
134
+ try {
135
+ const { getTracerProvider } = require("../../log-trace/opentelemetry/tracer-provider");
136
+ const provider = getTracerProvider();
137
+ const tracer = provider.getTracer('roy-tracer');
138
+ otelSpan = tracer.startSpan(`bash: ${command.slice(0, 50)}${command.length > 50 ? "..." : ""}`, {
139
+ attributes: {
140
+ 'bash.command': command.slice(0, 200),
141
+ 'bash.workdir': workdir || ctx.workdir || '',
142
+ 'bash.timeout': timeout,
143
+ },
144
+ });
145
+ } catch {
146
+ // OTel tracer 不可用,继续执行
147
+ }
148
+
149
+ const spanId = otelSpan?.spanContext?.spanId;
150
+
151
+ try {
152
+ const { stdout, stderr } = await execAsync(command, options);
153
+
154
+ // 结束 span
155
+ if (otelSpan) {
156
+ otelSpan.end({ stdout, stderr });
157
+ }
158
+
159
+ return {
160
+ success: true,
161
+ output: stdout || "(no output)",
162
+ metadata: {
163
+ execution_time_ms: Date.now() - startTime,
164
+ stdout,
165
+ stderr,
166
+ exit_code: 0,
167
+ trace_id: traceId,
168
+ parent_span_id: currentSpanCtx?.spanId,
169
+ span_id: spanId,
170
+ },
171
+ };
172
+ } catch (error: any) {
173
+ const exitCode = error.code || 1;
174
+ const stdout = error.stdout || "";
175
+ const stderr = error.stderr || error.message;
176
+
177
+ // 结束 span(带错误)
178
+ const execError = new Error(stderr);
179
+ execError.name = "BashExecutionError";
180
+
181
+ if (otelSpan) {
182
+ otelSpan.end(undefined, execError);
183
+ }
184
+
185
+ return {
186
+ success: exitCode === 0,
187
+ output: stdout || "(no output)",
188
+ error: stderr,
189
+ metadata: {
190
+ execution_time_ms: Date.now() - startTime,
191
+ stdout,
192
+ stderr,
193
+ exit_code: exitCode,
194
+ trace_id: traceId,
195
+ parent_span_id: currentSpanCtx?.spanId,
196
+ span_id: spanId,
197
+ },
198
+ };
199
+ }
200
+ },
201
+ };
@@ -0,0 +1,29 @@
1
+ import type { Tool, ToolContext, ToolResult } from "../types";
2
+
3
+ /**
4
+ * Echo tool - simple echo command
5
+ *
6
+ * This is a convenience tool for logging messages in workflows.
7
+ */
8
+ export const echoTool: Tool = {
9
+ name: "echo",
10
+ description: "Echo a message to the console. Useful for logging in workflows.",
11
+ parameters: {
12
+ name: "message",
13
+ schema: {
14
+ type: "string",
15
+ description: "The message to echo",
16
+ },
17
+ } as any,
18
+ execute: async (args: { message?: string }, _ctx: ToolContext): Promise<ToolResult> => {
19
+ const message = args?.message || "(no message)";
20
+
21
+ return {
22
+ success: true,
23
+ output: message,
24
+ metadata: {
25
+ execution_time_ms: 0,
26
+ },
27
+ };
28
+ },
29
+ };
@@ -0,0 +1,136 @@
1
+ import { describe, test, expect, beforeEach } from "bun:test";
2
+ import { editFileTool } from "./edit-file";
3
+ import { writeFile, mkdir } from "fs/promises";
4
+ import { join } from "path";
5
+
6
+ describe("editFileTool", () => {
7
+ const testDir = join("/tmp", `edit-test-${Date.now()}`);
8
+ const testFile = join(testDir, "test.txt");
9
+
10
+ beforeEach(async () => {
11
+ await mkdir(testDir, { recursive: true });
12
+ await writeFile(testFile, "Hello, World!\nThis is a test.\nEnd of file.");
13
+ });
14
+
15
+ describe("parameters", () => {
16
+ test("should validate required parameters", async () => {
17
+ const result = await editFileTool.execute(
18
+ { path: testFile, oldString: "Hello", newString: "Hi" },
19
+ {}
20
+ );
21
+
22
+ expect(result.success).toBe(true);
23
+ });
24
+
25
+ test("should handle missing oldString gracefully", async () => {
26
+ const result = await editFileTool.execute(
27
+ { path: testFile, newString: "Hi" } as any,
28
+ {}
29
+ );
30
+ // 会因为找不到空字符串而失败
31
+ expect(result).toBeDefined();
32
+ });
33
+
34
+ test("should handle missing newString gracefully", async () => {
35
+ const result = await editFileTool.execute(
36
+ { path: testFile, oldString: "Hello" } as any,
37
+ {}
38
+ );
39
+ // 会成功替换为空字符串
40
+ expect(result.success).toBe(true);
41
+ });
42
+ });
43
+
44
+ describe("execution", () => {
45
+ test("should replace text in file", async () => {
46
+ const result = await editFileTool.execute(
47
+ { path: testFile, oldString: "Hello", newString: "Hi" },
48
+ {}
49
+ );
50
+
51
+ expect(result.success).toBe(true);
52
+
53
+ const content = await Bun.file(testFile).text();
54
+ expect(content).toContain("Hi, World!");
55
+ expect(content).not.toContain("Hello, World!");
56
+ });
57
+
58
+ test("should replace all occurrences with replaceAll", async () => {
59
+ await writeFile(testFile, "foo bar foo baz foo");
60
+
61
+ const result = await editFileTool.execute(
62
+ { path: testFile, oldString: "foo", newString: "qux", replaceAll: true },
63
+ {}
64
+ );
65
+
66
+ expect(result.success).toBe(true);
67
+
68
+ const content = await Bun.file(testFile).text();
69
+ expect(content).toBe("qux bar qux baz qux");
70
+ });
71
+
72
+ test("should replace only first occurrence without replaceAll", async () => {
73
+ await writeFile(testFile, "foo bar foo baz foo");
74
+
75
+ const result = await editFileTool.execute(
76
+ { path: testFile, oldString: "foo", newString: "qux" },
77
+ {}
78
+ );
79
+
80
+ expect(result.success).toBe(true);
81
+
82
+ const content = await Bun.file(testFile).text();
83
+ expect(content).toBe("qux bar foo baz foo");
84
+ });
85
+
86
+ test("should return error when text not found", async () => {
87
+ const result = await editFileTool.execute(
88
+ { path: testFile, oldString: "NonExistent", newString: "Something" },
89
+ {}
90
+ );
91
+
92
+ expect(result.success).toBe(false);
93
+ expect(result.error).toContain("Could not find");
94
+ });
95
+
96
+ test("should handle multiline replacement", async () => {
97
+ const result = await editFileTool.execute(
98
+ {
99
+ path: testFile,
100
+ oldString: "Hello, World!\nThis is a test.",
101
+ newString: "Greetings!\nThis has been updated."
102
+ },
103
+ {}
104
+ );
105
+
106
+ expect(result.success).toBe(true);
107
+
108
+ const content = await Bun.file(testFile).text();
109
+ expect(content).toContain("Greetings!");
110
+ expect(content).toContain("This has been updated.");
111
+ });
112
+
113
+ test("should include metadata", async () => {
114
+ const result = await editFileTool.execute(
115
+ { path: testFile, oldString: "Hello", newString: "Hi" },
116
+ {}
117
+ );
118
+
119
+ expect(result.metadata?.execution_time_ms).toBeDefined();
120
+ expect(result.metadata?.file_path).toBe(testFile);
121
+ });
122
+ });
123
+
124
+ describe("metadata", () => {
125
+ test("should have correct metadata", () => {
126
+ expect(editFileTool.name).toBe("edit_file");
127
+ expect(editFileTool.metadata?.category).toBe("file");
128
+ expect(editFileTool.metadata?.tags).toContain("edit");
129
+ });
130
+
131
+ test("should require confirmation", () => {
132
+ expect(editFileTool.permission?.requireConfirmation).toBe(true);
133
+ expect(editFileTool.permission?.level).toBe("dangerous");
134
+ });
135
+ });
136
+ });