mixdog 1.3.4 → 1.4.0

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 (472) hide show
  1. package/LICENSES/oh-my-pi-MIT.txt +23 -0
  2. package/NOTICE.md +17 -2
  3. package/README.md +11 -0
  4. package/package.json +3 -11
  5. package/scripts/daemon-stub.mjs +1 -1
  6. package/scripts/embed-google-oauth-client.mjs +49 -0
  7. package/scripts/gate-local.mjs +4 -2
  8. package/scripts/lib/test-spawn-ledger.mjs +46 -1
  9. package/scripts/native-release-status.mjs +2 -2
  10. package/scripts/recall-history-cases.json +1 -1
  11. package/scripts/suite-health.mjs +10 -1
  12. package/scripts/test.mjs +12 -11
  13. package/src/agents/reviewer/AGENT.md +7 -11
  14. package/src/agents/reviewer/agent.json +1 -1
  15. package/src/defaults/shipped-history.json +25 -1
  16. package/src/defaults/skills/browser-use/SKILL.md +77 -17
  17. package/src/defaults/skills/code-tidy/SKILL.md +142 -270
  18. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +4 -4
  19. package/src/defaults/skills/code-tidy/references/cleanup-report.md +31 -76
  20. package/src/defaults/skills/code-tidy/references/dead-code.md +6 -12
  21. package/src/defaults/skills/computer-use/SKILL.md +33 -9
  22. package/src/defaults/skills/setup/SKILL.md +29 -2
  23. package/src/defaults/skills/setup/references/actions.md +117 -28
  24. package/src/defaults/skills/setup/references/surfaces.md +77 -35
  25. package/src/defaults/skills/setup-guide/SKILL.md +3 -3
  26. package/src/defaults/skills/visualize/SKILL.md +2 -1
  27. package/src/lib/keychain-cjs.cjs +359 -29
  28. package/src/lib/rules-builder.cjs +10 -8
  29. package/src/rules/agent/AGENT.md +6 -6
  30. package/src/rules/agent-mode/AGENT_MODE.md +10 -2
  31. package/src/rules/agent-mode/MIXY.md +12 -0
  32. package/src/rules/lead/LEAD.md +18 -20
  33. package/src/rules/shared/05-tool-calls.md +5 -6
  34. package/src/rules/shared/10-tool-workflow.md +2 -0
  35. package/src/rules/shared/60-verification.md +7 -5
  36. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
  37. package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +193 -0
  38. package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +3 -1
  39. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +3 -1
  40. package/src/runtime/agent/orchestrator/config.mjs +34 -0
  41. package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
  42. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +72 -67
  43. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +54 -1
  44. package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
  45. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +177 -73
  46. package/src/runtime/agent/orchestrator/mcp/client.mjs +25 -2
  47. package/src/runtime/agent/orchestrator/mcp/oauth-callback.mjs +31 -2
  48. package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +16 -3
  49. package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +42 -7
  50. package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +21 -2
  51. package/src/runtime/agent/orchestrator/mcp/oauth-shared.mjs +23 -0
  52. package/src/runtime/agent/orchestrator/mcp/oauth.mjs +11 -1
  53. package/src/runtime/agent/orchestrator/providers/account-pool.mjs +230 -137
  54. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +64 -7
  55. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +18 -5
  56. package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
  57. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
  58. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -1
  59. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +14 -14
  60. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +160 -69
  61. package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
  62. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +64 -33
  63. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
  64. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +52 -8
  65. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +10 -1
  66. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +22 -6
  67. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +15 -4
  68. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +17 -2
  69. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +142 -104
  70. package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
  71. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
  72. package/src/runtime/agent/orchestrator/providers/cursor-wire-normalization.mjs +10 -4
  73. package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +10 -217
  74. package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
  75. package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -6
  76. package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +409 -0
  77. package/src/runtime/agent/orchestrator/providers/devin-wire-families.mjs +187 -0
  78. package/src/runtime/agent/orchestrator/providers/devin-wire-identity.mjs +342 -0
  79. package/src/runtime/agent/orchestrator/providers/devin-wire-models.mjs +541 -0
  80. package/src/runtime/agent/orchestrator/providers/devin-wire-protobuf.mjs +305 -0
  81. package/src/runtime/agent/orchestrator/providers/devin-wire-request.mjs +558 -0
  82. package/src/runtime/agent/orchestrator/providers/devin-wire-schema.mjs +880 -0
  83. package/src/runtime/agent/orchestrator/providers/devin-wire-session.mjs +190 -0
  84. package/src/runtime/agent/orchestrator/providers/devin-wire-tool-args.mjs +351 -0
  85. package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +560 -0
  86. package/src/runtime/agent/orchestrator/providers/devin.mjs +491 -0
  87. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +3 -0
  88. package/src/runtime/agent/orchestrator/providers/gemini-output-limit.mjs +46 -0
  89. package/src/runtime/agent/orchestrator/providers/gemini-reasoning-relay.mjs +30 -0
  90. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +7 -11
  91. package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +61 -22
  92. package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +1 -0
  93. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +71 -4
  94. package/src/runtime/agent/orchestrator/providers/gemini.mjs +25 -2
  95. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
  96. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +96 -5
  97. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
  98. package/src/runtime/agent/orchestrator/providers/lib/tail-reminder-split.mjs +23 -5
  99. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
  100. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +8 -1
  101. package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
  102. package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +11 -3
  103. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +19 -1
  104. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +39 -3
  105. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
  106. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +2 -0
  107. package/src/runtime/agent/orchestrator/providers/openai-error-contract.mjs +6 -1
  108. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -9
  109. package/src/runtime/agent/orchestrator/providers/openai-ws-send/send-context.mjs +22 -3
  110. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +43 -5
  111. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +3 -1
  112. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +6 -3
  113. package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +1 -0
  114. package/src/runtime/agent/orchestrator/providers/provider-availability.mjs +19 -0
  115. package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +65 -1
  116. package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +38 -12
  117. package/src/runtime/agent/orchestrator/providers/registry.mjs +43 -3
  118. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +39 -7
  119. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +6 -0
  120. package/src/runtime/agent/orchestrator/providers/wire-protobuf-codec.mjs +368 -0
  121. package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +12 -7
  122. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +2 -0
  123. package/src/runtime/agent/orchestrator/runtime-core/compaction-config-keys.mjs +62 -0
  124. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +37 -16
  125. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +100 -23
  126. package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +1 -1
  127. package/src/runtime/agent/orchestrator/runtime-core/reaction-tool-defs.mjs +133 -0
  128. package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -0
  129. package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
  130. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
  131. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
  132. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +23 -5
  133. package/src/runtime/agent/orchestrator/runtime-core/tool-profile.mjs +35 -10
  134. package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +57 -10
  135. package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +9 -6
  136. package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -1
  137. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +18 -0
  138. package/src/runtime/agent/orchestrator/session/agent-room.d.mts +0 -3
  139. package/src/runtime/agent/orchestrator/session/agent-room.mjs +10 -4
  140. package/src/runtime/agent/orchestrator/session/cache-warm.mjs +792 -0
  141. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +148 -25
  142. package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +475 -58
  143. package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +42 -17
  144. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +8 -0
  145. package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +47 -9
  146. package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +6 -2
  147. package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
  148. package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +14 -2
  149. package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +8 -0
  150. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +18 -22
  151. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +32 -3
  152. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +11 -2
  153. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -1
  154. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +51 -3
  155. package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +17 -3
  156. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +10 -2
  157. package/src/runtime/agent/orchestrator/session/loop/tool-exec/after-hook.mjs +2 -1
  158. package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +14 -4
  159. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
  160. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +16 -1
  161. package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +10 -0
  162. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
  163. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +23 -5
  164. package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +60 -0
  165. package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -2
  166. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +19 -1
  167. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +2 -0
  168. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +133 -90
  169. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +14 -0
  170. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +2 -1
  171. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +31 -4
  172. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +30 -18
  173. package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +23 -13
  174. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +11 -2
  175. package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +13 -0
  176. package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +129 -0
  177. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +20 -2
  178. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
  179. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +8 -0
  180. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
  181. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +13 -0
  182. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +7 -2
  183. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
  184. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +18 -5
  185. package/src/runtime/agent/orchestrator/session/message-ids.mjs +5 -3
  186. package/src/runtime/agent/orchestrator/session/message-reactions.mjs +89 -0
  187. package/src/runtime/agent/orchestrator/session/message-reactions.test-support.mjs +75 -0
  188. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +19 -8
  189. package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
  190. package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +127 -0
  191. package/src/runtime/agent/orchestrator/session/routine-result.d.mts +0 -2
  192. package/src/runtime/agent/orchestrator/session/routine-result.mjs +47 -11
  193. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +20 -2
  194. package/src/runtime/agent/orchestrator/session/sensitive-projection.mjs +100 -0
  195. package/src/runtime/agent/orchestrator/session/sensitive-values.mjs +257 -0
  196. package/src/runtime/agent/orchestrator/session/side-question-store.mjs +20 -7
  197. package/src/runtime/agent/orchestrator/session/side-question.mjs +18 -0
  198. package/src/runtime/agent/orchestrator/session/skill-update-notice.mjs +60 -0
  199. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +6 -3
  200. package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +9 -5
  201. package/src/runtime/agent/orchestrator/session/store/serialize.mjs +9 -8
  202. package/src/runtime/agent/orchestrator/session/store/session-persistence-events.mjs +29 -0
  203. package/src/runtime/agent/orchestrator/session/store-agent-worker-header-cache.mjs +85 -0
  204. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +133 -18
  205. package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +12 -2
  206. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +44 -14
  207. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +84 -3
  208. package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
  209. package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +11 -5
  210. package/src/runtime/agent/orchestrator/session/thinking-binding.mjs +108 -0
  211. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
  212. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
  213. package/src/runtime/agent/orchestrator/session/tool-batch/state.mjs +4 -0
  214. package/src/runtime/agent/orchestrator/session/tool-batch.mjs +5 -0
  215. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +25 -2
  216. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +9 -7
  217. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +2 -2
  218. package/src/runtime/agent/orchestrator/session/turn-failure.mjs +5 -1
  219. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +5 -2
  220. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +12 -1
  221. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +240 -0
  222. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
  223. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/shell-cwd.mjs +38 -0
  224. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +25 -5
  225. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +65 -7
  226. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
  227. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +36 -13
  228. package/src/runtime/browser-bridge/action-schema.mjs +13 -2
  229. package/src/runtime/browser-bridge/client.mjs +73 -8
  230. package/src/runtime/browser-bridge/input-fields.mjs +8 -9
  231. package/src/runtime/browser-bridge/mail-links.mjs +107 -0
  232. package/src/runtime/browser-bridge/tool-defs.mjs +1 -1
  233. package/src/runtime/channels/lib/config.mjs +6 -61
  234. package/src/runtime/channels/lib/crash-log.mjs +1 -1
  235. package/src/runtime/channels/lib/event-pipeline.mjs +4 -19
  236. package/src/runtime/channels/lib/event-queue.mjs +3 -18
  237. package/src/runtime/channels/lib/owned-runtime/automation-services.mjs +2 -2
  238. package/src/runtime/channels/lib/owned-runtime/automation-start.mjs +3 -4
  239. package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +4 -59
  240. package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +33 -115
  241. package/src/runtime/channels/lib/owned-runtime/owned-stop.mjs +5 -22
  242. package/src/runtime/channels/lib/owned-runtime/state.mjs +2 -8
  243. package/src/runtime/channels/lib/owned-runtime.mjs +6 -23
  244. package/src/runtime/channels/lib/parent-bridge.mjs +2 -2
  245. package/src/runtime/channels/lib/runtime-paths.mjs +4 -43
  246. package/src/runtime/channels/lib/schedule-errors.mjs +51 -0
  247. package/src/runtime/channels/lib/scheduler.mjs +135 -154
  248. package/src/runtime/channels/lib/schedules-db.mjs +83 -11
  249. package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
  250. package/src/runtime/channels/lib/tool-dispatch.mjs +14 -2
  251. package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
  252. package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -1
  253. package/src/runtime/channels/lib/worker-ipc.mjs +0 -1
  254. package/src/runtime/channels/lib/worker-main.mjs +19 -34
  255. package/src/runtime/computer-bridge/action-schema.mjs +42 -1
  256. package/src/runtime/computer-bridge/actions.mjs +9 -1
  257. package/src/runtime/computer-bridge/client.mjs +180 -8
  258. package/src/runtime/computer-bridge/core-actions.mjs +2 -2
  259. package/src/runtime/computer-bridge/error-recovery.mjs +27 -2
  260. package/src/runtime/computer-bridge/linux-readiness.mjs +65 -23
  261. package/src/runtime/computer-bridge/pending-continuation.mjs +1 -1
  262. package/src/runtime/connectors/connector-accounts-mcp.mjs +230 -0
  263. package/src/runtime/connectors/gmail-app-password.mjs +172 -39
  264. package/src/runtime/connectors/google-mcp.mjs +10 -12
  265. package/src/runtime/memory/lib/pg/adapter.mjs +77 -70
  266. package/src/runtime/memory/lib/pg/supervisor.mjs +24 -12
  267. package/src/runtime/memory/lib/runtime-fetcher.mjs +23 -5
  268. package/src/runtime/office/com/com-adapter.mjs +17 -1
  269. package/src/runtime/office/com/office-com-host.ps1 +51 -1
  270. package/src/runtime/office/pdf/cfb-fixture.mjs +328 -0
  271. package/src/runtime/office/pdf/cfb-protection.mjs +311 -0
  272. package/src/runtime/office/pdf/document-preview.mjs +326 -8
  273. package/src/runtime/office/pdf/ooxml-crypto.mjs +469 -0
  274. package/src/runtime/office/pdf/ooxml-key-worker.mjs +14 -0
  275. package/src/runtime/office/portable/portable-soffice.mjs +45 -5
  276. package/src/runtime/session-search/session-search-db.mjs +73 -9
  277. package/src/runtime/session-search/session-search-ingest.mjs +110 -20
  278. package/src/runtime/shared/abort-race.mjs +89 -0
  279. package/src/runtime/shared/agent-avatar.d.mts +0 -1
  280. package/src/runtime/shared/agent-kind.mjs +4 -3
  281. package/src/runtime/shared/bot-hops.mjs +62 -2
  282. package/src/runtime/shared/bounded-download.mjs +8 -3
  283. package/src/runtime/shared/config.mjs +51 -35
  284. package/src/runtime/shared/connector-accounts.mjs +20 -10
  285. package/src/runtime/shared/connector-catalog.d.mts +33 -2
  286. package/src/runtime/shared/connector-catalog.mjs +166 -8
  287. package/src/runtime/shared/connector-triggers.mjs +22 -19
  288. package/src/runtime/shared/defaults-separation.mjs +2 -14
  289. package/src/runtime/shared/delegated-approval-host.mjs +103 -11
  290. package/src/runtime/shared/developer-options.mjs +32 -1
  291. package/src/runtime/shared/err-text.mjs +24 -15
  292. package/src/runtime/shared/file-permissions.d.mts +0 -8
  293. package/src/runtime/shared/file-permissions.mjs +0 -11
  294. package/src/runtime/shared/git-direct.test-support.mjs +19 -0
  295. package/src/runtime/shared/google-oauth-client.generated.json +4 -0
  296. package/src/runtime/shared/google-oauth-client.mjs +34 -9
  297. package/src/runtime/shared/heartbeat-interval.d.mts +4 -0
  298. package/src/runtime/shared/heartbeat-interval.mjs +19 -0
  299. package/src/runtime/shared/idle-auto-clear-gate.mjs +104 -0
  300. package/src/runtime/shared/llm/anthropic-betas.mjs +7 -0
  301. package/src/runtime/shared/llm/anthropic-thinking-contract.mjs +12 -0
  302. package/src/runtime/shared/llm/provider-catalog-registry.mjs +1 -0
  303. package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
  304. package/src/runtime/shared/llm/well-formed.mjs +66 -0
  305. package/src/runtime/shared/mixy-presence.mjs +22 -0
  306. package/src/runtime/shared/orchestration.d.mts +2 -0
  307. package/src/runtime/shared/pg-schema-db.mjs +27 -16
  308. package/src/runtime/shared/profile-config.cjs +1 -1
  309. package/src/runtime/shared/prompt-origin.d.mts +4 -0
  310. package/src/runtime/shared/prompt-origin.mjs +21 -0
  311. package/src/runtime/shared/provider-accounts.mjs +231 -59
  312. package/src/runtime/shared/provider-api-key.mjs +19 -8
  313. package/src/runtime/shared/provider-display-name.mjs +29 -0
  314. package/src/runtime/shared/provider-timeout-phase.mjs +2 -0
  315. package/src/runtime/shared/routine-trigger.d.mts +2 -0
  316. package/src/runtime/shared/routine-trigger.mjs +52 -0
  317. package/src/runtime/shared/sensitive-path-rules.d.mts +2 -10
  318. package/src/runtime/shared/sensitive-path-rules.mjs +19 -41
  319. package/src/runtime/shared/session-activity-signal.mjs +34 -1
  320. package/src/runtime/shared/session-sidebar-host.d.mts +1 -1
  321. package/src/runtime/shared/session-sidebar-host.mjs +7 -3
  322. package/src/runtime/shared/session-turn-prelude.mjs +18 -0
  323. package/src/runtime/shared/tool-execution-contract.mjs +2 -0
  324. package/src/runtime/shared/tool-result-summary.mjs +1 -14
  325. package/src/runtime/shared/transcript-metadata.mjs +38 -0
  326. package/src/runtime/shared/user-data-guard.mjs +30 -2
  327. package/src/runtime/shared/worktrees/activity-gate.mjs +12 -5
  328. package/src/runtime/shared/worktrees/test-support.mjs +9 -4
  329. package/src/runtime/terminal-bridge/client.mjs +10 -1
  330. package/src/runtime/visualize-bridge/client.mjs +27 -8
  331. package/src/runtime/visualize-bridge/tool-defs.mjs +22 -8
  332. package/src/runtime/visualize-bridge/tool-meta.d.mts +5 -0
  333. package/src/runtime/visualize-bridge/tool-meta.mjs +22 -0
  334. package/src/runtime/web-search/lib/fetch-pipeline.mjs +2 -2
  335. package/src/session-runtime/agent-home-delivery.mjs +486 -179
  336. package/src/session-runtime/agent-room-delivery.mjs +28 -1
  337. package/src/session-runtime/agent-task-sessions.mjs +561 -199
  338. package/src/session-runtime/boot/apis.mjs +9 -0
  339. package/src/session-runtime/boot/begin.mjs +3 -2
  340. package/src/session-runtime/boot/infrastructure.mjs +4 -0
  341. package/src/session-runtime/boot/providers.mjs +3 -0
  342. package/src/session-runtime/boot/tools.mjs +8 -1
  343. package/src/session-runtime/bot-chain.mjs +32 -0
  344. package/src/session-runtime/bot-status.mjs +7 -4
  345. package/src/session-runtime/channel-config-api.mjs +63 -17
  346. package/src/session-runtime/config-lifecycle.mjs +6 -0
  347. package/src/session-runtime/connector-merge-migration.mjs +305 -0
  348. package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +132 -28
  349. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +2 -0
  350. package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +45 -0
  351. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +72 -5
  352. package/src/session-runtime/internal-tool-executor.mjs +4 -0
  353. package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
  354. package/src/session-runtime/lifecycle/session-catalog.mjs +3 -1
  355. package/src/session-runtime/lifecycle/teardown/runtime-stops.mjs +50 -4
  356. package/src/session-runtime/lifecycle/teardown.mjs +23 -5
  357. package/src/session-runtime/mcp-glue/server-catalog.mjs +61 -3
  358. package/src/session-runtime/mcp-oauth-login.mjs +5 -3
  359. package/src/session-runtime/mixy-heartbeat.mjs +927 -0
  360. package/src/session-runtime/model-route/route-tuning.mjs +10 -6
  361. package/src/session-runtime/notification-bus.mjs +31 -117
  362. package/src/session-runtime/notification-completion-queue.mjs +54 -0
  363. package/src/session-runtime/notification-listeners.mjs +76 -0
  364. package/src/session-runtime/owned-automation-run.mjs +35 -13
  365. package/src/session-runtime/prewarm/channel-start.mjs +3 -7
  366. package/src/session-runtime/provider-auth/login.mjs +7 -0
  367. package/src/session-runtime/provider-models/row-hydration.mjs +13 -2
  368. package/src/session-runtime/resource-mcp-api.mjs +143 -224
  369. package/src/session-runtime/resource-mcp-connector-accounts.mjs +163 -0
  370. package/src/session-runtime/resource-mcp-oauth-api.mjs +217 -0
  371. package/src/session-runtime/resource-mcp-secrets.mjs +82 -0
  372. package/src/session-runtime/resource-mcp-servers.mjs +78 -0
  373. package/src/session-runtime/resource-mcp-store.mjs +49 -0
  374. package/src/session-runtime/routine-home-turn.mjs +33 -6
  375. package/src/session-runtime/routine-owner.mjs +40 -9
  376. package/src/session-runtime/schedule-session-run.mjs +7 -3
  377. package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
  378. package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +8 -12
  379. package/src/session-runtime/services/agent-tool/spawn-preset.mjs +7 -2
  380. package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
  381. package/src/session-runtime/services/agent-tool/worker-index/awaiting-user-sync.mjs +51 -0
  382. package/src/session-runtime/services/agent-tool/worker-index/disposal.mjs +55 -0
  383. package/src/session-runtime/services/agent-tool/worker-index/released-store.mjs +123 -0
  384. package/src/session-runtime/services/agent-tool/worker-index/restart-settlement.mjs +112 -0
  385. package/src/session-runtime/services/agent-tool/worker-index/row-reads.mjs +36 -0
  386. package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -0
  387. package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +17 -4
  388. package/src/session-runtime/services/agent-tool/worker-index/row-writes.mjs +58 -0
  389. package/src/session-runtime/services/agent-tool/worker-index.mjs +41 -241
  390. package/src/session-runtime/services/agent-tool/worker-rows.mjs +3 -0
  391. package/src/session-runtime/services/channel-admin.mjs +73 -31
  392. package/src/session-runtime/services/channel-session-router.mjs +4 -2
  393. package/src/session-runtime/services/channel-worker.mjs +1 -1
  394. package/src/session-runtime/services/provider-admin.mjs +128 -25
  395. package/src/session-runtime/services/schedule-access.mjs +14 -0
  396. package/src/session-runtime/services/seeds.mjs +0 -28
  397. package/src/session-runtime/services/usage-dashboard-model.mjs +1 -0
  398. package/src/session-runtime/session-compaction-sync.mjs +27 -0
  399. package/src/session-runtime/session-create/session-options.mjs +8 -4
  400. package/src/session-runtime/settings-builtin-tools-api.mjs +11 -0
  401. package/src/session-runtime/settings-compaction-api.mjs +2 -40
  402. package/src/session-runtime/settings-system-api.mjs +28 -1
  403. package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
  404. package/src/session-runtime/setup-tool/executor.mjs +187 -29
  405. package/src/session-runtime/setup-tool/extended-actions.mjs +33 -2
  406. package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
  407. package/src/session-runtime/setup-tool/settings-contract.mjs +68 -6
  408. package/src/session-runtime/setup-tool/tool-defs.mjs +92 -6
  409. package/src/session-runtime/task-session-route.mjs +99 -0
  410. package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
  411. package/src/session-runtime/tool-policy/policy-stage.mjs +21 -4
  412. package/src/session-runtime/tool-policy/surface-helpers.mjs +2 -3
  413. package/src/session-runtime/tool-surface.mjs +4 -0
  414. package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
  415. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +98 -21
  416. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
  417. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +6 -1
  418. package/src/session-runtime/workspace/transitions.mjs +10 -2
  419. package/src/standalone/channel-transport/client-registry/client-records.mjs +65 -0
  420. package/src/standalone/channel-transport/client-registry/client-registration.mjs +118 -0
  421. package/src/standalone/channel-transport/client-registry.mjs +24 -163
  422. package/src/standalone/channel-transport.mjs +1 -1
  423. package/src/standalone/daemon-channels-loader.mjs +10 -8
  424. package/src/standalone/daemon-session-control/list-page.mjs +72 -0
  425. package/src/standalone/daemon-session-control/request.mjs +51 -0
  426. package/src/standalone/daemon-session-control/room-host.mjs +57 -0
  427. package/src/standalone/daemon-session-control/route-control.mjs +48 -0
  428. package/src/standalone/daemon-session-control/send-turn.mjs +60 -0
  429. package/src/standalone/daemon-session-control/worktree-control.mjs +40 -0
  430. package/src/standalone/daemon-session-control.mjs +161 -157
  431. package/src/standalone/daemon.mjs +33 -2
  432. package/src/standalone/session-client.mjs +7 -3
  433. package/src/standalone/session-protocol.mjs +10 -0
  434. package/src/standalone/session-service/agent-tree/agent-cancel.mjs +6 -2
  435. package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
  436. package/src/standalone/session-service/quota-resume.mjs +3 -0
  437. package/src/standalone/session-service/retention/busy.mjs +65 -1
  438. package/src/standalone/session-service/session-calls/session-action.mjs +23 -2
  439. package/src/standalone/session-service/session-calls/session-turns.mjs +6 -0
  440. package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
  441. package/src/standalone/session-service.mjs +13 -0
  442. package/src/standalone/session-tool-output.mjs +21 -10
  443. package/src/tui/app/model-options.mjs +4 -27
  444. package/src/tui/dist/index.mjs +81 -65
  445. package/src/tui/session/agent-job-feed/model-notification.mjs +3 -0
  446. package/src/tui/session/initial-state.mjs +3 -0
  447. package/src/tui/session/notice-surface.mjs +23 -1
  448. package/src/tui/session/queue-helpers.mjs +3 -42
  449. package/src/tui/session/session-api/integrations.mjs +1 -0
  450. package/src/tui/session/session-api/lifecycle.mjs +8 -0
  451. package/src/tui/session/session-api/routes-agent-definitions.mjs +14 -2
  452. package/src/tui/session/session-api/routes-write.mjs +5 -1
  453. package/src/tui/session/session-api/routes.mjs +1 -0
  454. package/src/tui/session/session-api/settings.mjs +30 -2
  455. package/src/tui/session/session-flow/auto-clear.mjs +4 -33
  456. package/src/tui/session/session-flow/drain-closed-queue.mjs +38 -0
  457. package/src/tui/session/session-flow/drain-enqueue.mjs +86 -0
  458. package/src/tui/session/session-flow/drain-retry.mjs +35 -0
  459. package/src/tui/session/session-flow/drain.mjs +118 -149
  460. package/src/tui/session/session-flow/queue/entry-shape.mjs +5 -0
  461. package/src/tui/session/session-flow/queue/take-entries.mjs +5 -2
  462. package/src/tui/session/tool-approval-delegation.mjs +64 -0
  463. package/src/tui/session/tool-approval-request.mjs +39 -0
  464. package/src/tui/session/tool-approval-settle.mjs +62 -0
  465. package/src/tui/session/tool-approval.mjs +69 -115
  466. package/src/tui/session/tui-steering-persist.mjs +8 -1
  467. package/src/tui/session/turn-stream.mjs +36 -3
  468. package/src/tui/session/turn.mjs +23 -2
  469. package/src/vendor/statusline/bin/statusline-route.mjs +1 -219
  470. package/src/vendor/statusline/src/gateway/route-meta.mjs +35 -13
  471. package/scripts/code-graph-description-contract.mjs +0 -188
  472. package/src/runtime/channels/lib/owned-runtime/ownership-refresh.mjs +0 -36
