@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,210 @@
1
+ /**
2
+ * 环境变量键名转换工具
3
+ *
4
+ * 提供统一的环境变量键名转换逻辑,供 EnvSource 和其他组件使用
5
+ *
6
+ * 转换规则(toEnvKey):
7
+ * 1. 将点号替换为下划线
8
+ * 2. 将驼峰命名转换为下划线分隔的大写形式
9
+ * 3. 拼接前缀(如果前缀不以_结尾则自动添加)
10
+ *
11
+ * 转换规则(fromEnvKey - 用于 EnvSource):
12
+ * 1. 移除前缀
13
+ * 2. 保持原始格式(大小写)
14
+ *
15
+ * 转换规则(envKeyToConfigKey - 通用):
16
+ * 1. 移除前缀
17
+ * 2. 转小写
18
+ * 3. 将下划线替换为点号
19
+ * 4. 拼接组件名前缀
20
+ *
21
+ * @example
22
+ * // toEnvKey
23
+ * toEnvKey("llm.defaultModel", "LLM") -> "LLM_LLM_DEFAULT_MODEL"
24
+ * toEnvKey("logTrace.level", "LOG") -> "LOG_LOG_TRACE_LEVEL"
25
+ *
26
+ * // fromEnvKey (用于 EnvSource.list)
27
+ * fromEnvKey("LLM_LLM_DEBUG", "LLM_") -> "DEBUG"
28
+ *
29
+ * // envKeyToConfigKey (通用,支持任意组件)
30
+ * envKeyToConfigKey("LLM_LLM_DEFAULT_MODEL", "LLM", "llm") -> "llm.default.model"
31
+ * envKeyToConfigKey("LOG_LOG_TRACE_LEVEL", "LOG", "logTrace") -> "logTrace.level"
32
+ */
33
+
34
+ /**
35
+ * 将点号路径转换为环境变量名(带前缀)
36
+ *
37
+ * 规则:
38
+ * - `.` 和 `-` 都替换为路径分隔符 `_`
39
+ * - 驼峰转为下划线大写
40
+ *
41
+ * 转换示例:
42
+ * - `llm.defaultModel` + `LLM` -> `LLM_LLM_DEFAULT_MODEL`
43
+ * - `log-trace.logging.level` + `LOG` -> `LOG_TRACE_LOGGING_LEVEL`
44
+ *
45
+ * @example
46
+ * toEnvKey("llm.defaultModel", "LLM") -> "LLM_LLM_DEFAULT_MODEL"
47
+ * toEnvKey("log-trace.logging.level", "LOG") -> "LOG_TRACE_LOGGING_LEVEL"
48
+ */
49
+ export function toEnvKey(key: string, prefix: string): string {
50
+ // 1. 将点号和连字符替换为下划线
51
+ let keyNormalized = key.replace(/[.-]/g, "_");
52
+
53
+ // 2. 将驼峰命名转换为下划线分隔的大写形式
54
+ keyNormalized = keyNormalized
55
+ .replace(/([a-z])([A-Z])/g, "$1_$2")
56
+ .replace(/_+/g, "_")
57
+ .toUpperCase();
58
+
59
+ // 3. 拼接前缀
60
+ if (prefix) {
61
+ // 如果前缀已以下划线结尾,不要重复添加
62
+ const separator = prefix.endsWith("_") ? "" : "_";
63
+ return `${prefix}${separator}${keyNormalized}`;
64
+ }
65
+ return keyNormalized;
66
+ }
67
+
68
+ /**
69
+ * 从环境变量名提取内部键名(移除前缀,保持原始格式)
70
+ *
71
+ * 用于 EnvSource.list() 等需要保持原始格式的场景
72
+ */
73
+ export function fromEnvKey(envKey: string, prefix: string): string {
74
+ if (!prefix) {
75
+ return envKey;
76
+ }
77
+
78
+ // 检查前缀匹配
79
+ if (envKey.startsWith(prefix)) {
80
+ const afterPrefix = envKey.slice(prefix.length);
81
+ // 移除开头的下划线(如果有)
82
+ if (afterPrefix.startsWith("_")) {
83
+ return afterPrefix.slice(1);
84
+ }
85
+ return afterPrefix;
86
+ }
87
+ return envKey;
88
+ }
89
+
90
+ /**
91
+ * 将环境变量名转换为配置键名(通用,支持任意组件)
92
+ *
93
+ * 规则:
94
+ * - `_` 转换为 `.` 作为键路径分隔符
95
+ * - 组件名中的 `-` 在环境变量中也会是 `_`(因为 toEnvKey 会转换)
96
+ *
97
+ * 环境变量格式约定:
98
+ * - PREFIX_KEY: 如 LLM_DEFAULT_MODEL -> llm.default.model
99
+ * - PREFIX_COMPONENT_KEY: 如 LLM_LLM_DEFAULT_MODEL -> llm.default.model
100
+ * - 对于带连字符的组件名: 如 LOG_TRACE_LOGGING_LEVEL -> log-trace.logging.level (当组件名为 log-trace)
101
+ *
102
+ * @param envKey - 环境变量名(如 LLM_LLM_DEFAULT_MODEL 或 LOG_TRACE_LOGGING_LEVEL)
103
+ * @param prefix - 环境变量前缀(如 LLM 或 LOG)
104
+ * @param componentName - 组件名(如 llm, logTrace, log-trace)
105
+ * @returns 配置键名(如 llm.default.model 或 log-trace.logging.level)
106
+ *
107
+ * @example
108
+ * // 格式1: PREFIX_KEY
109
+ * envKeyToConfigKey("LLM_DEFAULT_MODEL", "LLM", "llm") -> "llm.default.model"
110
+ *
111
+ * // 格式2: PREFIX_COMPONENT_KEY
112
+ * envKeyToConfigKey("LLM_LLM_DEFAULT_MODEL", "LLM", "llm") -> "llm.default.model"
113
+ *
114
+ * // 格式3: 连字符组件名(环境变量中 - 会被转成 _)
115
+ * envKeyToConfigKey("LOG_TRACE_LOGGING_LEVEL", "LOG", "log-trace") -> "log-trace.logging.level"
116
+ */
117
+ export function envKeyToConfigKey(envKey: string, prefix: string, componentName: string): string | undefined {
118
+ const prefixUpper = prefix.toUpperCase();
119
+
120
+ if (!envKey.startsWith(prefixUpper)) {
121
+ return undefined;
122
+ }
123
+
124
+ // 将组件名转换为下划线大写格式用于比较
125
+ const componentUpperNormalized = componentName
126
+ .replace(/-/g, "_")
127
+ .toUpperCase();
128
+
129
+ // 移除前缀
130
+ let keyPart = envKey.slice(prefixUpper.length);
131
+
132
+ // 移除前缀后的分隔符
133
+ if (keyPart.startsWith("_")) {
134
+ keyPart = keyPart.slice(1);
135
+ }
136
+
137
+ if (!keyPart) {
138
+ return undefined;
139
+ }
140
+
141
+ // 找出第一个下划线的位置
142
+ const firstUnderscore = keyPart.indexOf("_");
143
+ let restPart: string;
144
+
145
+ if (firstUnderscore === -1) {
146
+ // 没有下划线,整个作为 rest
147
+ restPart = keyPart;
148
+ } else {
149
+ const firstPart = keyPart.slice(0, firstUnderscore);
150
+ const remaining = keyPart.slice(firstUnderscore + 1);
151
+
152
+ // 检查第一段是否等于组件名的大写形式
153
+ if (firstPart === componentUpperNormalized) {
154
+ // 匹配成功,移除组件名前缀
155
+ restPart = remaining;
156
+ } else {
157
+ // 第一段不是组件名,整个 keyPart 作为 rest
158
+ restPart = keyPart;
159
+ }
160
+ }
161
+
162
+ if (!restPart) {
163
+ return undefined;
164
+ }
165
+
166
+ // 将下划线转换为点号,转小写,拼接组件名
167
+ const restPartConverted = restPart.replace(/_/g, ".");
168
+
169
+ return `${componentName}.${restPartConverted.toLowerCase()}`;
170
+ }
171
+
172
+ /**
173
+ * 从环境变量键名提取组件名
174
+ *
175
+ * 用于自动发现所有以 prefix 开头的环境变量
176
+ *
177
+ * @param envKey - 环境变量名
178
+ * @param prefix - 前缀
179
+ * @returns 组件名和剩余部分(如 ["llm", "default.model"])
180
+ */
181
+ export function extractComponentFromEnvKey(envKey: string, prefix: string): [string, string] | undefined {
182
+ const prefixUpper = prefix.toUpperCase();
183
+
184
+ if (!envKey.startsWith(prefixUpper)) {
185
+ return undefined;
186
+ }
187
+
188
+ // 移除前缀
189
+ let keyPart = envKey.slice(prefixUpper.length);
190
+ // 移除前缀后的下划线(如果有)
191
+ if (keyPart.startsWith("_")) {
192
+ keyPart = keyPart.slice(1);
193
+ }
194
+
195
+ if (!keyPart) {
196
+ return undefined;
197
+ }
198
+
199
+ // 提取组件名(第一段下划线之前的部分)
200
+ const underscoreIndex = keyPart.indexOf("_");
201
+ if (underscoreIndex === -1) {
202
+ // 只有一个部分,如 LLM_DEFAULT_MODEL -> llm.default_model
203
+ return [keyPart.toLowerCase().replace(/_/g, "."), ""];
204
+ }
205
+
206
+ const component = keyPart.slice(0, underscoreIndex).toLowerCase();
207
+ const rest = keyPart.slice(underscoreIndex + 1);
208
+
209
+ return [`${component}.${rest.replace(/_/g, ".")}`, rest];
210
+ }
@@ -0,0 +1,252 @@
1
+ import { describe, test, expect, beforeEach, afterEach } from "vitest";
2
+ import { EnvSource } from "./env-source";
3
+
4
+ describe("EnvSource", () => {
5
+ // 保存原始环境变量
6
+ const originalEnv = { ...process.env };
7
+
8
+ beforeEach(() => {
9
+ // 重置环境变量
10
+ process.env = { ...originalEnv };
11
+ // 删除测试相关变量
12
+ delete process.env.TEST_VAR;
13
+ delete process.env.NESTED_VAR;
14
+ delete process.env["USER.PROFILE.NAME"];
15
+ delete process.env.PREFIX_TEST_ONE;
16
+ delete process.env.PREFIX_TEST_TWO;
17
+ });
18
+
19
+ afterEach(() => {
20
+ // 恢复原始环境变量
21
+ process.env = originalEnv;
22
+ });
23
+
24
+ test("read returns undefined for non-existent key", () => {
25
+ const source = new EnvSource();
26
+ const value = source.read("NON_EXISTENT_VAR");
27
+ expect(value).toBeUndefined();
28
+ });
29
+
30
+ test("read returns value from environment variable", () => {
31
+ process.env.TEST_VAR = "hello world";
32
+
33
+ const source = new EnvSource();
34
+ expect(source.read("TEST_VAR")).toBe("hello world");
35
+ });
36
+
37
+ test("read converts key to uppercase", () => {
38
+ process.env.TEST_VAR = "value";
39
+
40
+ const source = new EnvSource();
41
+ expect(source.read("test_var")).toBe("value");
42
+ expect(source.read("TEST_VAR")).toBe("value");
43
+ });
44
+
45
+ test("read supports prefix matching", () => {
46
+ process.env.MY_APP_DEBUG = "true";
47
+ process.env.MY_APP_PORT = "8080";
48
+ process.env.OTHER_VAR = "ignored";
49
+
50
+ const source = new EnvSource({ prefix: "MY_APP_" });
51
+ expect(source.read("DEBUG")).toBe("true");
52
+ expect(source.read("PORT")).toBe("8080");
53
+ expect(source.read("OTHER_VAR")).toBeUndefined();
54
+ });
55
+
56
+ test("read returns original key if prefix doesn't match", () => {
57
+ process.env.MY_APP_DEBUG = "true";
58
+
59
+ const source = new EnvSource({ prefix: "OTHER_" });
60
+ expect(source.read("DEBUG")).toBeUndefined();
61
+ expect(source.read("MY_APP_DEBUG")).toBeUndefined();
62
+ });
63
+
64
+ test("read returns string value by default", () => {
65
+ process.env.TEST_STRING = "hello";
66
+ process.env.TEST_NUMBER = "42";
67
+
68
+ const source = new EnvSource();
69
+ expect(source.read("TEST_STRING")).toBe("hello");
70
+ expect(source.read("TEST_NUMBER")).toBe("42");
71
+ });
72
+
73
+ test("read applies transform function", () => {
74
+ process.env.TEST_BOOL = "true";
75
+ process.env.TEST_NUM = "42";
76
+
77
+ const source = new EnvSource({
78
+ transform: (value, key) => {
79
+ if (key.endsWith("_BOOL")) return value === "true";
80
+ if (key.endsWith("_NUM")) return parseInt(value, 10);
81
+ return value;
82
+ },
83
+ });
84
+
85
+ expect(source.read("TEST_BOOL")).toBe(true);
86
+ expect(source.read("TEST_NUM")).toBe(42);
87
+ });
88
+
89
+ test("write sets environment variable", () => {
90
+ const source = new EnvSource();
91
+ const result = source.write("TEST_VAR", "new value");
92
+ expect(result).toBe(true);
93
+ expect(process.env.TEST_VAR).toBe("new value");
94
+ });
95
+
96
+ test("write applies prefix", () => {
97
+ const source = new EnvSource({ prefix: "APP_" });
98
+ source.write("DEBUG", "true");
99
+ expect(process.env.APP_DEBUG).toBe("true");
100
+ });
101
+
102
+ test("write applies transform function", () => {
103
+ const source = new EnvSource({
104
+ transform: (value) => String(value),
105
+ });
106
+ source.write("TEST_NUM", 42);
107
+ expect(process.env.TEST_NUM).toBe("42");
108
+ });
109
+
110
+ test("write converts key to uppercase", () => {
111
+ const source = new EnvSource();
112
+ source.write("test_var", "value");
113
+ expect(process.env.TEST_VAR).toBe("value");
114
+ });
115
+
116
+ test("delete removes environment variable", () => {
117
+ process.env.TEST_VAR = "value";
118
+
119
+ const source = new EnvSource();
120
+ const result = source.delete("TEST_VAR");
121
+ expect(result).toBe(true);
122
+ expect(process.env.TEST_VAR).toBeUndefined();
123
+ });
124
+
125
+ test("delete returns false for non-existent key", () => {
126
+ const source = new EnvSource();
127
+ const result = source.delete("NON_EXISTENT");
128
+ expect(result).toBe(false);
129
+ });
130
+
131
+ test("delete applies prefix", () => {
132
+ process.env.APP_TEST = "value";
133
+
134
+ const source = new EnvSource({ prefix: "APP_" });
135
+ const result = source.delete("TEST");
136
+ expect(result).toBe(true);
137
+ expect(process.env.APP_TEST).toBeUndefined();
138
+ });
139
+
140
+ test("list returns all environment variables", () => {
141
+ process.env.TEST_ONE = "1";
142
+ process.env.TEST_TWO = "2";
143
+ process.env.OTHER = "3";
144
+
145
+ const source = new EnvSource();
146
+ const entries = source.list();
147
+
148
+ const testEntries = entries.filter((e) => e.key.startsWith("TEST_"));
149
+ expect(testEntries).toContainEqual({ key: "TEST_ONE", value: "1" });
150
+ expect(testEntries).toContainEqual({ key: "TEST_TWO", value: "2" });
151
+ });
152
+
153
+ test("list applies prefix filter", () => {
154
+ process.env.MY_APP_DEBUG = "true";
155
+ process.env.MY_APP_PORT = "8080";
156
+ process.env.OTHER_VAR = "ignored";
157
+
158
+ const source = new EnvSource({ prefix: "MY_APP_" });
159
+ const entries = source.list();
160
+
161
+ expect(entries).toContainEqual({ key: "DEBUG", value: "true" });
162
+ expect(entries).toContainEqual({ key: "PORT", value: "8080" });
163
+ expect(entries).not.toContainEqual(
164
+ expect.objectContaining({ key: "OTHER_VAR" })
165
+ );
166
+ });
167
+
168
+ test("list removes prefix from keys", () => {
169
+ process.env.APP_DEBUG = "true";
170
+
171
+ const source = new EnvSource({ prefix: "APP_" });
172
+ const entries = source.list();
173
+
174
+ expect(entries).toContainEqual({ key: "DEBUG", value: "true" });
175
+ expect(entries).not.toContainEqual(
176
+ expect.objectContaining({ key: "APP_DEBUG" })
177
+ );
178
+ });
179
+
180
+ test("watch monitors environment changes", async () => {
181
+ const source = new EnvSource({ pollInterval: 50 });
182
+ const events: any[] = [];
183
+
184
+ const unwatch = source.watch((event) => {
185
+ events.push(event);
186
+ });
187
+
188
+ // 等待 watcher 初始化
189
+ await new Promise((r) => setTimeout(r, 100));
190
+
191
+ // 修改环境变量
192
+ process.env.TEST_VAR = "changed";
193
+
194
+ // 等待事件触发(需要轮询间隔)
195
+ await new Promise((r) => setTimeout(r, 150));
196
+
197
+ unwatch();
198
+
199
+ expect(events.length).toBeGreaterThan(0);
200
+ });
201
+
202
+ test("watch returns unsubscribe function", async () => {
203
+ const source = new EnvSource({ pollInterval: 50 });
204
+ let called = false;
205
+ const wrappedCallback = (event: any) => { called = true; };
206
+
207
+ const unwatch = source.watch(wrappedCallback);
208
+
209
+ // 等待 watcher 初始化
210
+ await new Promise((r) => setTimeout(r, 100));
211
+
212
+ unwatch();
213
+
214
+ process.env.TEST_VAR = "changed";
215
+
216
+ // 等待事件触发(需要轮询间隔)
217
+ await new Promise((r) => setTimeout(r, 150));
218
+
219
+ expect(called).toBe(false);
220
+ });
221
+
222
+ test("has correct name and priority", () => {
223
+ const source = new EnvSource();
224
+ expect(source.name).toBe("env");
225
+ expect(source.priority).toBe(20);
226
+ });
227
+
228
+ test("default priority is higher than file source", () => {
229
+ const envSource = new EnvSource();
230
+ expect(envSource.priority).toBe(20);
231
+ });
232
+
233
+ test("transform receives key and value", () => {
234
+ process.env.TEST_VAR = "original";
235
+
236
+ let receivedKey = "";
237
+ let receivedValue = "";
238
+
239
+ const source = new EnvSource({
240
+ transform: (value, key) => {
241
+ receivedKey = key;
242
+ receivedValue = value;
243
+ return value.toUpperCase();
244
+ },
245
+ });
246
+
247
+ const result = source.read("TEST_VAR");
248
+ expect(result).toBe("ORIGINAL");
249
+ expect(receivedKey).toBe("TEST_VAR");
250
+ expect(receivedValue).toBe("original");
251
+ });
252
+ });