@ai-setting/roy-agent-core 1.7.52 → 1.7.55

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 (367) hide show
  1. package/dist/config/config-component.d.ts +346 -0
  2. package/dist/config/config-parser.d.ts +45 -0
  3. package/dist/config/env-key.d.ts +97 -0
  4. package/dist/config/env-source.d.ts +113 -0
  5. package/dist/config/file-source.d.ts +90 -0
  6. package/dist/config/index.d.ts +4 -0
  7. package/dist/config/protocol-resolver.d.ts +94 -0
  8. package/dist/env/agent/agent-component.d.ts +646 -0
  9. package/dist/env/agent/agent-config-registration.d.ts +18 -0
  10. package/dist/env/agent/agent-registry.d.ts +500 -0
  11. package/dist/env/agent/index.d.ts +9 -0
  12. package/dist/env/agent/index.js +3 -3
  13. package/dist/env/agent/summary-agent.d.ts +44 -0
  14. package/dist/env/agent/types.d.ts +503 -0
  15. package/dist/env/commands/commands-component.d.ts +97 -0
  16. package/dist/env/commands/commands-config-registration.d.ts +19 -0
  17. package/dist/env/commands/index.d.ts +7 -0
  18. package/dist/env/commands/parser.d.ts +18 -0
  19. package/dist/env/commands/types.d.ts +133 -0
  20. package/dist/env/component.d.ts +186 -0
  21. package/dist/env/constants.d.ts +112 -0
  22. package/dist/env/context/env-context.d.ts +420 -0
  23. package/dist/env/context/env-event.d.ts +144 -0
  24. package/dist/env/context/index.d.ts +13 -0
  25. package/dist/env/debug/debug-component.d.ts +160 -0
  26. package/dist/env/debug/formatters/index.d.ts +8 -0
  27. package/dist/env/debug/formatters/repl-formatter.d.ts +80 -0
  28. package/dist/env/debug/formatters/trace-formatter.d.ts +43 -0
  29. package/dist/env/debug/formatters/tree-formatter.d.ts +72 -0
  30. package/dist/env/debug/index.d.ts +15 -0
  31. package/dist/env/debug/index.js +1 -1
  32. package/dist/env/debug/parser/regex-parser.d.ts +49 -0
  33. package/dist/env/debug/parser/span-builder.d.ts +79 -0
  34. package/dist/env/debug/reader/log-reader.d.ts +55 -0
  35. package/dist/env/debug/reader/span-db-reader.d.ts +70 -0
  36. package/dist/env/debug/types.d.ts +145 -0
  37. package/dist/env/environment.d.ts +185 -0
  38. package/dist/env/error-reply.d.ts +184 -0
  39. package/dist/env/errors.d.ts +120 -0
  40. package/dist/env/event-source/bounty-cli-handler.d.ts +42 -0
  41. package/dist/env/event-source/bounty-im-handler.d.ts +232 -0
  42. package/dist/env/event-source/event-source-component.d.ts +177 -0
  43. package/dist/env/event-source/event-source-config-registration.d.ts +18 -0
  44. package/dist/env/event-source/event-source-handlers.d.ts +472 -0
  45. package/dist/env/event-source/event-store.d.ts +110 -0
  46. package/dist/env/event-source/idempotency-key.d.ts +19 -0
  47. package/dist/env/event-source/index.d.ts +15 -0
  48. package/dist/env/event-source/index.js +6 -6
  49. package/dist/env/event-source/timer-handler.d.ts +74 -0
  50. package/dist/env/event-source/types.d.ts +803 -0
  51. package/dist/env/hook/global-hook-manager.d.ts +73 -0
  52. package/dist/env/hook/hook-manager.d.ts +139 -0
  53. package/dist/env/hook/index.d.ts +9 -0
  54. package/dist/env/hook/types.d.ts +107 -0
  55. package/dist/env/index.d.ts +24 -0
  56. package/dist/env/index.js +18 -18
  57. package/dist/env/interface.d.ts +156 -0
  58. package/dist/env/lark-mention-utils.d.ts +59 -0
  59. package/dist/env/llm/adapter-ai-sdk.d.ts +10 -0
  60. package/dist/env/llm/adapter-pi-ai.d.ts +184 -0
  61. package/dist/env/llm/adapter.d.ts +100 -0
  62. package/dist/env/llm/factory.d.ts +13 -0
  63. package/dist/env/llm/hooks.d.ts +150 -0
  64. package/dist/env/llm/index.d.ts +16 -0
  65. package/dist/env/llm/index.js +2 -2
  66. package/dist/env/llm/invoke.d.ts +304 -0
  67. package/dist/env/llm/llm-cache.d.ts +38 -0
  68. package/dist/env/llm/llm.d.ts +263 -0
  69. package/dist/env/llm/opencode-session.d.ts +79 -0
  70. package/dist/env/llm/provider.d.ts +40 -0
  71. package/dist/env/llm/reasoning-defense.d.ts +104 -0
  72. package/dist/env/llm/tool-args-parser.d.ts +77 -0
  73. package/dist/env/llm/tool-schema.d.ts +54 -0
  74. package/dist/env/llm/transform.d.ts +57 -0
  75. package/dist/env/llm/types.d.ts +844 -0
  76. package/dist/env/log-trace/decorator.d.ts +88 -0
  77. package/dist/env/log-trace/index.d.ts +14 -0
  78. package/dist/env/log-trace/log-trace-component.d.ts +268 -0
  79. package/dist/env/log-trace/log-trace-config-registration.d.ts +25 -0
  80. package/dist/env/log-trace/logger.d.ts +83 -0
  81. package/dist/env/log-trace/opentelemetry/cli-propagation.d.ts +105 -0
  82. package/dist/env/log-trace/opentelemetry/mod.d.ts +24 -0
  83. package/dist/env/log-trace/opentelemetry/propagation-env.d.ts +81 -0
  84. package/dist/env/log-trace/opentelemetry/propagation.d.ts +79 -0
  85. package/dist/env/log-trace/opentelemetry/tracer-provider.d.ts +157 -0
  86. package/dist/env/log-trace/span-storage.d.ts +37 -0
  87. package/dist/env/log-trace/trace-context.d.ts +28 -0
  88. package/dist/env/log-trace/types.d.ts +127 -0
  89. package/dist/env/mcp/command-resolver.d.ts +12 -0
  90. package/dist/env/mcp/config.d.ts +103 -0
  91. package/dist/env/mcp/index.d.ts +13 -0
  92. package/dist/env/mcp/loader.d.ts +78 -0
  93. package/dist/env/mcp/mcp-component.d.ts +54 -0
  94. package/dist/env/mcp/mcp-config-registration.d.ts +19 -0
  95. package/dist/env/mcp/npm-prefix/index.d.ts +17 -0
  96. package/dist/env/mcp/scanner.d.ts +38 -0
  97. package/dist/env/mcp/tool/adapter.d.ts +32 -0
  98. package/dist/env/mcp/tool/index.d.ts +4 -0
  99. package/dist/env/mcp/types.d.ts +131 -0
  100. package/dist/env/memory/built-in/index.d.ts +41 -0
  101. package/dist/env/memory/built-in/recall-memory.d.ts +29 -0
  102. package/dist/env/memory/built-in/record-memory.d.ts +44 -0
  103. package/dist/env/memory/index.d.ts +10 -0
  104. package/dist/env/memory/memory-component.d.ts +114 -0
  105. package/dist/env/memory/memory-config-registration.d.ts +18 -0
  106. package/dist/env/memory/memory-config.d.ts +18 -0
  107. package/dist/env/memory/plugin/index.d.ts +16 -0
  108. package/dist/env/memory/plugin/memory-agent.d.ts +126 -0
  109. package/dist/env/memory/plugin/memory-manager.d.ts +71 -0
  110. package/dist/env/memory/plugin/memory-plugin.d.ts +103 -0
  111. package/dist/env/memory/plugin/recall-memory.d.ts +16 -0
  112. package/dist/env/memory/plugin/types.d.ts +75 -0
  113. package/dist/env/memory/tools/memory-agent-tools.d.ts +109 -0
  114. package/dist/env/memory/types.d.ts +80 -0
  115. package/dist/env/paths.d.ts +46 -0
  116. package/dist/env/plugin/bounty-cli-notification-channel.d.ts +60 -0
  117. package/dist/env/plugin/event-bus-notification-channel.d.ts +50 -0
  118. package/dist/env/plugin/index.d.ts +13 -0
  119. package/dist/env/plugin/lark-cli-notification-channel.d.ts +61 -0
  120. package/dist/env/plugin/notification-channel.d.ts +143 -0
  121. package/dist/env/plugin/plugin-component.d.ts +232 -0
  122. package/dist/env/plugin/types.d.ts +146 -0
  123. package/dist/env/prompt/index.d.ts +7 -0
  124. package/dist/env/prompt/index.js +2 -2
  125. package/dist/env/prompt/prompt-component.d.ts +194 -0
  126. package/dist/env/prompt/prompt-config-registration.d.ts +18 -0
  127. package/dist/env/prompt/prompt-store.d.ts +26 -0
  128. package/dist/env/prompt/prompts-index.d.ts +146 -0
  129. package/dist/env/prompt/renderer.d.ts +21 -0
  130. package/dist/env/prompt/types.d.ts +176 -0
  131. package/dist/env/session/hooks.d.ts +14 -0
  132. package/dist/env/session/index.d.ts +19 -0
  133. package/dist/env/session/index.js +4 -4
  134. package/dist/env/session/search-query-parser.d.ts +41 -0
  135. package/dist/env/session/session-component.d.ts +464 -0
  136. package/dist/env/session/session-config-registration.d.ts +18 -0
  137. package/dist/env/session/session-id.d.ts +26 -0
  138. package/dist/env/session/session-message-converter.d.ts +142 -0
  139. package/dist/env/session/session-store.d.ts +188 -0
  140. package/dist/env/session/storage/index.d.ts +5 -0
  141. package/dist/env/session/storage/index.js +3 -3
  142. package/dist/env/session/storage/memory.d.ts +119 -0
  143. package/dist/env/session/storage/sqlite.d.ts +108 -0
  144. package/dist/env/session/types.d.ts +705 -0
  145. package/dist/env/session-tree-stopper.d.ts +79 -0
  146. package/dist/env/skill/config.d.ts +13 -0
  147. package/dist/env/skill/index.d.ts +6 -0
  148. package/dist/env/skill/parser.d.ts +9 -0
  149. package/dist/env/skill/scanner.d.ts +25 -0
  150. package/dist/env/skill/skill-component.d.ts +89 -0
  151. package/dist/env/skill/skill-config-registration.d.ts +18 -0
  152. package/dist/env/skill/tool/index.d.ts +1 -0
  153. package/dist/env/skill/tool/skill-tool.d.ts +15 -0
  154. package/dist/env/skill/types.d.ts +61 -0
  155. package/dist/env/task/backend/index.d.ts +24 -0
  156. package/dist/env/task/backend/index.js +702 -0
  157. package/dist/env/task/backend/roy-sidecar-task-port.d.ts +148 -0
  158. package/dist/env/task/backend/sqlite-task-port.d.ts +28 -0
  159. package/dist/env/task/backend/task-store-backend.d.ts +107 -0
  160. package/dist/env/task/backend/types.d.ts +282 -0
  161. package/dist/env/task/delegate/bg-task-id-storage.d.ts +9 -0
  162. package/dist/env/task/delegate/delegate-tool.d.ts +681 -0
  163. package/dist/env/task/delegate/index.d.ts +8 -0
  164. package/dist/env/task/delegate/index.js +2 -2
  165. package/dist/env/task/delegate/process-registry.d.ts +58 -0
  166. package/dist/env/task/delegate/stop-tool.d.ts +12 -0
  167. package/dist/env/task/delegate/subagent-resolver.d.ts +25 -0
  168. package/dist/env/task/events/index.d.ts +7 -0
  169. package/dist/env/task/events/task-event-payloads.d.ts +101 -0
  170. package/dist/env/task/events/task-event-types.d.ts +23 -0
  171. package/dist/env/task/hooks/contexts.d.ts +191 -0
  172. package/dist/env/task/hooks/index.d.ts +7 -0
  173. package/dist/env/task/hooks/task-hook-points.d.ts +42 -0
  174. package/dist/env/task/index.d.ts +7 -0
  175. package/dist/env/task/index.js +3 -3
  176. package/dist/env/task/plugins/auto-task-plugin.d.ts +38 -0
  177. package/dist/env/task/plugins/card-chat-routing.d.ts +88 -0
  178. package/dist/env/task/plugins/fake-user-message-helper.d.ts +90 -0
  179. package/dist/env/task/plugins/index.d.ts +8 -0
  180. package/dist/env/task/plugins/index.js +4 -4
  181. package/dist/env/task/plugins/lark-card-action-handler.d.ts +166 -0
  182. package/dist/env/task/plugins/lark-card-patch-notifier.d.ts +600 -0
  183. package/dist/env/task/plugins/lark-cli-task-notify-plugin.d.ts +231 -0
  184. package/dist/env/task/plugins/max-iteration-reminder-plugin.d.ts +112 -0
  185. package/dist/env/task/plugins/per-task-group-chat-plugin.d.ts +561 -0
  186. package/dist/env/task/plugins/task-tag-plugin.d.ts +70 -0
  187. package/dist/env/task/plugins/workflow-extractor-agent.d.ts +43 -0
  188. package/dist/env/task/registry-hook-installer.d.ts +43 -0
  189. package/dist/env/task/storage/index.d.ts +5 -0
  190. package/dist/env/task/storage/migrations/001_add_project_path_context.d.ts +14 -0
  191. package/dist/env/task/storage/migrations/002_add_task_type.d.ts +14 -0
  192. package/dist/env/task/storage/migrations/003_add_process_description.d.ts +20 -0
  193. package/dist/env/task/storage/migrations/004_rename_action_to_milestone.d.ts +37 -0
  194. package/dist/env/task/storage/migrations/005_convert_blob_description_to_text.d.ts +51 -0
  195. package/dist/env/task/storage/sqlite-task-store.d.ts +241 -0
  196. package/dist/env/task/tag-service.d.ts +138 -0
  197. package/dist/env/task/task-child-context.d.ts +70 -0
  198. package/dist/env/task/task-component.d.ts +270 -0
  199. package/dist/env/task/task-config-registration.d.ts +19 -0
  200. package/dist/env/task/task-creation-registry.d.ts +181 -0
  201. package/dist/env/task/task-reuse-context.d.ts +52 -0
  202. package/dist/env/task/task-reuse-registry.d.ts +31 -0
  203. package/dist/env/task/tools/batch-archive-tool.d.ts +9 -0
  204. package/dist/env/task/tools/batch-delete-tool.d.ts +9 -0
  205. package/dist/env/task/tools/complete-tool.d.ts +12 -0
  206. package/dist/env/task/tools/create-tool.d.ts +6 -0
  207. package/dist/env/task/tools/delete-tool.d.ts +6 -0
  208. package/dist/env/task/tools/get-tool.d.ts +6 -0
  209. package/dist/env/task/tools/index.d.ts +13 -0
  210. package/dist/env/task/tools/list-tool.d.ts +6 -0
  211. package/dist/env/task/tools/operation/create-tool.d.ts +12 -0
  212. package/dist/env/task/tools/operation/delete-tool.d.ts +6 -0
  213. package/dist/env/task/tools/operation/get-tool.d.ts +6 -0
  214. package/dist/env/task/tools/operation/index.d.ts +8 -0
  215. package/dist/env/task/tools/operation/list-tool.d.ts +6 -0
  216. package/dist/env/task/tools/operation/operation-types.d.ts +225 -0
  217. package/dist/env/task/tools/operation/update-tool.d.ts +6 -0
  218. package/dist/env/task/tools/search-tool.d.ts +9 -0
  219. package/dist/env/task/tools/task-tree-tool.d.ts +65 -0
  220. package/dist/env/task/tools/task-types.d.ts +255 -0
  221. package/dist/env/task/tools/update-tool.d.ts +6 -0
  222. package/dist/env/task/types.d.ts +290 -0
  223. package/dist/env/tool/built-in/bash-effect.d.ts +36 -0
  224. package/dist/env/tool/built-in/bash.d.ts +16 -0
  225. package/dist/env/tool/built-in/echo.d.ts +7 -0
  226. package/dist/env/tool/built-in/edit-file.d.ts +6 -0
  227. package/dist/env/tool/built-in/glob.d.ts +6 -0
  228. package/dist/env/tool/built-in/grep.d.ts +6 -0
  229. package/dist/env/tool/built-in/index.d.ts +39 -0
  230. package/dist/env/tool/built-in/query-background-process-tool.d.ts +113 -0
  231. package/dist/env/tool/built-in/read-file.d.ts +5 -0
  232. package/dist/env/tool/built-in/understand-image.d.ts +59 -0
  233. package/dist/env/tool/built-in/write-file.d.ts +5 -0
  234. package/dist/env/tool/index.d.ts +16 -0
  235. package/dist/env/tool/registry.d.ts +61 -0
  236. package/dist/env/tool/tool-component.d.ts +242 -0
  237. package/dist/env/tool/tool-config-registration.d.ts +18 -0
  238. package/dist/env/tool/types.d.ts +274 -0
  239. package/dist/env/tool/validator.d.ts +14 -0
  240. package/dist/env/types.d.ts +184 -0
  241. package/dist/env/workflow/decorators/decorator-node.d.ts +76 -0
  242. package/dist/env/workflow/decorators/edge.d.ts +42 -0
  243. package/dist/env/workflow/decorators/index.d.ts +13 -0
  244. package/dist/env/workflow/decorators/node-as.d.ts +40 -0
  245. package/dist/env/workflow/decorators/workflow.d.ts +30 -0
  246. package/dist/env/workflow/engine/dag-manager.d.ts +176 -0
  247. package/dist/env/workflow/engine/engine.d.ts +440 -0
  248. package/dist/env/workflow/engine/event-bus.d.ts +54 -0
  249. package/dist/env/workflow/engine/executor.d.ts +122 -0
  250. package/dist/env/workflow/engine/index.d.ts +15 -0
  251. package/dist/env/workflow/engine/index.js +2 -2
  252. package/dist/env/workflow/engine/node-registry.d.ts +159 -0
  253. package/dist/env/workflow/engine/scheduler.d.ts +164 -0
  254. package/dist/env/workflow/extractor/workflow-converter.d.ts +55 -0
  255. package/dist/env/workflow/fixtures.d.ts +401 -0
  256. package/dist/env/workflow/hooks/index.d.ts +4 -0
  257. package/dist/env/workflow/hooks/workflow-hook-points.d.ts +161 -0
  258. package/dist/env/workflow/index.d.ts +30 -0
  259. package/dist/env/workflow/index.js +9 -9
  260. package/dist/env/workflow/metadata/keys.d.ts +6 -0
  261. package/dist/env/workflow/nodes/agent-component-adapter.d.ts +175 -0
  262. package/dist/env/workflow/nodes/agent-node.d.ts +206 -0
  263. package/dist/env/workflow/nodes/ask-user-node.d.ts +66 -0
  264. package/dist/env/workflow/nodes/condition-node.d.ts +39 -0
  265. package/dist/env/workflow/nodes/index.d.ts +8 -0
  266. package/dist/env/workflow/nodes/index.js +1 -1
  267. package/dist/env/workflow/nodes/merge-node.d.ts +40 -0
  268. package/dist/env/workflow/nodes/python-call-node.d.ts +95 -0
  269. package/dist/env/workflow/nodes/skill-node.d.ts +29 -0
  270. package/dist/env/workflow/nodes/tool-node.d.ts +64 -0
  271. package/dist/env/workflow/nodes/workflow-node.d.ts +118 -0
  272. package/dist/env/workflow/plugins/index.d.ts +6 -0
  273. package/dist/env/workflow/plugins/index.js +2 -2
  274. package/dist/env/workflow/plugins/lark-cli-workflow-notify-plugin.d.ts +107 -0
  275. package/dist/env/workflow/plugins/workflow-json-output-plugin.d.ts +166 -0
  276. package/dist/env/workflow/runtime/runtime-cancellation-scope.d.ts +121 -0
  277. package/dist/env/workflow/service/index.d.ts +9 -0
  278. package/dist/env/workflow/service/registry.d.ts +37 -0
  279. package/dist/env/workflow/service/workflow-service.d.ts +422 -0
  280. package/dist/env/workflow/storage/index.d.ts +11 -0
  281. package/dist/env/workflow/storage/mock-repositories.d.ts +106 -0
  282. package/dist/env/workflow/storage/safe-json.d.ts +62 -0
  283. package/dist/env/workflow/storage/sqlite.d.ts +57 -0
  284. package/dist/env/workflow/storage/tag-repo.d.ts +65 -0
  285. package/dist/env/workflow/storage/workflow-repo.d.ts +161 -0
  286. package/dist/env/workflow/tools/ask-user-tool.d.ts +35 -0
  287. package/dist/env/workflow/tools/index.d.ts +16 -0
  288. package/dist/env/workflow/tools/index.js +6 -6
  289. package/dist/env/workflow/tools/run-workflow.d.ts +130 -0
  290. package/dist/env/workflow/tools/submit-json-output-tool.d.ts +38 -0
  291. package/dist/env/workflow/tools/workflow-add-tool.d.ts +47 -0
  292. package/dist/env/workflow/tools/workflow-get-tool.d.ts +29 -0
  293. package/dist/env/workflow/tools/workflow-list-tool.d.ts +55 -0
  294. package/dist/env/workflow/tools/workflow-run-status-tool.d.ts +26 -0
  295. package/dist/env/workflow/tools/workflow-run-stop-tool.d.ts +29 -0
  296. package/dist/env/workflow/tools/workflow-search-tool.d.ts +33 -0
  297. package/dist/env/workflow/tools/workflow-tag-list-tool.d.ts +59 -0
  298. package/dist/env/workflow/tools/workflow-validate-tool.d.ts +69 -0
  299. package/dist/env/workflow/types/context.d.ts +17 -0
  300. package/dist/env/workflow/types/decorators-types.d.ts +182 -0
  301. package/dist/env/workflow/types/edge.d.ts +33 -0
  302. package/dist/env/workflow/types/event.d.ts +869 -0
  303. package/dist/env/workflow/types/index.d.ts +16 -0
  304. package/dist/env/workflow/types/run.d.ts +254 -0
  305. package/dist/env/workflow/types/workflow-error.d.ts +79 -0
  306. package/dist/env/workflow/types/workflow-hil.d.ts +57 -0
  307. package/dist/env/workflow/types/workflow-message.d.ts +193 -0
  308. package/dist/env/workflow/types/workflow-session.d.ts +17 -0
  309. package/dist/env/workflow/types/workflow.d.ts +654 -0
  310. package/dist/env/workflow/types_compat.d.ts +10 -0
  311. package/dist/env/workflow/utils/agent-session-metadata.d.ts +48 -0
  312. package/dist/env/workflow/utils/build-agent-node-output.d.ts +11 -0
  313. package/dist/env/workflow/utils/create-workflow.d.ts +35 -0
  314. package/dist/env/workflow/utils/dependency-prescan.d.ts +67 -0
  315. package/dist/env/workflow/utils/execution-state.d.ts +46 -0
  316. package/dist/env/workflow/utils/extract-agent-json-output.d.ts +6 -0
  317. package/dist/env/workflow/utils/index.d.ts +14 -0
  318. package/dist/env/workflow/utils/index.js +1 -1
  319. package/dist/env/workflow/utils/json-schema-to-zod.d.ts +23 -0
  320. package/dist/env/workflow/utils/node-id-utils.d.ts +20 -0
  321. package/dist/env/workflow/utils/node-output-contracts.d.ts +137 -0
  322. package/dist/env/workflow/utils/node-registry-helper.d.ts +36 -0
  323. package/dist/env/workflow/utils/output-schema-hint.d.ts +7 -0
  324. package/dist/env/workflow/utils/parse-agent-output-config.d.ts +9 -0
  325. package/dist/env/workflow/utils/recovery-validator.d.ts +30 -0
  326. package/dist/env/workflow/utils/redact-command-secrets.d.ts +70 -0
  327. package/dist/env/workflow/utils/sensitive-redact.d.ts +37 -0
  328. package/dist/env/workflow/utils/session-parser.d.ts +23 -0
  329. package/dist/env/workflow/utils/session-recovery.d.ts +122 -0
  330. package/dist/env/workflow/utils/shell-dialect-lint.d.ts +75 -0
  331. package/dist/env/workflow/utils/template-contract-validator.d.ts +87 -0
  332. package/dist/env/workflow/utils/template-resolver.d.ts +285 -0
  333. package/dist/env/workflow/utils/validate-workflow-definition.d.ts +79 -0
  334. package/dist/env/workflow/utils/validation-rules.d.ts +103 -0
  335. package/dist/env/workflow/utils/workflow-message-metadata.d.ts +20 -0
  336. package/dist/env/workflow/utils/workflow-sanitize.d.ts +51 -0
  337. package/dist/env/workflow/workflow-component.d.ts +138 -0
  338. package/dist/index.d.ts +59 -0
  339. package/dist/index.js +21 -21
  340. package/dist/shared/@ai-setting/{roy-agent-core-stnddvx9.js → roy-agent-core-12d2xap8.js} +1 -1
  341. package/dist/shared/@ai-setting/{roy-agent-core-pk1b3kvf.js → roy-agent-core-2b8jtv7m.js} +1 -1
  342. package/dist/shared/@ai-setting/{roy-agent-core-x8n1r7h4.js → roy-agent-core-2bscfrr1.js} +188 -7
  343. package/dist/shared/@ai-setting/{roy-agent-core-gdsqp6j8.js → roy-agent-core-6masakz4.js} +45 -0
  344. package/dist/shared/@ai-setting/{roy-agent-core-vvxb9522.js → roy-agent-core-6qxh4xrm.js} +67 -6
  345. package/dist/shared/@ai-setting/{roy-agent-core-h93v6p6y.js → roy-agent-core-7qy3nffr.js} +2 -2
  346. package/dist/shared/@ai-setting/{roy-agent-core-s214vmmd.js → roy-agent-core-8eqngasy.js} +2 -2
  347. package/dist/shared/@ai-setting/{roy-agent-core-brwzs8wf.js → roy-agent-core-9h72sk1n.js} +1 -1
  348. package/dist/shared/@ai-setting/{roy-agent-core-na73mym1.js → roy-agent-core-a4vzsn0g.js} +212 -1
  349. package/dist/shared/@ai-setting/{roy-agent-core-35s1w7tc.js → roy-agent-core-aer5kw1j.js} +142 -70
  350. package/dist/shared/@ai-setting/{roy-agent-core-j8e92gj8.js → roy-agent-core-b5ew8t0k.js} +0 -59
  351. package/dist/shared/@ai-setting/{roy-agent-core-rcfewbzr.js → roy-agent-core-cd62e9p1.js} +1 -1
  352. package/dist/shared/@ai-setting/{roy-agent-core-39xejr39.js → roy-agent-core-e2z1etk4.js} +1 -1
  353. package/dist/shared/@ai-setting/{roy-agent-core-pkpkctvf.js → roy-agent-core-g36jevrk.js} +14 -183
  354. package/dist/shared/@ai-setting/{roy-agent-core-ezgsem94.js → roy-agent-core-j2nvedt6.js} +465 -128
  355. package/dist/shared/@ai-setting/{roy-agent-core-p2r27era.js → roy-agent-core-mxdc756a.js} +1 -1
  356. package/dist/shared/@ai-setting/{roy-agent-core-p8ak03s0.js → roy-agent-core-w527pcpe.js} +293 -42
  357. package/dist/shared/@ai-setting/{roy-agent-core-3tv1q6f2.js → roy-agent-core-ytr2w0vb.js} +2 -2
  358. package/dist/shared/@ai-setting/{roy-agent-core-yd21n6c7.js → roy-agent-core-zvemdfx5.js} +1 -1
  359. package/dist/test-utils/child-process-mock.d.ts +73 -0
  360. package/dist/util/process/process-tree-killer.d.ts +67 -0
  361. package/dist/utils/id.d.ts +11 -0
  362. package/dist/utils/loose-json.d.ts +30 -0
  363. package/dist/utils/media.d.ts +70 -0
  364. package/dist/utils/temp-file-manager/index.d.ts +99 -0
  365. package/package.json +5 -3
  366. /package/dist/shared/@ai-setting/{roy-agent-core-zy3hqfwg.js → roy-agent-core-0hq21px2.js} +0 -0
  367. /package/dist/shared/@ai-setting/{roy-agent-core-0cfaqnz9.js → roy-agent-core-k25gv86p.js} +0 -0