@@ -267,17 +267,6 @@ export async function prewarmOwnerOnlyAclWin32({ bridge = true } = {}) {
267
267
  }
268
268
  }
269
269
 
270
- /** Test/diagnostic hook: whether a helper is attached, its requests awaiting
271
- * an answer, and the starts inside the current restart window. */
272
- export function ownerOnlyAclHelperStats() {
273
- return {
274
- alive: aclHelper !== null,
275
- pid: aclHelper?.child.pid ?? null,
276
- pending: aclHelper?.pending.size ?? 0,
277
- recentStarts: aclHelperStartTimes.length,
278
- };
279
- }
280
-
281
270
  /** Test hook: the live helper process, or null. */
282
271
  export function ownerOnlyAclHelperForTests() {
283
272
  return aclHelper?.child ?? null;
@@ -0,0 +1,19 @@
1
+ // Side-effect import for the git-heavy suites. Import it before anything that
2
+ // spawns git or snapshots process.env.
3
+ //
4
+ // On Windows `git` on PATH is usually Git for Windows' cmd\git.exe launcher,
5
+ // which starts the real git.exe as a second process, so every spawn pays two
6
+ // process creations (~75 ms instead of ~40 ms). These suites spawn hundreds of
7
+ // git processes, test and code under test alike (the git runner worker shares
8
+ // process.env), so the real binary's directory (`git --exec-path`, where git
9
+ // itself resolves its subcommands) goes first on PATH. Same git, same config;
10
+ // only the launcher hop is skipped. Elsewhere `git` already is the binary.
11
+ import { spawnSync } from 'node:child_process';
12
+ import { existsSync } from 'node:fs';
13
+ import { delimiter, join, normalize } from 'node:path';
14
+
15
+ if (process.platform === 'win32') {
16
+ const probe = spawnSync('git', ['--exec-path'], { encoding: 'utf8', windowsHide: true });
17
+ const dir = probe.status === 0 ? normalize(probe.stdout.trim()) : '';
18
+ if (dir && existsSync(join(dir, 'git.exe'))) process.env.PATH = `${dir}${delimiter}${process.env.PATH}`;
19
+ }
@@ -0,0 +1,4 @@
1
+ {
2
+ "clientId": "187841207053-o7jhqbnjjh99kfio1fgs7422m540q75m.apps.googleusercontent.com",
3
+ "clientSecret": "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"
4
+ }
@@ -6,18 +6,43 @@
6
6
  // uses PKCE (S256), state and a loopback redirect
7
7
  // (developers.google.com/identity/protocols/oauth2/native-app).
8
8
  //
9
- // The values come only from the environment; the source ships none, so a
10
- // build without them offers no built-in Google sign-in (the user's own
11
- // Google client still works).
9
+ // The source ships no client. The values come from the environment first
10
+ // (MIXDOG_GOOGLE_OAUTH_CLIENT_ID / _SECRET: a developer's override, and what
11
+ // `npm run dev:isolated` passes through), then from the generated, gitignored
12
+ // google-oauth-client.generated.json beside this file. Release packaging
13
+ // writes that file from the repository secrets
14
+ // (scripts/embed-google-oauth-client.mjs) before the npm package and every
15
+ // desktop runtime.asar are built, so each shipped build carries it. A build
16
+ // with neither offers no built-in Google sign-in (the user's own Google
17
+ // client still works).
12
18
 
13
- const value = (name) => String(process.env[name] || '').trim();
19
+ import { readFileSync } from 'node:fs';
20
+ import { fileURLToPath } from 'node:url';
21
+
22
+ /** The generated file release packaging writes (see the header). */
23
+ export const GOOGLE_OAUTH_CLIENT_FILE = fileURLToPath(new URL('./google-oauth-client.generated.json', import.meta.url));
24
+
25
+ const text = (value) => String(value || '').trim();
26
+
27
+ function embeddedClient(file) {
28
+ let source;
29
+ try {
30
+ source = readFileSync(file, 'utf8');
31
+ } catch (error) {
32
+ if (error?.code === 'ENOENT') return null;
33
+ throw error;
34
+ }
35
+ const { clientId, clientSecret } = JSON.parse(source);
36
+ return text(clientId) ? { clientId: text(clientId), clientSecret: text(clientSecret) } : null;
37
+ }
14
38
 
15
39
  /** `{ clientId, clientSecret }` of Mixdog's Google client, or null when this
16
- * build has none. */
17
- export function googleOAuthClient() {
18
- const clientId = value('MIXDOG_GOOGLE_OAUTH_CLIENT_ID');
19
- if (!clientId) return null;
20
- return { clientId, clientSecret: value('MIXDOG_GOOGLE_OAUTH_CLIENT_SECRET') };
40
+ * build has none. The environment wins over the generated file as a whole:
41
+ * the two are never mixed. */
42
+ export function googleOAuthClient({ env = process.env, file = GOOGLE_OAUTH_CLIENT_FILE } = {}) {
43
+ const clientId = text(env.MIXDOG_GOOGLE_OAUTH_CLIENT_ID);
44
+ if (clientId) return { clientId, clientSecret: text(env.MIXDOG_GOOGLE_OAUTH_CLIENT_SECRET) };
45
+ return embeddedClient(file);
21
46
  }
22
47
 
23
48
  /** Google issues a refresh token only for `access_type=offline`. */
@@ -0,0 +1,4 @@
1
+ export const HEARTBEAT_INTERVAL_CHOICES: readonly number[];
2
+ export const DEFAULT_HEARTBEAT_INTERVAL_MINUTES: number;
3
+ export function normalizeHeartbeatIntervalMinutes(value: unknown): number;
4
+ export function requireHeartbeatIntervalMinutes(value: unknown): number;
@@ -0,0 +1,19 @@
1
+ // Mixy's heartbeat interval setting (`heartbeatIntervalMinutes` in the config):
2
+ // one of a few fixed choices, shared by the runtime, the desktop's IPC check
3
+ // and the Settings picker. "Off" is the separate `heartbeat` switch.
4
+ export const HEARTBEAT_INTERVAL_CHOICES = Object.freeze([30, 60, 120, 240]);
5
+ export const DEFAULT_HEARTBEAT_INTERVAL_MINUTES = 60;
6
+
7
+ /** `value` when it is one of the choices, else the default (a stored value
8
+ * that is no longer, or never was, a choice reads as the default). */
9
+ export function normalizeHeartbeatIntervalMinutes(value) {
10
+ return HEARTBEAT_INTERVAL_CHOICES.includes(value) ? value : DEFAULT_HEARTBEAT_INTERVAL_MINUTES;
11
+ }
12
+
13
+ /** `value` when it is one of the choices; throws otherwise (a write). */
14
+ export function requireHeartbeatIntervalMinutes(value) {
15
+ if (!HEARTBEAT_INTERVAL_CHOICES.includes(value)) {
16
+ throw new Error(`heartbeat interval must be one of ${HEARTBEAT_INTERVAL_CHOICES.join(', ')} minutes`);
17
+ }
18
+ return value;
19
+ }
@@ -0,0 +1,104 @@
1
+ // idle-auto-clear-gate.mjs — the idle auto-clear predicate, shared by the
2
+ // submit gate (tui/session/session-flow/auto-clear.mjs); the cache warmer
3
+ // (agent/orchestrator/session/cache-warm.mjs) registers its successful warms,
4
+ // which count as cache use (sessionActivityTimestamp). A thread is cleared before
5
+ // a submit when auto-clear is on, it has been idle for at least the window
6
+ // since its activity timestamp, and its context is not below the minimum
7
+ // share of the compaction trigger.
8
+ import { attachmentTextForPart, isAttachmentReference } from '../attachments/store.mjs';
9
+
10
+ export function promptContentText(content) {
11
+ if (typeof content === 'string') return content;
12
+ if (Array.isArray(content)) {
13
+ return content
14
+ .map((part) => {
15
+ if (typeof part === 'string') return part;
16
+ if (part?.type === 'text') return isAttachmentReference(part) ? attachmentTextForPart(part) : part.text || '';
17
+ if (part?.type === 'image') return '[Image]';
18
+ if (part?.type === 'file') return '[File]';
19
+ return part?.text || '';
20
+ })
21
+ .filter(Boolean)
22
+ .join('\n');
23
+ }
24
+ return String(content ?? '');
25
+ }
26
+
27
+ function timestampMs(value) {
28
+ if (value == null || value === '') return 0;
29
+ const n = Number(value);
30
+ if (Number.isFinite(n) && n > 0) return n;
31
+ const parsed = Date.parse(String(value));
32
+ return Number.isFinite(parsed) && parsed > 0 ? parsed : 0;
33
+ }
34
+
35
+ function hasModelVisibleConversation(session) {
36
+ const messages = Array.isArray(session?.messages) ? session.messages : [];
37
+ return messages.some((message) => {
38
+ const role = message?.role;
39
+ if (role !== 'user' && role !== 'assistant' && role !== 'tool') return false;
40
+ const text = promptContentText(message.content).trim();
41
+ if (role === 'user' && text.startsWith('<system-reminder>')) return false;
42
+ if (role === 'assistant' && text === '.' && !Array.isArray(message.toolCalls)) return false;
43
+ return !!text || role === 'assistant' || role === 'tool';
44
+ });
45
+ }
46
+
47
+ // When a session's prompt cache was last used by a successful cache warm (a
48
+ // read with no write), registered by the warmer (cache-warm.mjs, from its
49
+ // durable touch store); 0 when none.
50
+ let lastCacheWarmUse = () => 0;
51
+
52
+ /** Register the source of a session's last successful cache-warm use
53
+ * (`(sessionId) => epoch ms | 0`); null restores none. */
54
+ export function setCacheWarmUseSource(source) {
55
+ lastCacheWarmUse = typeof source === 'function' ? source : () => 0;
56
+ }
57
+
58
+ /**
59
+ * When the session was last active (0: no model-visible conversation): the
60
+ * latest of its own activity and the last successful cache warm. Idleness is
61
+ * measured from the last time the cached prompt was actually used, and a warm
62
+ * that read the cache without writing used it; the session's own timestamps
63
+ * are never moved.
64
+ */
65
+ export function sessionActivityTimestamp(session, fallback = 0) {
66
+ if (!hasModelVisibleConversation(session)) return 0;
67
+ const own = timestampMs(session?.lastUsedAt) || timestampMs(session?.updatedAt) || timestampMs(fallback);
68
+ return Math.max(own, timestampMs(lastCacheWarmUse(session?.id)));
69
+ }
70
+
71
+ // A zero is often an unavailable/stale meter field, not an authoritative
72
+ // measurement. Do not let it mask the sibling live estimate.
73
+ function contextUsageBelowThreshold(runtime, minContextPercent) {
74
+ if (!(minContextPercent > 0)) return false;
75
+ const status = runtime.contextStatus?.() || null;
76
+ const usedTokens = Math.max(
77
+ 0,
78
+ Number(status?.usedTokens) || 0,
79
+ Number(status?.currentEstimatedTokens) || 0,
80
+ Number(status?.compaction?.currentEstimatedTokens) || 0
81
+ );
82
+ const triggerTokens = Number(
83
+ status?.compaction?.triggerTokens ||
84
+ status?.compaction?.autoCompactTokenLimit ||
85
+ runtime.session?.autoCompactTokenLimit ||
86
+ 0
87
+ );
88
+ if (!Number.isFinite(usedTokens) || !Number.isFinite(triggerTokens) || !(usedTokens > 0 && triggerTokens > 0)) {
89
+ return true;
90
+ }
91
+ return (usedTokens / triggerTokens) * 100 < minContextPercent;
92
+ }
93
+
94
+ /**
95
+ * Whether the idle gate clears the thread before a submit at `at`: `cfg` is
96
+ * the auto-clear state (`enabled`, `idleMs`, `minContextPercent`), the
97
+ * activity is `activityAt` (sessionActivityTimestamp) and `runtime` answers
98
+ * `contextStatus()` for the thread. The submit gate adds its own transient
99
+ * conditions (busy, queued input, a clear already running).
100
+ */
101
+ export function idleAutoClearDue({ cfg, activityAt, at, runtime }) {
102
+ if (!cfg?.enabled || !activityAt || at - activityAt < cfg.idleMs) return false;
103
+ return !contextUsageBelowThreshold(runtime, Number(cfg.minContextPercent ?? 10));
104
+ }
@@ -7,6 +7,9 @@ const FAST_MODE_BETA_HEADER = 'fast-mode-2026-02-01';
7
7
  const TOOL_SEARCH_BETA_HEADER = 'advanced-tool-use-2025-11-20';
8
8
  const THINKING_DISPLAY_UPDATES_BETA_HEADER = 'thinking-display-updates-2026-08-18';
9
9
  export const SERVER_SIDE_FALLBACK_BETA_HEADER = 'server-side-fallback-2026-07-01';
10
+ // Turn-scoped mid-conversation system messages (clear_at), sent only when the
11
+ // request body carries one.
12
+ export const TURN_SCOPED_SYSTEM_BETA_HEADER = 'mid-conversation-system-clear-at-2026-08-21';
10
13
 
11
14
  // Fast mode ships on Opus 5.5, Opus 5 and Opus 4.8 only. Opus 4.7 rejects
12
15
  // `speed: "fast"` and Opus 4.6 silently runs at standard speed.
@@ -28,6 +31,7 @@ export function buildAnthropicBetaHeaders({
28
31
  effort = false,
29
32
  serverFallback = false,
30
33
  thinkingDisplayUpdates = false,
34
+ turnScopedSystem = false,
31
35
  } = {}) {
32
36
  const headers = String(base || '')
33
37
  .split(',')
@@ -48,5 +52,8 @@ export function buildAnthropicBetaHeaders({
48
52
  if (thinkingDisplayUpdates && !headers.includes(THINKING_DISPLAY_UPDATES_BETA_HEADER)) {
49
53
  headers.push(THINKING_DISPLAY_UPDATES_BETA_HEADER);
50
54
  }
55
+ if (turnScopedSystem && !headers.includes(TURN_SCOPED_SYSTEM_BETA_HEADER)) {
56
+ headers.push(TURN_SCOPED_SYSTEM_BETA_HEADER);
57
+ }
51
58
  return headers.join(',');
52
59
  }
@@ -63,3 +63,15 @@ export function emitsAnthropicProgressUpdates(model) {
63
63
  const id = normalizeClaudeModelId(model);
64
64
  return /^claude-(?:opus-5-5|sonnet-5-5|fable-5-1|mythos-5-1|fable-5)(?:-\d{8})?$/.test(id);
65
65
  }
66
+
67
+ // Models that accept turn-scoped mid-conversation system messages
68
+ // ({role:'system', clear_at:'next_user_message'}, beta
69
+ // mid-conversation-system-clear-at-2026-08-21). An id list for the same
70
+ // reason as above: a wrong "yes" is a 400 on every request, a wrong "no" only
71
+ // keeps the legacy tail-reminder layout — so unknown ids stay off.
72
+ export function supportsAnthropicTurnScopedSystemMessages(model) {
73
+ const id = normalizeClaudeModelId(model);
74
+ return /^claude-(?:fable-5-1|mythos-5-1|fable-5|mythos-5|opus-5-5|opus-5|opus-4-8|sonnet-5-5|haiku-5-5)(?:-\d{8})?$/.test(
75
+ id
76
+ );
77
+ }
@@ -92,6 +92,7 @@ const PROVIDER_CATALOGS = Object.freeze({
92
92
  rosterLimitsAuthoritative: true,
93
93
  },
94
94
  'cursor-oauth': { relay: true },
95
+ 'devin-oauth': { relay: true },
95
96
  'cursor-api': { relay: true },
96
97
  // The models.dev listing id of the Go gateway: a relay catalog, not a
97
98
  // selectable provider (the model lookup needs it flagged as a relay).
@@ -22,7 +22,7 @@ export function usageRollupDayKey(ts) {
22
22
  // background runners. An unknown source counts as conversation on purpose: a
23
23
  // new runner showing up in the user's totals is visible and correctable, while
24
24
  // silently dropping the user's own turns is neither.
25
- const BACKGROUND_SOURCES = new Set(['memory-cycle', 'schedule', 'webhook', 'native-web-search']);
25
+ const BACKGROUND_SOURCES = new Set(['memory-cycle', 'schedule', 'webhook', 'native-web-search', 'cache-warm']);
26
26
 
27
27
  export function isConversationUsageSource(sourceType) {
28
28
  const id = typeof sourceType === 'string' ? sourceType.trim().toLowerCase() : '';
@@ -0,0 +1,66 @@
1
+ /**
2
+ * Outgoing-request surrogate sanitizer.
3
+ *
4
+ * A lone UTF-16 surrogate (half of an emoji left by a char-count cut, or
5
+ * carried by tool output / file content) is serialized by JSON.stringify as a
6
+ * `\ud83d` escape that provider APIs reject ("not valid JSON"). This rewrites
7
+ * every string value and every object key to well-formed text (lone surrogate
8
+ * -> U+FFFD) in the request that is about to be sent.
9
+ *
10
+ * Copy-on-write: a request that is already well-formed is returned as the very
11
+ * same object (no allocation, identity kept for caches keyed on messages or
12
+ * tool lists). Only the containers on the path to a bad string are copied; the
13
+ * stored transcript is never mutated. Only arrays and plain objects are
14
+ * walked: Buffer / Uint8Array / ArrayBuffer and any other class instance are
15
+ * binary or opaque payloads and are returned untouched. Own symbol properties
16
+ * (e.g. the provider-native tool prefix count on a tool list) survive a copy.
17
+ */
18
+ function copySymbols(target, source) {
19
+ for (const symbol of Object.getOwnPropertySymbols(source)) {
20
+ Object.defineProperty(target, symbol, Object.getOwnPropertyDescriptor(source, symbol));
21
+ }
22
+ return target;
23
+ }
24
+
25
+ function setOwn(target, key, value) {
26
+ Object.defineProperty(target, key, { value, enumerable: true, writable: true, configurable: true });
27
+ }
28
+
29
+ function walk(value, active) {
30
+ if (typeof value === 'string') return value.isWellFormed() ? value : value.toWellFormed();
31
+ if (value === null || typeof value !== 'object' || active.has(value)) return value;
32
+ if (Array.isArray(value)) {
33
+ active.add(value);
34
+ let out = null;
35
+ for (let i = 0; i < value.length; i += 1) {
36
+ const next = walk(value[i], active);
37
+ if (!out && next !== value[i]) out = value.slice();
38
+ if (out) out[i] = next;
39
+ }
40
+ active.delete(value);
41
+ return out ? copySymbols(out, value) : value;
42
+ }
43
+ const proto = Object.getPrototypeOf(value);
44
+ if (proto !== Object.prototype && proto !== null) return value;
45
+ active.add(value);
46
+ const keys = Object.keys(value);
47
+ let out = null;
48
+ for (let i = 0; i < keys.length; i += 1) {
49
+ const key = keys[i];
50
+ const entry = value[key];
51
+ const nextKey = key.isWellFormed() ? key : key.toWellFormed();
52
+ const nextEntry = walk(entry, active);
53
+ if (!out && (nextKey !== key || nextEntry !== entry)) {
54
+ out = Object.create(proto);
55
+ for (let j = 0; j < i; j += 1) setOwn(out, keys[j], value[keys[j]]);
56
+ }
57
+ if (out) setOwn(out, nextKey, nextEntry);
58
+ }
59
+ active.delete(value);
60
+ return out ? copySymbols(out, value) : value;
61
+ }
62
+
63
+ /** `value` with every string and object key made well-formed; `value` itself when it already is. */
64
+ export function sanitizeSurrogates(value) {
65
+ return walk(value, new WeakSet());
66
+ }
@@ -0,0 +1,22 @@
1
+ // Whether the representative bot (Mixy) exists: the one rule. The desktop
2
+ // answers from it (getLeadStatus `exists`, main/mixy-first.ts), and so do
3
+ // Mixy's routines (routine-owner.mjs `no-mixy`), her heartbeat and the
4
+ // heartbeat reports queued for her chat (mixy-heartbeat.mjs,
5
+ // agent-home-delivery.mjs), all through routine-owner.mjs readMixyExists.
6
+ //
7
+ // `created: false` (Mixy's agent.json) is no. Otherwise she exists on
8
+ // evidence that the user made or uses her:
9
+ // - a name (the 대표 에이전트 dialog always sets one; her profile can);
10
+ // - a message the user wrote in her thread (`homeChatted`,
11
+ // agent-kind.mjs homeThreadEvidence);
12
+ // - a schedule or webhook she owns (`ownsRoutines`): the user set it up,
13
+ // and since v1.3.0 it ran for her whether or not she was named.
14
+ // Without any of them she does not exist: v1.3.0's untouched automatic
15
+ // `{"created": true}`, and an undecided profile (`created` null). Her own
16
+ // posts in her thread, heartbeat reports and routine results, are no
17
+ // evidence. `ownsRoutines` is read only when nothing else decides.
18
+ export async function mixyExists(status, ownsRoutines) {
19
+ if (status?.created === false) return false;
20
+ if (String(status?.name ?? '').trim() || status?.homeChatted === true) return true;
21
+ return (await ownsRoutines()) === true;
22
+ }
@@ -0,0 +1,2 @@
1
+ export type OrchestrationMode = 'none' | 'focused' | 'balanced' | 'swarm';
2
+ export function configuredOrchestrationMode(config: unknown): OrchestrationMode;
@@ -1,21 +1,32 @@
1
- /** Lazy per-dataDir PG handle: one in-flight init, bootstrap lock, retry after failure. */
1
+ import { createSharedAbortable } from './abort-race.mjs';
2
+
3
+ /** Lazy per-dataDir PG handle: one in-flight init, bootstrap lock, retry after
4
+ * failure. `signal` withdraws a caller; the init (a PG runtime install
5
+ * included) is cancelled once every caller has (createSharedAbortable). */
2
6
  export function createPgSchemaDb({ schema, ddl, defaultDataDir, ensurePg, withLock }) {
3
7
  const ready = new Map();
4
- return async function getDb(dataDir = defaultDataDir()) {
5
- if (ready.has(dataDir)) return ready.get(dataDir);
6
- const p = (async () => {
7
- const { db, pool } = await ensurePg(dataDir, { schema });
8
- // Serialize CREATE TABLE across concurrent first-boot processes on the
9
- // same cluster-global advisory lock the adapter uses for schema bootstrap.
10
- await withLock(pool, () => db.exec(ddl));
11
- return db;
12
- })();
13
- ready.set(dataDir, p);
14
- try {
15
- return await p;
16
- } catch (err) {
17
- ready.delete(dataDir); // let the next call retry after a transient failure
18
- throw err;
8
+ return function getDb(dataDir = defaultDataDir(), { signal = null } = {}) {
9
+ let shared = ready.get(dataDir);
10
+ if (!shared) {
11
+ const entry = createSharedAbortable(
12
+ async (initSignal) => {
13
+ const { db, pool } = await ensurePg(dataDir, { schema, signal: initSignal });
14
+ initSignal.throwIfAborted();
15
+ // Serialize CREATE TABLE across concurrent first-boot processes on the
16
+ // same cluster-global advisory lock the adapter uses for schema bootstrap.
17
+ await withLock(pool, () => db.exec(ddl));
18
+ return db;
19
+ },
20
+ {
21
+ // Let the next call retry after a transient failure or a cancellation.
22
+ onSettled: (failed) => {
23
+ if (failed && ready.get(dataDir) === entry) ready.delete(dataDir);
24
+ },
25
+ }
26
+ );
27
+ shared = entry;
28
+ ready.set(dataDir, entry);
19
29
  }
30
+ return shared.join(signal);
20
31
  };
21
32
  }
@@ -5,7 +5,7 @@
5
5
  const PROFILE_LANGUAGES = Object.freeze([
6
6
  { id: 'system', label: 'System (locale)', prompt: null },
7
7
  { id: 'en', label: 'English', prompt: 'English' },
8
- { id: 'ko', label: 'Korean', prompt: 'Korean' },
8
+ { id: 'ko', label: '한국어', prompt: 'Korean' },
9
9
  { id: 'ja', label: '日本語', prompt: 'Japanese (日本語)' },
10
10
  { id: 'zh-Hans', label: '中文(简体)', prompt: 'Simplified Chinese (简体中文)' },
11
11
  { id: 'zh-Hant', label: '中文(繁體)', prompt: 'Traditional Chinese (繁體中文)' },
@@ -0,0 +1,4 @@
1
+ export declare const PROMPT_ORIGIN_CHANNEL: 'channel';
2
+ export declare const PROMPT_ORIGIN_AGENT_REPORT: 'agent-report';
3
+ export type PromptOrigin = typeof PROMPT_ORIGIN_CHANNEL | typeof PROMPT_ORIGIN_AGENT_REPORT;
4
+ export declare function promptOriginOf(value: unknown): PromptOrigin | null;
@@ -0,0 +1,21 @@
1
+ // A submitted prompt's provenance, carried apart from its presentation mode
2
+ // (`origin` on the submit options, the queue entry, the turn input and the
3
+ // stored user message's meta). Dependency-free: the desktop main process
4
+ // stamps it too (agent-room-turn.ts).
5
+
6
+ /** Real external activity presented as a task notification: an inbound
7
+ * channel message (Discord, Telegram, webhook event rules …). */
8
+ export const PROMPT_ORIGIN_CHANNEL = 'channel';
9
+
10
+ /** A turn the runtime starts because another bot or agent reported back: a
11
+ * bot-home wake (daemon.mjs `wake`) or a group-room member's relay of its
12
+ * reported work (agent-room-turn.ts). System-caused, though presented as a
13
+ * prompt. */
14
+ export const PROMPT_ORIGIN_AGENT_REPORT = 'agent-report';
15
+
16
+ const KNOWN_ORIGINS = new Set([PROMPT_ORIGIN_CHANNEL, PROMPT_ORIGIN_AGENT_REPORT]);
17
+
18
+ /** `value` when it is a known provenance, else null. */
19
+ export function promptOriginOf(value) {
20
+ return KNOWN_ORIGINS.has(value) ? value : null;
21
+ }