mixdog 0.9.2 → 0.9.4

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 (417) hide show
  1. package/package.json +8 -3
  2. package/scripts/anthropic-maxtokens-test.mjs +119 -0
  3. package/scripts/bench/lead-review-tasks-r3.json +20 -0
  4. package/scripts/bench/lead-review-tasks.json +20 -0
  5. package/scripts/bench/r4-mixed-tasks.json +20 -0
  6. package/scripts/bench/review-tasks.json +20 -0
  7. package/scripts/bench/round-codex.json +114 -0
  8. package/scripts/bench/round-mixdog-lead-r3.json +269 -0
  9. package/scripts/bench/round-mixdog-lead.json +269 -0
  10. package/scripts/bench/round-mixdog.json +126 -0
  11. package/scripts/bench/round-r10-bigsample.json +679 -0
  12. package/scripts/bench/round-r11-codexalign.json +257 -0
  13. package/scripts/bench/round-r4-codex.json +114 -0
  14. package/scripts/bench/round-r4-mixed.json +225 -0
  15. package/scripts/bench/round-r5-gpt-lead.json +259 -0
  16. package/scripts/bench/round-r6-codex.json +114 -0
  17. package/scripts/bench/round-r6-solo.json +257 -0
  18. package/scripts/bench/round-r7-full.json +254 -0
  19. package/scripts/bench/round-r8-fulldefault.json +255 -0
  20. package/scripts/bench-run.mjs +215 -29
  21. package/scripts/build-tui.mjs +13 -1
  22. package/scripts/explore-bench.mjs +124 -0
  23. package/scripts/freevar-smoke.mjs +95 -0
  24. package/scripts/hook-bus-test.mjs +191 -0
  25. package/scripts/internal-comms-bench.mjs +1 -0
  26. package/scripts/internal-comms-smoke.mjs +10 -9
  27. package/scripts/mouse-probe.mjs +45 -0
  28. package/scripts/output-style-bench.mjs +13 -6
  29. package/scripts/output-style-smoke.mjs +4 -4
  30. package/scripts/path-suffix-test.mjs +57 -0
  31. package/scripts/provider-toolcall-test.mjs +7 -3
  32. package/scripts/recall-bench.mjs +207 -0
  33. package/scripts/recall-usecase-cases.json +18 -0
  34. package/scripts/recall-usecase-probe.json +6 -0
  35. package/scripts/session-bench.mjs +152 -6
  36. package/scripts/tool-smoke.mjs +30 -67
  37. package/scripts/tui-render-smoke.mjs +90 -0
  38. package/scripts/webhook-smoke.mjs +208 -0
  39. package/src/agents/debugger/AGENT.md +5 -2
  40. package/src/agents/heavy-worker/AGENT.md +21 -11
  41. package/src/agents/maintainer/AGENT.md +4 -0
  42. package/src/agents/reviewer/AGENT.md +3 -2
  43. package/src/agents/worker/AGENT.md +21 -11
  44. package/src/lib/rules-builder.cjs +4 -0
  45. package/src/mixdog-session-runtime.mjs +933 -3731
  46. package/src/output-styles/default.md +34 -9
  47. package/src/output-styles/{oneline.md → extreme-minimal.md} +5 -4
  48. package/src/output-styles/minimal.md +4 -1
  49. package/src/output-styles/simple.md +22 -7
  50. package/src/repl.mjs +5 -5
  51. package/src/rules/agent/00-common.md +2 -0
  52. package/src/rules/agent/30-explorer.md +8 -11
  53. package/src/rules/lead/lead-brief.md +12 -0
  54. package/src/rules/lead/lead-tool.md +2 -9
  55. package/src/rules/shared/01-tool.md +11 -5
  56. package/src/runtime/agent/orchestrator/agent-runtime/agent-loop-policy.mjs +25 -0
  57. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +100 -23
  58. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +6 -15
  59. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +362 -0
  60. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +410 -0
  61. package/src/runtime/agent/orchestrator/agent-trace.mjs +16 -735
  62. package/src/runtime/agent/orchestrator/config.mjs +69 -2
  63. package/src/runtime/agent/orchestrator/context/collect.mjs +51 -0
  64. package/src/runtime/agent/orchestrator/mcp/client.mjs +6 -2
  65. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +63 -21
  66. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +93 -0
  67. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +209 -0
  68. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +489 -0
  69. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +97 -1343
  70. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +607 -0
  71. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +78 -10
  72. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +1 -13
  73. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +81 -0
  74. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +248 -0
  75. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +303 -0
  76. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +505 -0
  77. package/src/runtime/agent/orchestrator/providers/gemini.mjs +44 -1014
  78. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +18 -4
  79. package/src/runtime/agent/orchestrator/providers/lib/usage-primitives.mjs +32 -0
  80. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +86 -11
  81. package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +348 -0
  82. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +54 -20
  83. package/src/runtime/agent/orchestrator/providers/openai-codex-model.mjs +108 -0
  84. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +19 -12
  85. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +58 -0
  86. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +368 -0
  87. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +760 -0
  88. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +41 -1142
  89. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +732 -0
  90. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +193 -0
  91. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +303 -2119
  92. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +140 -995
  93. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +227 -0
  94. package/src/runtime/agent/orchestrator/providers/openai-ws-events.mjs +67 -0
  95. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +436 -0
  96. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +1105 -0
  97. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +2 -1
  98. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +38 -12
  99. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +7 -8
  100. package/src/runtime/agent/orchestrator/session/compact/budget.mjs +288 -0
  101. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +85 -0
  102. package/src/runtime/agent/orchestrator/session/compact/engine.mjs +749 -0
  103. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +82 -0
  104. package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +315 -0
  105. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +643 -0
  106. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +326 -0
  107. package/src/runtime/agent/orchestrator/session/compact.mjs +40 -2282
  108. package/src/runtime/agent/orchestrator/session/loop/compact-debug.mjs +28 -0
  109. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +274 -0
  110. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +61 -0
  111. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +38 -0
  112. package/src/runtime/agent/orchestrator/session/loop/env.mjs +14 -0
  113. package/src/runtime/agent/orchestrator/session/loop/hidden-agents.mjs +21 -0
  114. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +47 -0
  115. package/src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs +182 -0
  116. package/src/runtime/agent/orchestrator/session/loop/steering-ladder.mjs +173 -0
  117. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +63 -0
  118. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +100 -0
  119. package/src/runtime/agent/orchestrator/session/loop/termination.mjs +58 -0
  120. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +52 -0
  121. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +239 -0
  122. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +218 -0
  123. package/src/runtime/agent/orchestrator/session/loop/transcript-repair.mjs +101 -0
  124. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +35 -0
  125. package/src/runtime/agent/orchestrator/session/loop.mjs +409 -1304
  126. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +471 -0
  127. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +230 -0
  128. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +235 -0
  129. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +149 -0
  130. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +155 -0
  131. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +406 -0
  132. package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +80 -0
  133. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +303 -0
  134. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +210 -0
  135. package/src/runtime/agent/orchestrator/session/manager.mjs +226 -2114
  136. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +189 -0
  137. package/src/runtime/agent/orchestrator/session/store.mjs +74 -179
  138. package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -3
  139. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +70 -20
  140. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +22 -2
  141. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +33 -42
  142. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +241 -0
  143. package/src/runtime/agent/orchestrator/tools/builtin/fuzzy-match.mjs +1 -1
  144. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +40 -0
  145. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +42 -2
  146. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +1 -1
  147. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +11 -4
  148. package/src/runtime/agent/orchestrator/tools/builtin/rg-runner.mjs +29 -0
  149. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +8 -0
  150. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +126 -0
  151. package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +81 -87
  152. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-paths.mjs +161 -0
  153. package/src/runtime/agent/orchestrator/tools/builtin/shell-job-process.mjs +108 -0
  154. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +78 -304
  155. package/src/runtime/agent/orchestrator/tools/builtin.mjs +11 -6
  156. package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +303 -0
  157. package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +43 -0
  158. package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +382 -0
  159. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +551 -0
  160. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +295 -0
  161. package/src/runtime/agent/orchestrator/tools/code-graph/graph-model.mjs +158 -0
  162. package/src/runtime/agent/orchestrator/tools/code-graph/keyword-match.mjs +82 -0
  163. package/src/runtime/agent/orchestrator/tools/code-graph/lang-predicates.mjs +128 -0
  164. package/src/runtime/agent/orchestrator/tools/code-graph/memory-cache.mjs +66 -0
  165. package/src/runtime/agent/orchestrator/tools/code-graph/project-root.mjs +44 -0
  166. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +1080 -0
  167. package/src/runtime/agent/orchestrator/tools/code-graph/source-access.mjs +81 -0
  168. package/src/runtime/agent/orchestrator/tools/code-graph/span.mjs +19 -0
  169. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +280 -0
  170. package/src/runtime/agent/orchestrator/tools/code-graph/text-columns.mjs +45 -0
  171. package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.mjs +347 -0
  172. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +6 -6
  173. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +36 -4277
  174. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +6 -3
  175. package/src/runtime/agent/orchestrator/tools/patch/constants.mjs +9 -0
  176. package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +171 -0
  177. package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +471 -0
  178. package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +436 -0
  179. package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +342 -0
  180. package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +359 -0
  181. package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +340 -0
  182. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +643 -0
  183. package/src/runtime/agent/orchestrator/tools/patch.mjs +36 -2959
  184. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +1 -23
  185. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +10 -74
  186. package/src/runtime/agent/orchestrator/tools/shell-powershell.mjs +77 -0
  187. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +2 -4
  188. package/src/runtime/agent/orchestrator/tools/shell-state.mjs +154 -0
  189. package/src/runtime/channels/backends/discord-access.mjs +32 -0
  190. package/src/runtime/channels/backends/discord-attachments.mjs +65 -0
  191. package/src/runtime/channels/backends/discord-gateway.mjs +233 -0
  192. package/src/runtime/channels/backends/discord.mjs +12 -292
  193. package/src/runtime/channels/index.mjs +241 -894
  194. package/src/runtime/channels/lib/backend-dispatch.mjs +44 -0
  195. package/src/runtime/channels/lib/boot-profile.mjs +23 -0
  196. package/src/runtime/channels/lib/crash-log.mjs +106 -0
  197. package/src/runtime/channels/lib/event-pipeline.mjs +18 -1
  198. package/src/runtime/channels/lib/event-queue.mjs +63 -4
  199. package/src/runtime/channels/lib/inbound-routing.mjs +111 -0
  200. package/src/runtime/channels/lib/index-drop-trace.mjs +72 -0
  201. package/src/runtime/channels/lib/output-forwarder.mjs +9 -1
  202. package/src/runtime/channels/lib/owner-heartbeat.mjs +75 -0
  203. package/src/runtime/channels/lib/parent-bridge.mjs +88 -0
  204. package/src/runtime/channels/lib/runtime-paths.mjs +14 -4
  205. package/src/runtime/channels/lib/session-discovery.mjs +56 -4
  206. package/src/runtime/channels/lib/telegram-format.mjs +19 -22
  207. package/src/runtime/channels/lib/tool-dispatch.mjs +158 -0
  208. package/src/runtime/channels/lib/tool-format.mjs +1 -1
  209. package/src/runtime/channels/lib/transcript-discovery.mjs +4 -4
  210. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +6 -3
  211. package/src/runtime/channels/lib/voice-transcription.mjs +179 -0
  212. package/src/runtime/channels/lib/webhook/deliveries.mjs +312 -0
  213. package/src/runtime/channels/lib/webhook/log.mjs +42 -0
  214. package/src/runtime/channels/lib/webhook/ngrok.mjs +181 -0
  215. package/src/runtime/channels/lib/webhook/signature.mjs +60 -0
  216. package/src/runtime/channels/lib/webhook.mjs +36 -570
  217. package/src/runtime/channels/lib/whisper-language.mjs +42 -0
  218. package/src/runtime/channels/tool-defs.mjs +11 -130
  219. package/src/runtime/memory/index.mjs +258 -2050
  220. package/src/runtime/memory/lib/core-memory-store.mjs +351 -1
  221. package/src/runtime/memory/lib/cycle-llm-adapters.mjs +58 -0
  222. package/src/runtime/memory/lib/cycle-scheduler.mjs +497 -0
  223. package/src/runtime/memory/lib/cycle-signatures.mjs +34 -0
  224. package/src/runtime/memory/lib/embedding-warmup.mjs +58 -0
  225. package/src/runtime/memory/lib/http-wire.mjs +57 -0
  226. package/src/runtime/memory/lib/memory-config-flags.mjs +91 -0
  227. package/src/runtime/memory/lib/memory-cycle.mjs +1 -1
  228. package/src/runtime/memory/lib/memory-cycle2-gate.mjs +515 -0
  229. package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +324 -0
  230. package/src/runtime/memory/lib/memory-cycle2-shared.mjs +18 -0
  231. package/src/runtime/memory/lib/memory-cycle2.mjs +72 -837
  232. package/src/runtime/memory/lib/memory-embed.mjs +149 -0
  233. package/src/runtime/memory/lib/memory-process-lock.mjs +162 -0
  234. package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +24 -0
  235. package/src/runtime/memory/lib/memory-recall-store.mjs +22 -2
  236. package/src/runtime/memory/lib/memory-retrievers.mjs +8 -0
  237. package/src/runtime/memory/lib/memory.mjs +20 -0
  238. package/src/runtime/memory/lib/pg/supervisor.mjs +1 -1
  239. package/src/runtime/memory/lib/promotion-fingerprint.mjs +50 -0
  240. package/src/runtime/memory/lib/query-handlers.mjs +780 -0
  241. package/src/runtime/memory/lib/recall-format.mjs +238 -0
  242. package/src/runtime/memory/lib/runtime-fetcher.mjs +8 -3
  243. package/src/runtime/memory/lib/transcript-ingest.mjs +425 -0
  244. package/src/runtime/memory/tool-defs.mjs +6 -14
  245. package/src/runtime/search/lib/http-fetch.mjs +274 -0
  246. package/src/runtime/search/lib/ssrf-guard.mjs +333 -0
  247. package/src/runtime/search/lib/web-tools.mjs +24 -602
  248. package/src/runtime/shared/abort-controller.mjs +1 -1
  249. package/src/runtime/shared/atomic-file.mjs +26 -1
  250. package/src/runtime/shared/background-tasks.mjs +2 -3
  251. package/src/runtime/shared/buffered-appender.mjs +149 -0
  252. package/src/runtime/shared/launcher-control.mjs +2 -2
  253. package/src/runtime/shared/task-notification-envelope.mjs +98 -0
  254. package/src/runtime/shared/tool-execution-contract.mjs +2 -2
  255. package/src/runtime/shared/tool-primitives.mjs +308 -0
  256. package/src/runtime/shared/tool-result-summary.mjs +515 -0
  257. package/src/runtime/shared/tool-surface.mjs +80 -898
  258. package/src/runtime/shared/transcript-writer.mjs +52 -2
  259. package/src/runtime/shared/update-checker.mjs +7 -4
  260. package/src/session-runtime/config-helpers.mjs +291 -0
  261. package/src/session-runtime/config-lifecycle.mjs +232 -0
  262. package/src/session-runtime/cwd-plugins.mjs +226 -0
  263. package/src/session-runtime/effort.mjs +128 -0
  264. package/src/session-runtime/fs-utils.mjs +10 -0
  265. package/src/session-runtime/mcp-glue.mjs +177 -0
  266. package/src/session-runtime/model-capabilities.mjs +130 -0
  267. package/src/session-runtime/model-recency.mjs +111 -0
  268. package/src/session-runtime/native-search.mjs +247 -0
  269. package/src/session-runtime/output-styles.mjs +126 -0
  270. package/src/session-runtime/plugin-mcp.mjs +114 -0
  271. package/src/session-runtime/prewarm.mjs +142 -0
  272. package/src/session-runtime/provider-models.mjs +278 -0
  273. package/src/session-runtime/provider-usage.mjs +120 -0
  274. package/src/session-runtime/quick-model-rows.mjs +170 -0
  275. package/src/session-runtime/quick-search-models.mjs +46 -0
  276. package/src/session-runtime/session-hooks.mjs +93 -0
  277. package/src/session-runtime/session-text.mjs +100 -0
  278. package/src/session-runtime/settings-api.mjs +319 -0
  279. package/src/session-runtime/statusline-route.mjs +35 -0
  280. package/src/session-runtime/tool-catalog.mjs +720 -0
  281. package/src/session-runtime/tool-defs.mjs +84 -0
  282. package/src/session-runtime/warmup-schedulers.mjs +201 -0
  283. package/src/session-runtime/workflow.mjs +358 -0
  284. package/src/standalone/agent-tool/helpers.mjs +237 -0
  285. package/src/standalone/agent-tool/notify.mjs +107 -0
  286. package/src/standalone/agent-tool/provider-init.mjs +143 -0
  287. package/src/standalone/agent-tool/render.mjs +152 -0
  288. package/src/standalone/agent-tool/tool-def.mjs +55 -0
  289. package/src/standalone/agent-tool.mjs +155 -677
  290. package/src/standalone/channel-worker.mjs +7 -9
  291. package/src/standalone/explore-tool.mjs +40 -12
  292. package/src/standalone/hook-bus/config.mjs +207 -0
  293. package/src/standalone/hook-bus/constants.mjs +90 -0
  294. package/src/standalone/hook-bus/handlers.mjs +481 -0
  295. package/src/standalone/hook-bus/payload.mjs +31 -0
  296. package/src/standalone/hook-bus/rules.mjs +77 -0
  297. package/src/standalone/hook-bus.mjs +110 -746
  298. package/src/standalone/memory-runtime-proxy.mjs +7 -0
  299. package/src/standalone/opencode-go-login.mjs +125 -0
  300. package/src/standalone/provider-admin.mjs +15 -19
  301. package/src/standalone/usage-dashboard.mjs +3 -1
  302. package/src/tui/App.jsx +1163 -7571
  303. package/src/tui/app/app-format.mjs +206 -0
  304. package/src/tui/app/channel-pickers.mjs +510 -0
  305. package/src/tui/app/clipboard.mjs +67 -0
  306. package/src/tui/app/core-memory-picker.mjs +210 -0
  307. package/src/tui/app/extension-pickers.mjs +506 -0
  308. package/src/tui/app/input-parsers.mjs +193 -0
  309. package/src/tui/app/maintenance-pickers.mjs +324 -0
  310. package/src/tui/app/model-options.mjs +330 -0
  311. package/src/tui/app/model-picker.mjs +365 -0
  312. package/src/tui/app/onboarding-steps.mjs +400 -0
  313. package/src/tui/app/project-picker.mjs +247 -0
  314. package/src/tui/app/provider-setup-picker.mjs +580 -0
  315. package/src/tui/app/resume-picker.mjs +55 -0
  316. package/src/tui/app/route-pickers.mjs +419 -0
  317. package/src/tui/app/settings-picker.mjs +490 -0
  318. package/src/tui/app/slash-commands.mjs +101 -0
  319. package/src/tui/app/slash-dispatch.mjs +427 -0
  320. package/src/tui/app/text-layout.mjs +46 -0
  321. package/src/tui/app/theme-effort-pickers.mjs +154 -0
  322. package/src/tui/app/transcript-window.mjs +671 -0
  323. package/src/tui/app/use-mouse-input.mjs +460 -0
  324. package/src/tui/app/use-prompt-handlers.mjs +310 -0
  325. package/src/tui/app/use-transcript-scroll.mjs +510 -0
  326. package/src/tui/app/use-transcript-window.mjs +589 -0
  327. package/src/tui/components/ConfirmBar.jsx +1 -1
  328. package/src/tui/components/Picker.jsx +32 -4
  329. package/src/tui/components/PromptInput.jsx +259 -80
  330. package/src/tui/components/SlashCommandPalette.jsx +8 -1
  331. package/src/tui/components/StatusLine.jsx +63 -12
  332. package/src/tui/components/TextEntryPanel.jsx +11 -0
  333. package/src/tui/components/ToolExecution.jsx +56 -588
  334. package/src/tui/components/TranscriptItem.jsx +105 -0
  335. package/src/tui/components/UsagePanel.jsx +18 -4
  336. package/src/tui/components/prompt-input/edit-helpers.mjs +72 -0
  337. package/src/tui/components/prompt-input/voice-indicator.mjs +39 -0
  338. package/src/tui/components/tool-execution/ResultBody.jsx +56 -0
  339. package/src/tui/components/tool-execution/surface-detail.mjs +405 -0
  340. package/src/tui/components/tool-execution/text-format.mjs +161 -0
  341. package/src/tui/components/tool-output-format.mjs +2 -2
  342. package/src/tui/display-width.mjs +20 -3
  343. package/src/tui/dist/index.mjs +18034 -17188
  344. package/src/tui/engine/agent-envelope.mjs +296 -0
  345. package/src/tui/engine/agent-job-feed.mjs +133 -0
  346. package/src/tui/engine/boot-profile.mjs +21 -0
  347. package/src/tui/engine/labels.mjs +67 -0
  348. package/src/tui/engine/notice-text.mjs +112 -0
  349. package/src/tui/engine/notification-plan.mjs +76 -0
  350. package/src/tui/engine/queue-helpers.mjs +161 -0
  351. package/src/tui/engine/render-timing.mjs +17 -0
  352. package/src/tui/engine/session-stats.mjs +46 -0
  353. package/src/tui/engine/tool-approval.mjs +94 -0
  354. package/src/tui/engine/tool-call-fields.mjs +23 -0
  355. package/src/tui/engine/tool-card-results.mjs +234 -0
  356. package/src/tui/engine/tool-result-status.mjs +135 -0
  357. package/src/tui/engine/tool-result-text.mjs +126 -0
  358. package/src/tui/engine.mjs +405 -1385
  359. package/src/tui/figures.mjs +5 -0
  360. package/src/tui/index.jsx +105 -0
  361. package/src/tui/input-editing.mjs +60 -10
  362. package/src/tui/keyboard-protocol.mjs +2 -2
  363. package/src/tui/lib/voice-recorder.mjs +35 -19
  364. package/src/tui/markdown/format-token.mjs +11 -9
  365. package/src/tui/paste-attachments.mjs +38 -0
  366. package/src/tui/statusline-ansi-bridge.mjs +11 -3
  367. package/src/tui/theme.mjs +6 -0
  368. package/src/tui/themes/base.mjs +2 -2
  369. package/src/tui/themes/kanagawa.mjs +4 -4
  370. package/src/tui/themes/teal.mjs +4 -5
  371. package/src/tui/themes/utils.mjs +1 -1
  372. package/src/ui/statusline-agents.mjs +213 -0
  373. package/src/ui/statusline-format.mjs +146 -0
  374. package/src/ui/statusline-segments.mjs +148 -0
  375. package/src/ui/statusline.mjs +77 -462
  376. package/src/ui/tool-card.mjs +0 -1
  377. package/src/vendor/statusline/bin/statusline-route.mjs +15 -2
  378. package/src/workflows/default/WORKFLOW.md +16 -9
  379. package/src/workflows/sequential/WORKFLOW.md +16 -11
  380. package/src/workflows/solo/WORKFLOW.md +5 -1
  381. package/vendor/ink/build/display-width.js +19 -3
  382. package/vendor/ink/build/ink.js +103 -6
  383. package/vendor/ink/build/log-update.js +17 -3
  384. package/vendor/ink/build/wrap-text.js +125 -0
  385. package/scripts/_test-folder-dialog.mjs +0 -30
  386. package/scripts/fix-brief-fn.mjs +0 -35
  387. package/scripts/fix-format-tool-surface.mjs +0 -24
  388. package/scripts/fix-tool-exec-visible.mjs +0 -42
  389. package/scripts/patch-agent-brief.mjs +0 -48
  390. package/scripts/patch-app.mjs +0 -21
  391. package/scripts/patch-app2.mjs +0 -18
  392. package/scripts/patch-dist-brief.mjs +0 -96
  393. package/scripts/patch-tool-exec.mjs +0 -70
  394. package/src/examples/schedules/SCHEDULE.example.md +0 -32
  395. package/src/examples/webhooks/WEBHOOK.example.md +0 -40
  396. package/src/runtime/agent/orchestrator/session/manager.reactive-persist.test.mjs +0 -107
  397. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.test.mjs +0 -143
  398. package/src/runtime/agent/orchestrator/tools/builtin/diagnostics-tool.mjs +0 -285
  399. package/src/runtime/agent/orchestrator/tools/builtin/open-config-tool.mjs +0 -26
  400. package/src/runtime/shared/channel-notification-routing.test.mjs +0 -45
  401. package/src/runtime/shared/tool-execution-contract.test.mjs +0 -183
  402. package/src/standalone/agent-task-status.test.mjs +0 -76
  403. package/src/tui/components/tool-output-format.test.mjs +0 -399
  404. package/src/tui/display-width.test.mjs +0 -35
  405. package/src/tui/engine-runtime-notification.test.mjs +0 -115
  406. package/src/tui/engine-tool-result-text.test.mjs +0 -75
  407. package/src/tui/markdown/format-token.test.mjs +0 -354
  408. package/src/tui/markdown/render-ansi.test.mjs +0 -108
  409. package/src/tui/markdown/stream-fence.test.mjs +0 -26
  410. package/src/tui/markdown/streaming-markdown.test.mjs +0 -70
  411. package/src/tui/prompt-history-store.test.mjs +0 -52
  412. package/src/tui/statusline-ansi-bridge.test.mjs +0 -159
  413. package/src/tui/transcript-tool-failures.test.mjs +0 -111
  414. package/src/ui/markdown.test.mjs +0 -70
  415. package/src/ui/statusline-context-label.test.mjs +0 -15
  416. package/src/vendor/statusline/bin/statusline-lib.mjs +0 -186
  417. package/src/vendor/statusline/bin/statusline-route.test.mjs +0 -80