@@ -10,7 +10,7 @@ import {
10
10
  } from "./roy-agent-core-1pg0fepg.js";
11
11
  import {
12
12
  builtInPrompts
13
- } from "./roy-agent-core-gdsqp6j8.js";
13
+ } from "./roy-agent-core-6masakz4.js";
14
14
  import {
15
15
  DEFAULT_SUBAGENT_PROMPT
16
16
  } from "./roy-agent-core-rx16h2m1.js";
@@ -10,7 +10,7 @@ import {
10
10
  invoke,
11
11
  invokeNonStream,
12
12
  toolParametersToJsonSchema
13
- } from "./roy-agent-core-zy3hqfwg.js";
13
+ } from "./roy-agent-core-0hq21px2.js";
14
14
  import {
15
15
  ContextError,
16
16
  ErrorCodes
@@ -51,47 +51,207 @@ import {
51
51
  stream as piStream,
52
52
  getModel
53
53
  } from "@earendil-works/pi-ai";
54
+
55
+ // src/env/llm/reasoning-defense.ts
56
+ var DEEPSEEK_PROVIDER_PREFIX = "deepseek";
57
+ var DEEPSEEK_MODEL_MARKER = "deepseek";
58
+ function shouldInjectReasoningContent(provider, modelId) {
59
+ const p = (provider ?? "").toLowerCase();
60
+ const m = (modelId ?? "").toLowerCase();
61
+ if (p === DEEPSEEK_PROVIDER_PREFIX || p.startsWith(`${DEEPSEEK_PROVIDER_PREFIX}-`)) {
62
+ return true;
63
+ }
64
+ return m.includes(DEEPSEEK_MODEL_MARKER);
65
+ }
66
+ function injectReasoningContent(messages) {
67
+ return messages.map((msg) => {
68
+ if (msg?.role !== "assistant")
69
+ return msg;
70
+ if ("reasoning_content" in msg)
71
+ return msg;
72
+ return { ...msg, reasoning_content: "" };
73
+ });
74
+ }
75
+ function applyReasoningDefense(payload, target) {
76
+ if (!payload || typeof payload !== "object")
77
+ return payload;
78
+ if (!shouldInjectReasoningContent(target.provider, target.modelId))
79
+ return payload;
80
+ const messages = payload.messages;
81
+ if (!Array.isArray(messages))
82
+ return payload;
83
+ return { ...payload, messages: injectReasoningContent(messages) };
84
+ }
85
+ function createReasoningDefenseHook(target) {
86
+ return (payload) => applyReasoningDefense(payload, target);
87
+ }
88
+
89
+ // src/env/llm/adapter-pi-ai.ts
54
90
  var logger = createLogger("llm:adapter-pi-ai");
55
91
  var KNOWN_PROVIDER_APIS = {
56
- anthropic: { api: "anthropic-messages", contextLimit: 200000, maxTokensLimit: 8192 },
57
- openai: { api: "openai-responses", contextLimit: 128000, maxTokensLimit: 16384 },
58
- google: { api: "google-generative-ai", contextLimit: 1e6, maxTokensLimit: 8192 },
59
- "google-vertex": { api: "google-vertex", contextLimit: 1e6, maxTokensLimit: 8192 },
60
- deepseek: { api: "openai-completions", contextLimit: 64000, maxTokensLimit: 8192 },
61
- xai: { api: "openai-completions", contextLimit: 131072, maxTokensLimit: 8192 },
62
- groq: { api: "openai-completions", contextLimit: 32768, maxTokensLimit: 8192 },
63
- minimax: { api: "openai-completions", contextLimit: 128000, maxTokensLimit: 8192 },
64
- "minimax-cn": { api: "openai-completions", contextLimit: 128000, maxTokensLimit: 8192 },
65
- moonshotai: { api: "openai-completions", contextLimit: 128000, maxTokensLimit: 8192 },
66
- "kimi-coding": { api: "openai-completions", contextLimit: 128000, maxTokensLimit: 8192 }
92
+ anthropic: {
93
+ api: "anthropic-messages",
94
+ apiProtocol: "anthropic-messages",
95
+ contextLimit: 200000,
96
+ maxTokensLimit: 8192
97
+ },
98
+ openai: {
99
+ api: "openai-responses",
100
+ apiProtocol: "openai-responses",
101
+ contextLimit: 128000,
102
+ maxTokensLimit: 16384
103
+ },
104
+ google: {
105
+ api: "google-generative-ai",
106
+ apiProtocol: "google-generative-ai",
107
+ contextLimit: 1e6,
108
+ maxTokensLimit: 8192
109
+ },
110
+ "google-vertex": {
111
+ api: "google-vertex",
112
+ apiProtocol: "google-vertex",
113
+ contextLimit: 1e6,
114
+ maxTokensLimit: 8192
115
+ },
116
+ deepseek: {
117
+ api: "openai-completions",
118
+ apiProtocol: "openai-completions",
119
+ contextLimit: 64000,
120
+ maxTokensLimit: 8192
121
+ },
122
+ glm: {
123
+ api: "openai-completions",
124
+ apiProtocol: "openai-completions",
125
+ contextLimit: 128000,
126
+ maxTokensLimit: 8192
127
+ },
128
+ xai: {
129
+ api: "openai-completions",
130
+ apiProtocol: "openai-completions",
131
+ contextLimit: 131072,
132
+ maxTokensLimit: 8192
133
+ },
134
+ groq: {
135
+ api: "openai-completions",
136
+ apiProtocol: "openai-completions",
137
+ contextLimit: 32768,
138
+ maxTokensLimit: 8192
139
+ },
140
+ minimax: {
141
+ api: "anthropic-messages",
142
+ apiProtocol: "anthropic-messages",
143
+ contextLimit: 128000,
144
+ maxTokensLimit: 8192
145
+ },
146
+ "minimax-cn": {
147
+ api: "anthropic-messages",
148
+ apiProtocol: "anthropic-messages",
149
+ contextLimit: 128000,
150
+ maxTokensLimit: 8192
151
+ },
152
+ moonshotai: {
153
+ api: "openai-completions",
154
+ apiProtocol: "openai-completions",
155
+ contextLimit: 128000,
156
+ maxTokensLimit: 8192
157
+ },
158
+ "kimi-coding": {
159
+ api: "openai-completions",
160
+ apiProtocol: "openai-completions",
161
+ contextLimit: 128000,
162
+ maxTokensLimit: 8192
163
+ }
164
+ };
165
+ var PROVIDER_ENDPOINT_APIS = {
166
+ minimax: [
167
+ { pathIncludes: "/anthropic", apiProtocol: "anthropic-messages" },
168
+ { pathIncludes: "/v1", apiProtocol: "openai-completions" }
169
+ ],
170
+ "minimax-cn": [
171
+ { pathIncludes: "/anthropic", apiProtocol: "anthropic-messages" },
172
+ { pathIncludes: "/v1", apiProtocol: "openai-completions" }
173
+ ]
174
+ };
175
+ var ENDPOINT_RULES_SORTED = Object.fromEntries(Object.entries(PROVIDER_ENDPOINT_APIS).map(([provider, rules]) => [
176
+ provider,
177
+ [...rules].sort((a, b) => b.pathIncludes.length - a.pathIncludes.length)
178
+ ]));
179
+ var PROVIDER_API_OVERRIDES = {
180
+ "minimax-responses": "openai-responses",
181
+ "minimax-openai": "openai-completions"
67
182
  };
68
- function resolvePiModel(provider, modelId, baseURL) {
183
+ function resolveApiProtocol(provider, baseURL, explicitProtocol) {
184
+ if (explicitProtocol)
185
+ return explicitProtocol;
186
+ if (PROVIDER_API_OVERRIDES[provider])
187
+ return PROVIDER_API_OVERRIDES[provider];
188
+ const endpointRules = ENDPOINT_RULES_SORTED[provider];
189
+ if (endpointRules) {
190
+ for (const rule of endpointRules) {
191
+ if (baseURL?.includes(rule.pathIncludes))
192
+ return rule.apiProtocol;
193
+ }
194
+ }
195
+ const declared = KNOWN_PROVIDER_APIS[provider]?.apiProtocol;
196
+ if (declared)
197
+ return declared;
198
+ if (baseURL?.includes("/responses"))
199
+ return "openai-responses";
200
+ if (baseURL?.includes("anthropic")) {
201
+ logger.warn(`[adapter-pi-ai] provider "${provider}" 的协议靠 baseURL 含 "anthropic" 推断为 anthropic-messages;` + `建议在 KNOWN_PROVIDER_APIS 或调用处显式声明 apiProtocol(Task #4383 P1)`, { provider, inferred_api_protocol: "anthropic-messages", base_url: baseURL });
202
+ return "anthropic-messages";
203
+ }
204
+ return KNOWN_PROVIDER_APIS[provider]?.api || "openai-completions";
205
+ }
206
+ var REASONING_COMPAT_PIN = {
207
+ supportsDeveloperRole: false,
208
+ thinkingFormat: "openai",
209
+ supportsReasoningEffort: false
210
+ };
211
+ var REASONING_SAFE_PROTOCOLS = new Set([
212
+ "openai-completions",
213
+ "anthropic-messages"
214
+ ]);
215
+ var warnedReasoningRefusals = new Set;
216
+ function resolveModelReasoning(provider, modelId, capabilities, apiProtocol) {
217
+ const requested = capabilities?.reasoning === true;
218
+ if (!requested)
219
+ return false;
220
+ if (!apiProtocol || !REASONING_SAFE_PROTOCOLS.has(apiProtocol)) {
221
+ const key = `${provider}:${apiProtocol ?? "<unresolved>"}`;
222
+ if (!warnedReasoningRefusals.has(key)) {
223
+ warnedReasoningRefusals.add(key);
224
+ logger.warn(`[adapter-pi-ai] provider "${provider}" (${apiProtocol ?? "unresolved"}) 的 capabilities.reasoning=true 被忽略:` + `该协议无法通过 compat pin 保持请求体字节一致,打开会破坏 prompt cache 前缀(Task #4403)`, { provider, model_id: modelId, api_protocol: apiProtocol });
225
+ }
226
+ return false;
227
+ }
228
+ return true;
229
+ }
230
+ function buildPiCacheOptions(args) {
231
+ const out = {};
232
+ if (args.sessionId)
233
+ out.sessionId = args.sessionId;
234
+ if (args.apiProtocol === "openai-completions") {
235
+ out.cacheRetention = args.cacheRetention ?? "long";
236
+ } else if (args.cacheRetention) {
237
+ out.cacheRetention = args.cacheRetention;
238
+ }
239
+ return out;
240
+ }
241
+ function resolvePiModel(provider, modelId, baseURL, capabilities) {
69
242
  const builtIn = getModel(provider, modelId);
70
243
  if (builtIn)
71
244
  return baseURL ? { ...builtIn, baseUrl: baseURL } : builtIn;
72
- const providerApiOverride = {
73
- "minimax-responses": "openai-responses",
74
- "minimax-openai": "openai-completions"
75
- };
76
- let configuredApi;
77
- if (providerApiOverride[provider]) {
78
- configuredApi = providerApiOverride[provider];
79
- } else if (provider === "minimax" || provider === "minimax-cn") {
80
- configuredApi = baseURL?.includes("anthropic") ? "anthropic-messages" : "openai-completions";
81
- } else if (baseURL?.includes("/responses")) {
82
- configuredApi = "openai-responses";
83
- } else if (baseURL?.includes("anthropic")) {
84
- configuredApi = "anthropic-messages";
85
- } else {
86
- configuredApi = KNOWN_PROVIDER_APIS[provider]?.api || "openai-completions";
87
- }
245
+ const configuredApi = resolveApiProtocol(provider, baseURL);
246
+ const reasoning = resolveModelReasoning(provider, modelId, capabilities, configuredApi);
88
247
  return {
89
248
  id: modelId,
90
249
  name: modelId,
91
250
  api: configuredApi,
92
251
  provider,
93
252
  baseUrl: baseURL || "",
94
- reasoning: false,
253
+ reasoning,
254
+ ...reasoning ? { compat: { ...REASONING_COMPAT_PIN } } : {},
95
255
  input: ["text", "image"],
96
256
  cost: { input: 0, output: 0, cacheRead: 0, cacheWrite: 0 },
97
257
  contextWindow: KNOWN_PROVIDER_APIS[provider]?.contextLimit || 128000,
@@ -214,7 +374,7 @@ class EmbeddingNotSupportedError extends Error {
214
374
  class PiAiAdapter {
215
375
  name = "pi-ai";
216
376
  async chat(req) {
217
- const model = resolvePiModel(req.provider, req.modelId, req.baseURL);
377
+ const model = resolvePiModel(req.provider, req.modelId, req.baseURL, req.capabilities);
218
378
  const ctx = {
219
379
  systemPrompt: [req.systemPrompt, extractSystemPrompt(req.messages)].filter(Boolean).join(`
220
380
 
@@ -228,12 +388,21 @@ class PiAiAdapter {
228
388
  temperature: req.temperature,
229
389
  maxTokens: req.maxTokens,
230
390
  signal: req.signal,
391
+ ...buildPiCacheOptions({
392
+ apiProtocol: model.api,
393
+ sessionId: req.sessionId,
394
+ cacheRetention: req.cacheRetention
395
+ }),
396
+ onPayload: createReasoningDefenseHook({
397
+ provider: req.provider,
398
+ modelId: req.modelId
399
+ }),
231
400
  ...piRequestExtras(req)
232
401
  });
233
402
  return fromAssistantMessage(msg);
234
403
  }
235
404
  async stream(req) {
236
- const model = resolvePiModel(req.provider, req.modelId, req.baseURL);
405
+ const model = resolvePiModel(req.provider, req.modelId, req.baseURL, req.capabilities);
237
406
  const ctx = {
238
407
  systemPrompt: [req.systemPrompt, extractSystemPrompt(req.messages)].filter(Boolean).join(`
239
408
 
@@ -241,7 +410,23 @@ class PiAiAdapter {
241
410
  messages: toPiMessages(req.messages),
242
411
  tools: toPiTools(req.tools)
243
412
  };
244
- const eventStream = piStream(model, ctx, { apiKey: req.apiKey, baseURL: req.baseURL, temperature: req.temperature, maxTokens: req.maxTokens, signal: req.signal, ...piRequestExtras(req) });
413
+ const eventStream = piStream(model, ctx, {
414
+ apiKey: req.apiKey,
415
+ baseURL: req.baseURL,
416
+ temperature: req.temperature,
417
+ maxTokens: req.maxTokens,
418
+ signal: req.signal,
419
+ ...buildPiCacheOptions({
420
+ apiProtocol: model.api,
421
+ sessionId: req.sessionId,
422
+ cacheRetention: req.cacheRetention
423
+ }),
424
+ onPayload: createReasoningDefenseHook({
425
+ provider: req.provider,
426
+ modelId: req.modelId
427
+ }),
428
+ ...piRequestExtras(req)
429
+ });
245
430
  return { events: eventStream, result: async () => fromAssistantMessage(await eventStream.result()) };
246
431
  }
247
432
  async embed(_req) {
@@ -893,6 +1078,39 @@ import * as fs from "node:fs/promises";
893
1078
  import * as os from "node:os";
894
1079
  import * as path from "node:path";
895
1080
  var logger2 = createLogger("llm");
1081
+ function normalizeUsage(usage) {
1082
+ if (!usage)
1083
+ return;
1084
+ const normalized = {
1085
+ promptTokens: usage.promptTokens ?? 0,
1086
+ completionTokens: usage.completionTokens ?? 0,
1087
+ totalTokens: usage.totalTokens ?? 0
1088
+ };
1089
+ if (usage.cacheRead !== undefined)
1090
+ normalized.cacheRead = usage.cacheRead;
1091
+ if (usage.cacheWrite !== undefined)
1092
+ normalized.cacheWrite = usage.cacheWrite;
1093
+ if (usage.cacheMiss !== undefined)
1094
+ normalized.cacheMiss = usage.cacheMiss;
1095
+ if (usage.cacheRead !== undefined || usage.cacheWrite !== undefined) {
1096
+ const reads = usage.cacheRead ?? 0;
1097
+ const writes = usage.cacheWrite ?? 0;
1098
+ const cacheSum = reads + writes;
1099
+ const prompt = usage.promptTokens ?? 0;
1100
+ const completion = usage.completionTokens ?? 0;
1101
+ const nonCachedTotal = prompt + completion + cacheSum;
1102
+ const aiSdkTotal = prompt + completion;
1103
+ const isPiAiShape = Math.abs(usage.totalTokens - nonCachedTotal) <= 1;
1104
+ if (isPiAiShape) {
1105
+ normalized.promptTokensTotal = prompt + cacheSum;
1106
+ } else if (Math.abs(usage.totalTokens - aiSdkTotal) <= 1) {
1107
+ normalized.promptTokensTotal = Math.max(prompt, cacheSum);
1108
+ } else {
1109
+ normalized.promptTokensTotal = Math.max(prompt, cacheSum);
1110
+ }
1111
+ }
1112
+ return normalized;
1113
+ }
896
1114
  async function resolveFallbackProviderConfig(providerId) {
897
1115
  const home = os.homedir();
898
1116
  const authPath = path.join(home, ".roy-agent", "auth.json");
@@ -929,6 +1147,7 @@ class LLMComponent extends BaseComponent {
929
1147
  configWatcher;
930
1148
  cachedAdapter;
931
1149
  cachedAdapterProvider;
1150
+ adapterOverride;
932
1151
  constructor() {
933
1152
  super();
934
1153
  }
@@ -1146,6 +1365,7 @@ class LLMComponent extends BaseComponent {
1146
1365
  model: `${providerId}/${model}`,
1147
1366
  apiKey,
1148
1367
  baseURL: provider?.baseURL,
1368
+ ...capabilities ? { capabilities } : {},
1149
1369
  ...effectiveThinkingInText?.enabled ? {
1150
1370
  options: {
1151
1371
  thinkingInText: {
@@ -1164,6 +1384,8 @@ class LLMComponent extends BaseComponent {
1164
1384
  };
1165
1385
  }
1166
1386
  getAdapter() {
1387
+ if (this.adapterOverride)
1388
+ return this.adapterOverride;
1167
1389
  const currentProvider = process.env.ROY_LLM_PROVIDER || "pi-ai";
1168
1390
  if (this.cachedAdapter && this.cachedAdapterProvider === currentProvider) {
1169
1391
  return this.cachedAdapter;
@@ -1172,6 +1394,9 @@ class LLMComponent extends BaseComponent {
1172
1394
  this.cachedAdapterProvider = currentProvider;
1173
1395
  return this.cachedAdapter;
1174
1396
  }
1397
+ __setAdapterForTest(adapter) {
1398
+ this.adapterOverride = adapter;
1399
+ }
1175
1400
  invalidateAdapterCache() {
1176
1401
  this.cachedAdapter = undefined;
1177
1402
  this.cachedAdapterProvider = undefined;
@@ -1194,7 +1419,8 @@ class LLMComponent extends BaseComponent {
1194
1419
  apiKey: ctx.invokeConfig.apiKey || "",
1195
1420
  baseURL: ctx.invokeConfig.baseURL,
1196
1421
  signal: ctx.abortSignal,
1197
- sessionId: request.context?.sessionId
1422
+ sessionId: request.context?.sessionId,
1423
+ capabilities: ctx.invokeConfig.capabilities
1198
1424
  };
1199
1425
  let output = {
1200
1426
  content: "",
@@ -1246,11 +1472,14 @@ class LLMComponent extends BaseComponent {
1246
1472
  output.finishReason = parsed.tool_calls?.length ? "tool-calls" : "stop";
1247
1473
  output.toolCalls = parsed.tool_calls || [];
1248
1474
  if (parsed.usage) {
1249
- finishUsage = {
1475
+ finishUsage = normalizeUsage({
1250
1476
  promptTokens: parsed.usage.promptTokens ?? parsed.usage.inputTokens ?? 0,
1251
1477
  completionTokens: parsed.usage.completionTokens ?? parsed.usage.outputTokens ?? 0,
1252
- totalTokens: parsed.usage.totalTokens ?? 0
1253
- };
1478
+ totalTokens: parsed.usage.totalTokens ?? 0,
1479
+ cacheRead: parsed.usage.cacheRead,
1480
+ cacheWrite: parsed.usage.cacheWrite,
1481
+ cacheMiss: parsed.usage.cacheMiss
1482
+ });
1254
1483
  }
1255
1484
  output.usage = finishUsage;
1256
1485
  } catch {
@@ -1263,11 +1492,7 @@ class LLMComponent extends BaseComponent {
1263
1492
  output.finishReason = resp.finishReason;
1264
1493
  output.toolCalls = resp.toolCalls || [];
1265
1494
  if (resp.usage) {
1266
- finishUsage = {
1267
- promptTokens: resp.usage.promptTokens ?? 0,
1268
- completionTokens: resp.usage.completionTokens ?? 0,
1269
- totalTokens: resp.usage.totalTokens ?? 0
1270
- };
1495
+ finishUsage = normalizeUsage(resp.usage);
1271
1496
  }
1272
1497
  output.usage = finishUsage;
1273
1498
  return this.finalizeOutput(request, ctx, output, finishUsage, startTime, adapter.name);
@@ -1362,6 +1587,7 @@ class LLMComponent extends BaseComponent {
1362
1587
  throw contextError;
1363
1588
  }
1364
1589
  }
1590
+ this.emitCompletedEvent(request, `${ctx.providerId}/${ctx.model}`, output.content, output.usage, adapterName);
1365
1591
  return {
1366
1592
  output,
1367
1593
  providerId: ctx.providerId,
@@ -1369,6 +1595,31 @@ class LLMComponent extends BaseComponent {
1369
1595
  latencyMs
1370
1596
  };
1371
1597
  }
1598
+ emitCompletedEvent(request, model, content, usage, adapterName) {
1599
+ try {
1600
+ this.env?.pushEnvEvent?.({
1601
+ id: randomUUID(),
1602
+ type: "llm.completed",
1603
+ timestamp: Date.now(),
1604
+ metadata: {
1605
+ source: "llm.component.invoke",
1606
+ sessionId: request.context?.sessionId,
1607
+ messageId: request.context?.messageId
1608
+ },
1609
+ payload: {
1610
+ type: "completed",
1611
+ content,
1612
+ metadata: {
1613
+ model,
1614
+ usage,
1615
+ adapter: adapterName
1616
+ }
1617
+ }
1618
+ });
1619
+ } catch (err) {
1620
+ logger2.warn("Failed to push llm.completed event", { error: String(err) });
1621
+ }
1622
+ }
1372
1623
  getApiKey(providerId) {
1373
1624
  const providers = this.getLLMConfig("llm.providers", {});
1374
1625
  return providers?.[providerId]?.apiKey;
@@ -10,12 +10,12 @@ import {
10
10
  } from "./roy-agent-core-dv714bqh.js";
11
11
  import {
12
12
  SessionMessageConverter
13
- } from "./roy-agent-core-pk1b3kvf.js";
13
+ } from "./roy-agent-core-2b8jtv7m.js";
14
14
  import {
15
15
  parseToolArgsStrict,
16
16
  safeParseToolArgs,
17
17
  withTimeout
18
- } from "./roy-agent-core-zy3hqfwg.js";
18
+ } from "./roy-agent-core-0hq21px2.js";
19
19
  import {
20
20
  getCurrentBgTaskId
21
21
  } from "./roy-agent-core-c1v263jn.js";
@@ -1,7 +1,7 @@
1
1
  import {
2
2
  MemorySessionStore,
3
3
  SQLiteSessionStore
4
- } from "./roy-agent-core-h93v6p6y.js";
4
+ } from "./roy-agent-core-7qy3nffr.js";
5
5
  import {
6
6
  init_loose_json,
7
7
  tryParseJsonFromText
@@ -0,0 +1,73 @@
1
+ /**
2
+ * @fileoverview Shared `child_process` mock factory for `mock.module(...)`.
3
+ *
4
+ * ## 为什么需要它(Task #4420)
5
+ *
6
+ * Bun 当前对 `mock.module("child_process", factory)` 采用 **ESM exports 语义**:
7
+ * factory 返回的对象被当作模块的**完整导出面**,而不是「在真实模块上打补丁」。
8
+ * 因此只要少提供一个命名导出,任何**静态** `import { x } from "child_process"`
9
+ * 该导出的模块都会在**模块加载期**直接抛:
10
+ *
11
+ * ```
12
+ * SyntaxError: Export named 'exec' not found in module 'node:child_process'.
13
+ * ```
14
+ *
15
+ * 更糟的是:
16
+ * 1. 报错指向**被 import 的模块**(如 `event-source-handlers.ts`),
17
+ * 而不是写了不完整 mock 的**测试文件** —— 极难定位。
18
+ * 2. mock.module 在同一 `bun test` 进程内**跨文件泄漏**(bun 不像 jest
19
+ * 每文件独立 registry),所以还会顺带炸掉后面无关的文件。
20
+ *
21
+ * ## 历史事故(同一个坑踩了 3 次)
22
+ *
23
+ * - Task #2372:`event-source-handlers-builtin.test.ts` 只 mock `spawn`,
24
+ * 炸掉后面所有静态 import `spawnSync` 的模块(见
25
+ * `util/process/process-tree-killer.ts` 里的 lazy-import 规避注释)。
26
+ * - Task #4331:源码 `event-source-handlers.ts` 新增 `exec as execSync`,
27
+ * 但该测试的 mock 没跟上 → 整个文件 48/64 条测试挂红(Task #4420 修的就是这个)。
28
+ *
29
+ * ## 解决方式
30
+ *
31
+ * **导出面从真实模块自省派生**,永不手写清单:
32
+ * - `require("node:child_process")` 枚举出真实存在的导出名
33
+ * - 对每个导出,默认**透传真实实现**,只把测试显式 `overrides` 的键替换掉
34
+ * - 额外补一个 `default`(ESM namespace 有 `default`,`require()` 没有 ——
35
+ * 这也是历史 mock 需要手写 `default: {...}` 的原因,现在自动生成)
36
+ *
37
+ * 这样即使未来 Node/Bun 新增导出,或源码新增 `import { execFile }`,
38
+ * mock 也不会因为「缺导出」再次炸掉整个测试文件。
39
+ *
40
+ * ## 用法
41
+ *
42
+ * ```ts
43
+ * import { createChildProcessMockModule } from "../../../test-utils/child-process-mock";
44
+ *
45
+ * beforeEach(() => {
46
+ * mock.module("child_process", () =>
47
+ * createChildProcessMockModule({ spawn: spawnMock }),
48
+ * );
49
+ * });
50
+ * ```
51
+ *
52
+ * 注意:`mock.module` 的 specifier 用 `"child_process"` 还是
53
+ * `"node:child_process"` 都能命中(Bun 会把两者归一),helper 内部统一
54
+ * 从 `node:child_process` 自省。
55
+ */
56
+ /**
57
+ * 当前 Node/Bun 上 `node:child_process` 的完整命名导出清单(运行时自省)。
58
+ *
59
+ * 在 Bun 上为:`ChildProcess`, `exec`, `execFile`, `execFileSync`,
60
+ * `execSync`, `fork`, `spawn`, `spawnSync`。
61
+ */
62
+ export declare const CHILD_PROCESS_EXPORT_NAMES: readonly string[];
63
+ type ChildProcessModule = Record<string, any>;
64
+ /**
65
+ * 构造一个**导出面完整**的 `child_process` mock 模块对象。
66
+ *
67
+ * @param overrides 需要替换为测试替身(spy/stub)的导出。其余导出保持真实实现,
68
+ * 既保证导出面完整,又避免把未测行为也一起假掉。
69
+ * @returns 可直接被 `mock.module("child_process", () => ...)` 返回的模块对象,
70
+ * 含 `default` 自引用(`default` 上的键与命名导出保持一致)。
71
+ */
72
+ export declare function createChildProcessMockModule(overrides?: ChildProcessModule): ChildProcessModule;
73
+ export {};
@@ -0,0 +1,67 @@
1
+ /**
2
+ * @fileoverview 跨平台进程树杀进程工具
3
+ *
4
+ * 用于 delegate_task 超时/stop 时彻底清理子 agent 派生的进程树(包括孙进程),
5
+ * 防止端口、文件句柄、孤儿进程泄漏。
6
+ *
7
+ * 平台策略:
8
+ * - POSIX (Linux / macOS):要求子进程以 `detached: true` + 子进程是进程组 leader,
9
+ * 通过 `process.kill(-pid, signal)` 杀进程组。如果子进程没有 detached(PID 不是负数),退化为直接杀 PID。
10
+ * - Windows:永远用 `taskkill /pid <pid> /f /t` 杀进程树(不依赖 detached)。
11
+ *
12
+ * 验证 + 重试机制:
13
+ * - 每次 kill 后等待 retryDelayMs,用 `process.kill(pid, 0)`(POSIX)或 `tasklist`(Windows)验证进程是否存活
14
+ * - 如果仍存活,重试(最多 retry 次,默认 3 次)
15
+ * - 全部重试完仍存活:记录 error 日志(由外层 process-registry 负责)
16
+ *
17
+ * 多平台代码路径在测试中可通过 `_setPlatformForTests()` 切换。
18
+ */
19
+ import type { ChildProcess, SpawnOptions, SpawnSyncOptions, SpawnSyncReturns } from "child_process";
20
+ type SpawnFn = (cmd: string, args: string[], opts: SpawnOptions) => ChildProcess;
21
+ export declare function _setSpawnForTests(s: SpawnFn | undefined): void;
22
+ type SpawnSyncFn = (cmd: string, args: string[], opts: SpawnSyncOptions) => SpawnSyncReturns<Buffer | string>;
23
+ export declare function _setSpawnSyncForTests(s: SpawnSyncFn | undefined): void;
24
+ export interface KillProcessTreeOptions {
25
+ /** 信号类型(仅 POSIX)。默认 SIGKILL */
26
+ signal?: NodeJS.Signals;
27
+ /** 已废弃字段,保留以兼容早期 API。SIGKILL 默认立即生效 */
28
+ gracefulTimeoutMs?: number;
29
+ /** 最大重试次数(默认 3) */
30
+ retry?: number;
31
+ /** 重试间隔(ms,默认 500) */
32
+ retryDelayMs?: number;
33
+ }
34
+ /** 杀进程结果 */
35
+ export interface KillProcessTreeResult {
36
+ /** 杀掉的进程 ID */
37
+ pid: number;
38
+ /** 使用的平台策略 */
39
+ platform: NodeJS.Platform;
40
+ /** 实际发出的信号(POSIX)或命令(Windows) */
41
+ signal: string;
42
+ /** 是否成功(不一定准确,例如 POSIX 中 ESRCH 被忽略视为软成功) */
43
+ success: boolean;
44
+ /** 实际尝试次数 */
45
+ attempts: number;
46
+ /** 最后一次尝试后进程是否仍存活(true=没杀干净) */
47
+ stillAlive: boolean;
48
+ }
49
+ export declare function _setPlatformForTests(p: NodeJS.Platform): void;
50
+ export declare function _resetPlatformForTests(): void;
51
+ /**
52
+ * 杀进程树(跨平台)。不会 throw;ESRCH / EPERM 等"进程已不存在"类错误静默忽略。
53
+ *
54
+ * 验证 + 重试:
55
+ * - 每次 kill 后等待 retryDelayMs(默认 500ms)
56
+ * - 用 `process.kill(pid, 0)`(POSIX)或 `tasklist`(Windows)验证进程是否存活
57
+ * - 如果仍存活,重试(最多 retry 次,默认 3 次)
58
+ * - 全部重试完仍存活:通过 stillAlive: true 返回,由外层记录 error 日志
59
+ *
60
+ * POSIX 默认使用 SIGKILL 杀进程组,要求子进程 spawn 时带 `detached: true`。
61
+ * Windows 调用 `taskkill /f /t` 杀进程树(不依赖 detached)。
62
+ *
63
+ * @param pid 进程 PID(必须为正整数)
64
+ * @param options 可选项
65
+ */
66
+ export declare function killProcessTree(pid: number, options?: KillProcessTreeOptions): Promise<KillProcessTreeResult>;
67
+ export {};
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @fileoverview ID Generation Utilities
3
+ */
4
+ /**
5
+ * Generate a unique ID with optional prefix
6
+ */
7
+ export declare function generateId(prefix?: string): string;
8
+ /**
9
+ * Generate a descending ID (useful for creating IDs that sort newest first)
10
+ */
11
+ export declare function generateDescendingId(prefix?: string): string;
@@ -0,0 +1,30 @@
1
+ /**
2
+ * @fileoverview Loose JSON extraction helpers
3
+ *
4
+ * LLM 经常把「本该结构化」的结果当纯文本吐出来,格式五花八门:
5
+ * 1. 纯 JSON
6
+ * 2. Markdown ```json ... ``` 代码块
7
+ * 3. 夹在解释文字中的第一个 `{...}`
8
+ *
9
+ * 这些 helper 从任意文本里尽力抠出 JSON 对象,返回 null 表示没找到。
10
+ *
11
+ * 原实现内联在 `env/workflow/plugins/workflow-json-output-plugin.ts`,
12
+ * 2026-10-16 抽到 utils 以便 session 压缩的 checkpoint 降级路径复用
13
+ * (避免 session → workflow/plugins 的反向耦合)。
14
+ */
15
+ /**
16
+ * Helper: try to parse a string as a JSON object.
17
+ * Returns the parsed object (excluding arrays/primitives), or null.
18
+ */
19
+ export declare function tryParseJsonString(s: string): Record<string, unknown> | null;
20
+ /**
21
+ * Extract a JSON object from arbitrary LLM text.
22
+ *
23
+ * Tries (in order):
24
+ * 1. Whole text is JSON
25
+ * 2. Markdown ```json ... ``` code block
26
+ * 3. First {...} substring
27
+ *
28
+ * Returns null if no valid JSON object is found.
29
+ */
30
+ export declare function tryParseJsonFromText(text: string): Record<string, unknown> | null;