@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,497 @@
1
+ /**
2
+ * @fileoverview Log & Trace Component
3
+ *
4
+ * 提供日志和追踪的统一组件封装
5
+ *
6
+ * 配置通过 ConfigComponent 实时获取,支持配置热更新
7
+ */
8
+
9
+ import {
10
+ BaseComponent,
11
+ type ComponentConfig,
12
+ type ComponentSchema,
13
+ } from "../component";
14
+ import { z } from "zod";
15
+ import { join } from "path";
16
+ import { createLogger, setQuietMode, setConfigComponent, type LogLevel } from "./logger";
17
+ import { getTracerProvider, type OTelTracer } from "./opentelemetry/tracer-provider";
18
+ import { SQLiteSpanStorage, type SpanStorage } from "./span-storage";
19
+ import { initTraceContext, type ITraceContext } from "./trace-context";
20
+ import type { ConfigComponent } from "../../config/config-component";
21
+ import { envKeyToConfigKey } from "../../config/env-key";
22
+ import { LOG_TRACE_CONFIG_REGISTRATION, LOG_TRACE_DEFAULTS } from "./log-trace-config-registration";
23
+
24
+ // ============================================================================
25
+ // Default Paths (based on XDG_DATA_HOME)
26
+ // ============================================================================
27
+
28
+ /**
29
+ * 获取默认数据目录(基于 XDG 标准)
30
+ */
31
+ function getDefaultDataDir(): string {
32
+ // 尝试使用 xdg-basedir
33
+ try {
34
+ const xdg = require("xdg-basedir");
35
+ if (xdg.xdgData) {
36
+ return xdg.xdgData;
37
+ }
38
+ } catch {}
39
+
40
+ // 回退到 ~/.local/share
41
+ const home = process.env.HOME || process.env.USERPROFILE || "/tmp";
42
+ return join(home, ".local", "share");
43
+ }
44
+
45
+ /**
46
+ * 获取默认日志目录(基于 XDG 标准)
47
+ * 存储在 XDG_DATA_HOME/roy-agent/logs/
48
+ */
49
+ export function getDefaultLogDir(): string {
50
+ return join(getDefaultDataDir(), "roy-agent", "logs");
51
+ }
52
+
53
+ /**
54
+ * 获取默认的 span 数据库路径(基于 XDG 标准)
55
+ * 存储在 XDG_DATA_HOME/roy-agent/traces.db
56
+ */
57
+ export function getDefaultSpanDbPath(): string {
58
+ return join(getDefaultDataDir(), "roy-agent", "traces.db");
59
+ }
60
+
61
+ // ============================================================================
62
+ // Config Schema
63
+ // ============================================================================
64
+
65
+ /**
66
+ * Log & Trace Component 配置 Schema
67
+ */
68
+ export const LogTraceConfigSchema = z.object({
69
+ /** 是否启用日志 */
70
+ logging: z.object({
71
+ enabled: z.boolean().default(true),
72
+ level: z.enum(["debug", "info", "warn", "error"]).default("info"),
73
+ quiet: z.boolean().default(false),
74
+ file: z.string().default("app.log"),
75
+ dir: z.string().default(getDefaultLogDir()),
76
+ /** 日志输出最大长度(0 表示不限制) */
77
+ maxOutput: z.number().default(0),
78
+ }).default({}),
79
+
80
+ /** 是否启用追踪 */
81
+ tracing: z.object({
82
+ enabled: z.boolean().default(true),
83
+ dbPath: z.string().optional(),
84
+ }).default({}),
85
+
86
+ /** 初始化请求上下文 */
87
+ initContext: z.object({
88
+ requestId: z.string().optional(),
89
+ sessionId: z.string().optional(),
90
+ }).optional(),
91
+ });
92
+
93
+ export type LogTraceConfig = z.infer<typeof LogTraceConfigSchema>;
94
+
95
+ /**
96
+ * LogTraceComponent 配置选项(通过 options 传递)
97
+ *
98
+ * 配置加载顺序(优先级从低到高):
99
+ * 1. File - 配置文件(通过 configPath 指定)
100
+ * 2. Env - 环境变量(通过 envPrefix 配置前缀)
101
+ * 3. Object - 直接传入的 config 对象(最高优先级)
102
+ */
103
+ export interface LogTraceComponentOptions {
104
+ /** ConfigComponent 实例(必填) */
105
+ configComponent: ConfigComponent;
106
+
107
+ /** 配置文件相对路径(可选,基于 XDG_DATA_HOME) */
108
+ configPath?: string;
109
+
110
+ /** 环境变量前缀(可选,默认 "LOG") */
111
+ envPrefix?: string;
112
+
113
+ /** 回调函数 */
114
+ callbacks?: {
115
+ onLogLevelChange?: (level: LogLevel) => void;
116
+ };
117
+
118
+ /** 直接传入的配置对象(可选,优先级最高) */
119
+ config?: Partial<LogTraceConfig>;
120
+ }
121
+
122
+ // ============================================================================
123
+ // Component
124
+ // ============================================================================
125
+
126
+ /**
127
+ * Log & Trace Component
128
+ *
129
+ * 提供统一的日志和追踪能力
130
+ * 配置通过 ConfigComponent 实时获取,支持配置热更新
131
+ *
132
+ * @example
133
+ * // 通过 ConfigComponent 初始化
134
+ * const configComponent = new ConfigComponent();
135
+ * const component = new LogTraceComponent();
136
+ * await component.init({
137
+ * env, // Environment 实例(必填)
138
+ * options: { configComponent }
139
+ * });
140
+ *
141
+ * // 配置更新后,日志级别会自动热更新
142
+ * configComponent.set("log-trace.logging.level", "debug");
143
+ *
144
+ * // 初始化追踪上下文
145
+ * component.initContext("request-123", "session-456");
146
+ *
147
+ * // 使用日志
148
+ * component.getLogger().info("Hello, world!");
149
+ *
150
+ * // 使用追踪
151
+ * const span = component.getTracer().startSpan("my-span");
152
+ * component.getTracer().endSpan(span);
153
+ */
154
+ export class LogTraceComponent extends BaseComponent {
155
+ readonly name = "log-trace";
156
+ readonly version = "1.0.0";
157
+
158
+ private config?: LogTraceConfig;
159
+ private configComponent?: ConfigComponent;
160
+ private tracer?: OTelTracer;
161
+ private traceContext?: ITraceContext;
162
+
163
+ /** 配置变更 watcher 清理函数 */
164
+ private configWatcher?: () => void;
165
+
166
+ constructor() {
167
+ super();
168
+ }
169
+
170
+ /**
171
+ * 初始化组件
172
+ *
173
+ * 配置加载优先级(从高到低):
174
+ * 1. Object - 直接传入的 config 对象
175
+ * 2. Env - 环境变量(通过 envPrefix 配置前缀)
176
+ * 3. File - 配置文件(通过 configPath 指定)
177
+ */
178
+ async init(config: ComponentConfig): Promise<void> {
179
+ // 调用基类 init,注入 env
180
+ await super.init(config);
181
+
182
+ // 从 options 获取 ConfigComponent
183
+ const options = config.options as unknown as LogTraceComponentOptions | undefined;
184
+ if (!options?.configComponent) {
185
+ throw new Error("ConfigComponent is required for LogTraceComponent initialization");
186
+ }
187
+
188
+ this.configComponent = options.configComponent;
189
+ await this.registerConfig(options);
190
+
191
+ // 初始化 Trace Context
192
+ this.traceContext = initTraceContext();
193
+
194
+ // 初始化 Tracer (OTel)
195
+ const provider = getTracerProvider();
196
+ // TODO: 这里后续要统一使用 "roy-tracer",但需要先重构为单例模式
197
+ // 目前保留原有 tracer 名称以避免破坏现有功能
198
+ // eslint-disable-next-line @typescript-eslint/no-unused-vars
199
+ const _unused = provider;
200
+ await provider.initialize();
201
+ this.tracer = provider.getTracer("roy-tracer");
202
+
203
+ // 配置日志
204
+ this.configureLogging();
205
+
206
+ // 初始化请求上下文(如果配置了)
207
+ if (this.config?.initContext?.requestId) {
208
+ this.traceContext.initContext(
209
+ this.config.initContext.requestId,
210
+ this.config.initContext.sessionId
211
+ );
212
+ }
213
+
214
+ this.setStatus("running");
215
+ }
216
+
217
+ /**
218
+ * 注册配置到 ConfigComponent
219
+ *
220
+ * 遵循 SessionComponent 模式:
221
+ * 1. 使用 registerComponent 注册配置结构
222
+ * 2. 使用 load 加载配置
223
+ * 3. 设置默认值
224
+ * 4. 处理环境变量后备方案
225
+ * 5. 处理 config 对象
226
+ *
227
+ * 配置加载顺序(优先级从低到高):
228
+ * 1. FileSource - 从配置文件加载(最低)
229
+ * 2. EnvSource - 从环境变量加载(中等)
230
+ * 3. MemorySource - 直接配置对象(最高)
231
+ */
232
+ private async registerConfig(options: LogTraceComponentOptions): Promise<void> {
233
+ const configComponent = options.configComponent;
234
+ if (!configComponent) return;
235
+
236
+ const { configPath, envPrefix, config } = options;
237
+ const prefix = envPrefix !== undefined ? envPrefix : "LOG_TRACE";
238
+
239
+ // 1. 使用 registerComponent 注册配置结构(keys 和 sources)
240
+ configComponent.registerComponent(LOG_TRACE_CONFIG_REGISTRATION);
241
+
242
+ // 2. 注册 FileSource(如果提供了 configPath)
243
+ if (configPath) {
244
+ configComponent.registerSource({
245
+ type: "file",
246
+ relativePath: configPath,
247
+ optional: true,
248
+ watch: false
249
+ });
250
+ }
251
+
252
+ // 3. 注册 EnvSource
253
+ configComponent.registerSource({
254
+ type: "env",
255
+ envPrefix: prefix,
256
+ priority: 20,
257
+ watch: false
258
+ });
259
+
260
+ // 4. 从 sources 加载配置(FileSource 和 EnvSource)
261
+ await configComponent.load("log-trace");
262
+
263
+ // 5. 后备方案:直接读取环境变量(确保所有环境变量都被处理)
264
+ for (const envKey of Object.keys(process.env)) {
265
+ const configKey = envKeyToConfigKey(envKey, prefix, "log-trace");
266
+ if (!configKey) continue;
267
+ const value = process.env[envKey];
268
+ if (value !== undefined) {
269
+ await configComponent.set(configKey, value);
270
+ }
271
+ }
272
+
273
+ // 6. 设置静态默认值(只有当配置不存在时)
274
+ for (const [key, value] of Object.entries(LOG_TRACE_DEFAULTS)) {
275
+ if (configComponent.get(key) === undefined) {
276
+ await configComponent.set(key, value);
277
+ }
278
+ }
279
+
280
+ // 7. 特殊处理动态默认值(这些无法在 defaults 中定义)
281
+ if (configComponent.get("log-trace.logging.dir") === undefined) {
282
+ await configComponent.set("log-trace.logging.dir", getDefaultLogDir());
283
+ }
284
+ if (configComponent.get("log-trace.logging.file") === undefined) {
285
+ await configComponent.set("log-trace.logging.file", "app.log");
286
+ }
287
+ if (configComponent.get("log-trace.logging.maxOutput") === undefined) {
288
+ await configComponent.set("log-trace.logging.maxOutput", 0);
289
+ }
290
+ if (configComponent.get("log-trace.tracing.dbPath") === undefined) {
291
+ await configComponent.set("log-trace.tracing.dbPath", getDefaultSpanDbPath());
292
+ }
293
+
294
+ // 8. 直接配置对象(最高优先级)
295
+ if (config) {
296
+ const flatConfig = this.flattenConfig(config);
297
+ for (const [key, value] of Object.entries(flatConfig)) {
298
+ await configComponent.set(key, value);
299
+ }
300
+ }
301
+
302
+ // 9. 注册配置热更新监听
303
+ this.registerConfigWatcher(configComponent);
304
+
305
+ // 10. 设置全局 ConfigComponent(让 logger 可以读取配置)
306
+ setConfigComponent(configComponent);
307
+
308
+ // 11. 解析最终配置
309
+ // 如果 tracing.dbPath 未配置,使用默认值
310
+ const tracingDbPath = configComponent.get("log-trace.tracing.dbPath") as string | undefined;
311
+ this.config = {
312
+ logging: {
313
+ enabled: (configComponent.get("log-trace.logging.enabled") as boolean) ?? true,
314
+ level: (configComponent.get("log-trace.logging.level") as LogLevel) ?? "info",
315
+ quiet: (configComponent.get("log-trace.logging.quiet") as boolean) ?? false,
316
+ file: (configComponent.get("log-trace.logging.file") as string) ?? "app.log",
317
+ dir: (configComponent.get("log-trace.logging.dir") as string) ?? getDefaultLogDir(),
318
+ maxOutput: (configComponent.get("log-trace.logging.maxOutput") as number) ?? 0,
319
+ },
320
+ tracing: {
321
+ enabled: (configComponent.get("log-trace.tracing.enabled") as boolean) ?? true,
322
+ dbPath: tracingDbPath ?? getDefaultSpanDbPath(),
323
+ },
324
+ };
325
+ }
326
+
327
+ /**
328
+ * 将配置对象展平为点号路径
329
+ */
330
+ private flattenConfig(
331
+ obj: Record<string, unknown>,
332
+ prefix = "log-trace"
333
+ ): Record<string, unknown> {
334
+ const result: Record<string, unknown> = {};
335
+ for (const [key, value] of Object.entries(obj)) {
336
+ const fullKey = `${prefix}.${key}`;
337
+ if (value && typeof value === "object" && !Array.isArray(value)) {
338
+ Object.assign(
339
+ result,
340
+ this.flattenConfig(value as Record<string, unknown>, fullKey)
341
+ );
342
+ } else {
343
+ result[fullKey] = value;
344
+ }
345
+ }
346
+ return result;
347
+ }
348
+
349
+ /**
350
+ * 注册配置热更新监听
351
+ */
352
+ private registerConfigWatcher(configComponent: ConfigComponent): void {
353
+ if (typeof configComponent.watch !== "function") {
354
+ return;
355
+ }
356
+
357
+ this.configWatcher = configComponent.watch("log-trace.*", (event) => {
358
+ this.onConfigChange(event);
359
+ });
360
+ }
361
+
362
+ /**
363
+ * 处理配置变更
364
+ */
365
+ protected onConfigChange(event: { key: string; oldValue?: unknown; newValue?: unknown }): void {
366
+ if (event.key === "log-trace.logging.quiet") {
367
+ setQuietMode(event.newValue as boolean);
368
+ }
369
+ }
370
+
371
+ /**
372
+ * 创建存储实例
373
+ *
374
+ * @throws Error 如果未配置 dbPath
375
+ */
376
+ private createStorage(): SpanStorage {
377
+ // 优先从 ConfigComponent 获取 dbPath
378
+ if (this.configComponent) {
379
+ const dbPath = this.configComponent.get("log-trace.tracing.dbPath") as string | undefined;
380
+ if (dbPath) {
381
+ return new SQLiteSpanStorage(dbPath);
382
+ }
383
+ }
384
+
385
+ // 降级到本地配置
386
+ if (this.config?.tracing?.dbPath) {
387
+ return new SQLiteSpanStorage(this.config.tracing.dbPath);
388
+ }
389
+
390
+ // 最后使用默认值
391
+ return new SQLiteSpanStorage(getDefaultSpanDbPath());
392
+ }
393
+
394
+ /**
395
+ * 配置日志系统
396
+ */
397
+ private configureLogging(): void {
398
+ if (!this.config?.logging) return;
399
+
400
+ if (this.config.logging.quiet) {
401
+ setQuietMode(true);
402
+ }
403
+ }
404
+
405
+ /**
406
+ * 初始化追踪上下文
407
+ *
408
+ * @param requestId 请求 ID
409
+ * @param sessionId 会话 ID(可选)
410
+ */
411
+ initContext(requestId: string, sessionId?: string): void {
412
+ if (!this.traceContext) {
413
+ throw new Error("Component not initialized");
414
+ }
415
+ this.traceContext.initContext(requestId, sessionId);
416
+ }
417
+
418
+ /**
419
+ * 创建新的追踪上下文(返回清理函数)
420
+ *
421
+ * @param requestId 请求 ID
422
+ * @param sessionId 会话 ID(可选)
423
+ */
424
+ startContext(requestId: string, sessionId?: string): () => void {
425
+ if (!this.traceContext) {
426
+ throw new Error("Component not initialized");
427
+ }
428
+ return this.traceContext.startNewContext(requestId, sessionId);
429
+ }
430
+
431
+ /**
432
+ * 获取 Logger
433
+ *
434
+ * @param prefix 日志前缀
435
+ */
436
+ getLogger(prefix?: string): ReturnType<typeof createLogger> {
437
+ return createLogger(prefix || "app");
438
+ }
439
+
440
+ /**
441
+ * 获取 Tracer
442
+ */
443
+ getTracer(): OTelTracer {
444
+ if (!this.tracer) {
445
+ throw new Error("Component not initialized");
446
+ }
447
+ return this.tracer;
448
+ }
449
+
450
+ /**
451
+ * 获取 Trace Context
452
+ */
453
+ getTraceContext(): ITraceContext | undefined {
454
+ return this.traceContext;
455
+ }
456
+
457
+ /**
458
+ * 获取当前 requestId
459
+ */
460
+ getRequestId(): string | undefined {
461
+ return this.traceContext?.getRequestId();
462
+ }
463
+
464
+ /**
465
+ * 停止组件
466
+ */
467
+ async onStop(): Promise<void> {
468
+ // 清理配置 watcher
469
+ this.configWatcher?.();
470
+ this.configWatcher = undefined;
471
+
472
+ // 清理 tracer
473
+ this.tracer = undefined;
474
+ this.setStatus("stopped");
475
+ }
476
+ }
477
+
478
+ // ============================================================================
479
+ // Component Schema
480
+ // ============================================================================
481
+
482
+ /**
483
+ * Log & Trace Component Schema
484
+ */
485
+ export const logTraceComponentSchema: ComponentSchema = {
486
+ name: "log-trace",
487
+ schema: LogTraceConfigSchema,
488
+ defaults: {
489
+ logging: { enabled: true, level: "info", quiet: false, file: "app.log" },
490
+ tracing: { enabled: true },
491
+ },
492
+ metadata: {
493
+ description: "Log & Trace Component - Unified logging and tracing",
494
+ version: "1.0.0",
495
+ author: "roy-agent",
496
+ },
497
+ };