mixdog 0.9.152 → 0.9.154

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 (300) hide show
  1. package/LICENSES/browser-import-NOTICE.txt +11 -0
  2. package/NOTICE.md +11 -0
  3. package/README.md +8 -10
  4. package/package.json +19 -3
  5. package/scripts/computer-task-cost-report.mjs +144 -0
  6. package/scripts/run-office-live-tests.mjs +32 -0
  7. package/src/agents/front-worker/AGENT.md +13 -0
  8. package/src/agents/front-worker/agent.json +6 -0
  9. package/src/agents/heavy-worker/AGENT.md +10 -11
  10. package/src/agents/heavy-worker/agent.json +1 -1
  11. package/src/agents/maintainer/AGENT.md +0 -2
  12. package/src/agents/reviewer/AGENT.md +9 -13
  13. package/src/agents/reviewer/agent.json +1 -1
  14. package/src/agents/security/AGENT.md +14 -0
  15. package/src/agents/security/agent.json +6 -0
  16. package/src/agents/worker/AGENT.md +8 -8
  17. package/src/agents/worker/agent.json +1 -1
  18. package/src/agents/writer/AGENT.md +14 -0
  19. package/src/agents/writer/agent.json +6 -0
  20. package/src/rules/agent/00-common.md +4 -7
  21. package/src/rules/lead/01-general.md +0 -3
  22. package/src/rules/shared/10-tool-workflow.md +10 -2
  23. package/src/rules/shared/60-verification.md +2 -0
  24. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +183 -26
  25. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +4 -0
  26. package/src/runtime/agent/orchestrator/cache-break-trace.mjs +109 -0
  27. package/src/runtime/agent/orchestrator/config.mjs +7 -2
  28. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +16 -3
  29. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +9 -1
  30. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +30 -9
  31. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +18 -26
  32. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +25 -2
  33. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +103 -10
  34. package/src/runtime/agent/orchestrator/providers/openai-turn-state.mjs +68 -0
  35. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +36 -11
  36. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +140 -86
  37. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +9 -13
  38. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +72 -4
  39. package/src/runtime/agent/orchestrator/session/browser-snapshot-supersession.mjs +61 -0
  40. package/src/runtime/agent/orchestrator/session/compact/handoff.mjs +0 -22
  41. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +2 -2
  42. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +11 -23
  43. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +28 -269
  44. package/src/runtime/agent/orchestrator/session/compact.mjs +0 -6
  45. package/src/runtime/agent/orchestrator/session/context-utils.mjs +86 -11
  46. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +17 -1
  47. package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +12 -8
  48. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +110 -2
  49. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +3 -16
  50. package/src/runtime/agent/orchestrator/session/loop/recall-fasttrack.mjs +80 -18
  51. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +6 -0
  52. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +3 -0
  53. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +6 -0
  54. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +80 -21
  55. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +33 -72
  56. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +21 -2
  57. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +25 -51
  58. package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +3 -0
  59. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +4 -110
  60. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +39 -15
  61. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +14 -4
  62. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +41 -8
  63. package/src/runtime/agent/orchestrator/session/provider-prefix-guard.mjs +129 -12
  64. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +2 -2
  65. package/src/runtime/agent/orchestrator/session/store/listing.mjs +8 -1
  66. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +15 -1
  67. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +36 -2
  68. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +157 -30
  69. package/src/runtime/agent/orchestrator/session/store-summary-visibility.mjs +57 -0
  70. package/src/runtime/agent/orchestrator/session/store.mjs +3 -1
  71. package/src/runtime/agent/orchestrator/session/tool-batch.mjs +22 -0
  72. package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +6 -6
  73. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +4 -0
  74. package/src/runtime/attachments/pdf-extract.mjs +3 -0
  75. package/src/runtime/attachments/pdfjs-runtime.mjs +13 -0
  76. package/src/runtime/browser-bridge/action-schema.mjs +251 -0
  77. package/src/runtime/browser-bridge/client.mjs +75 -26
  78. package/src/runtime/browser-bridge/tool-defs.mjs +132 -15
  79. package/src/runtime/computer-bridge/action-schema.mjs +653 -0
  80. package/src/runtime/computer-bridge/client.mjs +211 -28
  81. package/src/runtime/computer-bridge/tool-defs.mjs +25 -45
  82. package/src/runtime/office/assurance-benchmark.mjs +358 -0
  83. package/src/runtime/office/assurance.mjs +833 -0
  84. package/src/runtime/office/benchmark.mjs +496 -0
  85. package/src/runtime/office/capabilities.mjs +551 -0
  86. package/src/runtime/office/com-adapter.mjs +283 -0
  87. package/src/runtime/office/content-model.mjs +183 -0
  88. package/src/runtime/office/contract-benchmark.mjs +105 -0
  89. package/src/runtime/office/design-library.mjs +1562 -0
  90. package/src/runtime/office/design-system.mjs +1966 -0
  91. package/src/runtime/office/index.mjs +2413 -0
  92. package/src/runtime/office/journal.mjs +82 -0
  93. package/src/runtime/office/office-com-host.ps1 +3781 -0
  94. package/src/runtime/office/office-com-session-host.ps1 +855 -0
  95. package/src/runtime/office/ooxml-validator.mjs +271 -0
  96. package/src/runtime/office/pagination.mjs +132 -0
  97. package/src/runtime/office/pdf-adapter.mjs +591 -0
  98. package/src/runtime/office/pdf-analysis.mjs +372 -0
  99. package/src/runtime/office/pdf-render.mjs +167 -0
  100. package/src/runtime/office/pdf-security.mjs +63 -0
  101. package/src/runtime/office/polish-benchmark.mjs +190 -0
  102. package/src/runtime/office/portable-ooxml.mjs +1867 -0
  103. package/src/runtime/office/quality-live-benchmark.mjs +486 -0
  104. package/src/runtime/office/quality-pipeline.mjs +136 -0
  105. package/src/runtime/office/tabular.mjs +302 -0
  106. package/src/runtime/office/templates/mixdog-executive.pptx +0 -0
  107. package/src/runtime/office/templates/mixdog-executive.pptx.mixdog.json +190 -0
  108. package/src/runtime/office/tool-defs.mjs +113 -0
  109. package/src/runtime/office/visual-diff.mjs +89 -0
  110. package/src/runtime/office/xlsx-assertions.mjs +172 -0
  111. package/src/runtime/office/xlsx-contract.mjs +147 -0
  112. package/src/runtime/shared/agent-route-config.mjs +9 -0
  113. package/src/runtime/shared/tool-execution-contract.mjs +16 -0
  114. package/src/runtime/shared/tool-surface.mjs +9 -0
  115. package/src/session-runtime/context-status.mjs +9 -3
  116. package/src/session-runtime/deferred-tool-delta.mjs +104 -0
  117. package/src/session-runtime/goal-runtime.mjs +617 -197
  118. package/src/session-runtime/lifecycle-api.mjs +50 -8
  119. package/src/session-runtime/provider-request-snapshot.mjs +33 -9
  120. package/src/session-runtime/resource-api.mjs +31 -94
  121. package/src/session-runtime/runtime-core.mjs +78 -26
  122. package/src/session-runtime/session-lifecycle.mjs +34 -12
  123. package/src/session-runtime/session-title.mjs +2 -2
  124. package/src/session-runtime/session-turn-api.mjs +15 -14
  125. package/src/session-runtime/tool-catalog-data.mjs +1 -1
  126. package/src/session-runtime/tool-catalog.mjs +38 -99
  127. package/src/session-runtime/tool-defs.mjs +6 -1
  128. package/src/session-runtime/tool-surface.mjs +18 -8
  129. package/src/session-runtime/workflow-agents-api.mjs +8 -25
  130. package/src/session-runtime/workflow.mjs +8 -6
  131. package/src/standalone/agent-tool/helpers.mjs +2 -2
  132. package/src/standalone/agent-tool/job-views.mjs +3 -1
  133. package/src/standalone/agent-tool/notify.mjs +5 -1
  134. package/src/standalone/agent-tool/render.mjs +3 -0
  135. package/src/standalone/agent-tool/spawn-flow.mjs +61 -16
  136. package/src/standalone/agent-tool/tool-def.mjs +1 -1
  137. package/src/standalone/agent-tool/worker-index.mjs +123 -0
  138. package/src/standalone/agent-tool/worker-rows.mjs +2 -1
  139. package/src/standalone/agent-tool.mjs +57 -10
  140. package/src/standalone/daemon.mjs +105 -6
  141. package/src/standalone/session-runtime-host.mjs +61 -48
  142. package/src/standalone/session-runtime-inline-host.mjs +34 -127
  143. package/src/standalone/session-runtime-worker.mjs +20 -198
  144. package/src/standalone/session-service.mjs +632 -7
  145. package/src/tui/dist/index.mjs +24 -1
  146. package/src/tui/lib/voice-setup.mjs +4 -1
  147. package/src/tui/session/context-state.mjs +2 -13
  148. package/src/tui/session/goal-continuation.mjs +38 -7
  149. package/src/tui/session/session-api-ext.mjs +9 -0
  150. package/src/tui/session/session-api.mjs +15 -1
  151. package/src/tui/session/session-flow.mjs +25 -1
  152. package/src/tui/session/turn.mjs +88 -16
  153. package/src/tui/session-local.mjs +25 -3
  154. package/src/vendor/statusline/src/gateway/route-meta.mjs +31 -0
  155. package/scripts/generate-voice-runtime-manifest.test.mjs +0 -135
  156. package/scripts/native-binary-arch.test.mjs +0 -111
  157. package/scripts/patch-replay.test.mjs +0 -94
  158. package/src/headless-exec.test.mjs +0 -539
  159. package/src/runtime/agent/orchestrator/agent-trace-timing.test.mjs +0 -57
  160. package/src/runtime/agent/orchestrator/context/collect-skills.test.mjs +0 -153
  161. package/src/runtime/agent/orchestrator/mcp/cancellation.test.mjs +0 -139
  162. package/src/runtime/agent/orchestrator/mcp/features.test.mjs +0 -66
  163. package/src/runtime/agent/orchestrator/mcp/security.test.mjs +0 -80
  164. package/src/runtime/agent/orchestrator/providers/anthropic-fast-mode.test.mjs +0 -90
  165. package/src/runtime/agent/orchestrator/providers/anthropic-server-fallback.test.mjs +0 -215
  166. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.test.mjs +0 -165
  167. package/src/runtime/agent/orchestrator/providers/media-parity.test.mjs +0 -142
  168. package/src/runtime/agent/orchestrator/providers/openai-codex-identity.test.mjs +0 -153
  169. package/src/runtime/agent/orchestrator/providers/openai-codex-model.test.mjs +0 -24
  170. package/src/runtime/agent/orchestrator/providers/openai-ws-delta-parity.test.mjs +0 -190
  171. package/src/runtime/agent/orchestrator/providers/provider-replay.test.mjs +0 -235
  172. package/src/runtime/agent/orchestrator/providers/sse-framing.test.mjs +0 -719
  173. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.test.mjs +0 -40
  174. package/src/runtime/agent/orchestrator/session/compact-policy.test.mjs +0 -176
  175. package/src/runtime/agent/orchestrator/session/compaction-read-reset.test.mjs +0 -161
  176. package/src/runtime/agent/orchestrator/session/eager-dispatch.test.mjs +0 -115
  177. package/src/runtime/agent/orchestrator/session/evidence-union.test.mjs +0 -228
  178. package/src/runtime/agent/orchestrator/session/image-strip-recovery.test.mjs +0 -245
  179. package/src/runtime/agent/orchestrator/session/lossless-tool-output.test.mjs +0 -125
  180. package/src/runtime/agent/orchestrator/session/manager/pending-messages-persistence.test.mjs +0 -325
  181. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.test.mjs +0 -70
  182. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.test.mjs +0 -457
  183. package/src/runtime/agent/orchestrator/session/provider-prefix-guard.test.mjs +0 -117
  184. package/src/runtime/agent/orchestrator/session/reduction-metrics.test.mjs +0 -87
  185. package/src/runtime/agent/orchestrator/session/store/serialize.test.mjs +0 -60
  186. package/src/runtime/agent/orchestrator/session/store-summary-reader.test.mjs +0 -583
  187. package/src/runtime/agent/orchestrator/session/task-wait-control.test.mjs +0 -78
  188. package/src/runtime/agent/orchestrator/tools/builtin/absence-absorption.test.mjs +0 -43
  189. package/src/runtime/agent/orchestrator/tools/builtin/absolute-glob-expand.test.mjs +0 -63
  190. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool-cwd-env.test.mjs +0 -14
  191. package/src/runtime/agent/orchestrator/tools/builtin/edit-encoding-eol.test.mjs +0 -224
  192. package/src/runtime/agent/orchestrator/tools/builtin/edit-sequential-occupation.test.mjs +0 -224
  193. package/src/runtime/agent/orchestrator/tools/builtin/enoent-outside-project.test.mjs +0 -56
  194. package/src/runtime/agent/orchestrator/tools/builtin/find-search-budget.test.mjs +0 -103
  195. package/src/runtime/agent/orchestrator/tools/builtin/git-command-policy.test.mjs +0 -30
  196. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.test.mjs +0 -390
  197. package/src/runtime/agent/orchestrator/tools/builtin/git-repo-rw-lock.test.mjs +0 -83
  198. package/src/runtime/agent/orchestrator/tools/builtin/grep-output-budget.test.mjs +0 -31
  199. package/src/runtime/agent/orchestrator/tools/builtin/grep-single-file-rescue.test.mjs +0 -106
  200. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.test.mjs +0 -102
  201. package/src/runtime/agent/orchestrator/tools/builtin/list-tool-integrity.test.mjs +0 -152
  202. package/src/runtime/agent/orchestrator/tools/builtin/native-search-health.test.mjs +0 -24
  203. package/src/runtime/agent/orchestrator/tools/builtin/native-search-transport.test.mjs +0 -24
  204. package/src/runtime/agent/orchestrator/tools/builtin/noise-dir-visibility.test.mjs +0 -69
  205. package/src/runtime/agent/orchestrator/tools/builtin/read-glob-survey.test.mjs +0 -71
  206. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.test.mjs +0 -56
  207. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.test.mjs +0 -16
  208. package/src/runtime/agent/orchestrator/tools/builtin/search-glob-top-k.test.mjs +0 -39
  209. package/src/runtime/agent/orchestrator/tools/builtin/write-symlink.test.mjs +0 -153
  210. package/src/runtime/agent/orchestrator/tools/code-graph/aggregate-anchor-relocation.test.mjs +0 -55
  211. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.test.mjs +0 -88
  212. package/src/runtime/agent/orchestrator/tools/code-graph/loose-file-target.test.mjs +0 -72
  213. package/src/runtime/agent/orchestrator/tools/code-graph/memory-cache.test.mjs +0 -54
  214. package/src/runtime/agent/orchestrator/tools/code-graph/search-references.test.mjs +0 -20
  215. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-search-scope.test.mjs +0 -55
  216. package/src/runtime/agent/orchestrator/tools/code-graph/text-span-mask.test.mjs +0 -268
  217. package/src/runtime/agent/orchestrator/tools/env-scrub.test.mjs +0 -57
  218. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.test.mjs +0 -19
  219. package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.test.mjs +0 -104
  220. package/src/runtime/agent/orchestrator/tools/patch/engine-contract-gate.test.mjs +0 -661
  221. package/src/runtime/agent/orchestrator/tools/patch/patch-codec-eol.test.mjs +0 -552
  222. package/src/runtime/agent/orchestrator/tools/patch/patch-symlink.test.mjs +0 -141
  223. package/src/runtime/agent/orchestrator/tools/patch/v4a-pure-move.test.mjs +0 -57
  224. package/src/runtime/agent/orchestrator/tools/patch/v4a-section-coalesce.test.mjs +0 -81
  225. package/src/runtime/agent/orchestrator/tools/spawn-binary-fetcher.test.mjs +0 -52
  226. package/src/runtime/attachments/store.test.mjs +0 -209
  227. package/src/runtime/channels/lib/voice-runtime-fetcher.test.mjs +0 -17
  228. package/src/runtime/channels/lib/webhook/deliveries.test.mjs +0 -18
  229. package/src/runtime/channels/lib/webhook/relay-tunnel.test.mjs +0 -68
  230. package/src/runtime/media/adapters/codex-image.test.mjs +0 -22
  231. package/src/runtime/media/download.test.mjs +0 -52
  232. package/src/runtime/media/renditions.test.mjs +0 -99
  233. package/src/runtime/media/store.test.mjs +0 -159
  234. package/src/runtime/memory/lib/archive-security.test.mjs +0 -128
  235. package/src/runtime/memory/lib/embedding-model-config.test.mjs +0 -33
  236. package/src/runtime/memory/lib/http-wire.test.mjs +0 -15
  237. package/src/runtime/memory/lib/memory-cycle-packets.test.mjs +0 -49
  238. package/src/runtime/memory/lib/memory-cycle2-shared.test.mjs +0 -78
  239. package/src/runtime/memory/lib/memory-embedding-migration.test.mjs +0 -50
  240. package/src/runtime/memory/lib/pg/process.test.mjs +0 -36
  241. package/src/runtime/memory/lib/trace-store.test.mjs +0 -57
  242. package/src/runtime/memory/lib/transcript-ingest.test.mjs +0 -52
  243. package/src/runtime/shared/background-tasks.test.mjs +0 -78
  244. package/src/runtime/shared/bounded-download.test.mjs +0 -41
  245. package/src/runtime/shared/channel-notification-routing.test.mjs +0 -25
  246. package/src/runtime/shared/child-spawn-remote.test.mjs +0 -124
  247. package/src/runtime/shared/remote-intent.test.mjs +0 -40
  248. package/src/runtime/shared/resource-admission.test.mjs +0 -43
  249. package/src/runtime/shared/runtime-root.test.mjs +0 -34
  250. package/src/runtime/shared/schedule-time.test.mjs +0 -29
  251. package/src/runtime/shared/session-runtime-health.test.mjs +0 -83
  252. package/src/runtime/shared/skill-document.test.mjs +0 -81
  253. package/src/runtime/shared/tool-surface.test.mjs +0 -87
  254. package/src/runtime/shared/update-checker.test.mjs +0 -33
  255. package/src/runtime/shared/user-cwd.test.mjs +0 -43
  256. package/src/runtime/shared/webhook-session-run.test.mjs +0 -14
  257. package/src/session-runtime/agent-disable.test.mjs +0 -123
  258. package/src/session-runtime/cwd-plugins.test.mjs +0 -75
  259. package/src/session-runtime/cwd-tool-routing.test.mjs +0 -61
  260. package/src/session-runtime/global-extensions.test.mjs +0 -28
  261. package/src/session-runtime/goal-runtime.test.mjs +0 -108
  262. package/src/session-runtime/lifecycle-api.test.mjs +0 -21
  263. package/src/session-runtime/model-settings-persist.test.mjs +0 -105
  264. package/src/session-runtime/notification-bus.test.mjs +0 -148
  265. package/src/session-runtime/plugin-mcp-standard.test.mjs +0 -177
  266. package/src/session-runtime/prewarm.test.mjs +0 -52
  267. package/src/session-runtime/provider-request-snapshot.test.mjs +0 -37
  268. package/src/session-runtime/resource-api-global.test.mjs +0 -69
  269. package/src/session-runtime/session-lifecycle.test.mjs +0 -125
  270. package/src/session-runtime/session-title.test.mjs +0 -36
  271. package/src/session-runtime/skills-api.test.mjs +0 -99
  272. package/src/session-runtime/tool-policy-surface.test.mjs +0 -331
  273. package/src/standalone/agent-tool/helpers.test.mjs +0 -62
  274. package/src/standalone/agent-tool/notify.test.mjs +0 -37
  275. package/src/standalone/agent-tool/spawn-flow.test.mjs +0 -63
  276. package/src/standalone/channel-restart.test.mjs +0 -145
  277. package/src/standalone/channel-session-router.test.mjs +0 -37
  278. package/src/standalone/channel-worker-heartbeat.test.mjs +0 -30
  279. package/src/standalone/hook-bus/handlers.test.mjs +0 -88
  280. package/src/standalone/plugin-admin.test.mjs +0 -173
  281. package/src/standalone/session-runtime-agent-control-client.test.mjs +0 -71
  282. package/src/standalone/session-runtime-dispatch-cancel.test.mjs +0 -139
  283. package/src/standalone/session-runtime-host-factory.test.mjs +0 -31
  284. package/src/standalone/session-runtime-host-health.test.mjs +0 -160
  285. package/src/standalone/session-runtime-inline-host.test.mjs +0 -83
  286. package/src/standalone/session-runtime-provider-cooldown.test.mjs +0 -80
  287. package/src/standalone/session-runtime-shard-host.test.mjs +0 -569
  288. package/src/standalone/session-runtime-shard-router.test.mjs +0 -101
  289. package/src/tui/app/live-spinner-visibility.test.mjs +0 -44
  290. package/src/tui/app/panel-epoch.test.mjs +0 -1009
  291. package/src/tui/app/panel-handoff.test.mjs +0 -311
  292. package/src/tui/app/prompt-submit.test.mjs +0 -206
  293. package/src/tui/session/completion-card-restore.test.mjs +0 -111
  294. package/src/tui/session/goal-continuation.test.mjs +0 -84
  295. package/src/tui/session/oauth-flows.test.mjs +0 -134
  296. package/src/tui/session/queue-helpers.test.mjs +0 -46
  297. package/src/tui/session/session-action-surface.test.mjs +0 -108
  298. package/src/tui/session/task-wait-submit.test.mjs +0 -80
  299. package/src/tui/session/tool-result-status.test.mjs +0 -131
  300. package/src/tui/session/tui-steering-persist.test.mjs +0 -104
