mixdog 1.2.3 → 1.2.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 (465) hide show
  1. package/package.json +1 -1
  2. package/scripts/gate-local.mjs +6 -4
  3. package/scripts/lib/gate-scheduler.mjs +29 -11
  4. package/scripts/probe-provider-catalog.mjs +31 -0
  5. package/scripts/provider-pingpong-live.mjs +128 -38
  6. package/scripts/session-sweep.mjs +5 -25
  7. package/src/agents/maintainer/AGENT.md +1 -1
  8. package/src/agents/maintainer/agent.json +1 -1
  9. package/src/agents/reviewer/AGENT.md +2 -4
  10. package/src/agents/security/AGENT.md +1 -2
  11. package/src/agents/writer/AGENT.md +2 -3
  12. package/src/defaults/shipped-history.json +6 -1
  13. package/src/defaults/skills/image/SKILL.md +21 -23
  14. package/src/lib/keychain-cjs.cjs +13 -11
  15. package/src/rules/agent/AGENT.md +7 -5
  16. package/src/rules/lead/LEAD.md +7 -9
  17. package/src/rules/shared/45-destructive.md +4 -0
  18. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
  19. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +28 -7
  20. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -11
  21. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +101 -23
  22. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +2 -0
  23. package/src/runtime/agent/orchestrator/providers/anthropic-api-key-fetch.mjs +36 -0
  24. package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +1 -1
  25. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -3
  26. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  27. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +26 -44
  28. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2 -5
  29. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +4 -0
  30. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +41 -12
  31. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +13 -1
  32. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +81 -10
  33. package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +109 -5
  34. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +2 -1
  35. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +107 -37
  36. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +4 -1
  37. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +3 -1
  38. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
  39. package/src/runtime/agent/orchestrator/providers/cursor-native-context.mjs +48 -0
  40. package/src/runtime/agent/orchestrator/providers/cursor-wire-exec.mjs +144 -34
  41. package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +28 -4
  42. package/src/runtime/agent/orchestrator/providers/cursor-wire-request.mjs +8 -4
  43. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +41 -11
  44. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +67 -5
  45. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +14 -4
  46. package/src/runtime/agent/orchestrator/providers/cursor.mjs +14 -1
  47. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +9 -6
  48. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +7 -2
  49. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +26 -4
  50. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +12 -6
  51. package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +14 -6
  52. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +4 -4
  53. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +1 -0
  54. package/src/runtime/agent/orchestrator/providers/gemini-rest-stream/watchdogs.mjs +16 -5
  55. package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +6 -1
  56. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +22 -10
  57. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -2
  58. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +33 -7
  59. package/src/runtime/agent/orchestrator/providers/gemini.mjs +11 -2
  60. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  61. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +9 -2
  62. package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +9 -5
  63. package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
  64. package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +4 -2
  65. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -5
  66. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
  67. package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +60 -16
  68. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +11 -13
  69. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +30 -19
  70. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
  71. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
  72. package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +42 -5
  73. package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +13 -9
  74. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +1 -3
  75. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +18 -7
  76. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +36 -3
  77. package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
  78. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +11 -1
  79. package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +64 -52
  80. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +3 -1
  81. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +2 -1
  82. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +7 -1
  83. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +1 -4
  84. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +0 -1
  85. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +7 -6
  86. package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +13 -2
  87. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +4 -1
  88. package/src/runtime/agent/orchestrator/providers/openrouter.mjs +1 -2
  89. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +5 -4
  90. package/src/runtime/agent/orchestrator/providers/registry.mjs +9 -1
  91. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +2 -1
  92. package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +11 -4
  93. package/src/runtime/agent/orchestrator/providers/wire-route.mjs +14 -4
  94. package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +15 -3
  95. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +6 -2
  96. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
  97. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +4 -1
  98. package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +30 -2
  99. package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +3 -2
  100. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -3
  101. package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +3 -1
  102. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
  103. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +10 -10
  104. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +3 -1
  105. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +46 -8
  106. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -8
  107. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -2
  108. package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +24 -0
  109. package/src/runtime/agent/orchestrator/session/cache/tool-result-reuse.mjs +10 -2
  110. package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -3
  111. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +3 -11
  112. package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
  113. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +2 -0
  114. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
  115. package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +28 -0
  116. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
  117. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +0 -6
  118. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +0 -6
  119. package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +1 -1
  120. package/src/runtime/agent/orchestrator/session/historical-session-closure.mjs +10 -0
  121. package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +2 -5
  122. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +2 -4
  123. package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +3 -3
  124. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +0 -27
  125. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +1 -1
  126. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -10
  127. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +2 -9
  128. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +4 -1
  129. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +4 -1
  130. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +1 -4
  131. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
  132. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +5 -1
  133. package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +8 -9
  134. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
  135. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +15 -2
  136. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +1 -4
  137. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +3 -4
  138. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +33 -3
  139. package/src/runtime/agent/orchestrator/session/manager/ask-support.mjs +0 -4
  140. package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +21 -1
  141. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +38 -13
  142. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
  143. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +5 -0
  144. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +19 -1
  145. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
  146. package/src/runtime/agent/orchestrator/session/manager/failed-turn-rewind.mjs +16 -0
  147. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +6 -120
  148. package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
  149. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +29 -8
  150. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +42 -49
  151. package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +50 -0
  152. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +32 -14
  153. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +1 -1
  154. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +17 -33
  155. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
  156. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -3
  157. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
  158. package/src/runtime/agent/orchestrator/session/manager.mjs +2 -9
  159. package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
  160. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -2
  161. package/src/runtime/agent/orchestrator/session/side-question.mjs +12 -7
  162. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +5 -12
  163. package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +1 -1
  164. package/src/runtime/agent/orchestrator/session/store/listing.mjs +2 -6
  165. package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +1 -1
  166. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +46 -37
  167. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +1 -1
  168. package/src/runtime/agent/orchestrator/session/store/load-session.mjs +1 -1
  169. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +5 -11
  170. package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +59 -0
  171. package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +1 -1
  172. package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +1 -1
  173. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +27 -32
  174. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +0 -8
  175. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +6 -18
  176. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +33 -106
  177. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +1 -1
  178. package/src/runtime/agent/orchestrator/session/store-agent-worker-pool.mjs +5 -8
  179. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +136 -196
  180. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +50 -116
  181. package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +3 -29
  182. package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +1 -1
  183. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +7 -8
  184. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
  185. package/src/runtime/agent/orchestrator/session/store.mjs +3 -16
  186. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +11 -12
  187. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +37 -13
  188. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
  189. package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +4 -2
  190. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +72 -15
  191. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +45 -0
  192. package/src/runtime/agent/orchestrator/stall-policy.mjs +50 -0
  193. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +5 -1
  194. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +6 -2
  195. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +204 -10
  196. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +160 -39
  197. package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +7 -5
  198. package/src/runtime/agent/orchestrator/tools/builtin/grep-formatting.mjs +14 -5
  199. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +4 -3
  200. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +2 -1
  201. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +48 -44
  202. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +10 -3
  203. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +200 -17
  204. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +5 -4
  205. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +6 -1
  206. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +20 -0
  207. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +101 -2
  208. package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
  209. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +67 -0
  210. package/src/runtime/agent/orchestrator/tools/lib/process-table-fixture.mjs +50 -0
  211. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +303 -63
  212. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +2 -0
  213. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +108 -18
  214. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +77 -11
  215. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +81 -5
  216. package/src/runtime/attachments/store.d.mts +9 -0
  217. package/src/runtime/attachments/store.mjs +80 -9
  218. package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -1
  219. package/src/runtime/browser-bridge/browser-action-contract.mjs +0 -2
  220. package/src/runtime/computer-bridge/action-schema.mjs +178 -178
  221. package/src/runtime/computer-bridge/linux-readiness.d.mts +0 -2
  222. package/src/runtime/computer-bridge/linux-readiness.mjs +0 -16
  223. package/src/runtime/effort-judge/judge-client.mjs +21 -4
  224. package/src/runtime/effort-judge/judge-worker.mjs +4 -1
  225. package/src/runtime/github/tool.mjs +118 -17
  226. package/src/runtime/media/adapters/codex-image.mjs +140 -21
  227. package/src/runtime/media/catalog.mjs +4 -4
  228. package/src/runtime/media/chatgpt-usage.mjs +55 -0
  229. package/src/runtime/media/defaults.mjs +37 -0
  230. package/src/runtime/media/jobs.mjs +12 -2
  231. package/src/runtime/media/lanes.mjs +12 -0
  232. package/src/runtime/media/tool-defs.mjs +15 -4
  233. package/src/runtime/media/tool.mjs +41 -12
  234. package/src/runtime/media/upstream-error.mjs +72 -6
  235. package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
  236. package/src/runtime/memory/lib/pg/process.mjs +5 -7
  237. package/src/runtime/memory/lib/pg/supervisor.mjs +4 -1
  238. package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
  239. package/src/runtime/office/authoring/html-browser.mjs +18 -8
  240. package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
  241. package/src/runtime/office/authoring/pptx-html-measure.mjs +1 -1
  242. package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
  243. package/src/runtime/office/core/office-write-ledger.mjs +1 -5
  244. package/src/runtime/office/index.mjs +2 -3
  245. package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
  246. package/src/runtime/session-search/session-search-ingest.mjs +1 -1
  247. package/src/runtime/shared/agent-reap-state.mjs +13 -0
  248. package/src/runtime/shared/atomic-file.d.mts +1 -1
  249. package/src/runtime/shared/background-tasks.mjs +6 -1
  250. package/src/runtime/shared/bounded-line-diff.mjs +11 -2
  251. package/src/runtime/shared/browser-launch.mjs +15 -0
  252. package/src/runtime/shared/err-text.mjs +42 -4
  253. package/src/runtime/shared/file-lock.mjs +6 -5
  254. package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
  255. package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
  256. package/src/runtime/shared/model-route-chain.d.mts +8 -0
  257. package/src/runtime/shared/model-route-chain.mjs +48 -0
  258. package/src/runtime/shared/model-route-fallback.mjs +22 -0
  259. package/src/runtime/shared/pid-liveness.mjs +12 -0
  260. package/src/runtime/shared/provider-api-key.mjs +6 -0
  261. package/src/runtime/shared/provider-timeout-phase.mjs +17 -0
  262. package/src/runtime/shared/quiet-progress.d.mts +35 -0
  263. package/src/runtime/shared/quiet-progress.mjs +101 -0
  264. package/src/runtime/shared/quota-resume-store.mjs +32 -1
  265. package/src/runtime/shared/read-row-numbers.mjs +44 -0
  266. package/src/runtime/shared/remote-intent.mjs +2 -42
  267. package/src/runtime/shared/slow-span.mjs +8 -1
  268. package/src/runtime/shared/statusline/statusline-segments.mjs +24 -2
  269. package/src/runtime/shared/tool-card-model/card-header.mjs +2 -1
  270. package/src/runtime/shared/tool-output-budget.mjs +2 -0
  271. package/src/runtime/shared/tool-result-summary.mjs +16 -2
  272. package/src/runtime/shared/tool-status.mjs +3 -2
  273. package/src/runtime/shared/tool-surface.mjs +2 -3
  274. package/src/runtime/shared/tool-work-units.mjs +22 -15
  275. package/src/runtime/shared/transcript-metadata.mjs +49 -1
  276. package/src/runtime/shared/transcript-turn-keys.mjs +33 -0
  277. package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
  278. package/src/runtime/shared/transcript-writer.mjs +14 -4
  279. package/src/runtime/shared/turn-changes.mjs +2 -1
  280. package/src/runtime/shared/turn-snapshot.mjs +11 -3
  281. package/src/runtime/shared/worktrees/activity-gate.mjs +175 -0
  282. package/src/runtime/shared/worktrees/branch-management.mjs +179 -0
  283. package/src/runtime/shared/worktrees/carry.mjs +6 -4
  284. package/src/runtime/shared/worktrees/contract.mjs +27 -1
  285. package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
  286. package/src/runtime/shared/worktrees/file-recovery.mjs +29 -13
  287. package/src/runtime/shared/worktrees/git-head.mjs +22 -13
  288. package/src/runtime/shared/worktrees/include.mjs +125 -7
  289. package/src/runtime/shared/worktrees/lock.mjs +1 -1
  290. package/src/runtime/shared/worktrees/maintenance.mjs +20 -2
  291. package/src/runtime/shared/worktrees/manager.mjs +378 -32
  292. package/src/runtime/shared/worktrees/owner.mjs +2 -1
  293. package/src/runtime/shared/worktrees/preparation-report.mjs +79 -0
  294. package/src/runtime/shared/worktrees/setup-commands.mjs +232 -0
  295. package/src/runtime/shared/worktrees/workspace-visibility.mjs +17 -0
  296. package/src/runtime/terminal-bridge/client.mjs +14 -10
  297. package/src/session-runtime/boot/apis.mjs +7 -1
  298. package/src/session-runtime/boot/config.mjs +2 -0
  299. package/src/session-runtime/boot/facade.mjs +3 -0
  300. package/src/session-runtime/boot/session.mjs +3 -2
  301. package/src/session-runtime/boot/tools.mjs +3 -0
  302. package/src/session-runtime/conversation-import/service.mjs +1 -1
  303. package/src/session-runtime/goal-facade-api.mjs +2 -2
  304. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +44 -18
  305. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +4 -1
  306. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +22 -8
  307. package/src/session-runtime/internal-tool-executor.mjs +2 -0
  308. package/src/session-runtime/lifecycle/cold-heir.mjs +0 -1
  309. package/src/session-runtime/lifecycle/session-catalog.mjs +14 -16
  310. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +18 -53
  311. package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
  312. package/src/session-runtime/lifecycle/shared.mjs +5 -6
  313. package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -5
  314. package/src/session-runtime/lifecycle/teardown.mjs +7 -16
  315. package/src/session-runtime/media-api.mjs +8 -0
  316. package/src/session-runtime/model-route/route-ownership.mjs +60 -0
  317. package/src/session-runtime/model-route/route-persist.mjs +3 -2
  318. package/src/session-runtime/model-route/set-route.mjs +114 -34
  319. package/src/session-runtime/model-route/web-search-route.mjs +7 -2
  320. package/src/session-runtime/model-route-api.mjs +4 -2
  321. package/src/session-runtime/native-web-search/routes.mjs +37 -24
  322. package/src/session-runtime/native-web-search.mjs +9 -8
  323. package/src/session-runtime/provider-auth/setup.mjs +4 -0
  324. package/src/session-runtime/provider-models/catalog-load.mjs +9 -0
  325. package/src/session-runtime/provider-models/web-search-catalog.mjs +23 -3
  326. package/src/session-runtime/provider-models.mjs +1 -0
  327. package/src/session-runtime/provider-usage.mjs +4 -0
  328. package/src/session-runtime/route-resolution.mjs +3 -1
  329. package/src/session-runtime/runtime-core.mjs +4 -0
  330. package/src/session-runtime/runtime-facade.mjs +6 -0
  331. package/src/session-runtime/services/agent-task-status.mjs +2 -0
  332. package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +0 -3
  333. package/src/session-runtime/services/agent-tool/close-flow.mjs +6 -7
  334. package/src/session-runtime/services/agent-tool/execute-send.mjs +2 -2
  335. package/src/session-runtime/services/agent-tool/execute-spawn.mjs +36 -3
  336. package/src/session-runtime/services/agent-tool/execute.mjs +9 -1
  337. package/src/session-runtime/services/agent-tool/helpers.mjs +30 -7
  338. package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +7 -2
  339. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +6 -3
  340. package/src/session-runtime/services/agent-tool/lead-worker-index/lead-rows.mjs +3 -4
  341. package/src/session-runtime/services/agent-tool/lead-worker-index/reap-timers.mjs +9 -3
  342. package/src/session-runtime/services/agent-tool/lead-worker-index/row-settlement.mjs +7 -18
  343. package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +9 -6
  344. package/src/session-runtime/services/agent-tool/model-select.mjs +82 -0
  345. package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -6
  346. package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +3 -1
  347. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -5
  348. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -4
  349. package/src/session-runtime/services/agent-tool/spawn-flow.mjs +2 -1
  350. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
  351. package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +1 -3
  352. package/src/session-runtime/services/agent-tool/tag-registry/tag-refresh.mjs +1 -3
  353. package/src/session-runtime/services/agent-tool/tag-registry.mjs +3 -9
  354. package/src/session-runtime/services/agent-tool/terminal-reaper/scan-admission.mjs +8 -41
  355. package/src/session-runtime/services/agent-tool/terminal-reaper/stale-rows.mjs +3 -3
  356. package/src/session-runtime/services/agent-tool/terminal-reaper.mjs +6 -23
  357. package/src/session-runtime/services/agent-tool/terminal-trace.mjs +0 -1
  358. package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
  359. package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +32 -20
  360. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -2
  361. package/src/session-runtime/services/agent-tool/worker-index.mjs +28 -8
  362. package/src/session-runtime/services/agent-tool.mjs +4 -0
  363. package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
  364. package/src/session-runtime/services/provider-admin.mjs +77 -0
  365. package/src/session-runtime/session-create/session-options.mjs +7 -5
  366. package/src/session-runtime/session-create/session-start-hook.mjs +2 -1
  367. package/src/session-runtime/session-transcript.mjs +4 -5
  368. package/src/session-runtime/session-turn-api.mjs +3 -9
  369. package/src/session-runtime/settings-builtin-tools-api.mjs +9 -6
  370. package/src/session-runtime/setup-tool/executor.mjs +23 -5
  371. package/src/session-runtime/setup-tool/extended-actions.mjs +6 -6
  372. package/src/session-runtime/setup-tool/settings-contract.mjs +7 -2
  373. package/src/session-runtime/setup-tool/tool-defs.mjs +13 -1
  374. package/src/session-runtime/tool-policy-refresh.mjs +83 -32
  375. package/src/session-runtime/turn/agent-ops.mjs +49 -2
  376. package/src/session-runtime/turn/side-question-ops.mjs +1 -4
  377. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +2 -0
  378. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +4 -0
  379. package/src/session-runtime/turn/turn-run/turn-settle.mjs +8 -2
  380. package/src/session-runtime/turn/turn-run.mjs +1 -36
  381. package/src/session-runtime/usage-stats-api.mjs +4 -1
  382. package/src/session-runtime/workflow-agents-api/agent-route.mjs +16 -1
  383. package/src/session-runtime/workspace/admission-gate.mjs +44 -15
  384. package/src/session-runtime/workspace/project-branches.mjs +28 -36
  385. package/src/session-runtime/workspace/transition-steps.mjs +96 -95
  386. package/src/session-runtime/workspace/transitions.mjs +248 -68
  387. package/src/standalone/channel-transport.mjs +3 -4
  388. package/src/standalone/daemon-desktop-runtime.mjs +32 -1
  389. package/src/standalone/daemon-pg-stop.mjs +1 -3
  390. package/src/standalone/daemon-session-control.mjs +88 -0
  391. package/src/standalone/daemon-stored-session-views.mjs +23 -3
  392. package/src/standalone/daemon.mjs +2 -0
  393. package/src/standalone/local-session-runtime.mjs +11 -12
  394. package/src/standalone/session-protocol.mjs +7 -0
  395. package/src/standalone/session-runtime-inline-host.mjs +2 -0
  396. package/src/standalone/session-service/agent-tree/agent-cancel.mjs +91 -49
  397. package/src/standalone/session-service/agent-tree/agent-child.mjs +19 -1
  398. package/src/standalone/session-service/agent-tree/agent-registry.mjs +25 -0
  399. package/src/standalone/session-service/agent-tree/agent-turns.mjs +9 -1
  400. package/src/standalone/session-service/agent-tree.mjs +28 -2
  401. package/src/standalone/session-service/entries/session-loads.mjs +16 -5
  402. package/src/standalone/session-service/entries.mjs +1 -0
  403. package/src/standalone/session-service/projection/transcript-window.mjs +39 -0
  404. package/src/standalone/session-service/quota-resume.mjs +28 -13
  405. package/src/standalone/session-service/session-calls/session-turns.mjs +17 -6
  406. package/src/standalone/session-service/session-calls/session-views.mjs +6 -0
  407. package/src/standalone/session-tool-output.mjs +82 -0
  408. package/src/tui/app/app-view.jsx +2 -1
  409. package/src/tui/app/provider-setup/provider-items.mjs +8 -0
  410. package/src/tui/app/provider-setup-picker.mjs +15 -3
  411. package/src/tui/app/slash-commands.mjs +6 -0
  412. package/src/tui/app/slash-dispatch/session-commands.mjs +49 -0
  413. package/src/tui/components/Spinner.jsx +4 -0
  414. package/src/tui/components/SpinnerByline.jsx +21 -2
  415. package/src/tui/components/status-line/local-line.mjs +10 -2
  416. package/src/tui/dist/index.mjs +478 -251
  417. package/src/tui/session/active-tool-summary.mjs +1 -1
  418. package/src/tui/session/context-state.mjs +0 -3
  419. package/src/tui/session/goal-continuation/continuation-queue.mjs +2 -3
  420. package/src/tui/session/goal-continuation/deadline-delivery.mjs +4 -2
  421. package/src/tui/session/goal-continuation/session-boundary.mjs +21 -0
  422. package/src/tui/session/quota-resume.mjs +140 -61
  423. package/src/tui/session/session-api/commands.mjs +4 -10
  424. package/src/tui/session/session-api/controls.mjs +12 -0
  425. package/src/tui/session/session-api/lifecycle/dispose.mjs +2 -9
  426. package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
  427. package/src/tui/session/session-api/lifecycle.mjs +13 -11
  428. package/src/tui/session/session-api/media.mjs +2 -0
  429. package/src/tui/session/session-api/routes.mjs +81 -57
  430. package/src/tui/session/session-api/settings.mjs +3 -3
  431. package/src/tui/session/session-api/worktree.mjs +3 -2
  432. package/src/tui/session/session-flow/auto-clear.mjs +1 -3
  433. package/src/tui/session/session-flow/drain.mjs +6 -4
  434. package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -0
  435. package/src/tui/session/session-flow/queue/take-entries.mjs +2 -1
  436. package/src/tui/session/session-flow/queue.mjs +1 -1
  437. package/src/tui/session/tool-approval.mjs +17 -8
  438. package/src/tui/session/transcript-store/streaming-tail.mjs +1 -1
  439. package/src/tui/session/tui-steering-persist.mjs +3 -5
  440. package/src/tui/session/turn-quiet.mjs +53 -0
  441. package/src/tui/session/turn-stream.mjs +5 -1
  442. package/src/tui/session/turn.mjs +38 -31
  443. package/src/tui/session/worktree-setup-notice.mjs +38 -0
  444. package/src/tui/spinner-meta.mjs +10 -0
  445. package/src/tui/spinner-verbs.mjs +3 -0
  446. package/src/ui/statusline.mjs +13 -3
  447. package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +0 -1
  448. package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +0 -346
  449. package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +0 -117
  450. package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +0 -302
  451. package/src/session-runtime/services/agent-tool/terminal-reaper/reap-timers.mjs +0 -142
  452. package/src/session-runtime/turn/share-ops.mjs +0 -77
  453. package/src/tui/session/cross-surface-share.mjs +0 -406
  454. package/src/tui/session/live-share/delta.mjs +0 -153
  455. package/src/tui/session/live-share/mirror.mjs +0 -106
  456. package/src/tui/session/live-share/owner.mjs +0 -254
  457. package/src/tui/session/live-share/retry.mjs +0 -54
  458. package/src/tui/session/live-share/viewer/frame-router.mjs +0 -32
  459. package/src/tui/session/live-share/viewer/pipe-client.mjs +0 -108
  460. package/src/tui/session/live-share/viewer/submit-acks.mjs +0 -65
  461. package/src/tui/session/live-share/viewer/sync-waiters.mjs +0 -53
  462. package/src/tui/session/live-share/viewer.mjs +0 -99
  463. package/src/tui/session/live-share/wire.mjs +0 -44
  464. package/src/tui/session/live-share.mjs +0 -154
  465. package/src/tui/session/shared-dir-watch.mjs +0 -69
