mixdog 1.4.0 → 1.4.2

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 (493) hide show
  1. package/package.json +3 -2
  2. package/scripts/build-shipped-history.mjs +115 -33
  3. package/scripts/check-voice-runtime-inputs.mjs +25 -0
  4. package/scripts/gate-local.mjs +183 -63
  5. package/scripts/latest-guard.mjs +21 -9
  6. package/scripts/lib/gate-scheduler.mjs +138 -32
  7. package/scripts/lib/gate-timing-reporter.mjs +16 -0
  8. package/scripts/lib/isolated-test-env.mjs +10 -5
  9. package/scripts/lib/run-node-tests.mjs +91 -66
  10. package/scripts/lib/scoped-temp.d.mts +16 -0
  11. package/scripts/lib/scoped-temp.mjs +124 -0
  12. package/scripts/lib/stale-temp.mjs +44 -0
  13. package/scripts/lib/test-failure-records.mjs +14 -1
  14. package/scripts/lib/test-failure-summary.mjs +16 -4
  15. package/scripts/lib/test-spawn-ledger.mjs +12 -3
  16. package/scripts/post-release-check.mjs +1 -6
  17. package/scripts/pptx-kit-index.mjs +17 -5
  18. package/scripts/suite-health.mjs +115 -24
  19. package/scripts/test-data-dir.mjs +10 -7
  20. package/scripts/test.mjs +9 -14
  21. package/src/agents/advisor/AGENT.md +4 -4
  22. package/src/agents/advisor/agent.json +1 -1
  23. package/src/agents/explore/AGENT.md +22 -0
  24. package/src/agents/explore/agent.json +6 -0
  25. package/src/app.mjs +4 -0
  26. package/src/cli.mjs +7 -0
  27. package/src/defaults/agents.json +7 -0
  28. package/src/defaults/shipped-history.json +23 -2
  29. package/src/defaults/skills/browser-use/SKILL.md +10 -5
  30. package/src/defaults/skills/code-tidy/SKILL.md +71 -102
  31. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
  32. package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
  33. package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
  34. package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
  35. package/src/defaults/skills/computer-use/SKILL.md +16 -4
  36. package/src/defaults/skills/goal-management/SKILL.md +1 -1
  37. package/src/defaults/skills/setup/references/actions.md +12 -6
  38. package/src/defaults/skills/setup/references/surfaces.md +2 -2
  39. package/src/defaults/skills/setup-guide/SKILL.md +5 -2
  40. package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
  41. package/src/defaults/skills/skill-creator/SKILL.md +85 -190
  42. package/src/defaults/skills/skill-creator/references/design.md +70 -162
  43. package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
  44. package/src/defaults/skills/test-suite/SKILL.md +194 -0
  45. package/src/defaults/skills/test-suite/references/case-management.md +51 -0
  46. package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
  47. package/src/defaults/skills/test-suite/references/reliability.md +49 -0
  48. package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
  49. package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
  50. package/src/defaults/skills/visualize/SKILL.md +6 -2
  51. package/src/lib/rules-builder.cjs +35 -42
  52. package/src/output-styles/common.md +2 -2
  53. package/src/output-styles/simple.md +1 -1
  54. package/src/rules/agent/AGENT.md +5 -4
  55. package/src/rules/lead/LEAD.md +12 -7
  56. package/src/rules/shared/10-tool-workflow.md +3 -1
  57. package/src/rules/shared/20-research.md +3 -6
  58. package/src/rules/shared/40-editing.md +1 -0
  59. package/src/rules/shared/45-destructive.md +0 -2
  60. package/src/rules/shared/50-execution.md +2 -0
  61. package/src/rules/shared/60-verification.md +10 -9
  62. package/src/rules/shared/70-delivery.md +8 -9
  63. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
  64. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -1
  65. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +156 -24
  66. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -0
  67. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
  68. package/src/runtime/agent/orchestrator/cache-break-trace.mjs +2 -0
  69. package/src/runtime/agent/orchestrator/config.mjs +12 -7
  70. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +8 -8
  71. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +5 -26
  72. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +3 -1
  73. package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
  74. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +122 -12
  75. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +5 -3
  76. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +13 -2
  77. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +152 -58
  78. package/src/runtime/agent/orchestrator/mcp/client.mjs +51 -18
  79. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +88 -54
  80. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +42 -26
  81. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +54 -8
  82. package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +1 -1
  83. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +37 -31
  84. package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +8 -2
  85. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +6 -2
  86. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -2
  87. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  88. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
  89. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +3 -1
  90. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +14 -3
  91. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +6 -0
  92. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -2
  93. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
  94. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
  95. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  96. package/src/runtime/agent/orchestrator/providers/command-code-oauth-login.mjs +1 -10
  97. package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
  98. package/src/runtime/agent/orchestrator/providers/cursor.mjs +3 -0
  99. package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
  100. package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
  101. package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
  102. package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
  103. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
  104. package/src/runtime/agent/orchestrator/providers/devin.mjs +3 -0
  105. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
  106. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
  107. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +248 -41
  108. package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -11
  109. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +45 -6
  110. package/src/runtime/agent/orchestrator/providers/lib/first-output-window.mjs +58 -0
  111. package/src/runtime/agent/orchestrator/providers/lib/listen-on.mjs +14 -0
  112. package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
  113. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
  114. package/src/runtime/agent/orchestrator/providers/mimo-oauth-login.mjs +1 -10
  115. package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
  116. package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
  117. package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
  118. package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
  119. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +1 -0
  120. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +9 -2
  121. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +7 -0
  122. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +14 -3
  123. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +4 -2
  124. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
  125. package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +5 -3
  126. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +16 -3
  127. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
  128. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +5 -2
  129. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +13 -3
  130. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +13 -2
  131. package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +81 -42
  132. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +8 -0
  133. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +160 -31
  134. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +22 -12
  135. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +7 -1
  136. package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +49 -22
  137. package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
  138. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
  139. package/src/runtime/agent/orchestrator/providers/registry.mjs +45 -2
  140. package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
  141. package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
  142. package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
  143. package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +567 -0
  144. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +41 -13
  145. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +2 -0
  146. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -6
  147. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +7 -3
  148. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
  149. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +6 -1
  150. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +14 -5
  151. package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
  152. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +5 -2
  153. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
  154. package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
  155. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +1 -3
  156. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +102 -12
  157. package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
  158. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -8
  159. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +23 -0
  160. package/src/runtime/agent/orchestrator/session/compact/observation-supersession.mjs +103 -23
  161. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +160 -36
  162. package/src/runtime/agent/orchestrator/session/context-utils.mjs +13 -1
  163. package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +164 -23
  164. package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +139 -19
  165. package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +38 -7
  166. package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +3 -0
  167. package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +100 -22
  168. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
  169. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -6
  170. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +33 -3
  171. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +9 -2
  172. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -1
  173. package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +13 -5
  174. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +14 -0
  175. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +13 -1
  176. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +23 -4
  177. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +2 -0
  178. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
  179. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +39 -21
  180. package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
  181. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +50 -28
  182. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +3 -3
  183. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +3 -1
  184. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +2 -2
  185. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +1 -0
  186. package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +2 -1
  187. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +30 -13
  188. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +63 -6
  189. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +7 -0
  190. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
  191. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +35 -13
  192. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +24 -14
  193. package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
  194. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
  195. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +10 -6
  196. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +4 -0
  197. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +3 -0
  198. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +56 -29
  199. package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
  200. package/src/runtime/agent/orchestrator/session/mixy-name.mjs +11 -5
  201. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +5 -1
  202. package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +30 -7
  203. package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +154 -0
  204. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +7 -0
  205. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -0
  206. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +15 -0
  207. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +37 -8
  208. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +252 -39
  209. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
  210. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +164 -4
  211. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
  212. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +61 -2
  213. package/src/runtime/agent/orchestrator/stall-policy.mjs +23 -0
  214. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
  215. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +2 -2
  216. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -2
  217. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +6 -1
  218. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +46 -20
  219. package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +7 -1
  220. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +67 -31
  221. package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +25 -13
  222. package/src/runtime/agent/orchestrator/tools/builtin/lib/scoped-search-flight.mjs +9 -5
  223. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
  224. package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +7 -1
  225. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -3
  226. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +1 -1
  227. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +23 -12
  228. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +6 -1
  229. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +1 -8
  230. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
  231. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +96 -20
  232. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
  233. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/federation.mjs +3 -1
  234. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
  235. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  236. package/src/runtime/agent/orchestrator/tools/lib/isolated-test-env.mjs +4 -3
  237. package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
  238. package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
  239. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +103 -13
  240. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
  241. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
  242. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
  243. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +34 -10
  244. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +28 -4
  245. package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
  246. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -2
  247. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
  248. package/src/runtime/channels/lib/webhook/signature.mjs +4 -1
  249. package/src/runtime/channels/lib/whisper-port.mjs +29 -11
  250. package/src/runtime/channels/lib/whisper-server.mjs +10 -1
  251. package/src/runtime/computer-bridge/action-schema.mjs +2 -2
  252. package/src/runtime/computer-bridge/core-actions.mjs +2 -2
  253. package/src/runtime/computer-bridge/error-recovery.mjs +5 -4
  254. package/src/runtime/computer-bridge/linux-action-capabilities.mjs +24 -5
  255. package/src/runtime/computer-bridge/linux-readiness.d.mts +7 -2
  256. package/src/runtime/connectors/connector-accounts-mcp.mjs +236 -103
  257. package/src/runtime/connectors/gmail-app-password.mjs +3 -3
  258. package/src/runtime/explore/explorer.mjs +93 -0
  259. package/src/runtime/explore/tool-defs.mjs +35 -0
  260. package/src/runtime/explore/tool.mjs +123 -0
  261. package/src/runtime/local-provider/server-process.mjs +2 -1
  262. package/src/runtime/media/adapters/gemini-video.mjs +4 -1
  263. package/src/runtime/media/adapters/xai-media.mjs +2 -1
  264. package/src/runtime/memory/index.mjs +4 -0
  265. package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
  266. package/src/runtime/memory/lib/embedding-worker.mjs +10 -3
  267. package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +1 -7
  268. package/src/runtime/memory/lib/memory-chunk-quality.mjs +1 -6
  269. package/src/runtime/office/authoring/pdf-author-action.mjs +1 -6
  270. package/src/runtime/office/design/design-art-direction.mjs +29 -27
  271. package/src/runtime/office/pdf/pdf-writer.mjs +6 -1
  272. package/src/runtime/office/portable/portable-snapshot-docx.mjs +7 -1
  273. package/src/runtime/office/portable/portable-snapshot-shared.mjs +6 -1
  274. package/src/runtime/office/quality/assurance-rendered.mjs +9 -2
  275. package/src/runtime/office/quality/assurance-structure-docx.mjs +4 -2
  276. package/src/runtime/office/quality/design-review.mjs +1 -5
  277. package/src/runtime/office/quality/document-brief.mjs +1 -5
  278. package/src/runtime/office/quality/forced-break-pages.mjs +9 -6
  279. package/src/runtime/office/quality/quality-pipeline.mjs +1 -1
  280. package/src/runtime/shared/agent-route-config.mjs +17 -2
  281. package/src/runtime/shared/atomic-file.mjs +103 -2
  282. package/src/runtime/shared/background-tasks.mjs +15 -6
  283. package/src/runtime/shared/bot-owned-work.mjs +56 -0
  284. package/src/runtime/shared/connector-accounts.mjs +5 -5
  285. package/src/runtime/shared/connector-catalog.d.mts +11 -4
  286. package/src/runtime/shared/connector-catalog.mjs +60 -52
  287. package/src/runtime/shared/custom-provider-keys.mjs +20 -0
  288. package/src/runtime/shared/defaults-separation.mjs +1 -4
  289. package/src/runtime/shared/fetch-safe-listen.d.mts +16 -0
  290. package/src/runtime/shared/fetch-safe-listen.mjs +50 -0
  291. package/src/runtime/shared/file-has-data.mjs +26 -2
  292. package/src/runtime/shared/file-lock.mjs +13 -15
  293. package/src/runtime/shared/git-launch.d.mts +9 -0
  294. package/src/runtime/shared/git-launch.mjs +213 -0
  295. package/src/runtime/shared/git-runner-worker.mjs +2 -1
  296. package/src/runtime/shared/handoff-artifacts.d.mts +2 -1
  297. package/src/runtime/shared/handoff-artifacts.mjs +18 -8
  298. package/src/runtime/shared/idle-auto-clear-gate.mjs +29 -7
  299. package/src/runtime/shared/llm/cost.mjs +11 -2
  300. package/src/runtime/shared/llm/http-agent.mjs +313 -29
  301. package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
  302. package/src/runtime/shared/llm/model-catalog.mjs +46 -6
  303. package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
  304. package/src/runtime/shared/llm/system-proxy.mjs +452 -0
  305. package/src/runtime/shared/loopback-listener.mjs +25 -2
  306. package/src/runtime/shared/model-route-chain.d.mts +7 -2
  307. package/src/runtime/shared/model-route-chain.mjs +22 -4
  308. package/src/runtime/shared/open-url.mjs +10 -0
  309. package/src/runtime/shared/provider-accounts.mjs +52 -2
  310. package/src/runtime/shared/session-activity-signal.mjs +14 -0
  311. package/src/runtime/shared/session-scratch.mjs +37 -0
  312. package/src/runtime/shared/staged-install-worker.mjs +5 -0
  313. package/src/runtime/shared/staged-update.mjs +47 -2
  314. package/src/runtime/shared/tool-card-model/agent-surface.mjs +1 -3
  315. package/src/runtime/shared/tool-card-model/card-status.mjs +15 -2
  316. package/src/runtime/shared/tool-result-summary.mjs +1 -1
  317. package/src/runtime/shared/tool-surface.mjs +113 -36
  318. package/src/runtime/shared/tool-work-units.mjs +6 -0
  319. package/src/runtime/shared/turn-snapshot-store.mjs +13 -6
  320. package/src/runtime/shared/turn-worktree-snapshot.mjs +414 -54
  321. package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
  322. package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
  323. package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
  324. package/src/runtime/shared/worktrees/branch-management.mjs +9 -3
  325. package/src/runtime/shared/worktrees/contract.mjs +4 -1
  326. package/src/runtime/shared/worktrees/git.mjs +72 -0
  327. package/src/runtime/shared/worktrees/manager.mjs +285 -168
  328. package/src/runtime/shared/worktrees/test-support.mjs +6 -10
  329. package/src/runtime/tidy/install.mjs +95 -15
  330. package/src/runtime/tidy/languages.mjs +17 -15
  331. package/src/runtime/tidy/process.mjs +7 -4
  332. package/src/runtime/tidy/resolve.mjs +19 -16
  333. package/src/runtime/tidy/runners/biome.mjs +3 -3
  334. package/src/runtime/tidy/tool.mjs +1 -1
  335. package/src/runtime/tidy/worktree.mjs +10 -6
  336. package/src/runtime/visualize-bridge/client.mjs +6 -1
  337. package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
  338. package/src/runtime/web-search/index.mjs +1 -1
  339. package/src/session-runtime/agent-home-delivery.mjs +41 -0
  340. package/src/session-runtime/agent-task-sessions.mjs +458 -312
  341. package/src/session-runtime/agent-tool-routing.mjs +8 -41
  342. package/src/session-runtime/boot/tools.mjs +7 -1
  343. package/src/session-runtime/bot-status.mjs +107 -101
  344. package/src/session-runtime/bot-target.mjs +38 -0
  345. package/src/session-runtime/channel-config-api.mjs +6 -1
  346. package/src/session-runtime/connector-merge-migration.mjs +18 -15
  347. package/src/session-runtime/conversation-import/codex-titles.mjs +88 -0
  348. package/src/session-runtime/conversation-import/discovery.mjs +401 -36
  349. package/src/session-runtime/conversation-import/service.mjs +35 -8
  350. package/src/session-runtime/handoff-attachments.mjs +82 -31
  351. package/src/session-runtime/held-requests.mjs +3 -1
  352. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +12 -13
  353. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +1 -0
  354. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -0
  355. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
  356. package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +4 -1
  357. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +145 -112
  358. package/src/session-runtime/lifecycle/cold-heir.mjs +11 -6
  359. package/src/session-runtime/lifecycle/session-catalog.mjs +9 -1
  360. package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -1
  361. package/src/session-runtime/lifecycle/teardown.mjs +1 -1
  362. package/src/session-runtime/mcp-glue/server-catalog.mjs +16 -10
  363. package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
  364. package/src/session-runtime/mixy-heartbeat.mjs +1 -1
  365. package/src/session-runtime/model-route/set-route.mjs +11 -2
  366. package/src/session-runtime/provider-auth/login.mjs +2 -2
  367. package/src/session-runtime/provider-catalog-cache.mjs +82 -36
  368. package/src/session-runtime/provider-models/catalog-load.mjs +23 -6
  369. package/src/session-runtime/provider-models.mjs +4 -2
  370. package/src/session-runtime/resource-mcp-api.mjs +98 -35
  371. package/src/session-runtime/resource-mcp-connector-accounts.mjs +44 -31
  372. package/src/session-runtime/resource-mcp-secrets.mjs +28 -11
  373. package/src/session-runtime/resource-mcp-servers.mjs +5 -4
  374. package/src/session-runtime/resource-recall-api.mjs +6 -1
  375. package/src/session-runtime/runtime-feature-gates.mjs +5 -1
  376. package/src/session-runtime/services/agent-tool/execute.mjs +14 -9
  377. package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +20 -4
  378. package/src/session-runtime/services/agent-tool/model-select.mjs +48 -7
  379. package/src/session-runtime/services/agent-tool/render.mjs +71 -17
  380. package/src/session-runtime/services/agent-tool/send-flow.mjs +10 -2
  381. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
  382. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +4 -1
  383. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +6 -2
  384. package/src/session-runtime/services/agent-tool/tool-def.mjs +9 -9
  385. package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
  386. package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
  387. package/src/session-runtime/services/daemon-candidate.mjs +4 -1
  388. package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
  389. package/src/session-runtime/services/plugin-admin.mjs +10 -6
  390. package/src/session-runtime/services/provider-admin.mjs +283 -11
  391. package/src/session-runtime/session-turn-api.mjs +2 -0
  392. package/src/session-runtime/settings-builtin-tools-api.mjs +4 -1
  393. package/src/session-runtime/settings-system-api.mjs +1 -1
  394. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
  395. package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
  396. package/src/session-runtime/setup-tool/executor.mjs +6 -2
  397. package/src/session-runtime/setup-tool/tool-defs.mjs +2 -1
  398. package/src/session-runtime/tool-policy/policy-stage.mjs +1 -0
  399. package/src/session-runtime/turn/agent-ops.mjs +23 -0
  400. package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +49 -11
  401. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +5 -1
  402. package/src/session-runtime/workflow-agents-api/agent-route.mjs +25 -5
  403. package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -3
  404. package/src/session-runtime/workspace/activity-guards.mjs +176 -0
  405. package/src/session-runtime/workspace/session-view.mjs +149 -0
  406. package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
  407. package/src/session-runtime/workspace/transition-runner.mjs +188 -0
  408. package/src/session-runtime/workspace/transitions.mjs +108 -1041
  409. package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
  410. package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
  411. package/src/session-runtime/workspace/worktree-maintenance.mjs +80 -0
  412. package/src/session-runtime/workspace/worktree-setup.mjs +85 -0
  413. package/src/session-runtime/workspace/worktree-tool.mjs +73 -56
  414. package/src/standalone/daemon-desktop-runtime.mjs +2 -0
  415. package/src/standalone/daemon-session-control.mjs +169 -138
  416. package/src/standalone/daemon.mjs +7 -0
  417. package/src/standalone/desktop-service-registry.mjs +9 -0
  418. package/src/standalone/local-session-runtime.mjs +5 -1
  419. package/src/standalone/session-client/daemon-unavailable.mjs +3 -0
  420. package/src/standalone/session-client.mjs +5 -1
  421. package/src/standalone/session-frame-stream.mjs +83 -11
  422. package/src/standalone/session-protocol.mjs +4 -0
  423. package/src/standalone/session-service/agent-tree/agent-turns.mjs +16 -12
  424. package/src/standalone/session-service/agent-tree.mjs +45 -9
  425. package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
  426. package/src/standalone/session-service/session-calls/session-action.mjs +10 -3
  427. package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
  428. package/src/standalone/session-service/stored-reader.mjs +127 -40
  429. package/src/standalone/session-transport/client-registry/client-grace.mjs +12 -9
  430. package/src/tui/App.jsx +154 -164
  431. package/src/tui/app/app-view/floating-panel.jsx +10 -4
  432. package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
  433. package/src/tui/app/clipboard.mjs +21 -10
  434. package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +1 -3
  435. package/src/tui/app/model-picker/route-selection.mjs +5 -6
  436. package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
  437. package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
  438. package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
  439. package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
  440. package/src/tui/app/provider-setup/oauth-actions.mjs +58 -21
  441. package/src/tui/app/provider-setup/provider-items.mjs +8 -2
  442. package/src/tui/app/provider-setup-picker.mjs +29 -18
  443. package/src/tui/app/shell-layout/row-budgets.mjs +12 -10
  444. package/src/tui/app/slash-commands.mjs +1 -0
  445. package/src/tui/app/slash-dispatch/session-commands.mjs +46 -0
  446. package/src/tui/app/slash-dispatch.mjs +1 -1
  447. package/src/tui/app/use-btw-panel.mjs +29 -0
  448. package/src/tui/app/use-context-panel-refresh.mjs +31 -0
  449. package/src/tui/app/use-model-catalog-cache.mjs +13 -10
  450. package/src/tui/app/use-mouse-input.mjs +11 -0
  451. package/src/tui/app/use-onboarding-start.mjs +8 -3
  452. package/src/tui/app/use-panel-transition.mjs +10 -1
  453. package/src/tui/app/use-pasted-buffers.mjs +28 -20
  454. package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
  455. package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
  456. package/src/tui/app/use-prompt-queue-history.mjs +3 -2
  457. package/src/tui/app/use-selection-focus.mjs +11 -2
  458. package/src/tui/app/use-selection-geometry.mjs +18 -9
  459. package/src/tui/app/use-selection-paint.mjs +4 -4
  460. package/src/tui/app/use-selection-stitch.mjs +3 -3
  461. package/src/tui/app/use-slash-palette.mjs +62 -0
  462. package/src/tui/app/use-terminal-chrome.mjs +2 -2
  463. package/src/tui/app/use-transcript-activity.mjs +47 -32
  464. package/src/tui/app/use-transcript-follow.mjs +12 -4
  465. package/src/tui/app/use-transcript-scroll.mjs +46 -17
  466. package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
  467. package/src/tui/app/use-transcript-window/geometry.mjs +19 -5
  468. package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
  469. package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
  470. package/src/tui/app/use-transcript-window.mjs +21 -11
  471. package/src/tui/app/use-tui-ready.mjs +18 -0
  472. package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
  473. package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
  474. package/src/tui/components/Picker.jsx +27 -3
  475. package/src/tui/components/QuestionPanel.jsx +13 -4
  476. package/src/tui/components/SignInUrl.jsx +68 -0
  477. package/src/tui/components/TextEntryPanel.jsx +76 -46
  478. package/src/tui/components/sign-in-url-layout.mjs +24 -0
  479. package/src/tui/dist/index.mjs +1963 -1361
  480. package/src/tui/session/goal-turn-state.mjs +6 -2
  481. package/src/tui/session/session-api/controls.mjs +4 -0
  482. package/src/tui/session/session-api/extensions.mjs +8 -0
  483. package/src/tui/session/session-api/intake/abort.mjs +2 -1
  484. package/src/tui/session/session-api/intake.mjs +2 -0
  485. package/src/tui/session/session-api/integrations.mjs +2 -2
  486. package/src/tui/session/session-api/routes-agent-definitions.mjs +1 -0
  487. package/src/tui/session/session-api/settings.mjs +2 -2
  488. package/src/tui/session/session-flow/queue/take-entries.mjs +11 -0
  489. package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
  490. package/src/tui/session/transcript-spill.mjs +92 -4
  491. package/src/tui/session/transcript-store.mjs +2 -0
  492. package/src/ui/statusline-agents.mjs +1 -3
  493. package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