@@ -1,40 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import {
3
- mkdtempSync,
4
- mkdirSync,
5
- readFileSync,
6
- readdirSync,
7
- rmSync,
8
- writeFileSync,
9
- } from 'node:fs';
10
- import { tmpdir } from 'node:os';
11
- import { join } from 'node:path';
12
- import { test } from 'node:test';
13
-
14
- test('prefetch disk cache uses a full hash and rejects a mismatched path identity', async () => {
15
- const root = mkdtempSync(join(tmpdir(), 'mixdog-prefetch-cache-'));
16
- const previousDataDir = process.env.MIXDOG_DATA_DIR;
17
- process.env.MIXDOG_DATA_DIR = root;
18
- const source = join(root, 'source.txt');
19
- writeFileSync(source, 'source');
20
- try {
21
- const first = await import(`./prefetch-cache.mjs?writer=${Date.now()}`);
22
- first.setPrefetchCached(source, 'cached output');
23
- first.drainPrefetchDiskWrites();
24
- const cacheDir = join(root, 'cache', 'prefetch');
25
- const [cacheFile] = readdirSync(cacheDir);
26
- assert.match(cacheFile, /^[0-9a-f]{64}\.json$/);
27
-
28
- const path = join(cacheDir, cacheFile);
29
- const payload = JSON.parse(readFileSync(path, 'utf8'));
30
- mkdirSync(cacheDir, { recursive: true });
31
- writeFileSync(path, JSON.stringify({ ...payload, absPath: `${source}.other` }));
32
-
33
- const second = await import(`./prefetch-cache.mjs?reader=${Date.now()}`);
34
- assert.equal(second.tryPrefetchCached(source), null);
35
- } finally {
36
- if (previousDataDir === undefined) delete process.env.MIXDOG_DATA_DIR;
37
- else process.env.MIXDOG_DATA_DIR = previousDataDir;
38
- rmSync(root, { recursive: true, force: true });
39
- }
40
- });
@@ -1,176 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
-
4
- import {
5
- compactionTelemetryPressureTokens,
6
- currentContextEstimateTokens,
7
- rememberCompactTelemetry,
8
- resolveCompactionPressureTokens,
9
- resolveContextTokens,
10
- resolveGaugeContextTokens,
11
- resolveWorkerCompactPolicy,
12
- shouldCompactForSession,
13
- } from './loop/compact-policy.mjs';
14
- import { contextMessagesSignature, estimateMessagesTokens } from './context-utils.mjs';
15
-
16
- test('Cursor main sessions preserve the configured 200k compact boundary', () => {
17
- const session = {
18
- provider: 'cursor-oauth',
19
- model: 'gemini-3.7-flash',
20
- contextWindow: 200_000,
21
- compactBoundaryTokens: 200_000,
22
- compaction: { auto: true },
23
- };
24
-
25
- const policy = resolveWorkerCompactPolicy(session, []);
26
- assert.equal(policy.boundaryTokens, 200_000);
27
- assert.equal(policy.triggerTokens, 200_000);
28
- assert.equal(policy.bufferTokens, 0);
29
- });
30
-
31
- test('successful compaction publishes post-compact pressure and invalidates the old baseline', () => {
32
- const session = {
33
- provider: 'cursor-oauth',
34
- model: 'gemini-3.7-flash',
35
- contextWindow: 200_000,
36
- compactBoundaryTokens: 200_000,
37
- contextPressureBaselineTokens: 225_000,
38
- contextPressureBaselineUpdatedAt: Date.now(),
39
- lastContextTokensStaleAfterCompact: false,
40
- compaction: { auto: true },
41
- };
42
- const policy = resolveWorkerCompactPolicy(session, []);
43
-
44
- rememberCompactTelemetry(session, policy, {
45
- stage: 'pre_send',
46
- beforeTokens: 225_000,
47
- afterTokens: 20_000,
48
- pressureTokens: 225_000,
49
- compactChanged: true,
50
- });
51
-
52
- assert.equal(session.compaction.currentEstimatedTokens, 20_000);
53
- assert.equal(session.contextPressureBaselineTokens, null);
54
- assert.equal(session.lastContextTokensStaleAfterCompact, true);
55
- });
56
-
57
- // Reported compaction numbers must share ONE scale with the context gauge
58
- // (user: 게이지는 499k인데 압축 알림은 131k→23k). The pre-compact side follows
59
- // the provider-billed prompt; the post-compact side is the same calibrated
60
- // estimate the gauge falls back to once compaction drops the baseline.
61
- test('gauge and post-compact estimate are one scale', () => {
62
- const messages = [
63
- { role: 'user', content: 'hello world '.repeat(200) },
64
- { role: 'assistant', content: 'reply text '.repeat(200) },
65
- ];
66
- const session = {
67
- provider: 'anthropic-oauth',
68
- model: 'claude-opus-5',
69
- contextWindow: 500_000,
70
- compactBoundaryTokens: 500_000,
71
- compaction: { auto: true },
72
- tools: [],
73
- };
74
- const policy = resolveWorkerCompactPolicy(session, []);
75
- const messageTokensEst = estimateMessagesTokens(messages);
76
-
77
- // No baseline: both ends resolve through the identical calibrated formula.
78
- assert.equal(
79
- resolveGaugeContextTokens(messageTokensEst, policy, { messages, sessionRef: session }),
80
- currentContextEstimateTokens(messageTokensEst, policy),
81
- );
82
-
83
- // Live baseline: the reported "before" follows the provider-billed prompt
84
- // instead of the much smaller raw transcript estimate.
85
- Object.assign(session, {
86
- contextPressureBaselineTokens: 499_000,
87
- contextPressureBaselineOutputTokens: 0,
88
- contextPressureBaselineMessageCount: messages.length,
89
- contextPressureBaselinePrefixSignature: contextMessagesSignature(messages),
90
- contextPressureBaselineProvider: session.provider,
91
- contextPressureBaselineModel: session.model,
92
- contextPressureBaselineToolSignature: policy.toolSchemaSignature,
93
- contextPressureBaselineBoundary: 'complete',
94
- contextPressureBaselineUpdatedAt: Date.now(),
95
- lastContextTokensStaleAfterCompact: false,
96
- });
97
-
98
- const gauged = resolveGaugeContextTokens(messageTokensEst, policy, { messages, sessionRef: session });
99
- assert.equal(gauged, 499_000);
100
- assert.equal(
101
- resolveCompactionPressureTokens(messageTokensEst, policy, { messages, sessionRef: session }),
102
- gauged,
103
- );
104
- assert.equal(
105
- shouldCompactForSession(messageTokensEst, policy, { messages, sessionRef: session }),
106
- false,
107
- );
108
- assert.ok(gauged > currentContextEstimateTokens(messageTokensEst, policy) * 10);
109
- });
110
-
111
- test('provider baseline plus trailing growth is the only display and compaction value', () => {
112
- const prefix = [
113
- { role: 'user', content: 'large provider-aligned prefix '.repeat(5_000) },
114
- ];
115
- const trailing = { role: 'user', content: 'new trailing message' };
116
- const messages = [...prefix, trailing];
117
- const session = {
118
- provider: 'anthropic-oauth',
119
- model: 'claude-opus-5',
120
- contextWindow: 500_000,
121
- compactBoundaryTokens: 500_000,
122
- compaction: { auto: true },
123
- tools: [],
124
- };
125
- const policy = resolveWorkerCompactPolicy(session, []);
126
- const messageTokensEst = estimateMessagesTokens(messages);
127
- const providerTokens = 1_000;
128
- Object.assign(session, {
129
- contextPressureBaselineTokens: providerTokens,
130
- contextPressureBaselineOutputTokens: 0,
131
- contextPressureBaselineMessageCount: prefix.length,
132
- contextPressureBaselinePrefixSignature: contextMessagesSignature(messages, prefix.length),
133
- contextPressureBaselineProvider: session.provider,
134
- contextPressureBaselineModel: session.model,
135
- contextPressureBaselineToolSignature: policy.toolSchemaSignature,
136
- contextPressureBaselineBoundary: 'complete',
137
- contextPressureBaselineUpdatedAt: Date.now(),
138
- lastContextTokensStaleAfterCompact: false,
139
- });
140
-
141
- const expected = providerTokens + Math.round(
142
- estimateMessagesTokens([trailing]) * policy.tokenCalibration,
143
- );
144
- const contextTokens = resolveContextTokens(messageTokensEst, policy, { messages, sessionRef: session });
145
- assert.equal(contextTokens, expected);
146
- assert.equal(
147
- resolveGaugeContextTokens(messageTokensEst, policy, { messages, sessionRef: session }),
148
- contextTokens,
149
- );
150
- assert.equal(
151
- resolveCompactionPressureTokens(messageTokensEst, policy, { messages, sessionRef: session }),
152
- contextTokens,
153
- );
154
- assert.ok(currentContextEstimateTokens(messageTokensEst, policy) > contextTokens * 2);
155
-
156
- const decisionPolicy = { ...policy, triggerTokens: contextTokens + 1 };
157
- assert.equal(
158
- shouldCompactForSession(messageTokensEst, decisionPolicy, { messages, sessionRef: session }),
159
- false,
160
- );
161
- assert.equal(
162
- compactionTelemetryPressureTokens(messageTokensEst, decisionPolicy, {
163
- messages,
164
- sessionRef: session,
165
- }),
166
- contextTokens,
167
- );
168
- assert.equal(
169
- compactionTelemetryPressureTokens(messageTokensEst, decisionPolicy, {
170
- reactivePending: true,
171
- messages,
172
- sessionRef: session,
173
- }),
174
- decisionPolicy.triggerTokens,
175
- );
176
- });
@@ -1,161 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import { mkdtempSync, rmSync, writeFileSync } from 'node:fs';
3
- import { tmpdir } from 'node:os';
4
- import { join } from 'node:path';
5
- import test from 'node:test';
6
-
7
- import { executeBuiltinTool } from '../tools/builtin.mjs';
8
- import { COMPACT_TYPE_SEMANTIC } from './compact.mjs';
9
- import { runSessionCompaction } from './manager/compaction-runner.mjs';
10
- import { runPreSendCompactPass } from './pre-send-compact.mjs';
11
- import { resetReadStateAfterCompaction } from './read-dedup.mjs';
12
-
13
- const SUMMARY = [
14
- '## Goal',
15
- '- continue after compaction',
16
- '',
17
- '## Constraints & Preferences',
18
- '- (none)',
19
- '',
20
- '## Progress',
21
- '### Done',
22
- '- old context summarized',
23
- '',
24
- '### In Progress',
25
- '- (none)',
26
- '',
27
- '### Blocked',
28
- '- (none)',
29
- '',
30
- '## Key Decisions',
31
- '- (none)',
32
- '',
33
- '## Next Steps',
34
- '- reread the working file',
35
- '',
36
- '## Critical Context',
37
- '- active file must be readable again',
38
- '',
39
- '## Relevant Files',
40
- '- working.txt',
41
- ].join('\n');
42
-
43
- function fixture(t, tag) {
44
- const dir = mkdtempSync(join(tmpdir(), `mixdog-compact-read-${tag}-`));
45
- const file = join(dir, 'working.txt');
46
- const sessionId = `compact-read-${tag}-${process.pid}-${Date.now()}`;
47
- writeFileSync(file, 'alpha\nbeta\n', 'utf8');
48
- t.after(() => {
49
- resetReadStateAfterCompaction(sessionId);
50
- rmSync(dir, { recursive: true, force: true });
51
- });
52
- return { dir, file, sessionId };
53
- }
54
-
55
- async function establishUnchangedSnapshot({ dir, file, sessionId }) {
56
- const first = String(await executeBuiltinTool('read', { path: file }, dir, { sessionId }));
57
- assert.match(first, /alpha/);
58
- const duplicate = await executeBuiltinTool('read', { path: file }, dir, { sessionId });
59
- assert.equal(duplicate, `[file unchanged: ${file.replaceAll('\\', '/')}]`);
60
- }
61
-
62
- function semanticProvider(name) {
63
- return {
64
- name,
65
- async send() {
66
- return { content: SUMMARY };
67
- },
68
- };
69
- }
70
-
71
- test('manual compaction starts a fresh read epoch', async (t) => {
72
- const fx = fixture(t, 'manual');
73
- await establishUnchangedSnapshot(fx);
74
-
75
- const session = {
76
- id: fx.sessionId,
77
- provider: 'compact-read-manual',
78
- model: 'fake-model',
79
- contextWindow: 100_000,
80
- compactBoundaryTokens: 100_000,
81
- messages: [
82
- { role: 'system', content: 'system rules stay exact' },
83
- { role: 'user', content: 'older request about working.txt' },
84
- { role: 'assistant', content: 'older answer with file details' },
85
- { role: 'user', content: 'current request remains verbatim' },
86
- ],
87
- tools: [],
88
- compaction: {
89
- type: COMPACT_TYPE_SEMANTIC,
90
- compactType: COMPACT_TYPE_SEMANTIC,
91
- tailTurns: 1,
92
- },
93
- };
94
- const result = await runSessionCompaction(session, {
95
- mode: 'manual',
96
- force: true,
97
- compactType: COMPACT_TYPE_SEMANTIC,
98
- provider: semanticProvider('compact-read-manual'),
99
- model: 'fake-model',
100
- });
101
-
102
- assert.equal(result.changed, true);
103
- const reread = String(await executeBuiltinTool('read', { path: fx.file }, fx.dir, { sessionId: fx.sessionId }));
104
- assert.doesNotMatch(reread, /file unchanged/);
105
- assert.match(reread, /alpha/);
106
- });
107
-
108
- test('automatic pre-send compaction resets reads only after transcript change', async (t) => {
109
- const fx = fixture(t, 'auto');
110
- await establishUnchangedSnapshot(fx);
111
-
112
- const session = {
113
- id: fx.sessionId,
114
- owner: 'agent',
115
- provider: 'compact-read-auto',
116
- model: 'fake-model',
117
- cwd: fx.dir,
118
- contextWindow: 20_000,
119
- compactBoundaryTokens: 20_000,
120
- messages: [
121
- { role: 'user', content: 'small request' },
122
- { role: 'assistant', content: 'small answer' },
123
- ],
124
- tools: [],
125
- compaction: { auto: true, tailTurns: 1 },
126
- };
127
- const state = {
128
- provider: semanticProvider('compact-read-auto'),
129
- messages: session.messages,
130
- model: session.model,
131
- requestTools: [],
132
- sessionRef: session,
133
- sessionId: fx.sessionId,
134
- cwd: fx.dir,
135
- opts: {},
136
- signal: null,
137
- iterations: 1,
138
- lastUsage: null,
139
- firstTurnUsage: null,
140
- providerState: null,
141
- reactiveOverflowRetryPending: false,
142
- loopUsageMetricsTurnId: () => 'test-turn',
143
- loopUsageMetricsEpoch: () => 0,
144
- };
145
-
146
- const noChange = await runPreSendCompactPass(state);
147
- assert.equal(noChange.compactChanged, false);
148
- const stillUnchanged = await executeBuiltinTool('read', { path: fx.file }, fx.dir, { sessionId: fx.sessionId });
149
- assert.equal(stillUnchanged, `[file unchanged: ${fx.file.replaceAll('\\', '/')}]`);
150
-
151
- session.messages.unshift(
152
- { role: 'user', content: `large old request ${'context '.repeat(12_000)}` },
153
- { role: 'assistant', content: `large old answer ${'detail '.repeat(12_000)}` },
154
- );
155
- const changed = await runPreSendCompactPass({ ...state, messages: session.messages });
156
- assert.equal(changed.compactChanged, true);
157
-
158
- const reread = String(await executeBuiltinTool('read', { path: fx.file }, fx.dir, { sessionId: fx.sessionId }));
159
- assert.doesNotMatch(reread, /file unchanged/);
160
- assert.match(reread, /alpha/);
161
- });
@@ -1,115 +0,0 @@
1
- import assert from 'node:assert/strict';
2
- import test from 'node:test';
3
- import { createEagerDispatcher } from './eager-dispatch.mjs';
4
- import {
5
- _repeatFailurePatternWouldContinue,
6
- _repeatFailureSig,
7
- } from './loop/tool-classify.mjs';
8
-
9
- function gate() {
10
- let release;
11
- return { promise: new Promise((resolve) => { release = resolve; }), release };
12
- }
13
-
14
- test('eager dispatch serializes Git mutations, file edits, and shell verification', async () => {
15
- const gitGate = gate();
16
- const patchGate = gate();
17
- const events = [];
18
- const executeToolFn = async (name) => {
19
- events.push(`${name}:start`);
20
- if (name === 'git') await gitGate.promise;
21
- if (name === 'apply_patch') await patchGate.promise;
22
- events.push(`${name}:end`);
23
- return { result: 'ok', explicitSuccess: true };
24
- };
25
- const dispatcher = createEagerDispatcher({
26
- tools: [],
27
- cwd: process.cwd(),
28
- sessionId: null,
29
- sessionRef: {},
30
- signal: null,
31
- opts: {},
32
- crossTurnCalls: new Map(),
33
- getIterations: () => 1,
34
- getNextIteration: () => 1,
35
- repeatFailLimit: 3,
36
- executeToolFn,
37
- });
38
- const calls = [
39
- { id: 'git', name: 'git', arguments: { command: 'git add --all' } },
40
- { id: 'patch', name: 'apply_patch', arguments: { patch: 'test' } },
41
- { id: 'shell', name: 'shell', arguments: { command: 'git status' } },
42
- ];
43
-
44
- dispatcher.startEagerRun(calls, 0, new Set());
45
- await new Promise((resolve) => setImmediate(resolve));
46
- assert.deepEqual(events, ['git:start']);
47
-
48
- gitGate.release();
49
- await new Promise((resolve) => setImmediate(resolve));
50
- assert.deepEqual(events, ['git:start', 'git:end', 'apply_patch:start']);
51
-
52
- patchGate.release();
53
- await Promise.all([...dispatcher.pending.values()].map((entry) => entry.promise));
54
- assert.deepEqual(events, [
55
- 'git:start', 'git:end',
56
- 'apply_patch:start', 'apply_patch:end',
57
- 'shell:start', 'shell:end',
58
- ]);
59
- });
60
-
61
- test('same-file edits serialize while different-file edits stay parallel', async () => {
62
- const firstEditGate = gate();
63
- const events = [];
64
- const executeToolFn = async (name, args) => {
65
- events.push(`start:${args.file_path}#${args.old_string}`);
66
- if (args.old_string === 'a1') await firstEditGate.promise;
67
- events.push(`end:${args.file_path}#${args.old_string}`);
68
- return { result: 'ok', explicitSuccess: true };
69
- };
70
- const dispatcher = createEagerDispatcher({
71
- tools: [],
72
- cwd: process.cwd(),
73
- sessionId: null,
74
- sessionRef: {},
75
- signal: null,
76
- opts: {},
77
- crossTurnCalls: new Map(),
78
- getIterations: () => 1,
79
- getNextIteration: () => 1,
80
- repeatFailLimit: 3,
81
- executeToolFn,
82
- });
83
- const calls = [
84
- { id: 'e1', name: 'edit', arguments: { file_path: 'a.txt', old_string: 'a1', new_string: 'x' } },
85
- { id: 'e2', name: 'edit', arguments: { file_path: 'A.TXT', old_string: 'a2', new_string: 'y' } },
86
- { id: 'e3', name: 'edit', arguments: { file_path: 'b.txt', old_string: 'b1', new_string: 'z' } },
87
- ];
88
-
89
- dispatcher.startEagerRun(calls, 0, new Set());
90
- await new Promise((resolve) => setImmediate(resolve));
91
- // e1 runs and blocks. e2 targets the same file (case variant) and must
92
- // wait. e3 targets an independent file and must run to completion in
93
- // parallel with the blocked e1.
94
- assert.ok(events.includes('start:a.txt#a1'));
95
- assert.ok(!events.includes('start:A.TXT#a2'));
96
- assert.ok(events.includes('end:b.txt#b1'));
97
-
98
- firstEditGate.release();
99
- await Promise.all([...dispatcher.pending.values()].map((entry) => entry.promise));
100
- assert.ok(events.indexOf('start:A.TXT#a2') > events.indexOf('end:a.txt#a1'));
101
- });
102
-
103
- test('repeat failure signatures normalize paths and detect alternating cycles', () => {
104
- const cwd = process.cwd();
105
- const relative = _repeatFailureSig('read', { file_path: 'missing/file.txt' }, cwd);
106
- const absolute = _repeatFailureSig('read', {
107
- file_path: `${cwd}/missing/file.txt`,
108
- }, cwd);
109
- assert.equal(relative, absolute);
110
-
111
- const other = _repeatFailureSig('read', { file_path: 'missing/other.txt' }, cwd);
112
- const history = [relative, other, relative, other, relative, other];
113
- assert.equal(_repeatFailurePatternWouldContinue(history, relative, 3), 2);
114
- assert.equal(_repeatFailurePatternWouldContinue(history, other, 3), 0);
115
- });