@@ -0,0 +1,368 @@
1
+ /**
2
+ * openai-compat-wire.mjs — message/tool wire conversion + response parsing for
3
+ * the OpenAI-compat provider.
4
+ *
5
+ * Extracted from openai-compat.mjs. Pure (stateless) converters between the
6
+ * agent's internal message/tool shape and the OpenAI Chat Completions /
7
+ * Responses API wire shapes, plus the response tool-call / text / search-source
8
+ * parsers. No provider instance state; openai-compat.mjs imports these entry
9
+ * points and re-exports the ones its tests/importers reference.
10
+ */
11
+ import {
12
+ parseCompletedToolCallArgumentsJson,
13
+ } from './openai-compat-stream.mjs';
14
+ import {
15
+ normalizeContentForOpenAIChat,
16
+ normalizeContentForOpenAIResponses,
17
+ splitToolContentForOpenAIChat,
18
+ splitToolContentForOpenAIResponses,
19
+ } from './media-normalization.mjs';
20
+ import {
21
+ customToolCallFromResponseItem,
22
+ } from './custom-tool-wire.mjs';
23
+
24
+ export function positiveTokenInt(value) {
25
+ const n = Number(value);
26
+ return Number.isFinite(n) && n > 0 ? Math.floor(n) : null;
27
+ }
28
+
29
+ export function resolveCompatMaxOutputTokens(opts = {}) {
30
+ return positiveTokenInt(
31
+ opts.maxOutputTokens
32
+ ?? opts.outputTokens
33
+ ?? opts.max_output_tokens
34
+ ?? opts.maxTokens
35
+ ?? opts.max_tokens,
36
+ );
37
+ }
38
+
39
+ export function toOpenAIMessages(messages, providerName, options = {}) {
40
+ // NOTE: chat.completions has no equivalent slot for replaying reasoning
41
+ // encrypted_content the way the Responses API does (no `type:'reasoning'`
42
+ // input item). Whatever reasoningItems may be attached to assistant
43
+ // messages by the openai-oauth provider is intentionally dropped here —
44
+ // strict providers (xai) reject unknown roles/types and would 400 the
45
+ // request. Documented in v0.1.160 (GPT reasoning replay).
46
+ //
47
+ // DeepSeek thinking models require the prior turn's `reasoning_content`
48
+ // string to be echoed back inside the assistant message, otherwise the API
49
+ // returns 400. xAI reasoning models also preserve their official multi-turn
50
+ // shape and cache prefix stability when prior assistant reasoning_content
51
+ // is replayed; reasoning_effort itself remains caller/user-selected.
52
+ const replaysReasoningContent = options.replaysReasoningContent === true
53
+ || providerName === 'deepseek'
54
+ || providerName === 'xai';
55
+ const out = [];
56
+ const pendingToolMedia = [];
57
+ const flushToolMedia = () => {
58
+ if (!pendingToolMedia.length) return;
59
+ out.push({ role: 'user', content: pendingToolMedia.splice(0) });
60
+ };
61
+ for (const m of messages) {
62
+ if (m.role === 'tool') {
63
+ const { output, mediaContent } = splitToolContentForOpenAIChat(m.content);
64
+ out.push({
65
+ role: 'tool',
66
+ tool_call_id: m.toolCallId || '',
67
+ content: output,
68
+ });
69
+ if (mediaContent) pendingToolMedia.push(...mediaContent);
70
+ continue;
71
+ }
72
+ flushToolMedia();
73
+ if (m.role === 'assistant' && m.toolCalls?.length) {
74
+ const msg = {
75
+ role: 'assistant',
76
+ content: normalizeContentForOpenAIChat(m.content, { role: 'assistant' }) || null,
77
+ tool_calls: m.toolCalls.map((tc) => ({
78
+ id: tc.id,
79
+ type: 'function',
80
+ function: { name: tc.name, arguments: JSON.stringify(tc.arguments) },
81
+ })),
82
+ };
83
+ if (replaysReasoningContent && m.reasoningContent) msg.reasoning_content = m.reasoningContent;
84
+ out.push(msg);
85
+ continue;
86
+ }
87
+ if (m.role === 'assistant' && replaysReasoningContent && m.reasoningContent) {
88
+ out.push({ role: m.role, content: normalizeContentForOpenAIChat(m.content, { role: 'assistant' }), reasoning_content: m.reasoningContent });
89
+ continue;
90
+ }
91
+ out.push({ role: m.role, content: normalizeContentForOpenAIChat(m.content, { role: m.role }) });
92
+ }
93
+ flushToolMedia();
94
+ return out;
95
+ }
96
+
97
+ export function toOpenAITools(tools) {
98
+ return tools.map((t) => ({
99
+ type: 'function',
100
+ function: {
101
+ name: t.name,
102
+ description: t.description,
103
+ parameters: t.inputSchema,
104
+ },
105
+ }));
106
+ }
107
+
108
+ export function toResponsesTools(tools) {
109
+ return tools.map((t) => {
110
+ if (t?.name === 'tool_search') {
111
+ return {
112
+ type: 'tool_search',
113
+ execution: 'client',
114
+ description: t.description,
115
+ parameters: t.inputSchema,
116
+ };
117
+ }
118
+ // xAI/Grok Responses rejects the OpenAI-only `type:'custom'` freeform
119
+ // variant ("unknown variant 'custom'"). Serialize freeform/grammar
120
+ // tools (e.g. apply_patch) as ordinary function tools instead. Grammar
121
+ // tools may carry no usable inputSchema, so fall back to a permissive
122
+ // object schema so grok still registers a valid function tool.
123
+ return {
124
+ type: 'function',
125
+ name: t.name,
126
+ description: t.description,
127
+ parameters: t.inputSchema || { type: 'object', additionalProperties: true },
128
+ };
129
+ });
130
+ }
131
+
132
+ export function nativeResponsesTools(opts) {
133
+ return Array.isArray(opts?.nativeTools)
134
+ ? opts.nativeTools.filter(t => t && typeof t === 'object')
135
+ : [];
136
+ }
137
+
138
+ // Known tool-name sets for the leaked-tool-call guard, derived from the exact
139
+ // request body so a recovered leaked call is only synthesized when it names a
140
+ // tool the model was actually offered. Chat tools nest the name under
141
+ // `function.name`; Responses tools carry a top-level `name`.
142
+ export function knownToolNamesFromOpenAITools(tools) {
143
+ return new Set(
144
+ (Array.isArray(tools) ? tools : [])
145
+ .map((t) => (typeof t?.function?.name === 'string' ? t.function.name
146
+ : typeof t?.name === 'string' ? t.name : null))
147
+ .filter(Boolean),
148
+ );
149
+ }
150
+
151
+ export function knownToolNamesFromResponsesTools(tools) {
152
+ return new Set(
153
+ (Array.isArray(tools) ? tools : [])
154
+ .map((t) => (typeof t?.name === 'string' ? t.name : null))
155
+ .filter(Boolean),
156
+ );
157
+ }
158
+
159
+ export function parseToolCalls(choice, label) {
160
+ const calls = choice.message?.tool_calls;
161
+ if (!calls?.length)
162
+ return undefined;
163
+ // finish_reason present ⇒ the turn completed; a JSON.parse failure on the
164
+ // arguments is deterministic bad JSON (permanent), not stream truncation.
165
+ const finishReason = choice.finish_reason || null;
166
+ return calls
167
+ .filter((tc) => tc.type === 'function')
168
+ .map((tc) => ({
169
+ id: tc.id,
170
+ name: tc.function.name,
171
+ arguments: parseCompletedToolCallArgumentsJson(tc.function.arguments, label, { id: tc.id, name: tc.function.name, finishReason }),
172
+ }));
173
+ }
174
+
175
+ export function parseResponsesToolCalls(response, label) {
176
+ const out = [];
177
+ // A Responses tool call is only parsed off a completed/done item, so any
178
+ // malformed-JSON failure here is deterministic, not mid-stream truncation.
179
+ const finishReason = response?.status || 'completed';
180
+ for (const item of response?.output || []) {
181
+ if (item?.type === 'function_call') {
182
+ out.push({
183
+ id: item.call_id || item.id,
184
+ name: item.name,
185
+ arguments: parseCompletedToolCallArgumentsJson(item.arguments, label, { id: item.call_id || item.id, name: item.name, finishReason }),
186
+ });
187
+ } else if (item?.type === 'custom_tool_call') {
188
+ const call = customToolCallFromResponseItem(item);
189
+ if (call) out.push(call);
190
+ } else if (item?.type === 'tool_search_call') {
191
+ const _tsArgs = item.arguments && typeof item.arguments === 'object' && !Array.isArray(item.arguments)
192
+ ? item.arguments
193
+ : parseCompletedToolCallArgumentsJson(item.arguments || '{}', label, { id: item.call_id || item.id, name: 'tool_search', finishReason });
194
+ out.push({
195
+ id: item.call_id || item.id,
196
+ name: 'tool_search',
197
+ // Schema is a plain object ({query,select,limit}); an array
198
+ // (parsed JSON or passthrough) must never pass through as args.
199
+ arguments: (_tsArgs && typeof _tsArgs === 'object' && !Array.isArray(_tsArgs)) ? _tsArgs : {},
200
+ nativeType: 'tool_search_call',
201
+ });
202
+ }
203
+ }
204
+ return out.length ? out : undefined;
205
+ }
206
+
207
+ export function responseOutputText(response) {
208
+ if (typeof response?.output_text === 'string') return response.output_text;
209
+ const chunks = [];
210
+ for (const item of response?.output || []) {
211
+ if (item?.type !== 'message' || !Array.isArray(item.content)) continue;
212
+ for (const part of item.content) {
213
+ if (part?.type === 'output_text' && typeof part.text === 'string') chunks.push(part.text);
214
+ }
215
+ }
216
+ return chunks.join('');
217
+ }
218
+
219
+ export function collectCompatResponseSearchSources(response) {
220
+ const citations = [];
221
+ const webSearchCalls = [];
222
+ const seen = new Set();
223
+ const addCitation = (source, fallback = {}) => {
224
+ if (!source) return;
225
+ if (typeof source === 'string') {
226
+ const url = source.trim();
227
+ if (!url || seen.has(url)) return;
228
+ seen.add(url);
229
+ citations.push({ title: url, url, snippet: '', source: fallback.source || 'citation', provider: 'xai' });
230
+ return;
231
+ }
232
+ if (typeof source !== 'object') return;
233
+ const url = String(
234
+ source.url
235
+ || source.uri
236
+ || source.href
237
+ || source.source_url
238
+ || source.url_citation?.url
239
+ || '',
240
+ ).trim();
241
+ if (!url || seen.has(url)) return;
242
+ seen.add(url);
243
+ citations.push({
244
+ title: String(source.title || source.name || source.query || source.url_citation?.title || fallback.title || url).trim(),
245
+ url,
246
+ snippet: String(source.snippet || source.text || source.description || '').trim(),
247
+ source: source.source || fallback.source || 'citation',
248
+ provider: source.provider || 'xai',
249
+ });
250
+ };
251
+ for (const citation of Array.isArray(response?.citations) ? response.citations : []) addCitation(citation);
252
+ for (const item of Array.isArray(response?.output) ? response.output : []) {
253
+ if (item?.type === 'web_search_call') {
254
+ webSearchCalls.push({ id: item.id || '', status: item.status || '', action: item.action || null });
255
+ const action = item.action || {};
256
+ for (const source of Array.isArray(action.sources) ? action.sources : []) addCitation(source, { title: action.query || '', source: 'web_search_call' });
257
+ if (action.url) addCitation({ url: action.url, title: action.query || '' }, { source: 'web_search_call' });
258
+ for (const url of Array.isArray(action.urls) ? action.urls : []) addCitation({ url, title: action.query || '' }, { source: 'web_search_call' });
259
+ }
260
+ for (const citation of Array.isArray(item?.citations) ? item.citations : []) addCitation(citation);
261
+ for (const part of Array.isArray(item?.content) ? item.content : []) {
262
+ for (const annotation of Array.isArray(part?.annotations) ? part.annotations : []) {
263
+ addCitation(annotation, { source: 'annotation' });
264
+ }
265
+ }
266
+ }
267
+ return { citations, webSearchCalls };
268
+ }
269
+
270
+ export function toResponsesInputMessage(m, pendingToolMedia = null, customToolCallNameById = null) {
271
+ if (m.role === 'tool') {
272
+ if (Array.isArray(m.nativeToolSearch?.openaiTools)) {
273
+ return {
274
+ type: 'tool_search_output',
275
+ call_id: m.toolCallId || '',
276
+ status: 'completed',
277
+ execution: 'client',
278
+ tools: m.nativeToolSearch.openaiTools,
279
+ };
280
+ }
281
+ const { output, mediaContent } = splitToolContentForOpenAIResponses(m.content);
282
+ // xai path: never emit `custom_tool_call_output` (the `custom` variant
283
+ // is rejected by grok). Replay prior tool outputs as the standard
284
+ // `function_call_output` item regardless of original native type.
285
+ const item = {
286
+ type: 'function_call_output',
287
+ call_id: m.toolCallId || '',
288
+ output: output,
289
+ };
290
+ if (mediaContent && pendingToolMedia) pendingToolMedia.push(...mediaContent);
291
+ return item;
292
+ }
293
+ if (m.role === 'assistant' && Array.isArray(m.toolCalls) && m.toolCalls.length > 0) {
294
+ const items = [];
295
+ if (m.content) items.push({ role: 'assistant', content: normalizeContentForOpenAIResponses(m.content, { role: 'assistant' }) });
296
+ for (const tc of m.toolCalls) {
297
+ if (tc.nativeType === 'tool_search_call' || tc.name === 'tool_search') {
298
+ items.push({
299
+ type: 'tool_search_call',
300
+ call_id: tc.id,
301
+ execution: 'client',
302
+ arguments: tc.arguments || {},
303
+ });
304
+ } else {
305
+ // xai path: prior native `custom_tool_call` history is replayed
306
+ // as a standard `function_call` (grok rejects the `custom`
307
+ // variant). tc.arguments already holds the recovered object
308
+ // form, so the same stringify path as regular calls applies.
309
+ items.push({
310
+ type: 'function_call',
311
+ call_id: tc.id,
312
+ name: tc.name,
313
+ arguments: JSON.stringify(tc.arguments || {}),
314
+ });
315
+ }
316
+ }
317
+ return items;
318
+ }
319
+ return { role: m.role, content: normalizeContentForOpenAIResponses(m.content || '', { role: m.role }) };
320
+ }
321
+
322
+ export function xaiSystemInstructions(messages) {
323
+ const instructions = (messages || [])
324
+ .filter(m => m?.role === 'system')
325
+ .map(m => String(m.content || ''))
326
+ .filter(Boolean)
327
+ .join('\n\n');
328
+ return instructions || undefined;
329
+ }
330
+
331
+ export function toXaiResponsesInput(messages, providerState, options = {}) {
332
+ const includeSystem = options.includeSystem !== false;
333
+ const state = providerState?.xaiResponses || null;
334
+ let startIndex = 0;
335
+ let resetReason = null;
336
+ let previousResponseId = typeof state?.previousResponseId === 'string' ? state.previousResponseId : null;
337
+ const expectedModel = options.model ? String(options.model) : '';
338
+ const stateModel = state?.model ? String(state.model) : '';
339
+ const seen = Number.isInteger(state?.seenMessageCount) ? state.seenMessageCount : null;
340
+ if (previousResponseId && expectedModel && stateModel && stateModel !== expectedModel) {
341
+ previousResponseId = null;
342
+ resetReason = 'model_changed';
343
+ }
344
+ if (previousResponseId && (seen == null || seen < 0 || seen > messages.length)) {
345
+ previousResponseId = null;
346
+ resetReason = seen == null ? 'missing_seen_message_count' : 'seen_message_count_out_of_range';
347
+ }
348
+ if (previousResponseId) {
349
+ startIndex = Math.max(0, Math.min(seen, messages.length));
350
+ if (messages[startIndex]?.role === 'assistant') startIndex += 1;
351
+ }
352
+ const input = [];
353
+ const pendingToolMedia = [];
354
+ const customToolCallNameById = new Map();
355
+ const flushToolMedia = () => {
356
+ if (!pendingToolMedia.length) return;
357
+ input.push({ role: 'user', content: pendingToolMedia.splice(0) });
358
+ };
359
+ for (const m of messages.slice(startIndex)) {
360
+ if (!includeSystem && m.role === 'system') continue;
361
+ if (m.role !== 'tool') flushToolMedia();
362
+ const converted = toResponsesInputMessage(m, pendingToolMedia, customToolCallNameById);
363
+ if (Array.isArray(converted)) input.push(...converted);
364
+ else input.push(converted);
365
+ }
366
+ flushToolMedia();
367
+ return { input, previousResponseId, startIndex, continuationResetReason: resetReason };
368
+ }