@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,181 @@
1
+ /**
2
+ * @fileoverview Propagation Env 测试
3
+ *
4
+ * 测试 propagation-env 模块:
5
+ * - injectToEnv: 从当前 OTelTracerProvider 获取上下文并注入环境变量
6
+ * - injectToEnvWithContext: 直接注入指定 SpanContext
7
+ */
8
+
9
+ import { describe, test, expect, beforeEach, afterEach, vi } from 'bun:test';
10
+ import {
11
+ injectToEnv,
12
+ injectToEnvWithContext,
13
+ injectToEnvFromCarrier,
14
+ } from './propagation-env';
15
+ import { propagation } from './propagation';
16
+
17
+ // Mock the tracer-provider module
18
+ const mockInjectToEnv = vi.fn();
19
+ const mockGetCurrentContext = vi.fn();
20
+
21
+ vi.mock('./tracer-provider', () => ({
22
+ getTracerProvider: vi.fn().mockReturnValue({
23
+ getTracer: vi.fn().mockReturnValue({
24
+ injectToEnv: mockInjectToEnv,
25
+ getCurrentContext: mockGetCurrentContext,
26
+ }),
27
+ isInitialized: vi.fn().mockReturnValue(true),
28
+ }),
29
+ }));
30
+
31
+ describe('propagation-env', () => {
32
+ beforeEach(() => {
33
+ vi.clearAllMocks();
34
+ });
35
+
36
+ describe('injectToEnv', () => {
37
+ test('should inject TRACEPARENT to provided env object', async () => {
38
+ // Create a mock tracer with current context
39
+ const mockSpanContext = {
40
+ traceId: '0af7651916cd43dd8448eb211c80319c',
41
+ spanId: 'b7ad6b7169203331',
42
+ parentSpanId: undefined,
43
+ };
44
+
45
+ mockGetCurrentContext.mockReturnValue(mockSpanContext);
46
+ mockInjectToEnv.mockImplementation((env: Record<string, string | undefined>) => {
47
+ env['TRACEPARENT'] = '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01';
48
+ });
49
+
50
+ const env: Record<string, string | undefined> = {};
51
+ injectToEnv(env);
52
+
53
+ expect(env['TRACEPARENT']).toBeDefined();
54
+ expect(env['TRACEPARENT']).toMatch(/^00-[0-9a-f]{32}-[0-9a-f]{16}-01$/);
55
+ });
56
+
57
+ test('should not inject if no current context', () => {
58
+ mockGetCurrentContext.mockReturnValue(undefined);
59
+ mockInjectToEnv.mockImplementation((_env: Record<string, string | undefined>) => {});
60
+
61
+ const env: Record<string, string | undefined> = {};
62
+ injectToEnv(env);
63
+
64
+ // injectToEnv should not set TRACEPARENT when no context
65
+ expect(mockInjectToEnv).toHaveBeenCalledWith(env);
66
+ });
67
+
68
+ test('should preserve existing env variables', () => {
69
+ const mockSpanContext = {
70
+ traceId: '0af7651916cd43dd8448eb211c80319c',
71
+ spanId: 'b7ad6b7169203331',
72
+ parentSpanId: undefined,
73
+ };
74
+
75
+ mockGetCurrentContext.mockReturnValue(mockSpanContext);
76
+ mockInjectToEnv.mockImplementation((env: Record<string, string | undefined>) => {
77
+ env['TRACEPARENT'] = '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01';
78
+ });
79
+
80
+ const env: Record<string, string | undefined> = {
81
+ HOME: '/home/user',
82
+ PATH: '/usr/bin',
83
+ CUSTOM_VAR: 'custom-value',
84
+ };
85
+
86
+ injectToEnv(env);
87
+
88
+ expect(env['HOME']).toBe('/home/user');
89
+ expect(env['PATH']).toBe('/usr/bin');
90
+ expect(env['CUSTOM_VAR']).toBe('custom-value');
91
+ expect(env['TRACEPARENT']).toBeDefined();
92
+ });
93
+ });
94
+
95
+ describe('injectToEnvWithContext', () => {
96
+ test('should inject given SpanContext to env', () => {
97
+ const context = {
98
+ traceId: '0af7651916cd43dd8448eb211c80319c',
99
+ spanId: 'b7ad6b7169203331',
100
+ parentSpanId: 'a1b2c3d4e5f67890',
101
+ };
102
+
103
+ const env: Record<string, string | undefined> = {};
104
+ injectToEnvWithContext(env, context);
105
+
106
+ // 验证 propagation.inject 被正确调用
107
+ expect(env['TRACEPARENT']).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
108
+ });
109
+
110
+ test('should inject traceparent format correctly', () => {
111
+ const context = {
112
+ traceId: '0af7651916cd43dd8448eb211c80319c',
113
+ spanId: 'b7ad6b7169203331',
114
+ parentSpanId: undefined,
115
+ };
116
+
117
+ const env: Record<string, string | undefined> = {};
118
+ injectToEnvWithContext(env, context);
119
+
120
+ const traceparent = env['TRACEPARENT'];
121
+ expect(traceparent).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
122
+ });
123
+
124
+ test('should overwrite existing TRACEPARENT', () => {
125
+ const context = {
126
+ traceId: '0af7651916cd43dd8448eb211c80319c',
127
+ spanId: 'b7ad6b7169203331',
128
+ parentSpanId: undefined,
129
+ };
130
+
131
+ const env: Record<string, string | undefined> = {
132
+ TRACEPARENT: '00-old-trace-old-span-old-flags',
133
+ };
134
+
135
+ injectToEnvWithContext(env, context);
136
+
137
+ expect(env['TRACEPARENT']).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
138
+ });
139
+ });
140
+
141
+ describe('injectToEnvFromCarrier', () => {
142
+ test('should inject from source carrier to target carrier', () => {
143
+ const sourceCarrier: Record<string, string | undefined> = {
144
+ TRACEPARENT: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
145
+ };
146
+
147
+ const targetCarrier: Record<string, string | undefined> = {};
148
+ injectToEnvFromCarrier(targetCarrier, sourceCarrier);
149
+
150
+ expect(targetCarrier['TRACEPARENT']).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
151
+ });
152
+
153
+ test('should return undefined if source has no TRACEPARENT', () => {
154
+ const sourceCarrier: Record<string, string | undefined> = {};
155
+ const targetCarrier: Record<string, string | undefined> = {};
156
+
157
+ injectToEnvFromCarrier(targetCarrier, sourceCarrier);
158
+
159
+ expect(targetCarrier['TRACEPARENT']).toBeUndefined();
160
+ });
161
+ });
162
+ });
163
+
164
+ describe('propagation-env integration', () => {
165
+ test('should produce valid W3C traceparent format', () => {
166
+ const context = {
167
+ traceId: '0af7651916cd43dd8448eb211c80319c',
168
+ spanId: 'b7ad6b7169203331',
169
+ parentSpanId: undefined,
170
+ };
171
+
172
+ const env: Record<string, string | undefined> = {};
173
+ injectToEnvWithContext(env, context);
174
+
175
+ // Parse and verify format
176
+ const parsed = propagation.extract(env);
177
+ expect(parsed).toBeDefined();
178
+ expect(parsed!.traceId).toBe('0af7651916cd43dd8448eb211c80319c');
179
+ expect(parsed!.spanId).toBe('b7ad6b7169203331');
180
+ });
181
+ });
@@ -0,0 +1,136 @@
1
+ /**
2
+ * @fileoverview Propagation Env Module
3
+ *
4
+ * 提供便捷的环境变量注入功能,用于在子进程执行时传递 trace context。
5
+ *
6
+ * @example
7
+ * ```typescript
8
+ * import { injectToEnv, injectToEnvWithContext } from './propagation-env';
9
+ *
10
+ * // 在 Bash 工具中执行子进程前:
11
+ * const traceEnv = injectToEnv(); // 从当前 OTelTracerProvider 获取并注入
12
+ * const options = {
13
+ * env: { ...process.env, ...traceEnv, ...env },
14
+ * };
15
+ * spawn(command, args, options);
16
+ * ```
17
+ */
18
+
19
+ import type { SpanContext } from "../types";
20
+ import { propagation } from "./propagation";
21
+ import { getTracerProvider } from "./tracer-provider";
22
+
23
+ // ============================================================================
24
+ // Types
25
+ // ============================================================================
26
+
27
+ /**
28
+ * 环境变量对象类型
29
+ */
30
+ export type EnvCarrier = Record<string, string | undefined>;
31
+
32
+ // ============================================================================
33
+ // Core Functions
34
+ // ============================================================================
35
+
36
+ /**
37
+ * 从当前 OTelTracerProvider 获取上下文并注入到环境变量
38
+ *
39
+ * 这是一个便捷函数,封装了常见的注入模式:
40
+ * 1. 从全局 TracerProvider 获取当前 Tracer
41
+ * 2. 获取当前 span context
42
+ * 3. 注入到目标环境变量
43
+ *
44
+ * @param env 目标环境变量对象(默认:{})
45
+ * @returns 注入了 TRACEPARENT 的环境变量对象
46
+ *
47
+ * @example
48
+ * ```typescript
49
+ * const env = injectToEnv({ PATH: '/usr/bin' });
50
+ * // env.TRACEPARENT = '00-{traceId}-{spanId}-01'
51
+ * // env.PATH = '/usr/bin'
52
+ * ```
53
+ */
54
+ export function injectToEnv(env: EnvCarrier = {}): EnvCarrier {
55
+ const provider = getTracerProvider();
56
+
57
+ // 如果 provider 未初始化,尝试获取 tracer(可能会自动初始化)
58
+ const tracer = provider.getTracer('roy-tracer');
59
+
60
+ tracer.injectToEnv(env);
61
+
62
+ return env;
63
+ }
64
+
65
+ /**
66
+ * 将指定的 SpanContext 直接注入到环境变量
67
+ *
68
+ * 与 injectToEnv 不同,这个函数不需要访问全局 TracerProvider,
69
+ * 直接使用传入的 SpanContext 进行注入。
70
+ *
71
+ * @param env 目标环境变量对象
72
+ * @param context 要注入的 SpanContext
73
+ * @returns 注入了 TRACEPARENT 的环境变量对象
74
+ *
75
+ * @example
76
+ * ```typescript
77
+ * const span = tracer.startSpan('my-span');
78
+ * const env = injectToEnvWithContext({}, span.spanContext);
79
+ * ```
80
+ */
81
+ export function injectToEnvWithContext(env: EnvCarrier, context: SpanContext): EnvCarrier {
82
+ propagation.inject(env, context);
83
+ return env;
84
+ }
85
+
86
+ /**
87
+ * 从源环境变量 carrier 复制 TRACEPARENT 到目标 carrier
88
+ *
89
+ * 用于将一个环境变量对象中的 trace context 传递到另一个:
90
+ * - 从 process.env 复制到子进程的环境变量
91
+ * - 从父进程环境变量复制到子进程环境变量
92
+ *
93
+ * @param target 目标 carrier(将被修改)
94
+ * @param source 源 carrier
95
+ * @returns 目标 carrier
96
+ *
97
+ * @example
98
+ * ```typescript
99
+ * // 在 fork 子进程时继承父进程的 trace context
100
+ * const childEnv = injectToEnvFromCarrier({}, process.env);
101
+ * ```
102
+ */
103
+ export function injectToEnvFromCarrier(target: EnvCarrier, source: EnvCarrier): EnvCarrier {
104
+ const extracted = propagation.extract(source);
105
+
106
+ if (extracted) {
107
+ // 将提取的上下文重新注入到目标
108
+ // ExtractedContext 包含发送方的 traceId 和 spanId
109
+ // 需要构造新的 SpanContext 用于传播
110
+ const context: SpanContext = {
111
+ traceId: extracted.traceId,
112
+ spanId: extracted.spanId, // 使用发送方的 spanId
113
+ parentSpanId: undefined, // 新的 span 将作为根 span(但会继承 traceId)
114
+ };
115
+ propagation.inject(target, context);
116
+ }
117
+
118
+ return target;
119
+ }
120
+
121
+ // ============================================================================
122
+ // Utility Functions
123
+ // ============================================================================
124
+
125
+ /**
126
+ * 获取 TRACEPARENT 字段名
127
+ */
128
+ export function getTraceparentHeader(): string {
129
+ return propagation.getTraceparentHeader();
130
+ }
131
+
132
+ // ============================================================================
133
+ // Re-exports
134
+ // ============================================================================
135
+
136
+ export type { SpanContext } from "../types";
@@ -0,0 +1,259 @@
1
+ /**
2
+ * @fileoverview W3C TraceContext Propagation 测试
3
+ *
4
+ * 测试 W3C TraceContext 标准的 traceparent 格式:
5
+ * - 注入 (inject): 将 SpanContext 序列化到环境变量
6
+ * - 提取 (extract): 从环境变量反序列化 SpanContext
7
+ * - 序列化 (serialize): SpanContext -> traceparent 字符串
8
+ * - 反序列化 (parse): traceparent 字符串 -> SpanContext
9
+ */
10
+
11
+ import { describe, test, expect, beforeEach } from 'bun:test';
12
+ import {
13
+ propagation,
14
+ serialize,
15
+ parse,
16
+ type SpanContext,
17
+ type ExtractedContext,
18
+ } from './propagation';
19
+
20
+ describe('propagation', () => {
21
+ describe('serialize', () => {
22
+ test('should serialize basic SpanContext to traceparent format', () => {
23
+ const context: SpanContext = {
24
+ traceId: '0af7651916cd43dd8448eb211c80319c',
25
+ spanId: 'b7ad6b7169203331',
26
+ parentSpanId: undefined,
27
+ };
28
+
29
+ const result = serialize(context);
30
+ // W3C TraceContext: 使用 spanId 而非 parentSpanId
31
+ expect(result).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
32
+ });
33
+
34
+ test('should serialize SpanContext with parentSpanId', () => {
35
+ const context: SpanContext = {
36
+ traceId: '0af7651916cd43dd8448eb211c80319c',
37
+ spanId: 'b7ad6b7169203331',
38
+ parentSpanId: 'a1b2c3d4e5f67890',
39
+ };
40
+
41
+ const result = serialize(context);
42
+ // W3C TraceContext: 使用 spanId 而非 parentSpanId
43
+ expect(result).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
44
+ });
45
+
46
+ test('should pad traceId to 32 characters', () => {
47
+ const context: SpanContext = {
48
+ traceId: '1',
49
+ spanId: 'b7ad6b7169203331',
50
+ parentSpanId: undefined,
51
+ };
52
+
53
+ const result = serialize(context);
54
+ // traceId "1" should be padded to "00000000000000000000000000000001"
55
+ expect(result).toMatch(/^00-0{31}1-/);
56
+ });
57
+
58
+ test('should pad spanId to 16 characters', () => {
59
+ const context: SpanContext = {
60
+ traceId: '0af7651916cd43dd8448eb211c80319c',
61
+ spanId: '1',
62
+ parentSpanId: undefined,
63
+ };
64
+
65
+ const result = serialize(context);
66
+ // spanId "1" should be padded to "0000000000000001"
67
+ expect(result).toMatch(/-0{15}1-01$/);
68
+ });
69
+ });
70
+
71
+ describe('parse', () => {
72
+ test('should parse valid traceparent string', () => {
73
+ const traceparent = '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01';
74
+
75
+ const result = parse(traceparent);
76
+
77
+ expect(result).toBeDefined();
78
+ expect(result!.traceId).toBe('0af7651916cd43dd8448eb211c80319c');
79
+ // parse returns ExtractedContext: spanId is the sender's spanId
80
+ expect(result!.spanId).toBe('b7ad6b7169203331');
81
+ });
82
+
83
+ test('should parse traceparent string', () => {
84
+ const traceparent = '00-0af7651916cd43dd8448eb211c80319c-a1b2c3d4e5f67890-01';
85
+
86
+ const result = parse(traceparent);
87
+
88
+ expect(result).toBeDefined();
89
+ expect(result!.traceId).toBe('0af7651916cd43dd8448eb211c80319c');
90
+ expect(result!.spanId).toBe('a1b2c3d4e5f67890');
91
+ });
92
+
93
+ test('should return undefined for invalid traceparent format', () => {
94
+ const invalidTraceparent = 'invalid-format';
95
+
96
+ const result = parse(invalidTraceparent);
97
+
98
+ expect(result).toBeUndefined();
99
+ });
100
+
101
+ test('should return undefined for wrong version', () => {
102
+ const wrongVersion = '01-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01';
103
+
104
+ const result = parse(wrongVersion);
105
+
106
+ expect(result).toBeUndefined();
107
+ });
108
+
109
+ test('should return undefined for traceId wrong length', () => {
110
+ const wrongLength = '00-0af7651916cd43dd8448eb211c80319-b7ad6b7169203331-01';
111
+
112
+ const result = parse(wrongLength);
113
+
114
+ expect(result).toBeUndefined();
115
+ });
116
+
117
+ test('should return undefined for spanId wrong length', () => {
118
+ const wrongLength = '00-0af7651916cd43dd8448eb211c80319c-b7ad6b716920333-01';
119
+
120
+ const result = parse(wrongLength);
121
+
122
+ expect(result).toBeUndefined();
123
+ });
124
+ });
125
+
126
+ describe('inject', () => {
127
+ test('should inject SpanContext to carrier', () => {
128
+ const carrier: Record<string, string> = {};
129
+ const context: SpanContext = {
130
+ traceId: '0af7651916cd43dd8448eb211c80319c',
131
+ spanId: 'b7ad6b7169203331',
132
+ parentSpanId: undefined,
133
+ };
134
+
135
+ propagation.inject(carrier, context);
136
+
137
+ expect(carrier['TRACEPARENT']).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
138
+ });
139
+
140
+ test('should inject with parentSpanId', () => {
141
+ const carrier: Record<string, string> = {};
142
+ const context: SpanContext = {
143
+ traceId: '0af7651916cd43dd8448eb211c80319c',
144
+ spanId: 'b7ad6b7169203331',
145
+ parentSpanId: 'a1b2c3d4e5f67890',
146
+ };
147
+
148
+ propagation.inject(carrier, context);
149
+
150
+ // W3C TraceContext: inject uses spanId (sender's span ID)
151
+ expect(carrier['TRACEPARENT']).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
152
+ });
153
+
154
+ test('should overwrite existing TRACEPARENT', () => {
155
+ const carrier: Record<string, string> = {
156
+ TRACEPARENT: '00-old-trace-old-span-old-flags',
157
+ };
158
+ const context: SpanContext = {
159
+ traceId: '0af7651916cd43dd8448eb211c80319c',
160
+ spanId: 'b7ad6b7169203331',
161
+ };
162
+
163
+ propagation.inject(carrier, context);
164
+
165
+ expect(carrier['TRACEPARENT']).toBe('00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01');
166
+ });
167
+ });
168
+
169
+ describe('extract', () => {
170
+ test('should extract SpanContext from carrier', () => {
171
+ const carrier: Record<string, string> = {
172
+ TRACEPARENT: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
173
+ };
174
+
175
+ const result = propagation.extract(carrier);
176
+
177
+ expect(result).toBeDefined();
178
+ expect(result!.traceId).toBe('0af7651916cd43dd8448eb211c80319c');
179
+ // extract returns ExtractedContext: spanId is sender's spanId
180
+ expect(result!.spanId).toBe('b7ad6b7169203331');
181
+ });
182
+
183
+ test('should extract with spanId', () => {
184
+ const carrier: Record<string, string> = {
185
+ TRACEPARENT: '00-0af7651916cd43dd8448eb211c80319c-a1b2c3d4e5f67890-01',
186
+ };
187
+
188
+ const result = propagation.extract(carrier);
189
+
190
+ expect(result).toBeDefined();
191
+ expect(result!.traceId).toBe('0af7651916cd43dd8448eb211c80319c');
192
+ expect(result!.spanId).toBe('a1b2c3d4e5f67890');
193
+ });
194
+
195
+ test('should return undefined when TRACEPARENT not present', () => {
196
+ const carrier: Record<string, string> = {};
197
+
198
+ const result = propagation.extract(carrier);
199
+
200
+ expect(result).toBeUndefined();
201
+ });
202
+
203
+ test('should return undefined for invalid TRACEPARENT', () => {
204
+ const carrier: Record<string, string> = {
205
+ TRACEPARENT: 'invalid-traceparent',
206
+ };
207
+
208
+ const result = propagation.extract(carrier);
209
+
210
+ expect(result).toBeUndefined();
211
+ });
212
+
213
+ test('should handle lowercase traceparent', () => {
214
+ const carrier: Record<string, string> = {
215
+ TRACEPARENT: '00-0af7651916cd43dd8448eb211c80319c-b7ad6b7169203331-01',
216
+ };
217
+
218
+ const result = propagation.extract(carrier);
219
+
220
+ expect(result).toBeDefined();
221
+ expect(result!.traceId).toBe('0af7651916cd43dd8448eb211c80319c');
222
+ });
223
+ });
224
+
225
+ describe('roundtrip', () => {
226
+ test('should serialize and parse back to same values (traceId and parentSpanId)', () => {
227
+ const original: SpanContext = {
228
+ traceId: '0af7651916cd43dd8448eb211c80319c',
229
+ spanId: 'b7ad6b7169203331',
230
+ parentSpanId: 'a1b2c3d4e5f67890',
231
+ };
232
+
233
+ const serialized = serialize(original);
234
+ const parsed = parse(serialized);
235
+
236
+ // parse returns ExtractedContext: spanId is sender's spanId
237
+ expect(parsed).toBeDefined();
238
+ expect(parsed!.traceId).toBe(original.traceId);
239
+ expect(parsed!.spanId).toBe(original.spanId);
240
+ });
241
+
242
+ test('should inject and extract back to same values', () => {
243
+ const original: SpanContext = {
244
+ traceId: '0af7651916cd43dd8448eb211c80319c',
245
+ spanId: 'b7ad6b7169203331',
246
+ parentSpanId: 'a1b2c3d4e5f67890',
247
+ };
248
+
249
+ const carrier: Record<string, string> = {};
250
+ propagation.inject(carrier, original);
251
+ const extracted = propagation.extract(carrier);
252
+
253
+ // extract returns ExtractedContext (without spanId)
254
+ expect(extracted).toBeDefined();
255
+ expect(extracted!.traceId).toBe(original.traceId);
256
+ expect(extracted!.spanId).toBe(original.spanId); // injected uses spanId
257
+ });
258
+ });
259
+ });