@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,209 @@
1
+ /**
2
+ * @fileoverview SessionComponent extractRecentMessages Tests
3
+ *
4
+ * Tests for the extractRecentMessages method
5
+ */
6
+
7
+ import { describe, it, expect, beforeEach } from 'bun:test';
8
+ import { SessionComponent } from './session-component';
9
+ import { MemorySessionStore } from './storage/memory';
10
+ import type { SessionMessage } from './types';
11
+
12
+ describe('SessionComponent.extractRecentMessages', () => {
13
+ let component: SessionComponent;
14
+ let store: MemorySessionStore;
15
+
16
+ beforeEach(async () => {
17
+ // Create component with memory store
18
+ component = new SessionComponent();
19
+ store = new MemorySessionStore();
20
+
21
+ // Inject mock dependencies
22
+ (component as any).store = store;
23
+ (component as any).hooksConfig = {};
24
+ });
25
+
26
+ // Helper to create test messages
27
+ function createMessage(
28
+ id: string,
29
+ role: 'user' | 'assistant',
30
+ content: string,
31
+ parts?: any[]
32
+ ): SessionMessage {
33
+ return {
34
+ id,
35
+ sessionID: 'test-session',
36
+ role,
37
+ content,
38
+ timestamp: Date.now(),
39
+ parts,
40
+ metadata: {},
41
+ };
42
+ }
43
+
44
+ describe('basic extraction', () => {
45
+ it('should extract 2 turns by default', async () => {
46
+ const messages: SessionMessage[] = [
47
+ createMessage('1', 'user', 'First question'),
48
+ createMessage('2', 'assistant', 'First answer'),
49
+ createMessage('3', 'user', 'Second question'),
50
+ createMessage('4', 'assistant', 'Second answer'),
51
+ createMessage('5', 'user', 'Third question'),
52
+ createMessage('6', 'assistant', 'Third answer'),
53
+ ];
54
+
55
+ // Access private method via any cast
56
+ const result = (component as any).extractRecentMessages(messages);
57
+
58
+ expect(result.length).toBe(4); // 2 turns = user + assistant pairs
59
+ expect(result[0]).toEqual({ role: 'user', content: 'Second question' });
60
+ expect(result[1]).toEqual({ role: 'assistant', content: 'Second answer' });
61
+ expect(result[2]).toEqual({ role: 'user', content: 'Third question' });
62
+ expect(result[3]).toEqual({ role: 'assistant', content: 'Third answer' });
63
+ });
64
+
65
+ it('should extract 1 turn when specified', async () => {
66
+ const messages: SessionMessage[] = [
67
+ createMessage('1', 'user', 'First question'),
68
+ createMessage('2', 'assistant', 'First answer'),
69
+ createMessage('3', 'user', 'Second question'),
70
+ createMessage('4', 'assistant', 'Second answer'),
71
+ ];
72
+
73
+ const result = (component as any).extractRecentMessages(messages, 1);
74
+
75
+ expect(result.length).toBe(2); // 1 turn = user + assistant
76
+ expect(result[0]).toEqual({ role: 'user', content: 'Second question' });
77
+ expect(result[1]).toEqual({ role: 'assistant', content: 'Second answer' });
78
+ });
79
+
80
+ it('should extract 3 turns when specified', async () => {
81
+ const messages: SessionMessage[] = [
82
+ createMessage('1', 'user', 'First question'),
83
+ createMessage('2', 'assistant', 'First answer'),
84
+ createMessage('3', 'user', 'Second question'),
85
+ createMessage('4', 'assistant', 'Second answer'),
86
+ createMessage('5', 'user', 'Third question'),
87
+ createMessage('6', 'assistant', 'Third answer'),
88
+ ];
89
+
90
+ const result = (component as any).extractRecentMessages(messages, 3);
91
+
92
+ expect(result.length).toBe(6); // 3 turns
93
+ });
94
+ });
95
+
96
+ describe('skip tool calls and results', () => {
97
+ it('should skip assistant messages with tool-call parts', async () => {
98
+ const messages: SessionMessage[] = [
99
+ createMessage('1', 'user', 'Run a command'),
100
+ createMessage('2', 'assistant', 'I will run the command', [
101
+ { type: 'tool-call', toolName: 'bash' }
102
+ ]),
103
+ createMessage('3', 'user', 'Second question'),
104
+ createMessage('4', 'assistant', 'Second answer'),
105
+ ];
106
+
107
+ const result = (component as any).extractRecentMessages(messages, 1);
108
+
109
+ // Should skip the tool-call message and find next user+assistant pair
110
+ expect(result.length).toBe(2);
111
+ expect(result[0]).toEqual({ role: 'user', content: 'Second question' });
112
+ expect(result[1]).toEqual({ role: 'assistant', content: 'Second answer' });
113
+ });
114
+
115
+ it('should skip assistant messages with tool-result parts', async () => {
116
+ const messages: SessionMessage[] = [
117
+ createMessage('1', 'user', 'Run a command'),
118
+ createMessage('2', 'assistant', 'Command completed', [
119
+ { type: 'tool-result', toolName: 'bash' }
120
+ ]),
121
+ createMessage('3', 'user', 'Second question'),
122
+ createMessage('4', 'assistant', 'Second answer'),
123
+ ];
124
+
125
+ const result = (component as any).extractRecentMessages(messages, 1);
126
+
127
+ expect(result.length).toBe(2);
128
+ expect(result[0]).toEqual({ role: 'user', content: 'Second question' });
129
+ expect(result[1]).toEqual({ role: 'assistant', content: 'Second answer' });
130
+ });
131
+
132
+ it('should include assistant messages without tool parts', async () => {
133
+ const messages: SessionMessage[] = [
134
+ createMessage('1', 'user', 'Hello'),
135
+ createMessage('2', 'assistant', 'Hi there!'), // No tool parts
136
+ createMessage('3', 'user', 'How are you?'),
137
+ createMessage('4', 'assistant', 'I am fine!'),
138
+ ];
139
+
140
+ const result = (component as any).extractRecentMessages(messages, 1);
141
+
142
+ expect(result.length).toBe(2);
143
+ expect(result[1]).toEqual({ role: 'assistant', content: 'I am fine!' });
144
+ });
145
+ });
146
+
147
+ describe('skip checkpoint messages', () => {
148
+ it('should skip checkpoint messages when extracting', async () => {
149
+ const messages: SessionMessage[] = [
150
+ createMessage('1', 'user', 'First question'),
151
+ createMessage('2', 'assistant', 'First answer'),
152
+ createMessage('3', 'user', '', undefined), // Will be checkpoint
153
+ createMessage('3', 'user', 'Second question'),
154
+ createMessage('4', 'assistant', 'Second answer'),
155
+ ];
156
+ // Mark checkpoint
157
+ messages[2].metadata = { isCheckpoint: true };
158
+
159
+ const result = (component as any).extractRecentMessages(messages, 1);
160
+
161
+ expect(result.length).toBe(2);
162
+ expect(result[0]).toEqual({ role: 'user', content: 'Second question' });
163
+ });
164
+ });
165
+
166
+ describe('edge cases', () => {
167
+ it('should return empty array if no valid turns found', async () => {
168
+ const messages: SessionMessage[] = [
169
+ createMessage('1', 'assistant', 'I started first', [
170
+ { type: 'tool-call', toolName: 'bash' }
171
+ ]),
172
+ ];
173
+
174
+ const result = (component as any).extractRecentMessages(messages, 1);
175
+
176
+ expect(result.length).toBe(0);
177
+ });
178
+
179
+ it('should handle empty messages array', async () => {
180
+ const messages: SessionMessage[] = [];
181
+
182
+ const result = (component as any).extractRecentMessages(messages);
183
+
184
+ expect(result.length).toBe(0);
185
+ });
186
+
187
+ it('should handle only user messages', async () => {
188
+ const messages: SessionMessage[] = [
189
+ createMessage('1', 'user', 'Hello'),
190
+ ];
191
+
192
+ const result = (component as any).extractRecentMessages(messages, 1);
193
+
194
+ expect(result.length).toBe(0);
195
+ });
196
+
197
+ it('should handle messages with only empty content', async () => {
198
+ const messages: SessionMessage[] = [
199
+ createMessage('1', 'user', ''),
200
+ createMessage('2', 'assistant', ' '),
201
+ ];
202
+
203
+ const result = (component as any).extractRecentMessages(messages, 1);
204
+
205
+ // Empty content is filtered out
206
+ expect(result.length).toBe(0);
207
+ });
208
+ });
209
+ });
@@ -0,0 +1,132 @@
1
+ /**
2
+ * @fileoverview SessionComponent Custom ID Tests
3
+ *
4
+ * Tests for SessionComponent.create() supporting custom session ID
5
+ */
6
+
7
+ import { describe, it, expect, beforeEach, afterEach } from 'bun:test';
8
+ import { SessionComponent } from './session-component';
9
+ import { MemorySessionStore } from './storage/memory';
10
+ import type { CreateSessionOptions, Session } from './types';
11
+
12
+ describe('SessionComponent.create with custom ID', () => {
13
+ let component: SessionComponent;
14
+ let store: MemorySessionStore;
15
+
16
+ beforeEach(async () => {
17
+ // Create component with memory store
18
+ component = new SessionComponent();
19
+ store = new MemorySessionStore();
20
+
21
+ // Inject mock dependencies
22
+ (component as any).store = store;
23
+ (component as any).hooksConfig = {};
24
+ });
25
+
26
+ describe('custom session ID', () => {
27
+ it('should accept custom session ID in options', async () => {
28
+ const customId = 'workflow_test123';
29
+
30
+ const options: CreateSessionOptions = {
31
+ id: customId,
32
+ title: 'Test Session',
33
+ metadata: { type: 'workflow', workflowName: 'test' },
34
+ };
35
+
36
+ const session = await component.create(options);
37
+
38
+ expect(session.id).toBe(customId);
39
+ expect(session.title).toBe('Test Session');
40
+ });
41
+
42
+ it('should generate ID if not provided', async () => {
43
+ const options: CreateSessionOptions = {
44
+ title: 'Test Session',
45
+ };
46
+
47
+ const session = await component.create(options);
48
+
49
+ expect(session.id).toBeTruthy();
50
+ expect(typeof session.id).toBe('string');
51
+ });
52
+
53
+ it('should preserve workflow-style session ID', async () => {
54
+ const timestamp = Date.now();
55
+ const sessionId = `workflow_${timestamp}_1_abc`;
56
+
57
+ const options: CreateSessionOptions = {
58
+ id: sessionId,
59
+ title: 'Workflow Session',
60
+ };
61
+
62
+ const session = await component.create(options);
63
+
64
+ expect(session.id).toBe(sessionId);
65
+ expect(session.id.startsWith('workflow_')).toBe(true);
66
+ });
67
+
68
+ it('should create workflow session with correct metadata', async () => {
69
+ const sessionId = 'workflow_test_workflow1';
70
+
71
+ const options: CreateSessionOptions = {
72
+ id: sessionId,
73
+ title: 'Workflow: test-workflow',
74
+ metadata: {
75
+ type: 'workflow',
76
+ workflowName: 'test-workflow',
77
+ workflowId: 'wf-123',
78
+ status: 'running',
79
+ },
80
+ };
81
+
82
+ const session = await component.create(options);
83
+
84
+ expect(session.id).toBe(sessionId);
85
+ expect((session.metadata as any).type).toBe('workflow');
86
+ expect((session.metadata as any).workflowName).toBe('test-workflow');
87
+ expect((session.metadata as any).status).toBe('running');
88
+ });
89
+
90
+ it('should allow custom ID with parent session', async () => {
91
+ // First create parent session
92
+ const parentSession = await component.create({
93
+ title: 'Parent Session',
94
+ });
95
+
96
+ // Create child session with custom ID
97
+ const childOptions: CreateSessionOptions = {
98
+ id: `workflow_child_${Date.now()}`,
99
+ title: 'Child Workflow',
100
+ parentID: parentSession.id,
101
+ };
102
+
103
+ const childSession = await component.create(childOptions);
104
+
105
+ expect(childSession.parentID).toBe(parentSession.id);
106
+ expect(childSession.id.startsWith('workflow_child_')).toBe(true);
107
+ });
108
+ });
109
+
110
+ describe('duplicate ID handling', () => {
111
+ it('should throw error if custom ID already exists', async () => {
112
+ const customId = 'workflow_duplicate_test';
113
+
114
+ // Create first session with custom ID
115
+ await component.create({
116
+ id: customId,
117
+ title: 'First Session',
118
+ });
119
+
120
+ // Try to create second session with same ID
121
+ try {
122
+ await component.create({
123
+ id: customId,
124
+ title: 'Second Session',
125
+ });
126
+ expect.fail('Should have thrown an error');
127
+ } catch (error: any) {
128
+ expect(error.message).toContain('already exists');
129
+ }
130
+ });
131
+ });
132
+ });