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
@@ -0,0 +1,368 @@
1
+ // Schema-driven protobuf wire codec shared by the handwritten provider wires.
2
+ //
3
+ // A schema table maps message type names to `protobufFields([...])` rows of
4
+ // `[name, fieldNo, type, options]`. Types are scalars ('string', 'bytes',
5
+ // 'raw', 'bool', 'int', 'uint', 'double', 'float'), another message type name
6
+ // from the same table, or `mapOf(keyType, valueType)`. Options:
7
+ // repeated — the field is an array (numeric ones packed only when the
8
+ // codec is created with `packed: true`).
9
+ // presence — explicit presence (proto3 `optional` / oneof member): the value
10
+ // is written even when it equals the type default.
11
+ // 'int' covers int32/int64/enum (two's-complement varint); 'uint' covers
12
+ // uint32/uint64. Both decode to number.
13
+ // Width-specific varint types follow protobuf's per-width rules instead:
14
+ // 'int32' / 'enum' — integer number, truncated to 32 bits; decodes to number.
15
+ // 'uint32' — non-negative integer number, truncated to 32 bits; a
16
+ // varint longer than 5 bytes is rejected; decodes to number.
17
+ // 'int64' — bigint, integer number or decimal string, truncated to
18
+ // 64 bits; decodes to a signed bigint.
19
+ // 'uint64' — as int64 but negative input is rejected; decodes to an
20
+ // unsigned bigint.
21
+ // Decoded objects carry only fields seen on the wire, plus `$unknown` for
22
+ // unrecognised fields.
23
+
24
+ export function protobufFields(entries) {
25
+ return Object.fromEntries(entries.map(([name, no, type, options = {}]) => [no, { name, no, type, ...options }]));
26
+ }
27
+
28
+ export const mapOf = (key, value) => ({ map: [key, value] });
29
+ export const repeated = Object.freeze({ repeated: true });
30
+ export const presence = Object.freeze({ presence: true });
31
+
32
+ const textEncoder = new TextEncoder();
33
+ const WIDTH_TYPES = new Set(['int32', 'enum', 'uint32', 'int64', 'uint64']);
34
+ const PACKABLE_TYPES = new Set(['bool', 'int', 'uint', 'double', 'float', ...WIDTH_TYPES]);
35
+
36
+ export function concatBytes(parts) {
37
+ const length = parts.reduce((sum, part) => sum + part.length, 0);
38
+ const output = new Uint8Array(length);
39
+ let offset = 0;
40
+ for (const part of parts) {
41
+ output.set(part, offset);
42
+ offset += part.length;
43
+ }
44
+ return output;
45
+ }
46
+
47
+ export function encodeVarint(value) {
48
+ let current = BigInt(value ?? 0);
49
+ if (current < 0) current = BigInt.asUintN(64, current);
50
+ const bytes = [];
51
+ do {
52
+ let byte = Number(current & 0x7fn);
53
+ current >>= 7n;
54
+ if (current) byte |= 0x80;
55
+ bytes.push(byte);
56
+ } while (current);
57
+ return Uint8Array.from(bytes);
58
+ }
59
+
60
+ export function encodeTag(no, wireType) {
61
+ return encodeVarint((BigInt(no) << 3n) | BigInt(wireType));
62
+ }
63
+
64
+ function isDefaultScalar(value) {
65
+ if (value === 0 || value === 0n || value === false || value === '') return true;
66
+ return value instanceof Uint8Array && value.length === 0;
67
+ }
68
+
69
+ // `label` prefixes every error ("Cursor protobuf"). `strict` rejects wire-type
70
+ // mismatches, field number 0, malformed UTF-8, varints longer than 10 bytes and
71
+ // truncated fixed-width values instead of decoding them leniently.
72
+ // `omitDefaults` skips proto3 implicit-presence fields that hold their type
73
+ // default, which yields canonical proto3 bytes; repeated elements are always
74
+ // written, defaults included. `packed` encodes repeated numeric fields packed
75
+ // and decodes them from either packed or unpacked wire form.
76
+ export function createProtobufCodec(
77
+ schemas,
78
+ { label = 'protobuf', strict = false, omitDefaults = false, packed = false } = {}
79
+ ) {
80
+ // A protobuf string is data, not a text document with a disposable BOM.
81
+ const textDecoder = new TextDecoder('utf-8', { ignoreBOM: true, fatal: strict });
82
+
83
+ const isMessageType = (type) => typeof type === 'string' && Object.hasOwn(schemas, type);
84
+
85
+ function wireTypeFor(type) {
86
+ if (type === 'double') return 1;
87
+ if (type === 'float') return 5;
88
+ if (type?.map || ['string', 'bytes', 'raw'].includes(type) || isMessageType(type)) return 2;
89
+ return 0;
90
+ }
91
+
92
+ function scalarBytes(type, value) {
93
+ if (type === 'string') return textEncoder.encode(String(value));
94
+ if (type === 'bytes' || type === 'raw') return value instanceof Uint8Array ? value : new Uint8Array(value);
95
+ if (type === 'double' || type === 'float') {
96
+ const size = type === 'double' ? 8 : 4;
97
+ const buffer = new ArrayBuffer(size);
98
+ const view = new DataView(buffer);
99
+ if (size === 8) view.setFloat64(0, Number(value), true);
100
+ else view.setFloat32(0, Number(value), true);
101
+ return new Uint8Array(buffer);
102
+ }
103
+ if (type === 'bool') return encodeVarint(value ? 1 : 0);
104
+ if (type === 'int' || type === 'uint') return encodeVarint(value);
105
+ if (WIDTH_TYPES.has(type)) return encodeVarint(BigInt.asUintN(64, BigInt(widthValue(type, value))));
106
+ if (isMessageType(type)) return encodeMessage(type, value);
107
+ throw new Error(`Unknown ${label} type: ${type}`);
108
+ }
109
+
110
+ // Validated, width-truncated value of a width-specific varint field.
111
+ function widthValue(type, value) {
112
+ if (type === 'int64' || type === 'uint64') {
113
+ let big;
114
+ if (typeof value === 'bigint') big = value;
115
+ else if (typeof value === 'number' && Number.isInteger(value)) big = BigInt(value);
116
+ else if (typeof value === 'string') {
117
+ try {
118
+ big = BigInt(value);
119
+ } catch {
120
+ // Reported below with the field type.
121
+ }
122
+ }
123
+ if (big === undefined) throw new Error(`Invalid ${label} ${type} value: ${typeof value}`);
124
+ if (type === 'uint64' && big < 0n) throw new Error(`Invalid ${label} uint64 value: negative`);
125
+ return big;
126
+ }
127
+ if (typeof value !== 'number' || !Number.isInteger(value)) {
128
+ throw new Error(`Invalid ${label} ${type} value: ${typeof value}`);
129
+ }
130
+ if (type === 'uint32') {
131
+ if (value < 0) throw new Error(`Invalid ${label} uint32 value: negative`);
132
+ return value >>> 0;
133
+ }
134
+ return value | 0;
135
+ }
136
+
137
+ function shouldWrite(type, value) {
138
+ if (value == null) return false;
139
+ if (WIDTH_TYPES.has(type)) return !(omitDefaults && BigInt(widthValue(type, value)) === 0n);
140
+ if (type === 'string') return value !== '';
141
+ if (omitDefaults && !isMessageType(type)) return !isDefaultScalar(value);
142
+ return true;
143
+ }
144
+
145
+ function encodeField(no, type, value) {
146
+ const wireType = wireTypeFor(type);
147
+ const payload = scalarBytes(type, value);
148
+ if (wireType === 2) return concatBytes([encodeTag(no, wireType), encodeVarint(payload.length), payload]);
149
+ return concatBytes([encodeTag(no, wireType), payload]);
150
+ }
151
+
152
+ function encodeMapField(no, [keyType, valueType], value) {
153
+ const parts = [];
154
+ for (const [key, entryValue] of Object.entries(value || {})) {
155
+ const entry = concatBytes([encodeField(1, keyType, key), encodeField(2, valueType, entryValue)]);
156
+ parts.push(concatBytes([encodeTag(no, 2), encodeVarint(entry.length), entry]));
157
+ }
158
+ return parts;
159
+ }
160
+
161
+ function encodeMessage(type, value = {}) {
162
+ const schema = schemas[type];
163
+ if (!schema) throw new Error(`Unknown ${label} message: ${type}`);
164
+ const parts = [];
165
+ for (const descriptor of Object.values(schema)) {
166
+ const fieldValue = value[descriptor.name];
167
+ if (descriptor.type?.map) {
168
+ parts.push(...encodeMapField(descriptor.no, descriptor.type.map, fieldValue));
169
+ continue;
170
+ }
171
+ let values = [fieldValue];
172
+ if (descriptor.repeated) {
173
+ values = Array.isArray(fieldValue) ? fieldValue : [];
174
+ if (packed && PACKABLE_TYPES.has(descriptor.type)) {
175
+ if (values.length) {
176
+ const payload = concatBytes(values.map((item) => scalarBytes(descriptor.type, item)));
177
+ parts.push(concatBytes([encodeTag(descriptor.no, 2), encodeVarint(payload.length), payload]));
178
+ }
179
+ continue;
180
+ }
181
+ }
182
+ for (const item of values) {
183
+ // A oneof's explicit empty string is a value, not an absent field;
184
+ // canonical proto3 keeps every repeated element.
185
+ const explicit = descriptor.presence || (omitDefaults && descriptor.repeated);
186
+ if ((explicit && item != null) || shouldWrite(descriptor.type, item)) {
187
+ parts.push(encodeField(descriptor.no, descriptor.type, item));
188
+ }
189
+ }
190
+ }
191
+ return concatBytes(parts);
192
+ }
193
+
194
+ class ProtoReader {
195
+ constructor(bytes) {
196
+ this.bytes = bytes instanceof Uint8Array ? bytes : new Uint8Array(bytes);
197
+ this.offset = 0;
198
+ }
199
+
200
+ get done() {
201
+ return this.offset >= this.bytes.length;
202
+ }
203
+
204
+ varint() {
205
+ let value = 0n;
206
+ let shift = 0n;
207
+ while (!this.done) {
208
+ const byte = this.bytes[this.offset++];
209
+ value |= BigInt(byte & 0x7f) << shift;
210
+ if ((byte & 0x80) === 0) return value;
211
+ shift += 7n;
212
+ if (shift > (strict ? 63n : 70n)) throw new Error(`Invalid ${label} varint`);
213
+ }
214
+ throw new Error(`Truncated ${label} varint`);
215
+ }
216
+
217
+ // A 32-bit varint: at most 5 bytes, bits past 32 dropped.
218
+ varint32() {
219
+ let value = 0n;
220
+ for (let index = 0; index < 5; index++) {
221
+ if (this.done) throw new Error(`Truncated ${label} varint`);
222
+ const byte = this.bytes[this.offset++];
223
+ value |= BigInt(byte & 0x7f) << BigInt(7 * index);
224
+ if ((byte & 0x80) === 0) return Number(value & 0xffffffffn);
225
+ }
226
+ throw new Error(`Invalid ${label} 32-bit varint`);
227
+ }
228
+
229
+ take(length) {
230
+ const end = this.offset + length;
231
+ if (end > this.bytes.length) throw new Error(`Truncated ${label} field`);
232
+ const value = this.bytes.subarray(this.offset, end);
233
+ this.offset = end;
234
+ return value;
235
+ }
236
+
237
+ bytesValue() {
238
+ return this.take(Number(this.varint()));
239
+ }
240
+
241
+ skip(wireType) {
242
+ if (wireType === 0) this.varint();
243
+ else if (wireType === 1) this.take(8);
244
+ else if (wireType === 2) this.bytesValue();
245
+ else if (wireType === 5) this.take(4);
246
+ else throw new Error(`Unsupported ${label} wire type: ${wireType}`);
247
+ }
248
+ }
249
+
250
+ function decodeString(bytes) {
251
+ try {
252
+ return textDecoder.decode(bytes);
253
+ } catch (error) {
254
+ throw new Error(`Invalid ${label} UTF-8 string`, { cause: error });
255
+ }
256
+ }
257
+
258
+ function decodeScalar(reader, type, wireType) {
259
+ if (type === 'string') return decodeString(reader.bytesValue());
260
+ if (type === 'bytes' || type === 'raw') return new Uint8Array(reader.bytesValue());
261
+ if (type === 'double') {
262
+ if (wireType !== 1) throw new Error(`Invalid ${label} double`);
263
+ if (strict) {
264
+ const bytes = reader.take(8);
265
+ return new DataView(bytes.buffer, bytes.byteOffset, 8).getFloat64(0, true);
266
+ }
267
+ // Lenient read: the view is bounded by the backing buffer only.
268
+ const value = new DataView(reader.bytes.buffer, reader.bytes.byteOffset + reader.offset, 8).getFloat64(0, true);
269
+ reader.offset += 8;
270
+ return value;
271
+ }
272
+ if (type === 'float') {
273
+ if (wireType !== 5) throw new Error(`Invalid ${label} float`);
274
+ const bytes = reader.take(4);
275
+ return new DataView(bytes.buffer, bytes.byteOffset, 4).getFloat32(0, true);
276
+ }
277
+ if (type === 'bool') return reader.varint() !== 0n;
278
+ if (type === 'int') return Number(BigInt.asIntN(64, reader.varint()));
279
+ if (type === 'uint') return Number(reader.varint());
280
+ if (type === 'int32' || type === 'enum') return Number(BigInt.asIntN(32, reader.varint()));
281
+ if (type === 'uint32') return reader.varint32();
282
+ if (type === 'int64') return BigInt.asIntN(64, reader.varint());
283
+ if (type === 'uint64') return BigInt.asUintN(64, reader.varint());
284
+ if (isMessageType(type)) return decodeMessage(type, reader.bytesValue());
285
+ throw new Error(`Unknown ${label} type: ${type}`);
286
+ }
287
+
288
+ function checkWireType(descriptorName, type, wireType) {
289
+ if (strict && wireType !== wireTypeFor(type)) {
290
+ throw new Error(`Invalid ${label} wire type ${wireType} for ${descriptorName}`);
291
+ }
292
+ }
293
+
294
+ function decodeMapEntry(bytes, [keyType, valueType]) {
295
+ const reader = new ProtoReader(bytes);
296
+ let key = '';
297
+ let value = valueType === 'string' ? '' : undefined;
298
+ while (!reader.done) {
299
+ const tag = reader.varint();
300
+ const no = Number(tag >> 3n);
301
+ const wireType = Number(tag & 7n);
302
+ if (no === 1) {
303
+ checkWireType('map key', keyType, wireType);
304
+ key = decodeScalar(reader, keyType, wireType);
305
+ } else if (no === 2) {
306
+ checkWireType('map value', valueType, wireType);
307
+ value = decodeScalar(reader, valueType, wireType);
308
+ } else reader.skip(wireType);
309
+ }
310
+ return [String(key), value];
311
+ }
312
+
313
+ function decodePacked(bytes, type) {
314
+ const reader = new ProtoReader(bytes);
315
+ const wireType = wireTypeFor(type);
316
+ const values = [];
317
+ while (!reader.done) values.push(decodeScalar(reader, type, wireType));
318
+ return values;
319
+ }
320
+
321
+ function decodeMessage(type, bytes) {
322
+ const schema = schemas[type];
323
+ if (!schema) throw new Error(`Unknown ${label} message: ${type}`);
324
+ const reader = new ProtoReader(bytes);
325
+ const output = {};
326
+ while (!reader.done) {
327
+ const tag = reader.varint();
328
+ const no = Number(tag >> 3n);
329
+ const wireType = Number(tag & 7n);
330
+ if (strict && no === 0) throw new Error(`Invalid ${label} field number 0`);
331
+ const descriptor = schema[no];
332
+ if (!descriptor) {
333
+ const start = reader.offset;
334
+ reader.skip(wireType);
335
+ output.$unknown ||= [];
336
+ output.$unknown.push({
337
+ no,
338
+ wireType,
339
+ data: new Uint8Array(reader.bytes.subarray(start, reader.offset)),
340
+ });
341
+ continue;
342
+ }
343
+ if (descriptor.type?.map) {
344
+ checkWireType(descriptor.name, descriptor.type, wireType);
345
+ const [key, value] = decodeMapEntry(reader.bytesValue(), descriptor.type.map);
346
+ output[descriptor.name] ||= {};
347
+ output[descriptor.name][key] = value;
348
+ continue;
349
+ }
350
+ if (packed && descriptor.repeated && wireType === 2 && PACKABLE_TYPES.has(descriptor.type)) {
351
+ output[descriptor.name] ||= [];
352
+ output[descriptor.name].push(...decodePacked(reader.bytesValue(), descriptor.type));
353
+ continue;
354
+ }
355
+ checkWireType(descriptor.name, descriptor.type, wireType);
356
+ const value = decodeScalar(reader, descriptor.type, wireType);
357
+ if (descriptor.repeated) {
358
+ output[descriptor.name] ||= [];
359
+ output[descriptor.name].push(value);
360
+ } else {
361
+ output[descriptor.name] = value;
362
+ }
363
+ }
364
+ return output;
365
+ }
366
+
367
+ return { encodeMessage, decodeMessage, encodeField, ProtoReader };
368
+ }
@@ -8,9 +8,9 @@ export const ASK_USER_TOOL_DEFS = Object.freeze([
8
8
  name: 'ask_user',
9
9
  title: 'Ask User',
10
10
  trigger:
11
- 'Ask the user 1–4 multiple-choice questions and wait; when a plan needs the user to pick between clear options, instead of listing them in chat.',
11
+ 'Ask the user 1–4 multiple-choice questions and wait; when a plan needs the user to pick between clear options, instead of listing them in chat. Also hands the user a page or app step (CAPTCHA, sign-in, 2FA, a secret).',
12
12
  description:
13
- 'Ask the user multiple-choice questions and wait. Only for a decision only the user can make, with clear options; never for minor choices or approval of requested work, and open questions go in chat. Do not repeat the options in your message.',
13
+ 'Ask the user multiple-choice questions and wait. Only for a decision only the user can make, with clear options; never for minor choices or approval of requested work, and open questions go in chat. Do not repeat the options in your message. A step only the user can do on a page or app (CAPTCHA, human check, sign-in, 2FA, a password) is a handoff here, never a request in plain chat.',
14
14
  annotations: {
15
15
  title: 'Ask User',
16
16
  readOnlyHint: true,
@@ -55,7 +55,7 @@ export const ASK_USER_TOOL_DEFS = Object.freeze([
55
55
  handoff: {
56
56
  type: 'object',
57
57
  description:
58
- 'Instead of questions: secret = the user types a password/token into the focused field (you never see it; result provided/skipped/timeout); takeover = the user does a step (sign-in, CAPTCHA, 2FA) and says done.',
58
+ 'Instead of questions: secret = the user types a password, sign-in, new password or one-time code into that field of the page (you never see it; result entered/user_skipped/no_field/page_changed/blocked/expired); takeover = the user does a step (sign-in, CAPTCHA, 2FA) and says done.',
59
59
  properties: {
60
60
  kind: { type: 'string', enum: ['secret', 'takeover'] },
61
61
  surface: { type: 'string', enum: ['browser', 'computer'] },
@@ -74,8 +74,9 @@ export const ASK_USER_TOOL_DEFS = Object.freeze([
74
74
  description: 'browser takeover: login = sign-in window on url.',
75
75
  },
76
76
  url: { type: 'string', maxLength: 2048, description: 'login: sign-in page (https).' },
77
- tab: { type: 'string', maxLength: 64, description: 'browser takeover: page ID from list_tabs.' },
78
- window_id: { type: 'string', maxLength: 128, description: 'computer takeover: exact window id.' },
77
+ tab: { type: 'string', maxLength: 64, description: 'browser: page ID from list_tabs.' },
78
+ window_id: { type: 'string', maxLength: 128, description: 'computer: exact window id (secret: required).' },
79
+ ref: { type: 'string', maxLength: 64, description: 'computer secret: field ref (required).' },
79
80
  app: { type: 'string', maxLength: 120, description: 'computer takeover: app name.' },
80
81
  },
81
82
  required: ['kind', 'surface'],
@@ -106,13 +107,16 @@ export function validateAskUserHandoff(args) {
106
107
  const login = handoffLogin(handoff);
107
108
  let need = login ? 'sign_in' : 'action';
108
109
  if (['sign_in', 'action', 'confirmation'].includes(handoff.need)) need = handoff.need;
110
+ const loginField = login ? { login } : {};
109
111
  return {
110
112
  kind: handoff.kind,
111
113
  surface: handoff.surface,
112
114
  target: text('target', 200),
113
115
  field: text('field', 80),
114
116
  instructions: text('instructions', 2000),
115
- ...(handoff.kind === 'takeover' ? { need, identity: handoffIdentity(handoff), ...(login ? { login } : {}) } : {}),
117
+ // A secret is bound to its page (browser tab) or window and field (computer).
118
+ identity: handoffIdentity(handoff),
119
+ ...(handoff.kind === 'takeover' ? { need, ...loginField } : {}),
116
120
  };
117
121
  }
118
122
 
@@ -149,7 +153,8 @@ function handoffIdentity(handoff) {
149
153
  .trim()
150
154
  .slice(0, 120)
151
155
  : '';
152
- return { ...(windowId ? { windowId } : {}), ...(app ? { app } : {}) };
156
+ const ref = handoff.kind === 'secret' ? token('ref', 64) : '';
157
+ return { ...(windowId ? { windowId } : {}), ...(app ? { app } : {}), ...(ref ? { ref } : {}) };
153
158
  }
154
159
 
155
160
  /** Throws a clear error when the questions are malformed; returns the list. */
@@ -158,6 +158,8 @@ export function featureDisallowedToolsFor(
158
158
  ...(builtinFeatureActive(configLike, 'media') ? [] : ['media']),
159
159
  ...(builtinFeatureActive(configLike, 'tidy') ? [] : ['tidy']),
160
160
  ...(builtinFeatureActive(configLike, 'visualize') ? [] : ['visualize']),
161
+ // Bots' emoji reactions (Settings → General → Reactions); on unless turned off.
162
+ ...(configLike?.reactions === false ? ['react'] : []),
161
163
  ];
162
164
  // Headless exec uses the Lead surface and excludes Skill/MCP tools. When
163
165
  // only its eager defaults remain, neither schemas nor loader guidance help.
@@ -0,0 +1,62 @@
1
+ // The fields of `session.compaction` that the saved global config owns, as
2
+ // opposed to the per-session state (archive, thresholds, outcome telemetry)
3
+ // the session owns. Shared by the config sync and by the compaction commit, so
4
+ // a commit that finishes after a reload never writes back a stale config value.
5
+ import { RETIRED_COMPACTION_FIELDS } from '../config-storage.mjs';
6
+ import { normalizeCompactionConfig } from './config-helpers.mjs';
7
+
8
+ // Every spelling of the main-context buffer budget; a new representation
9
+ // replaces the previous one.
10
+ export const MAIN_BUFFER_KEYS = [
11
+ 'mainBufferTokens',
12
+ 'mainBuffer',
13
+ 'mainBufferPercent',
14
+ 'mainBufferPct',
15
+ 'mainBufferRatio',
16
+ 'mainBufferFraction',
17
+ ];
18
+
19
+ // Everything the normalizer emits for an empty config, the retired aliases it
20
+ // folds away, and every setting a session record is seeded from the config
21
+ // (session-record.mjs initialCompactionConfig). A field the config no longer
22
+ // sets is cleared so the session falls back to the default.
23
+ export const COMPACTION_CONFIG_KEYS = Object.freeze([
24
+ ...Object.keys(normalizeCompactionConfig({})),
25
+ ...RETIRED_COMPACTION_FIELDS,
26
+ 'enabled',
27
+ 'useMaintainer',
28
+ 'model',
29
+ 'summaryModel',
30
+ 'timeoutMs',
31
+ 'memoryTimeoutMs',
32
+ 'buffer',
33
+ 'bufferTokens',
34
+ 'reservedTokens',
35
+ 'bufferPercent',
36
+ 'bufferPct',
37
+ 'bufferRatio',
38
+ 'bufferFraction',
39
+ ...MAIN_BUFFER_KEYS,
40
+ ]);
41
+
42
+ // The resolved buffer is the plan's own measurement, recorded on every compact
43
+ // pass, so for the writers below it is telemetry and not a setting.
44
+ const RESOLVED_BUFFER_KEYS = new Set(['bufferTokens', 'bufferRatio']);
45
+
46
+ /**
47
+ * The `session.compaction` record a compaction writer produces: the live record
48
+ * plus its own outcome telemetry. Config-owned fields always come from the
49
+ * live record, never from the policy or the plan the writer started with: a
50
+ * reload that landed while the compaction was running (auto turned off, a
51
+ * model removed) must not be undone by the write that follows it.
52
+ */
53
+ export function withLiveCompactionConfig(live, telemetry) {
54
+ const record = { ...live, auto: live.auto !== false, ...telemetry };
55
+ for (const key of COMPACTION_CONFIG_KEYS) {
56
+ if (key === 'auto' || RESOLVED_BUFFER_KEYS.has(key)) continue;
57
+ if (Object.hasOwn(live, key)) record[key] = live[key];
58
+ else delete record[key];
59
+ }
60
+ record.auto = live.auto !== false;
61
+ return record;
62
+ }
@@ -78,6 +78,14 @@ function resolveAutoEffort({ autoEffort, saved, preset = null }) {
78
78
  return preset?.autoEffort !== false;
79
79
  }
80
80
 
81
+ /** The route's context percent: an explicit request, else the saved choice
82
+ * (read lazily) unless an exact token selection replaced it. */
83
+ function resolveContextPercent({ hasExplicitContextPercent, contextPercent, keepsSavedPercent, savedPercent }) {
84
+ if (hasExplicitContextPercent) return cleanContextPercent(contextPercent);
85
+ if (keepsSavedPercent) return cleanContextPercent(savedPercent());
86
+ return undefined;
87
+ }
88
+
81
89
  export function makeResolveRoute(resolveDefaultProvider) {
82
90
  return function resolveRoute(
83
91
  config,
@@ -119,11 +127,12 @@ export function makeResolveRoute(resolveDefaultProvider) {
119
127
  modelParameters: hasExplicitModelParameters
120
128
  ? cleanModelParameters(modelParameters)
121
129
  : cleanModelParameters(saved.modelParameters ?? preset.modelParameters),
122
- contextPercent: hasExplicitContextPercent
123
- ? cleanContextPercent(contextPercent)
124
- : keepsSavedPercent
125
- ? cleanContextPercent(saved.contextPercent ?? preset.contextPercent)
126
- : undefined,
130
+ contextPercent: resolveContextPercent({
131
+ hasExplicitContextPercent,
132
+ contextPercent,
133
+ keepsSavedPercent,
134
+ savedPercent: () => saved.contextPercent ?? preset.contextPercent,
135
+ }),
127
136
  ...(tokens ? { contextTokens: tokens } : {}),
128
137
  };
129
138
  }
@@ -144,11 +153,12 @@ export function makeResolveRoute(resolveDefaultProvider) {
144
153
  modelParameters: hasExplicitModelParameters
145
154
  ? cleanModelParameters(modelParameters)
146
155
  : cleanModelParameters(saved.modelParameters),
147
- contextPercent: hasExplicitContextPercent
148
- ? cleanContextPercent(contextPercent)
149
- : keepsSavedPercent
150
- ? cleanContextPercent(saved.contextPercent)
151
- : undefined,
156
+ contextPercent: resolveContextPercent({
157
+ hasExplicitContextPercent,
158
+ contextPercent,
159
+ keepsSavedPercent,
160
+ savedPercent: () => saved.contextPercent,
161
+ }),
152
162
  ...(tokens ? { contextTokens: tokens } : {}),
153
163
  };
154
164
  };
@@ -231,7 +241,7 @@ const AGENT_TERMINAL_REAP_MS = Object.freeze({ 'openai-oauth': 60 * 60 * 1000 })
231
241
 
232
242
  /** A stored/requested idle value: AUTO_CLEAR_UNLIMITED, a window ≥ 1 min, or
233
243
  * null when absent or invalid. */
234
- export function normalizeAutoClearIdleValue(value) {
244
+ function normalizeAutoClearIdleValue(value) {
235
245
  if (value === null || value === undefined || typeof value === 'boolean') return null;
236
246
  if (typeof value === 'string') {
237
247
  const text = value.trim().toLowerCase();
@@ -290,11 +300,11 @@ export function autoClearProviderDefaults(providerIdleMs = null, extraProviders
290
300
  const builtIn = Object.hasOwn(AUTO_CLEAR_PROVIDER_IDLE_MS, provider)
291
301
  ? AUTO_CLEAR_PROVIDER_IDLE_MS[provider]
292
302
  : AUTO_CLEAR_PROVIDER_IDLE_MS.default;
293
- const idleMs = Object.hasOwn(overrides, provider)
294
- ? resolvedIdleMs(overrides[provider])
295
- : provider === 'default' || Object.hasOwn(AUTO_CLEAR_PROVIDER_IDLE_MS, provider)
296
- ? resolvedIdleMs(builtIn)
297
- : autoClearIdleMsForProvider(provider, overrides);
303
+ let idleMs;
304
+ if (Object.hasOwn(overrides, provider)) idleMs = resolvedIdleMs(overrides[provider]);
305
+ else if (provider === 'default' || Object.hasOwn(AUTO_CLEAR_PROVIDER_IDLE_MS, provider)) {
306
+ idleMs = resolvedIdleMs(builtIn);
307
+ } else idleMs = autoClearIdleMsForProvider(provider, overrides);
298
308
  return {
299
309
  provider,
300
310
  idleMs,
@@ -338,6 +348,17 @@ export function resolveAutoClearIdleMs(config, provider) {
338
348
  return autoClearIdleMsForProvider(provider, raw.providerIdleMs);
339
349
  }
340
350
 
351
+ /** The idle auto-clear gate's settings for a thread on `provider`
352
+ * (idle-auto-clear-gate.mjs): `{ enabled, idleMs, minContextPercent }`. */
353
+ function autoClearGateSettings(config, provider) {
354
+ const normalized = normalizeAutoClearConfig(config?.autoClear);
355
+ return {
356
+ enabled: normalized.enabled,
357
+ idleMs: resolveAutoClearIdleMs(config, provider),
358
+ minContextPercent: normalized.minContextPercent,
359
+ };
360
+ }
361
+
341
362
  export function normalizeSystemShellConfig(value = {}) {
342
363
  const raw = value && typeof value === 'object' ? value : {};
343
364
  const command = clean(raw.command);