@@ -1,11 +1,15 @@
1
1
  // A steering handoff cancels a turn, not its durable Goal. Record the explicit
2
2
  // abort path against its turn epoch instead of guessing intent from error text.
3
- export function abortGoalTurn(runtime, flags, hasPendingSteering, reason = 'user-cancel') {
3
+ export function abortGoalTurn(runtime, flags, hasPendingSteering, reason = 'user-cancel', { timeout = false } = {}) {
4
4
  const previous = flags.goalSteeringAbortEpoch;
5
5
  const epoch = flags.leadTurnEpoch;
6
6
  flags.goalSteeringAbortEpoch = hasPendingSteering ? epoch : null;
7
7
  try {
8
- const result = runtime.abort(hasPendingSteering ? 'interrupt' : reason);
8
+ // A steering interrupt outranks a timeout: the turn was redirected, not abandoned.
9
+ const result =
10
+ timeout && !hasPendingSteering
11
+ ? runtime.abort(reason, { timeout: true })
12
+ : runtime.abort(hasPendingSteering ? 'interrupt' : reason);
9
13
  if (result === false) flags.goalSteeringAbortEpoch = previous;
10
14
  return result;
11
15
  } catch (error) {
@@ -67,6 +67,10 @@ export function createSessionControlsApi(bag) {
67
67
  stopShellJob: async (taskId) => {
68
68
  return (await runtime.stopShellJob?.(taskId)) ?? { stopped: false, error: 'shell job control is unavailable' };
69
69
  },
70
+ // `/stop`: this session's background shells, and stopping all of them:
71
+ // { jobs } and { stopped, stopping }.
72
+ listStoppableShellJobs: async () => (await runtime.listStoppableShellJobs?.()) ?? { jobs: [] },
73
+ stopShellJobs: async () => (await runtime.stopShellJobs?.()) ?? { stopped: 0, stopping: 0 },
70
74
  // Explicit force-release of a shell whose termination is unconfirmed:
71
75
  // { released, error? }. Surfaces confirm with the user before calling.
72
76
  releaseShellJob: async (taskId) => {
@@ -54,6 +54,14 @@ export function createSessionExtensionsApi(bag) {
54
54
  (input) => runtime.addMcpServer?.(input),
55
55
  (result, input) => [`mcp added: ${result?.name || input?.name || 'server'}`]
56
56
  ),
57
+ // No command lock: the runtime serializes adds per connector
58
+ // (oneAddAtATime), so concurrent adds each succeed with their own key.
59
+ addConnectorAccount: async (input) => {
60
+ const result = await runtime.addConnectorAccount?.(input);
61
+ refreshRouteStats();
62
+ pushNotice(`mcp account added: ${result?.account || input?.connector || 'connector'}`);
63
+ return result;
64
+ },
57
65
  saveMcpServer: lockedChange(
58
66
  (input) => runtime.saveMcpServer?.(input),
59
67
  (result, input) => [`mcp saved: ${result?.name || input?.name || 'server'}`]
@@ -172,7 +172,8 @@ export function createAbortAction(bag) {
172
172
  runtime,
173
173
  flags,
174
174
  hasPendingSteering,
175
- keepsPrompt ? USER_CANCEL_KEEP_PROMPT_REASON : reason
175
+ keepsPrompt ? USER_CANCEL_KEEP_PROMPT_REASON : reason,
176
+ { timeout: options?.timeout === true }
176
177
  );
177
178
  if (restoreState) {
178
179
  // A user Stop consumes this input even when no draft is requested.
@@ -20,6 +20,7 @@ export function createSessionIntakeApi(bag) {
20
20
  patchItem,
21
21
  restoreOlderTranscript,
22
22
  restoreNewerTranscript,
23
+ readSpilledTranscript,
23
24
  routeState,
24
25
  restoreQueued,
25
26
  prioritizeQueued,
@@ -32,6 +33,7 @@ export function createSessionIntakeApi(bag) {
32
33
  patchItem,
33
34
  restoreOlderTranscript,
34
35
  restoreNewerTranscript,
36
+ ...(typeof readSpilledTranscript === 'function' ? { readSpilledTranscript } : {}),
35
37
  subscribe: (listener) => {
36
38
  listeners.add(listener);
37
39
  return () => listeners.delete(listener);
@@ -129,8 +129,8 @@ export function createSessionIntegrationsApi(bag, { oauthFlows }) {
129
129
  getOAuthProviderLoginStatus: (flowId) => oauthFlows.status(flowId),
130
130
  completeOAuthProviderLogin: async (flowId, code) => oauthFlows.complete(flowId, code),
131
131
  cancelOAuthProviderLogin: async (flowId) => oauthFlows.cancel(flowId),
132
- saveProviderApiKey: async (provider, secret) => {
133
- const result = await runtime.saveProviderApiKey(provider, secret);
132
+ saveProviderApiKey: async (provider, secret, options) => {
133
+ const result = await runtime.saveProviderApiKey(provider, secret, options);
134
134
  pushNotice(`provider api key saved: ${result.provider}`, 'info');
135
135
  return true;
136
136
  },
@@ -43,6 +43,7 @@ export function createAgentDefinitionApi(runtime) {
43
43
  setAgentConnectorToolPermission: async (agentId, connectorId, toolName, permission, options) =>
44
44
  runtime.setAgentConnectorToolPermission?.(agentId, connectorId, toolName, permission, options) ?? null,
45
45
  getAgentAlwaysAllowedTools: (agentId) => runtime.getAgentAlwaysAllowedTools?.(agentId) ?? [],
46
+ getAgentConnectorTools: (agentId) => runtime.getAgentConnectorTools?.(agentId) ?? [],
46
47
  // Per-agent action-kind permissions (ask / allow / block) for the profile.
47
48
  getAgentPermissions: async (agentId) =>
48
49
  (await import('../../../runtime/agent/orchestrator/session/human-gate/store.mjs')).agentPermissions(agentId),
@@ -113,13 +113,13 @@ export function createSessionSettingsApi(bag) {
113
113
  return await runtime.setAiSessionTitles?.(enabled);
114
114
  }),
115
115
  getCacheWarmingSettings: () => {
116
- return runtime.getCacheWarmingSettings?.() || { enabled: true };
116
+ return runtime.getCacheWarmingSettings?.() || { enabled: false };
117
117
  },
118
118
  setCacheWarmingEnabled: withCommandLock(async (enabled) => {
119
119
  return await runtime.setCacheWarmingEnabled?.(enabled);
120
120
  }),
121
121
  getHeartbeatSettings: () => {
122
- return runtime.getHeartbeatSettings?.() || { heartbeat: true, intervalMinutes: 60 };
122
+ return runtime.getHeartbeatSettings?.() || { heartbeat: false, intervalMinutes: 60 };
123
123
  },
124
124
  setHeartbeatEnabled: withCommandLock(async (enabled) => {
125
125
  return await runtime.setHeartbeatEnabled?.(enabled);
@@ -87,6 +87,17 @@ export function createTakeEntriesOps({ pending, pendingNotificationKeys, removeQ
87
87
  // prompt the user already took back.
88
88
  const mirrored = queued.filter((entry) => entry.steeringPersistId);
89
89
  if (mirrored.length > 0) void dropTuiSteeringPersist(leadSessionId(), mirrored);
90
+ // The entries left the queue for good, so nothing later (a drain, the
91
+ // close of the session) can settle them: whoever submitted one is told it
92
+ // was cancelled, once, here. A submitter that waits on its settlement (a
93
+ // bot's send, which owns the work until then) is released.
94
+ for (const entry of queued) {
95
+ try {
96
+ entry.onSettled?.({ status: 'cancelled', reason: 'reclaimed', result: null, session: null });
97
+ } catch {
98
+ // A throwing callback must not leave the remaining entries unsettled.
99
+ }
100
+ }
90
101
  const queuedText = queued
91
102
  .map((item) => item.text)
92
103
  .filter((text) => String(text || '').trim())
@@ -10,6 +10,8 @@
10
10
  // Pages are self-contained files named by the owner, so a restart continues
11
11
  // the same spill directory with nothing to hand over.
12
12
  import { randomUUID } from 'node:crypto';
13
+ import { mkdirSync } from 'node:fs';
14
+ import { dirname } from 'node:path';
13
15
 
14
16
  const MAX_ATTEMPTS = 2;
15
17
  const SPILL_WRITER_IDLE_MS = 10_000;
@@ -67,6 +69,11 @@ export function createSpillWriter({ workerFactory, writeTimeoutMs = 5000, idleMs
67
69
  if (record.cancelled) return;
68
70
  record.attempts += 1;
69
71
  if (record.attempts <= MAX_ATTEMPTS) {
72
+ // The spill folder vanished (TEMP cleaned): the retry recreates it. Only
73
+ // the parent does this, synchronously right before it posts the retry
74
+ // and only for a live record, so a reset or cleanup (which cancels the
75
+ // record first) can never have its folder resurrected by a late write.
76
+ record.recreateDir = /ENOENT/.test(String(error));
70
77
  queue.unshift(record);
71
78
  return;
72
79
  }
@@ -159,6 +166,14 @@ export function createSpillWriter({ workerFactory, writeTimeoutMs = 5000, idleMs
159
166
  queueMicrotask(pump);
160
167
  return;
161
168
  }
169
+ if (active.recreateDir) {
170
+ active.recreateDir = false;
171
+ try {
172
+ mkdirSync(dirname(active.path), { recursive: true });
173
+ } catch {
174
+ /* the retry reports the failure */
175
+ }
176
+ }
162
177
  // Pages are capped at chunkSize, so the structured-clone post cost is
163
178
  // bounded; the retry payload is identical to the first attempt.
164
179
  const tempPath = `${active.path}.attempt-${active.attempts}-${randomUUID()}.tmp`;
@@ -20,6 +20,13 @@ export const tuiDebug = (msg) => {
20
20
  } catch {}
21
21
  };
22
22
 
23
+ /** Normal-level spill warning for the daemon: its stderr is daemon.log. */
24
+ export const spillWarningToStderr = (message) => {
25
+ try {
26
+ process.stderr.write(`[transcript-spill] ${message}\n`);
27
+ } catch {}
28
+ };
29
+
23
30
  // Item ids outlive the process (queued-input mirror, turn change records), so
24
31
  // a restarted process never issues an id again.
25
32
  const ID_PREFIX = `it_${randomBytes(4).toString('hex')}_`;
@@ -41,6 +48,48 @@ export function sweepStaleTranscriptSpillDirsOnce() {
41
48
  cleanupStaleTranscriptSpillDirs();
42
49
  }
43
50
 
51
+ const decodePage = (record) => record.pendingItems || JSON.parse(readFileSync(record.path, 'utf8'));
52
+
53
+ /** Spilled rows `[stop - limit, stop)` of `pages` (`spilledRows` rows in all),
54
+ * `stop` being `end` clamped to the spilled rows, read newest page first;
55
+ * `broken` when a page cannot be read whole. */
56
+ function readSpilledRows(pages, spilledRows, end, limit) {
57
+ const stop = Math.max(0, Math.min(Number(end) || 0, spilledRows));
58
+ const begin = Math.max(0, stop - Math.max(0, Number(limit) || 0));
59
+ const parts = [];
60
+ const result = (broken) => {
61
+ const items = parts.reverse().flat();
62
+ return { items, start: stop - items.length, broken };
63
+ };
64
+ // The page holding row `stop - 1`, by binary search over the pages' first
65
+ // rows: a read touches only the pages it returns rows from, at any depth.
66
+ let low = 0;
67
+ let high = pages.length - 1;
68
+ let last = -1;
69
+ while (low <= high) {
70
+ const middle = (low + high) >> 1;
71
+ if (pages[middle].start < stop) {
72
+ last = middle;
73
+ low = middle + 1;
74
+ } else high = middle - 1;
75
+ }
76
+ for (let index = last; index >= 0; index -= 1) {
77
+ const record = pages[index];
78
+ const pageStart = record.start;
79
+ const pageEnd = pageStart + record.count;
80
+ if (pageEnd <= begin) break;
81
+ let items = null;
82
+ try {
83
+ items = decodePage(record);
84
+ } catch {
85
+ items = null;
86
+ }
87
+ if (!Array.isArray(items) || items.length !== record.count) return result(true);
88
+ parts.push(items.slice(Math.max(begin, pageStart) - pageStart, Math.min(stop, pageEnd) - pageStart));
89
+ }
90
+ return result(false);
91
+ }
92
+
44
93
  // Serialized pages deliberately release the old item object graph while
45
94
  // keeping every byte restorable. Only `items` is render-live and walkable.
46
95
  // This buffer owns the page list, the reading cursor and snapshots; the spill
@@ -65,6 +114,21 @@ export function createTranscriptSpillBuffer({
65
114
  let cursor = null;
66
115
  let spillDir = null;
67
116
  let pageSequence = 0;
117
+ // Spilled rows in this page list, and its epoch: it moves whenever the list
118
+ // is replaced (reset, restored snapshot, dispose), so an absolute row index
119
+ // names one row only within an epoch. Cursor-independent.
120
+ let spilledRows = 0;
121
+ let epoch = 0;
122
+ let spilledInfo = { rows: 0, epoch: 0 };
123
+ // Each page's first absolute row (`start`) within the current page list.
124
+ const replaced = () => {
125
+ spilledRows = 0;
126
+ for (const record of pages) {
127
+ record.start = spilledRows;
128
+ spilledRows += record.count;
129
+ }
130
+ epoch += 1;
131
+ };
68
132
  let warningEmitted = false;
69
133
  let spillDisabled = false;
70
134
  const snapshots = new Set();
@@ -96,6 +160,7 @@ export function createTranscriptSpillBuffer({
96
160
  const record = {
97
161
  id: pageSequence,
98
162
  path: page,
163
+ count: items.length,
99
164
  pendingItems: items,
100
165
  cancelled: false,
101
166
  attempts: 0,
@@ -104,11 +169,10 @@ export function createTranscriptSpillBuffer({
104
169
  writer.enqueue(record);
105
170
  return record;
106
171
  };
107
- const decode = (record) => record.pendingItems || JSON.parse(readFileSync(record.path, 'utf8'));
108
172
  const restoredWithOverlap = (liveItems) => {
109
- const restored = decode(pages[cursor]);
173
+ const restored = decodePage(pages[cursor]);
110
174
  let following = Array.isArray(liveItems) ? liveItems : [];
111
- if (cursor + 1 < pages.length) following = decode(pages[cursor + 1]);
175
+ if (cursor + 1 < pages.length) following = decodePage(pages[cursor + 1]);
112
176
  return [...restored, ...following.slice(0, TRANSCRIPT_RESTORE_OVERLAP_ITEMS)];
113
177
  };
114
178
  return {
@@ -118,6 +182,14 @@ export function createTranscriptSpillBuffer({
118
182
  get hasNewer() {
119
183
  return cursor != null;
120
184
  },
185
+ /** `{ rows, epoch }`: how many rows were spilled above the live ones, in
186
+ * which page list. The same object while neither changes. */
187
+ get spilled() {
188
+ if (spilledInfo.rows !== spilledRows || spilledInfo.epoch !== epoch) {
189
+ spilledInfo = { rows: spilledRows, epoch };
190
+ }
191
+ return spilledInfo;
192
+ },
121
193
  reset() {
122
194
  const retained = [...snapshots].some((snapshot) => snapshot.spillDir === spillDir);
123
195
  const oldPages = pages.splice(0);
@@ -127,6 +199,7 @@ export function createTranscriptSpillBuffer({
127
199
  pageSequence = 0;
128
200
  spillDisabled = false;
129
201
  warningEmitted = false;
202
+ replaced();
130
203
  if (!retained) cleanupRecords(oldPages, oldDir);
131
204
  },
132
205
  snapshot() {
@@ -155,6 +228,7 @@ export function createTranscriptSpillBuffer({
155
228
  pageSequence = snapshot.pageSequence;
156
229
  spillDisabled = snapshot.spillDisabled === true;
157
230
  warningEmitted = snapshot.warningEmitted === true;
231
+ replaced();
158
232
  snapshots.delete(snapshot);
159
233
  return true;
160
234
  },
@@ -169,6 +243,7 @@ export function createTranscriptSpillBuffer({
169
243
  if (snapshot.spillDir !== spillDir) cleanupRecords(snapshot.pages, snapshot.spillDir);
170
244
  }
171
245
  pages.length = 0;
246
+ replaced();
172
247
  snapshots.clear();
173
248
  cursor = null;
174
249
  spillDir = null;
@@ -191,11 +266,24 @@ export function createTranscriptSpillBuffer({
191
266
  let live = Array.isArray(items) ? items : [];
192
267
  if (spillDisabled) return live;
193
268
  while (live.length > cap) {
194
- pages.push(encode(live.slice(0, chunkSize)));
269
+ const record = encode(live.slice(0, chunkSize));
270
+ record.start = spilledRows;
271
+ pages.push(record);
272
+ spilledRows += chunkSize;
195
273
  live = live.slice(chunkSize);
196
274
  }
197
275
  return live;
198
276
  },
277
+ /** Spilled rows `[start, end)` by absolute index (0 = the first row ever
278
+ * spilled in this `epoch`), at most `limit` ending at `end`, exactly as
279
+ * they were spilled. Reads pages in order without moving the reading
280
+ * cursor. Null for another epoch. A page that cannot be read whole (gone,
281
+ * not JSON, not an array of its recorded length) ends the spilled
282
+ * history there: `broken`, with only the rows below it. */
283
+ readSpilled({ epoch: wanted, end = spilledRows, limit = 0 } = {}) {
284
+ if (wanted !== epoch) return null;
285
+ return readSpilledRows(pages, spilledRows, end, limit);
286
+ },
199
287
  restoreOlder(liveItems) {
200
288
  const nextCursor = cursor == null ? pages.length - 1 : cursor - 1;
201
289
  if (nextCursor < 0) return null;
@@ -21,6 +21,8 @@ export function createTranscriptStore({ draft, store, flags, transcriptSpill, it
21
21
  const transcriptHistoryFlags = () => ({
22
22
  transcriptHistoryBefore: transcriptSpill.hasOlder,
23
23
  transcriptHistoryAfter: transcriptSpill.hasNewer,
24
+ // Paged views read spilled rows by this, never by the TUI reading cursor.
25
+ transcriptSpilled: transcriptSpill.spilled,
24
26
  });
25
27
  const restoreOlderTranscript = () => {
26
28
  const transcriptViewItems = transcriptSpill.restoreOlder(draft.state.items);
@@ -13,9 +13,7 @@ import { positiveInt } from '../runtime/shared/numbers.mjs';
13
13
 
14
14
  // One table owns both halves of a maintenance agent: which agents are hidden
15
15
  // from the worker list by default, and the short label they render as.
16
- const MAINTENANCE_AGENT_LABELS = new Map([
17
- ['cycle1-agent', 'cycle1'],
18
- ]);
16
+ const MAINTENANCE_AGENT_LABELS = new Map([['cycle1-agent', 'cycle1']]);
19
17
  const DEFAULT_HIDDEN_STATUSLINE_AGENTS = Object.freeze([...MAINTENANCE_AGENT_LABELS.keys()]);
20
18
  const TERMINAL_AGENT_STATUS = /idle|done|complete|success|closed|error|fail|cancel|killed|timeout/i;
21
19
  const ACTIVE_AGENT_STATUS = /^(?:connecting|requesting|streaming|tool[-_\s]?running|running|queued|pending|starting)$/i;
@@ -1,94 +0,0 @@
1
- # Reviewing public skills
2
-
3
- Use this reference to decide whether a public skill should be used as-is,
4
- reimplemented, or rejected.
5
-
6
- ## Research order
7
-
8
- Look for evidence in this order:
9
-
10
- 1. current first-party documentation;
11
- 2. the maintainer's source repository;
12
- 3. maintained community implementations;
13
- 4. indexes and lists for discovery only.
14
-
15
- Stop when the decision has enough evidence. Popularity and search position do
16
- not prove quality or compatibility.
17
-
18
- ## Candidate record
19
-
20
- For each viable candidate, capture:
21
-
22
- - the exact capability and trigger boundary;
23
- - source URL plus release or commit when available;
24
- - target agent and supported platforms;
25
- - license and redistribution conditions;
26
- - last meaningful maintenance;
27
- - file layout and runtime assumptions;
28
- - scripts, dependencies, network calls, secret access, and side effects;
29
- - tests or examples that demonstrate behavior.
30
-
31
- Compare candidates against the user's required outcome, not against each
32
- other's feature count.
33
-
34
- ## Integration decision
35
-
36
- ### Reimplement the behavior
37
-
38
- Prefer a local implementation when the useful part is a small set of ideas or
39
- requirements. Write a new structure and new language from Mixdog constraints
40
- and local evidence. Do not translate or lightly rearrange upstream text.
41
-
42
- This path avoids carrying incompatible conventions and usually produces a
43
- smaller skill. It does not permit copying protected prose or code without
44
- following its license.
45
-
46
- ### Import third-party material
47
-
48
- Use exact upstream material only when its implementation is necessary and its
49
- license is acceptable. Preserve required notices, identify modifications, and
50
- test the imported behavior in Mixdog. Upstream test results do not validate a
51
- local adaptation.
52
-
53
- ### Reject the candidate
54
-
55
- Reject it when:
56
-
57
- - no usable license is present;
58
- - executable behavior is unexplained or excessive;
59
- - it depends on unavailable tools or private infrastructure;
60
- - its trigger overlaps a stronger local owner;
61
- - adapting it would cost more than a focused local design;
62
- - maintenance or security evidence is insufficient.
63
-
64
- ## Executable-content audit
65
-
66
- Read scripts rather than trusting their documentation. Look for:
67
-
68
- - vendor-specific subprocesses;
69
- - writes into hidden product directories;
70
- - downloads, telemetry, or remote execution;
71
- - environment and credential collection;
72
- - package installation or privilege elevation;
73
- - deletion, overwrite, publishing, deployment, or recurring scheduling;
74
- - unbounded concurrency, retries, waits, or external spend;
75
- - hard-coded local paths and platform-specific shell commands.
76
-
77
- Removing an unnecessary executable is often safer than wrapping it in warnings.
78
- When it is necessary, make its dependency and side effects visible in the main
79
- skill.
80
-
81
- ## Extracting useful ideas safely
82
-
83
- Record abstract lessons such as:
84
-
85
- - a decision the workflow should make;
86
- - a failure mode worth detecting;
87
- - a completion condition;
88
- - a useful separation of responsibilities;
89
- - a test category or compatibility concern.
90
-
91
- Then design the local workflow from those requirements without consulting the
92
- source phrasing while drafting. Review the result for accidental product names,
93
- foreign paths, commands, metadata, or structural assumptions.
94
-