@@ -155,198 +155,198 @@ const captureProperties = {
155
155
  // schema below derives its `input` from it. It is not part of the advertised
156
156
  // root: provider tool schemas must be an object root without anyOf/oneOf/allOf.
157
157
  export const COMPUTER_ACTION_CONTRACTS = [
158
- branch(
159
- 'wait_for_user',
160
- input({
161
- timeout_ms: {
158
+ branch(
159
+ 'wait_for_user',
160
+ input({
161
+ timeout_ms: {
162
+ type: 'integer',
163
+ minimum: 0,
164
+ maximum: 120000,
165
+ description: 'Wait for manual or host-configured idle resume; default 60000.',
166
+ },
167
+ }),
168
+ false
169
+ ),
170
+ branch(
171
+ 'list',
172
+ input(
173
+ {
174
+ kind: {
175
+ type: 'string',
176
+ enum: ['windows', 'apps', 'history'],
177
+ description:
178
+ "history returns this session's own executed commands with their verdicts, for reviewing what a run already did.",
179
+ },
180
+ query: {
181
+ type: 'string',
182
+ minLength: 1,
183
+ maxLength: MAX_TARGET_TOKEN_LENGTH,
184
+ description:
185
+ 'With kind="apps", also lists installed apps whose name or id matches, including apps that are not running.',
186
+ },
187
+ limit: {
162
188
  type: 'integer',
163
- minimum: 0,
164
- maximum: 120000,
165
- description: 'Wait for manual or host-configured idle resume; default 60000.',
189
+ minimum: 1,
190
+ maximum: 60,
191
+ description: 'kind="history" only: how many of the most recent records to return; default 60.',
166
192
  },
167
- }),
168
- false
169
- ),
170
- branch(
171
- 'list',
172
- input(
173
- {
174
- kind: {
175
- type: 'string',
176
- enum: ['windows', 'apps', 'history'],
177
- description:
178
- "history returns this session's own executed commands with their verdicts, for reviewing what a run already did.",
179
- },
180
- query: {
181
- type: 'string',
182
- minLength: 1,
183
- maxLength: MAX_TARGET_TOKEN_LENGTH,
184
- description:
185
- 'With kind="apps", also lists installed apps whose name or id matches, including apps that are not running.',
186
- },
187
- limit: {
188
- type: 'integer',
189
- minimum: 1,
190
- maximum: 60,
191
- description: 'kind="history" only: how many of the most recent records to return; default 60.',
192
- },
193
+ },
194
+ ['kind']
195
+ )
196
+ ),
197
+ branch(
198
+ 'diagnose',
199
+ input({
200
+ ...windowTarget,
201
+ ocr_language: {
202
+ ...ocrLanguage,
203
+ description: 'Optional OS OCR language tag to verify, e.g. ko or en-US.',
204
+ },
205
+ }),
206
+ false
207
+ ),
208
+ branch('capture', input(captureProperties), false),
209
+ branch(
210
+ 'act',
211
+ input(
212
+ {
213
+ ...windowTarget,
214
+ ...appTarget,
215
+ frame_id: {
216
+ type: 'string',
217
+ minLength: 1,
218
+ maxLength: MAX_TARGET_TOKEN_LENGTH,
219
+ description: 'Latest unexpired frame id shared by coordinate actions in this act call.',
193
220
  },
194
- ['kind']
195
- )
196
- ),
197
- branch(
198
- 'diagnose',
199
- input({
221
+ actions: {
222
+ type: 'array',
223
+ items: COMPUTER_CORE_ACTION_SCHEMA,
224
+ minItems: 1,
225
+ maxItems: 6,
226
+ description:
227
+ 'First: an input action. Then type/key/wait reusing focus, or click/double_click/triple_click/scroll/set_value/type/key on a ref from the same observation (no marks or coordinates). Waits total ≤10s; transition/failure or a changed, disabled, or off-screen ref stops the rest.',
228
+ },
229
+ observe: {
230
+ type: 'string',
231
+ enum: ['state', 'ax'],
232
+ description:
233
+ 'Returned observation. Default: ax when the first action targets a ref (full state if the tree is unusable), otherwise state. state includes the frame for coordinates or visual checks; ax skips the screenshot.',
234
+ },
235
+ ...delivery,
236
+ },
237
+ ['actions']
238
+ )
239
+ ),
240
+ branch(
241
+ 'window',
242
+ input(
243
+ {
200
244
  ...windowTarget,
201
- ocr_language: {
202
- ...ocrLanguage,
203
- description: 'Optional OS OCR language tag to verify, e.g. ko or en-US.',
245
+ ...appTarget,
246
+ operation: {
247
+ type: 'string',
248
+ enum: ['focus', 'move', 'minimize', 'maximize', 'restore', 'close', 'terminate'],
204
249
  },
205
- }),
206
- false
207
- ),
208
- branch('capture', input(captureProperties), false),
209
- branch(
210
- 'act',
211
- input(
212
- {
213
- ...windowTarget,
214
- ...appTarget,
215
- frame_id: {
216
- type: 'string',
217
- minLength: 1,
218
- maxLength: MAX_TARGET_TOKEN_LENGTH,
219
- description: 'Latest unexpired frame id shared by coordinate actions in this act call.',
220
- },
221
- actions: {
222
- type: 'array',
223
- items: COMPUTER_CORE_ACTION_SCHEMA,
224
- minItems: 1,
225
- maxItems: 6,
226
- description:
227
- 'First: an input action. Then type/key/wait reusing focus, or click/double_click/triple_click/scroll/set_value/type/key on a ref from the same observation (no marks or coordinates). Waits total ≤10s; transition/failure or a changed, disabled, or off-screen ref stops the rest.',
228
- },
229
- observe: {
230
- type: 'string',
231
- enum: ['state', 'ax'],
232
- description:
233
- 'Returned observation. Default: ax when the first action targets a ref (full state if the tree is unusable), otherwise state. state includes the frame for coordinates or visual checks; ax skips the screenshot.',
234
- },
235
- ...delivery,
250
+ confirm: {
251
+ type: 'string',
252
+ enum: ['terminate'],
253
+ description:
254
+ 'terminate only, and required for it: kills the process behind the window, losing unsaved work. Ask the user first.',
236
255
  },
237
- ['actions']
238
- )
239
- ),
240
- branch(
241
- 'window',
242
- input(
243
- {
244
- ...windowTarget,
245
- ...appTarget,
246
- operation: {
247
- type: 'string',
248
- enum: ['focus', 'move', 'minimize', 'maximize', 'restore', 'close', 'terminate'],
249
- },
250
- confirm: {
251
- type: 'string',
252
- enum: ['terminate'],
253
- description:
254
- 'terminate only, and required for it: kills the process behind the window, losing unsaved work. Ask the user first.',
255
- },
256
- x: {
257
- type: 'integer',
258
- description: 'move only: new left edge; y the top; width/height an optional new size.',
259
- },
260
- y: { type: 'integer' },
261
- width: { type: 'integer', minimum: 1 },
262
- height: { type: 'integer', minimum: 1 },
256
+ x: {
257
+ type: 'integer',
258
+ description: 'move only: new left edge; y the top; width/height an optional new size.',
263
259
  },
264
- ['operation']
265
- )
266
- ),
267
- branch(
268
- 'menu',
269
- input(
270
- {
271
- ...windowTarget,
272
- ...appTarget,
273
- path: {
274
- type: 'array',
275
- items: { type: 'string', minLength: 1, maxLength: 512 },
276
- minItems: 1,
277
- maxItems: 8,
278
- description:
279
- 'Exact labels from the bar down, e.g. ["File","Save As"]. Missing, ambiguous, or disabled entries fail closed.',
280
- },
260
+ y: { type: 'integer' },
261
+ width: { type: 'integer', minimum: 1 },
262
+ height: { type: 'integer', minimum: 1 },
263
+ },
264
+ ['operation']
265
+ )
266
+ ),
267
+ branch(
268
+ 'menu',
269
+ input(
270
+ {
271
+ ...windowTarget,
272
+ ...appTarget,
273
+ path: {
274
+ type: 'array',
275
+ items: { type: 'string', minLength: 1, maxLength: 512 },
276
+ minItems: 1,
277
+ maxItems: 8,
278
+ description:
279
+ 'Exact labels from the bar down, e.g. ["File","Save As"]. Missing, ambiguous, or disabled entries fail closed.',
281
280
  },
282
- ['path']
283
- )
284
- ),
285
- branch(
286
- 'verify',
287
- input(
288
- {
289
- ...windowTarget,
290
- ...appTarget,
291
- expect: {
292
- type: 'array',
293
- minItems: 1,
294
- maxItems: 8,
295
- description: 'AND-combined predicates. Reads state only: no pixels, and prior refs stay valid.',
296
- items: {
297
- type: 'object',
298
- properties: {
299
- present: {
300
- type: 'string',
301
- maxLength: MAX_TARGET_TOKEN_LENGTH,
302
- description: 'Text an element name or value must contain.',
303
- },
304
- absent: { type: 'string', maxLength: MAX_TARGET_TOKEN_LENGTH },
305
- title_contains: { type: 'string', maxLength: MAX_TARGET_TOKEN_LENGTH },
306
- window_exists: { type: 'boolean' },
281
+ },
282
+ ['path']
283
+ )
284
+ ),
285
+ branch(
286
+ 'verify',
287
+ input(
288
+ {
289
+ ...windowTarget,
290
+ ...appTarget,
291
+ expect: {
292
+ type: 'array',
293
+ minItems: 1,
294
+ maxItems: 8,
295
+ description: 'AND-combined predicates. Reads state only: no pixels, and prior refs stay valid.',
296
+ items: {
297
+ type: 'object',
298
+ properties: {
299
+ present: {
300
+ type: 'string',
301
+ maxLength: MAX_TARGET_TOKEN_LENGTH,
302
+ description: 'Text an element name or value must contain.',
307
303
  },
308
- additionalProperties: false,
304
+ absent: { type: 'string', maxLength: MAX_TARGET_TOKEN_LENGTH },
305
+ title_contains: { type: 'string', maxLength: MAX_TARGET_TOKEN_LENGTH },
306
+ window_exists: { type: 'boolean' },
309
307
  },
310
- },
311
- timeout_ms: { type: 'integer', minimum: 0, maximum: 30000 },
312
- stable_samples: {
313
- type: 'integer',
314
- minimum: 1,
315
- maximum: 5,
316
- description: 'Consecutive satisfied samples required. Default 2.',
308
+ additionalProperties: false,
317
309
  },
318
310
  },
319
- ['expect']
320
- )
321
- ),
322
- branch(
323
- 'clipboard',
324
- input(
325
- {
326
- operation: { type: 'string', enum: ['read', 'write'] },
327
- text: {
328
- type: 'string',
329
- maxLength: MAX_CLIPBOARD_TEXT_LENGTH,
330
- description: 'Required for operation="write".',
331
- },
311
+ timeout_ms: { type: 'integer', minimum: 0, maximum: 30000 },
312
+ stable_samples: {
313
+ type: 'integer',
314
+ minimum: 1,
315
+ maximum: 5,
316
+ description: 'Consecutive satisfied samples required. Default 2.',
332
317
  },
333
- ['operation']
334
- )
335
- ),
336
- branch(
337
- 'launch',
338
- input(
339
- {
340
- app: {
341
- type: 'string',
342
- minLength: 1,
343
- maxLength: MAX_TARGET_TOKEN_LENGTH,
344
- description: 'Executable name, exact path, file, or URL.',
345
- },
318
+ },
319
+ ['expect']
320
+ )
321
+ ),
322
+ branch(
323
+ 'clipboard',
324
+ input(
325
+ {
326
+ operation: { type: 'string', enum: ['read', 'write'] },
327
+ text: {
328
+ type: 'string',
329
+ maxLength: MAX_CLIPBOARD_TEXT_LENGTH,
330
+ description: 'Required for operation="write".',
331
+ },
332
+ },
333
+ ['operation']
334
+ )
335
+ ),
336
+ branch(
337
+ 'launch',
338
+ input(
339
+ {
340
+ app: {
341
+ type: 'string',
342
+ minLength: 1,
343
+ maxLength: MAX_TARGET_TOKEN_LENGTH,
344
+ description: 'Executable name, exact path, file, or URL.',
346
345
  },
347
- ['app']
348
- )
349
- ),
346
+ },
347
+ ['app']
348
+ )
349
+ ),
350
350
  ];
351
351
 
352
352
  // A JSON Schema 2020-12 object root with no root combinator (Anthropic
@@ -46,7 +46,5 @@ export function linuxComputerPreflight(options?: Record<string, unknown>): Promi
46
46
  export function resetLinuxComputerPreflightCache(): void;
47
47
  export const GNOME_EXTENSION_UUID: 'mixdog-windows@mixdog.io';
48
48
  export function gnomeExtensionDirs(env?: Record<string, string | undefined>): string[];
49
- export const FIX_MESSAGES: Readonly<Record<'allow_input' | 'relogin' | 'enable_window_helper' | 'install_package', string>>;
50
- export const REFUSAL_MESSAGE: string;
51
49
  export const CAPTURE_FALLBACK_NOTE: string;
52
50
  export function linuxCaptureFallback(options?: Record<string, unknown>): Promise<{ command: Record<string, unknown>; note: string } | null>;
@@ -32,22 +32,6 @@ export const CLIPBOARD_HINT =
32
32
  export const DISPLAY_HINT =
33
33
  'display_unavailable: no graphical session to drive; run inside a desktop session with DISPLAY (X11) or WAYLAND_DISPLAY set';
34
34
 
35
- /**
36
- * User-facing English phrases, one per fix a capability can ask for. They are
37
- * the keys of the UI catalogs (apps/desktop/src/renderer/locales), so a UI that
38
- * renders a capability's `fix` looks the phrase up there; `{{package}}` is the
39
- * capability's `package`. The tool result text for the model stays English.
40
- */
41
- export const FIX_MESSAGES = Object.freeze({
42
- allow_input:
43
- 'Allow Mixdog to send keyboard and mouse input: grant access to /dev/uinput (add your user to the input group), then sign in again.',
44
- relogin: 'Sign out and sign in again to finish setting up window control for Mixdog.',
45
- enable_window_helper:
46
- 'Enable the Mixdog Windows extension so Mixdog can list and control windows (gnome-extensions enable mixdog-windows@mixdog.io).',
47
- install_package: 'Install {{package}} to enable this Computer Use feature.',
48
- });
49
- export const REFUSAL_MESSAGE = 'Computer Use cannot run this action because a required capability is not ready.';
50
-
51
35
  /** Stable code of the whole refusal; the per-capability codes are the native ones. */
52
36
  export const CAPABILITY_UNAVAILABLE_CODE = 'computer_capability_unavailable';
53
37
 
@@ -1,7 +1,8 @@
1
- // Effort-judge client. The judge loads on the first turn that uses it (a model
2
- // with Auto effort support) and then stays resident until the feature is
3
- // turned off or a model update replaces its files, so users who never send
4
- // such a turn never hold it in memory. A turn waits for a still-loading judge
1
+ // Effort-judge client. The judge loads when a session that uses it (a model
2
+ // with Auto effort support) is created or opened, or on the first judged turn,
3
+ // and then stays resident until the feature is turned off or a model update
4
+ // replaces its files, so users who never open such a session never hold it in
5
+ // memory. A turn waits for a still-loading judge
5
6
  // only briefly; when the model is missing, still loading, slow, or failing,
6
7
  // `judgeTurn` returns a `skipped` reason and the turn keeps its default
7
8
  // effort. Decisions are logged locally (lengths and probabilities only, never
@@ -237,6 +238,22 @@ export function refreshEffortJudge() {
237
238
  });
238
239
  }
239
240
 
241
+ /**
242
+ * Starts the judge worker ahead of the first judged turn so its cold load
243
+ * (about 2.3 s) is over by then. Fire-and-forget: it spawns nothing when the
244
+ * platform is unsupported, the model is missing or being installed, or a
245
+ * failed load is still inside LOAD_RETRY_MS. Returns whether a worker is
246
+ * running or loading.
247
+ */
248
+ export function prewarmEffortJudge() {
249
+ if (!onnxRuntimeSupported() || installing) return false;
250
+ const dir = effortJudgeModelDir();
251
+ if (!effortJudgeAvailable(dir)) return false;
252
+ if (!worker && lastLoadError && Date.now() - lastLoadErrorAt < LOAD_RETRY_MS) return false;
253
+ ensureWorker(dir);
254
+ return true;
255
+ }
256
+
240
257
  export function effortJudgeReady() {
241
258
  return ready;
242
259
  }
@@ -94,7 +94,10 @@ async function load() {
94
94
  executionProviders: ['cpu'],
95
95
  graphOptimizationLevel: 'all',
96
96
  // One judgment runs at a time; 4 threads halve the long-input tail
97
- // (p95 ~280 -> ~110 ms measured) for a ~0.1 s burst per turn.
97
+ // (p95 ~280 -> ~110 ms measured) for a ~0.1 s burst per turn. More threads
98
+ // did not help where agents share the CPU: with 3-4 agent-like loads on
99
+ // 20 logical cores, 6 threads timed out 8-16% (3 loads) and 78-87% (4 loads) of judgments against
100
+ // 0-5% for 4, so the count stays fixed.
98
101
  intraOpNumThreads: 4,
99
102
  });
100
103
  const settings = calibration();
@@ -1,4 +1,4 @@
1
- import { GITHUB_ACTIONS } from './contract.mjs';
1
+ import { DEFAULT_GITHUB_HOSTNAME, GITHUB_ACTIONS } from './contract.mjs';
2
2
  import { executeGithubRequest } from './client.mjs';
3
3
  import { GITHUB_OUTPUT_MAX_BYTES } from '../shared/tool-output-limit.mjs';
4
4
  import { persistToolResultArtifactSync } from '../agent/orchestrator/session/tool-result-offload.mjs';
@@ -6,19 +6,19 @@ import { normalizeOutputPath } from '../agent/orchestrator/tools/builtin/path-ut
6
6
 
7
7
  // Model-facing reduction only; executeGithubRequest (also used by Desktop)
8
8
  // keeps the raw REST response, and the agent's copy is preserved as `raw`.
9
- const KEPT_URL_KEYS = new Set([
10
- 'html_url',
11
- 'browser_download_url',
12
- 'diff_url',
13
- 'patch_url',
14
- 'clone_url',
15
- 'ssh_url',
16
- 'tarball_url',
17
- 'zipball_url',
18
- 'target_url',
19
- 'details_url',
9
+ // html_url is the one page link the model can hand to a user; the asset,
10
+ // status and check links are the only other URLs not derivable from ids.
11
+ const KEPT_URL_KEYS = new Set(['html_url', 'browser_download_url', 'target_url', 'details_url']);
12
+ const DROPPED_KEYS = new Set([
13
+ 'url',
14
+ 'node_id',
15
+ '_links',
16
+ 'gravatar_id',
17
+ 'performed_via_github_app',
18
+ 'author_association',
19
+ 'sub_issues_summary',
20
+ 'issue_dependencies_summary',
20
21
  ]);
21
- const DROPPED_KEYS = new Set(['node_id', '_links', 'gravatar_id']);
22
22
  const USER_KEYS = new Set([
23
23
  'user',
24
24
  'owner',
@@ -55,12 +55,22 @@ function reduceGithubData(value, key, parentKey) {
55
55
  if (isNestedRepository(key, parentKey) && typeof value.full_name === 'string') return value.full_name;
56
56
  const reduced = {};
57
57
  for (const [name, item] of Object.entries(value)) {
58
- if (DROPPED_KEYS.has(name) || (name.endsWith('_url') && !KEPT_URL_KEYS.has(name))) continue;
58
+ if (DROPPED_KEYS.has(name) || name.endsWith('node_id') || (name.endsWith('_url') && !KEPT_URL_KEYS.has(name))) {
59
+ continue;
60
+ }
61
+ // Numbered objects (issues, PRs, milestones) are addressed by number; their id is noise.
62
+ if (name === 'id' && typeof value.number === 'number') continue;
63
+ if (name === 'reactions' && isEmptyReactions(item)) continue;
59
64
  reduced[name] = reduceGithubData(item, name, key);
60
65
  }
61
66
  return reduced;
62
67
  }
63
68
 
69
+ function isEmptyReactions(value) {
70
+ if (!value || typeof value !== 'object' || Array.isArray(value)) return false;
71
+ return Object.values(value).every((item) => typeof item !== 'number' || item === 0);
72
+ }
73
+
64
74
  const EXCERPT_MAX = 140;
65
75
  const day = (value) => (typeof value === 'string' ? value.slice(0, 10) : undefined);
66
76
  const login = (value) => userLogin(value) ?? (typeof value === 'string' ? value : undefined);
@@ -151,6 +161,89 @@ function projectList(action, data) {
151
161
  return project && Array.isArray(data) ? data.map(project) : undefined;
152
162
  }
153
163
 
164
+ const BODY_MAX = 1500;
165
+
166
+ function bodyText(body) {
167
+ if (typeof body !== 'string') return undefined;
168
+ const text = body.replace(/\r\n/g, '\n').trim();
169
+ if (!text) return undefined;
170
+ if (text.length <= BODY_MAX) return text;
171
+ const cut = /[\ud800-\udbff]/.test(text[BODY_MAX - 1]) ? BODY_MAX - 1 : BODY_MAX;
172
+ return `${text.slice(0, cut)}… ${text.length - cut} more chars in raw`;
173
+ }
174
+
175
+ function logins(list) {
176
+ const names = (Array.isArray(list) ? list : []).map(login).filter(Boolean);
177
+ return names.length ? names : undefined;
178
+ }
179
+
180
+ const stamp = (value) => (typeof value === 'string' ? value : undefined);
181
+ const repoName = (repo) => (typeof repo === 'string' ? repo : repo?.full_name);
182
+
183
+ // Single-item projections: the decision fields of one issue/PR. Nulls that
184
+ // mean "not yet" (open PR closed_at) are dropped; `mergeable`/`mergeable_state`
185
+ // stay as returned because null there means GitHub is still computing.
186
+ const VIEW_PROJECTORS = {
187
+ 'pr.view': (pr) => ({
188
+ number: pr.number,
189
+ title: pr.title,
190
+ state: pr.state,
191
+ draft: pr.draft,
192
+ merged: pr.merged,
193
+ mergeable: pr.mergeable,
194
+ mergeable_state: pr.mergeable_state,
195
+ user: login(pr.user),
196
+ labels: labelNames(pr.labels),
197
+ assignees: logins(pr.assignees),
198
+ requested_reviewers: logins(pr.requested_reviewers),
199
+ head: pr.head && { ref: pr.head.ref, sha: pr.head.sha, repo: repoName(pr.head.repo) },
200
+ base: pr.base && { ref: pr.base.ref, sha: pr.base.sha },
201
+ commits: pr.commits,
202
+ additions: pr.additions,
203
+ deletions: pr.deletions,
204
+ changed_files: pr.changed_files,
205
+ comments: pr.comments,
206
+ review_comments: pr.review_comments,
207
+ html_url: pr.html_url,
208
+ created_at: stamp(pr.created_at),
209
+ updated_at: stamp(pr.updated_at),
210
+ closed_at: stamp(pr.closed_at),
211
+ merged_at: stamp(pr.merged_at),
212
+ body: bodyText(pr.body),
213
+ }),
214
+ 'issue.view': (issue) => ({
215
+ number: issue.number,
216
+ title: issue.title,
217
+ state: issue.state,
218
+ state_reason: issue.state_reason || undefined,
219
+ user: login(issue.user),
220
+ labels: labelNames(issue.labels),
221
+ assignees: logins(issue.assignees),
222
+ milestone: issue.milestone?.title,
223
+ comments: issue.comments,
224
+ html_url: issue.html_url,
225
+ created_at: stamp(issue.created_at),
226
+ updated_at: stamp(issue.updated_at),
227
+ closed_at: stamp(issue.closed_at),
228
+ body: bodyText(issue.body),
229
+ }),
230
+ };
231
+
232
+ function projectView(action, data) {
233
+ const project = VIEW_PROJECTORS[action];
234
+ return project && data && typeof data === 'object' && !Array.isArray(data) ? project(data) : undefined;
235
+ }
236
+
237
+ // Rows whose excerpt/description was shortened ("…") need raw for the rest.
238
+ function rowsWereCut(rows) {
239
+ return rows.some(
240
+ (row) =>
241
+ row &&
242
+ typeof row === 'object' &&
243
+ Object.values(row).some((value) => typeof value === 'string' && value.endsWith('…'))
244
+ );
245
+ }
246
+
154
247
  const fits = (text) => Buffer.byteLength(text, 'utf8') <= GITHUB_OUTPUT_MAX_BYTES;
155
248
 
156
249
  function clampStrings(value, max) {
@@ -303,7 +396,7 @@ export const GITHUB_TOOL_DEF = {
303
396
  },
304
397
  trigger: 'GitHub repos, issues, PRs, Actions, releases; not local Git history, diffs or staging (git).',
305
398
  description:
306
- 'GitHub repositories, issues, PRs and reviews, Actions/logs, releases, and notifications through the signed-in GitHub CLI. Local Git history/diffs/staging belong to git. One action per call; writes are serialized and never retried. Obtain user approval before writes; workflow runs and published releases may deploy. repo is owner/name; omit to resolve the current Project. Lists use page/limit and return compact rows (issues/PRs: number, title, state, author, updated, labels, 140-char excerpt; other lists: ids and status fields); open a row with its *.view action for bodies and details. Review/merge requires the current PR head sha. Install/connect in Extensions → Plugin → Git & GitHub. Results omit API-only URLs and node ids and name users/repos by login/full_name; `raw` is a readable file with the full response, and long results state what is shown.',
399
+ 'GitHub repositories, issues, PRs and reviews, Actions/logs, releases, and notifications through the signed-in GitHub CLI. Local Git history/diffs/staging belong to git. One action per call; writes are serialized and never retried. Obtain user approval before writes; workflow runs and published releases may deploy. repo is owner/name; omit to resolve the current Project. Lists use page/limit and return compact rows (issues/PRs: number, title, state, author, updated, labels, 140-char excerpt; other lists: ids and status fields); open a row with its *.view action for bodies and details. Review/merge requires the current PR head sha. Install/connect in Extensions → Plugin → Git & GitHub. Results omit API-only URLs and node ids and name users/repos by login/full_name; issue/PR views keep decision fields and cap the body; `raw`, present whenever rows, text or fields were cut or dropped, is a readable file with the full response, and long results state what is shown.',
307
400
  inputSchema: {
308
401
  type: 'object',
309
402
  properties: {
@@ -357,9 +450,17 @@ export const GITHUB_TOOL_DEF = {
357
450
  export async function executeGithubTool(args, cwd, options = {}) {
358
451
  try {
359
452
  const result = await executeGithubRequest(args, cwd, options);
360
- const reduced = { ...result, data: projectList(args.action, result.data) ?? reduceGithubData(result.data) };
453
+ const data =
454
+ projectList(args.action, result.data) ?? projectView(args.action, result.data) ?? reduceGithubData(result.data);
455
+ const reduced = { ...result, data };
456
+ if (reduced.hostname === DEFAULT_GITHUB_HOSTNAME) delete reduced.hostname;
361
457
  const text = JSON.stringify(reduced);
362
- if (text === JSON.stringify(result) && fits(text)) return text;
458
+ // Lists point at raw only when a row or excerpt was cut; they are projected
459
+ // by design. Everything else needs raw whenever the reduction dropped data.
460
+ const lossy = GITHUB_ACTIONS[args.action]?.list
461
+ ? Array.isArray(data) && rowsWereCut(data)
462
+ : JSON.stringify(data) !== JSON.stringify(result.data);
463
+ if (!lossy && fits(text)) return text;
363
464
  const raw = persistToolResultArtifactSync({
364
465
  sessionId: options.sessionId,
365
466
  toolCallId: options.toolCallId,