@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,215 @@
1
+ /**
2
+ * @fileoverview W3C TraceContext Propagation
3
+ *
4
+ * 实现 W3C Trace Context 标准中的 traceparent 格式:
5
+ * https://www.w3.org/TR/trace-context/#traceparent-header
6
+ *
7
+ * 格式: 00-{traceId}-{parentSpanId}-{flags}
8
+ * - version: 2字符,固定 "00"
9
+ * - traceId: 32字符,128位追踪ID
10
+ * - parentSpanId: 16字符,64位父Span ID
11
+ * - flags: 2字符,采样标志(当前固定 "01")
12
+ */
13
+
14
+ import type { SpanContext } from "../types";
15
+
16
+ // ============================================================================
17
+ // Constants
18
+ // ============================================================================
19
+
20
+ /** W3C TraceContext 版本号 */
21
+ const TRACE_CONTEXT_VERSION = "00";
22
+
23
+ /** 采样标志(01 = sampled) */
24
+ const TRACE_FLAGS_SAMPLED = "01";
25
+
26
+ /** traceparent 字段名 */
27
+ const TRACEPARENT_HEADER = "TRACEPARENT";
28
+
29
+ /** 版本号长度 */
30
+ const VERSION_LENGTH = 2;
31
+
32
+ /** traceId 长度 */
33
+ const TRACE_ID_LENGTH = 32;
34
+
35
+ /** parentSpanId 长度 */
36
+ const PARENT_SPAN_ID_LENGTH = 16;
37
+
38
+ /** flags 长度 */
39
+ const FLAGS_LENGTH = 2;
40
+
41
+ // ============================================================================
42
+ // Utility Functions
43
+ // ============================================================================
44
+
45
+ /**
46
+ * 左补零到指定长度
47
+ */
48
+ function padLeft(str: string, length: number): string {
49
+ return str.padStart(length, "0");
50
+ }
51
+
52
+ /**
53
+ * 验证是否为有效的十六进制字符串
54
+ */
55
+ function isValidHex(str: string): boolean {
56
+ return /^[0-9a-f]+$/i.test(str);
57
+ }
58
+
59
+ // ============================================================================
60
+ // Serialization (SpanContext -> traceparent)
61
+ // ============================================================================
62
+
63
+ /**
64
+ * 将 SpanContext 序列化为 traceparent 字符串
65
+ *
66
+ * W3C TraceContext 语义:
67
+ * - traceparent 中的 spanId 是"发送方 span"的 ID
68
+ * - 接收方会将其作为新 span 的 parentSpanId
69
+ * - 所以应该使用 context.spanId,而非 parentSpanId
70
+ *
71
+ * @param context SpanContext
72
+ * @returns traceparent 格式字符串
73
+ */
74
+ export function serialize(context: SpanContext): string {
75
+ const traceId = padLeft(context.traceId.toLowerCase(), TRACE_ID_LENGTH);
76
+ const spanId = padLeft(context.spanId.toLowerCase(), PARENT_SPAN_ID_LENGTH);
77
+
78
+ // 格式: 00-{traceId}-{spanId}-{flags}
79
+ // 注意:使用 spanId 而非 parentSpanId,因为这是发送方 span 的 ID
80
+ const parts = [
81
+ TRACE_CONTEXT_VERSION,
82
+ traceId,
83
+ spanId,
84
+ TRACE_FLAGS_SAMPLED,
85
+ ];
86
+
87
+ return parts.join("-");
88
+ }
89
+
90
+ // ============================================================================
91
+ // Deserialization (traceparent -> SpanContext)
92
+ // ============================================================================
93
+
94
+ /**
95
+ * 提取的 Trace Context
96
+ *
97
+ * W3C TraceContext 格式: 00-{traceId}-{spanId}-{flags}
98
+ * - {spanId} 是发送方 span 的 ID
99
+ * - 接收方应将其作为新 span 的 parentSpanId
100
+ */
101
+ export interface ExtractedContext {
102
+ traceId: string;
103
+ /** 发送方 span 的 ID,接收方应作为新 span 的 parentSpanId */
104
+ spanId: string;
105
+ }
106
+
107
+ /**
108
+ * 将 traceparent 字符串反序列化为 ExtractedContext
109
+ *
110
+ * W3C TraceContext 语义:
111
+ * - traceparent 中的 "span-id" 是发送方 span 的 ID
112
+ * - 接收方应该:
113
+ * - 使用提取的 traceId
114
+ * - 将提取的 spanId 作为 parentSpanId
115
+ * - 生成自己的新 spanId
116
+ *
117
+ * @param traceparent traceparent 格式字符串
118
+ * @returns 接收方 ExtractedContext 或 undefined(格式无效)
119
+ */
120
+ export function parse(traceparent: string): ExtractedContext | undefined {
121
+ if (!traceparent || typeof traceparent !== "string") {
122
+ return undefined;
123
+ }
124
+
125
+ const trimmed = traceparent.trim();
126
+ const parts = trimmed.split("-");
127
+
128
+ // 必须有 4 个部分
129
+ if (parts.length !== 4) {
130
+ return undefined;
131
+ }
132
+
133
+ const [version, traceId, senderSpanId, flags] = parts;
134
+
135
+ // 验证版本(当前只支持 "00")
136
+ if (version !== TRACE_CONTEXT_VERSION) {
137
+ // 未来版本兼容:对于 "ff" 及以上的未来版本,忽略
138
+ if (version > TRACE_CONTEXT_VERSION) {
139
+ return undefined;
140
+ }
141
+ }
142
+
143
+ // 验证 traceId 长度和格式
144
+ if (traceId.length !== TRACE_ID_LENGTH || !isValidHex(traceId)) {
145
+ return undefined;
146
+ }
147
+
148
+ // 验证 spanId 长度和格式(W3C 标准中叫 span-id,但这是发送方 span 的 ID)
149
+ if (senderSpanId.length !== PARENT_SPAN_ID_LENGTH || !isValidHex(senderSpanId)) {
150
+ return undefined;
151
+ }
152
+
153
+ // 验证 flags 长度(当前忽略 flags 值,只验证格式)
154
+ if (flags.length !== FLAGS_LENGTH || !isValidHex(flags)) {
155
+ return undefined;
156
+ }
157
+
158
+ // 返回提取的上下文
159
+ // - traceId: 保持不变
160
+ // - spanId: 发送方 span 的 ID(接收方应作为新 span 的 parentSpanId)
161
+ return {
162
+ traceId: traceId.toLowerCase(),
163
+ spanId: senderSpanId.toLowerCase(),
164
+ };
165
+ }
166
+
167
+ // ============================================================================
168
+ // Propagation Interface
169
+ // ============================================================================
170
+
171
+ /**
172
+ * W3C TraceContext Propagation 实现
173
+ *
174
+ * 用于在进程间传递 trace 上下文:
175
+ * - inject: 将 SpanContext 注入到 carrier(环境变量)
176
+ * - extract: 从 carrier(环境变量)提取 SpanContext
177
+ */
178
+ export const propagation = {
179
+ /**
180
+ * 将 SpanContext 注入到 carrier
181
+ *
182
+ * @param carrier 载体对象(通常是环境变量对象)
183
+ * @param context Span 上下文
184
+ */
185
+ inject(carrier: Record<string, string | undefined>, context: SpanContext): void {
186
+ carrier[TRACEPARENT_HEADER] = serialize(context);
187
+ },
188
+
189
+ /**
190
+ * 从 carrier 提取 SpanContext
191
+ *
192
+ * @param carrier 载体对象(通常是环境变量对象)
193
+ * @returns ExtractedContext 或 undefined
194
+ */
195
+ extract(carrier: Record<string, string | undefined>): ExtractedContext | undefined {
196
+ const traceparent = carrier[TRACEPARENT_HEADER];
197
+ if (!traceparent) {
198
+ return undefined;
199
+ }
200
+ return parse(traceparent);
201
+ },
202
+
203
+ /**
204
+ * 获取 traceparent 字段名
205
+ */
206
+ getTraceparentHeader(): string {
207
+ return TRACEPARENT_HEADER;
208
+ },
209
+ };
210
+
211
+ // ============================================================================
212
+ // Type Exports
213
+ // ============================================================================
214
+
215
+ export type { SpanContext } from "../types";
@@ -0,0 +1,166 @@
1
+ /**
2
+ * @fileoverview OTelTracerImpl 上下文管理测试
3
+ *
4
+ * 验证 OTelTracerImpl 的 startSpan/endSpan 正确维护 currentContext
5
+ * 以及嵌套 span 的父子关系建立
6
+ */
7
+
8
+ import { describe, test, expect, beforeEach, afterEach } from 'bun:test';
9
+ import {
10
+ OTelTracerProvider,
11
+ getTracerProvider,
12
+ resetTracerProvider,
13
+ type OTelTracer,
14
+ type OTelSpan,
15
+ } from './tracer-provider';
16
+ import { join } from 'path';
17
+
18
+ describe('OTelTracerImpl Context Management', () => {
19
+ const dbPath = join('/tmp', `test-otel-context-${Date.now()}.db`);
20
+
21
+ beforeEach(() => {
22
+ resetTracerProvider();
23
+ });
24
+
25
+ afterEach(() => {
26
+ resetTracerProvider();
27
+ });
28
+
29
+ describe('startSpan/endSpan context lifecycle', () => {
30
+ test('should set currentContext after startSpan', async () => {
31
+ const provider = getTracerProvider();
32
+ await provider.initialize();
33
+ const tracer = provider.getTracer('test-context');
34
+
35
+ const span = tracer.startSpan('test-span');
36
+
37
+ expect(tracer.getCurrentContext()).toBeDefined();
38
+ expect(tracer.getCurrentContext()!.traceId).toBeDefined();
39
+ expect(tracer.getCurrentContext()!.spanId).toBe(span.spanContext.spanId);
40
+ });
41
+
42
+ test('should clear currentContext after endSpan', async () => {
43
+ const provider = getTracerProvider();
44
+ await provider.initialize();
45
+ const tracer = provider.getTracer('test-context');
46
+
47
+ const span = tracer.startSpan('test-span');
48
+ expect(tracer.getCurrentContext()).toBeDefined();
49
+
50
+ // 调用 end 方法
51
+ span.end();
52
+
53
+ // 对于根 span,end 后 currentContext 应该为 undefined
54
+ expect(tracer.getCurrentContext()).toBeUndefined();
55
+ });
56
+
57
+ test('should maintain currentContext after endSpan when parent exists', async () => {
58
+ const provider = getTracerProvider();
59
+ await provider.initialize();
60
+ const tracer = provider.getTracer('test-context');
61
+
62
+ // 创建父 span
63
+ const parentSpan = tracer.startSpan('parent');
64
+ const parentContext = tracer.getCurrentContext();
65
+ expect(parentContext).toBeDefined();
66
+
67
+ // 创建子 span
68
+ const childSpan = tracer.startSpan('child');
69
+ expect(tracer.getCurrentContext()!.spanId).toBe(childSpan.spanContext.spanId);
70
+ expect(tracer.getCurrentContext()!.parentSpanId).toBe(parentSpan.spanContext.spanId);
71
+
72
+ // 结束子 span,应该恢复到父上下文
73
+ childSpan.end();
74
+
75
+ // ⚠️ 这里会失败,因为当前实现有问题
76
+ expect(tracer.getCurrentContext()!.spanId).toBe(parentSpan.spanContext.spanId);
77
+ expect(tracer.getCurrentContext()!.parentSpanId).toBe(parentContext!.parentSpanId);
78
+ });
79
+ });
80
+
81
+ describe('nested span parent-child relationship', () => {
82
+ test('should create child span with correct parentSpanId', async () => {
83
+ const provider = getTracerProvider();
84
+ await provider.initialize();
85
+ const tracer = provider.getTracer('test-nested');
86
+
87
+ // 父 span
88
+ const parentSpan = tracer.startSpan('parent');
89
+ const parentSpanId = parentSpan.spanContext.spanId;
90
+ const traceId = parentSpan.spanContext.traceId;
91
+
92
+ // 子 span - 应该继承 traceId,parentSpanId 指向父 span
93
+ const childSpan = tracer.startSpan('child');
94
+
95
+ expect(childSpan.spanContext.traceId).toBe(traceId);
96
+ expect(childSpan.spanContext.parentSpanId).toBe(parentSpanId);
97
+ });
98
+
99
+ test('should build correct span tree in storage', async () => {
100
+ const provider = getTracerProvider();
101
+ await provider.initialize();
102
+ const tracer = provider.getTracer('test-tree');
103
+ const storage = provider.getStorage();
104
+
105
+ // 创建嵌套 span
106
+ const parent = tracer.startSpan('parent');
107
+ const parentId = parent.spanContext.spanId;
108
+ const parentTraceId = parent.spanContext.traceId;
109
+
110
+ const child1 = tracer.startSpan('child1');
111
+ child1.end();
112
+
113
+ const child2 = tracer.startSpan('child2');
114
+ child2.end();
115
+
116
+ parent.end();
117
+
118
+ // 验证存储中的 span - SQLiteSpanStorage 返回树结构根节点
119
+ // 需要直接查询所有 span
120
+ const rootSpans = storage.findByTraceId(parentTraceId);
121
+
122
+ // 树中应该有 1 个根 span(parent),children 包含 child1 和 child2
123
+ expect(rootSpans.length).toBeGreaterThanOrEqual(1);
124
+
125
+ const parentStored = rootSpans.find(s => s.spanId === parentId);
126
+ expect(parentStored).toBeDefined();
127
+ // 根 span 的 parentSpanId 应该是 undefined 或 null
128
+ expect(parentStored!.parentSpanId || undefined).toBeUndefined();
129
+
130
+ // 验证子 span 存在(通过 flatten)
131
+ function flattenSpans(span: any): any[] {
132
+ const result: any[] = [];
133
+ if (span.children) {
134
+ for (const child of span.children) {
135
+ result.push(child);
136
+ result.push(...flattenSpans(child));
137
+ }
138
+ }
139
+ return result;
140
+ }
141
+ const flatSpans = rootSpans.flatMap(s => [s, ...flattenSpans(s)]);
142
+ expect(flatSpans.length).toBeGreaterThanOrEqual(3);
143
+ });
144
+ });
145
+
146
+ describe('async span context', () => {
147
+ test('should maintain context across async boundaries', async () => {
148
+ const provider = getTracerProvider();
149
+ await provider.initialize();
150
+ const tracer = provider.getTracer('test-async');
151
+
152
+ const span = tracer.startSpan('async-parent');
153
+ const traceId = span.spanContext.traceId;
154
+
155
+ // 在异步操作中
156
+ await new Promise(resolve => setTimeout(resolve, 10));
157
+
158
+ // 应该仍然能访问到相同的 traceId
159
+ const currentContext = tracer.getCurrentContext();
160
+ expect(currentContext).toBeDefined();
161
+ expect(currentContext!.traceId).toBe(traceId);
162
+
163
+ span.end();
164
+ });
165
+ });
166
+ });