mixdog 0.9.172 → 0.9.174

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 (1264) hide show
  1. package/package.json +4 -4
  2. package/scripts/build-tui.mjs +32 -9
  3. package/scripts/code-graph-description-contract.mjs +1 -2
  4. package/scripts/computer-task-cost-report.mjs +4 -11
  5. package/scripts/context-renewal-live-check.mjs +1 -1
  6. package/scripts/coverage-query.mjs +27 -0
  7. package/scripts/generate-runtime-manifest.mjs +12 -16
  8. package/scripts/graph-parity.mjs +110 -83
  9. package/scripts/lib/changed-tests.mjs +104 -0
  10. package/scripts/lib/cli-args.mjs +43 -0
  11. package/scripts/lib/cli-args.test.mjs +64 -0
  12. package/scripts/lib/coverage.mjs +309 -0
  13. package/scripts/lib/embedding-model-bench-core.mjs +4 -9
  14. package/scripts/lib/recall-bench-eval.mjs +4 -4
  15. package/scripts/lib/run-node-tests.mjs +171 -14
  16. package/scripts/lib/test-failure-records.mjs +46 -0
  17. package/scripts/lib/test-failure-summary.mjs +59 -0
  18. package/scripts/lib/test-summary-reporter.mjs +7 -3
  19. package/scripts/lib/trace-stats.mjs +38 -0
  20. package/scripts/lib/trace-stats.test.mjs +56 -0
  21. package/scripts/llm-trace-summary.mjs +2 -34
  22. package/scripts/mouse-probe.mjs +1 -3
  23. package/scripts/native-tool-download.mjs +5 -0
  24. package/scripts/office/author-deck.mjs +8 -14
  25. package/scripts/office/build-pptx-icons.mjs +0 -1
  26. package/scripts/patch-replay.mjs +1 -11
  27. package/scripts/perf/transcript-runtime-probe.mjs +22 -6
  28. package/scripts/pg-memory-diet.mjs +2 -4
  29. package/scripts/pptx-kit-index.mjs +157 -0
  30. package/scripts/prepare-native-assets.mjs +4 -6
  31. package/scripts/routing-corpus.mjs +1 -13
  32. package/scripts/session-diag.mjs +2 -41
  33. package/scripts/session-sweep.mjs +102 -56
  34. package/scripts/suite-health.mjs +4 -0
  35. package/scripts/test.mjs +144 -38
  36. package/scripts/tidy/sync-engines-manifest.mjs +42 -9
  37. package/scripts/tool-failures.mjs +1 -8
  38. package/scripts/tool-stress.mjs +4 -8
  39. package/scripts/tui-frame-harness.mjs +1 -1
  40. package/scripts/verify-release-assets.mjs +24 -7
  41. package/src/agents/reviewer/AGENT.md +2 -1
  42. package/src/agents/security/AGENT.md +2 -1
  43. package/src/app.mjs +79 -74
  44. package/src/cli.mjs +0 -2
  45. package/src/defaults/agents.json +3 -3
  46. package/src/defaults/skills/browser-use/SKILL.md +75 -20
  47. package/src/defaults/skills/code-tidy/SKILL.md +89 -35
  48. package/src/defaults/skills/code-tidy/references/agent-cleanup.md +27 -115
  49. package/src/defaults/skills/code-tidy/references/cleanup-report.md +88 -0
  50. package/src/defaults/skills/code-tidy/references/dead-code.md +2 -7
  51. package/src/defaults/skills/code-tidy/references/test-suite-slop.md +31 -0
  52. package/src/defaults/skills/computer-use/SKILL.md +64 -36
  53. package/src/defaults/skills/docx/SKILL.md +5 -5
  54. package/src/defaults/skills/docx/references/native-authoring.md +86 -29
  55. package/src/defaults/skills/goal-management/SKILL.md +56 -28
  56. package/src/defaults/skills/image/SKILL.md +16 -16
  57. package/src/defaults/skills/local-provider/SKILL.md +1 -2
  58. package/src/defaults/skills/memory-management/SKILL.md +1 -2
  59. package/src/defaults/skills/pdf/SKILL.md +6 -5
  60. package/src/defaults/skills/pptx/SKILL.md +20 -14
  61. package/src/defaults/skills/pptx/references/charts.md +177 -28
  62. package/src/defaults/skills/pptx/references/composition.md +9 -9
  63. package/src/defaults/skills/pptx/references/direction.md +4 -4
  64. package/src/defaults/skills/pptx/references/html.md +108 -0
  65. package/src/defaults/skills/pptx/references/kit-index.md +839 -0
  66. package/src/defaults/skills/pptx/references/kit.md +239 -41
  67. package/src/defaults/skills/pptx/references/pictures.md +10 -2
  68. package/src/defaults/skills/pptx/references/review.md +0 -5
  69. package/src/defaults/skills/setup/SKILL.md +3 -2
  70. package/src/defaults/skills/setup/references/actions.md +16 -22
  71. package/src/defaults/skills/setup/references/surfaces.md +1 -2
  72. package/src/defaults/skills/skill-creator/SKILL.md +16 -19
  73. package/src/defaults/skills/skill-creator/references/design.md +13 -19
  74. package/src/defaults/skills/skill-creator/scripts/validate-skill.mjs +6 -2
  75. package/src/defaults/skills/video/SKILL.md +12 -13
  76. package/src/defaults/skills/xlsx/SKILL.md +10 -9
  77. package/src/defaults/skills/xlsx/references/model-conventions.md +1 -1
  78. package/src/defaults/skills/xlsx/references/report-design.md +14 -5
  79. package/src/headless-exec.mjs +1 -2
  80. package/src/help.mjs +2 -2
  81. package/src/lib/keychain-cjs.cjs +48 -69
  82. package/src/lib/rules-builder.cjs +1 -24
  83. package/src/repl/slash-commands.mjs +15 -7
  84. package/src/rules/agent/43-title-agent.md +1 -1
  85. package/src/rules/agent/AGENT.md +1 -1
  86. package/src/rules/lead/LEAD.md +3 -2
  87. package/src/rules/shared/05-tool-calls.md +11 -0
  88. package/src/rules/shared/10-tool-workflow.md +2 -3
  89. package/src/rules/shared/30-exploration.md +1 -2
  90. package/src/rules/shared/40-editing.md +1 -1
  91. package/src/rules/shared/45-destructive.md +3 -3
  92. package/src/rules/shared/70-delivery.md +5 -1
  93. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/turn.mjs +14 -18
  94. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +95 -95
  95. package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +19 -96
  96. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +26 -45
  97. package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +1 -4
  98. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +2 -20
  99. package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +3 -0
  100. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +36 -32
  101. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +17 -30
  102. package/src/runtime/agent/orchestrator/agent-trace.mjs +20 -42
  103. package/src/runtime/agent/orchestrator/cache-mtime.mjs +3 -1
  104. package/src/runtime/agent/orchestrator/config-providers-merge.mjs +56 -0
  105. package/src/runtime/agent/orchestrator/config-storage.mjs +49 -51
  106. package/src/runtime/agent/orchestrator/config.mjs +44 -78
  107. package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +9 -21
  108. package/src/runtime/agent/orchestrator/context/role-instructions.mjs +11 -7
  109. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +15 -32
  110. package/src/runtime/agent/orchestrator/internal-agents.mjs +26 -19
  111. package/src/runtime/agent/orchestrator/internal-tools.mjs +4 -4
  112. package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +22 -37
  113. package/src/runtime/agent/orchestrator/mcp/client.mjs +48 -66
  114. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +40 -39
  115. package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +75 -0
  116. package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +154 -0
  117. package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +168 -0
  118. package/src/runtime/agent/orchestrator/providers/anthropic-betas.mjs +8 -2
  119. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +19 -13
  120. package/src/runtime/agent/orchestrator/providers/anthropic-leaked-toolcall.mjs +0 -8
  121. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +1 -1
  122. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +9 -28
  123. package/src/runtime/agent/orchestrator/providers/anthropic-midstream-recovery.mjs +314 -0
  124. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +7 -1
  125. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +26 -27
  126. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-midstream.mjs +21 -207
  127. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-recovery.mjs +11 -63
  128. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +9 -6
  129. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request.mjs +5 -2
  130. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +46 -101
  131. package/src/runtime/agent/orchestrator/providers/anthropic-recovery-guards.mjs +93 -0
  132. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-delta.mjs +16 -1
  133. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +10 -2
  134. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +7 -3
  135. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-state.mjs +4 -0
  136. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn.mjs +19 -2
  137. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +15 -3
  138. package/src/runtime/agent/orchestrator/providers/anthropic-thinking-contract.mjs +9 -0
  139. package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +89 -0
  140. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +104 -622
  141. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +1 -5
  142. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +56 -319
  143. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +101 -0
  144. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +161 -0
  145. package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +110 -0
  146. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +6 -4
  147. package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +17 -14
  148. package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +14 -0
  149. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +3 -3
  150. package/src/runtime/agent/orchestrator/providers/cursor-wire-exec.mjs +3 -2
  151. package/src/runtime/agent/orchestrator/providers/cursor-wire-guards.mjs +3 -33
  152. package/src/runtime/agent/orchestrator/providers/cursor-wire-interactions.mjs +20 -39
  153. package/src/runtime/agent/orchestrator/providers/cursor.mjs +2 -1
  154. package/src/runtime/agent/orchestrator/providers/custom-tool-wire.mjs +3 -34
  155. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +5 -2
  156. package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +266 -0
  157. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +9 -11
  158. package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +54 -0
  159. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +145 -0
  160. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +64 -70
  161. package/src/runtime/agent/orchestrator/providers/gemini-sdk-request.mjs +107 -0
  162. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +47 -12
  163. package/src/runtime/agent/orchestrator/providers/gemini.mjs +26 -536
  164. package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +9 -18
  165. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +40 -43
  166. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +15 -37
  167. package/src/runtime/agent/orchestrator/providers/lib/flat-schema-merge.mjs +37 -0
  168. package/src/runtime/agent/orchestrator/providers/lib/gemini-model-catalog.mjs +4 -4
  169. package/src/runtime/agent/orchestrator/providers/lib/quota-readings.mjs +24 -0
  170. package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +146 -44
  171. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +62 -77
  172. package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +3 -0
  173. package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +9 -15
  174. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +2 -0
  175. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +13 -16
  176. package/src/runtime/agent/orchestrator/providers/openai-codex-model.mjs +10 -7
  177. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +4 -29
  178. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +1 -1
  179. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +6 -6
  180. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +4 -2
  181. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +23 -46
  182. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +3 -12
  183. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-state.mjs +9 -14
  184. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +51 -55
  185. package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +1 -1
  186. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +4 -4
  187. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +2 -6
  188. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +4 -24
  189. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +13 -17
  190. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +24 -29
  191. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +11 -3
  192. package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +3 -2
  193. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +0 -2
  194. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +7 -100
  195. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-stamps.mjs +127 -0
  196. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +2 -8
  197. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +1 -2
  198. package/src/runtime/agent/orchestrator/providers/openai-oauth-catalog.mjs +8 -8
  199. package/src/runtime/agent/orchestrator/providers/openai-oauth-dispatch.mjs +258 -0
  200. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +4 -2
  201. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +53 -222
  202. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +102 -60
  203. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +3 -3
  204. package/src/runtime/agent/orchestrator/providers/openai-transport-policy.mjs +2 -6
  205. package/src/runtime/agent/orchestrator/providers/openai-turn-state.mjs +9 -11
  206. package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +20 -13
  207. package/src/runtime/agent/orchestrator/providers/openai-ws-handshake.mjs +108 -0
  208. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +11 -89
  209. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +2 -4
  210. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +5 -2
  211. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +1 -1
  212. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +9 -16
  213. package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts.mjs +0 -2
  214. package/src/runtime/agent/orchestrator/providers/openai-ws-send-outcome.mjs +66 -309
  215. package/src/runtime/agent/orchestrator/providers/openai-ws-send-trace.mjs +316 -0
  216. package/src/runtime/agent/orchestrator/providers/openai-ws-stream/terminal-frames.mjs +0 -2
  217. package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +18 -23
  218. package/src/runtime/agent/orchestrator/providers/openai-ws-warmup.mjs +7 -13
  219. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +5 -16
  220. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +79 -253
  221. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +1 -13
  222. package/src/runtime/agent/orchestrator/providers/provider-catalog-cache.mjs +3 -2
  223. package/src/runtime/agent/orchestrator/providers/provider-model-identities.mjs +6 -0
  224. package/src/runtime/agent/orchestrator/providers/registry.mjs +0 -24
  225. package/src/runtime/agent/orchestrator/providers/retry-backoff.mjs +3 -12
  226. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +132 -15
  227. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +6 -12
  228. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +39 -0
  229. package/src/runtime/agent/orchestrator/providers/retry-midstream.mjs +16 -5
  230. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +0 -7
  231. package/src/runtime/agent/orchestrator/providers/tool-stream-state.mjs +7 -6
  232. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +5 -8
  233. package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +2 -3
  234. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +6 -109
  235. package/src/runtime/agent/orchestrator/session/compact/budget.mjs +19 -19
  236. package/src/runtime/agent/orchestrator/session/compact/constants.mjs +1 -1
  237. package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +148 -48
  238. package/src/runtime/agent/orchestrator/session/compact/json-byte-length.mjs +93 -0
  239. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +1 -0
  240. package/src/runtime/agent/orchestrator/session/compact/observation-supersession.mjs +96 -0
  241. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +39 -11
  242. package/src/runtime/agent/orchestrator/session/compact/summary-schema.mjs +24 -42
  243. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +45 -33
  244. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +2 -5
  245. package/src/runtime/agent/orchestrator/session/context-compaction-policy.mjs +9 -13
  246. package/src/runtime/agent/orchestrator/session/context-fingerprint.mjs +32 -1
  247. package/src/runtime/agent/orchestrator/session/context-tool-pairs.mjs +7 -7
  248. package/src/runtime/agent/orchestrator/session/context-utils.mjs +865 -111
  249. package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +0 -1
  250. package/src/runtime/agent/orchestrator/session/eager-dispatch/entry.mjs +8 -7
  251. package/src/runtime/agent/orchestrator/session/explicit-skills.mjs +1 -4
  252. package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +24 -15
  253. package/src/runtime/agent/orchestrator/session/loop/compact-debug.mjs +0 -14
  254. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +35 -16
  255. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +3 -3
  256. package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +16 -0
  257. package/src/runtime/agent/orchestrator/session/loop/diagnostics.mjs +1 -8
  258. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +5 -2
  259. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +3 -3
  260. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/empty-nudge.mjs +1 -1
  261. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +12 -6
  262. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +1 -1
  263. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +22 -10
  264. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +24 -24
  265. package/src/runtime/agent/orchestrator/session/loop/request-projection.mjs +6 -45
  266. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +43 -30
  267. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +57 -51
  268. package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +8 -6
  269. package/src/runtime/agent/orchestrator/session/loop/termination.mjs +7 -10
  270. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +2 -9
  271. package/src/runtime/agent/orchestrator/session/loop/tool-exec/call-prep.mjs +1 -5
  272. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +1 -1
  273. package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +3 -0
  274. package/src/runtime/agent/orchestrator/session/loop/transcript-repair.mjs +7 -15
  275. package/src/runtime/agent/orchestrator/session/loop/usage.mjs +3 -1
  276. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +1 -0
  277. package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +0 -1
  278. package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +44 -20
  279. package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +4 -55
  280. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +0 -1
  281. package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +5 -12
  282. package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +63 -0
  283. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +193 -33
  284. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +21 -82
  285. package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +74 -67
  286. package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +28 -27
  287. package/src/runtime/agent/orchestrator/session/manager/message-sanitize.mjs +1 -3
  288. package/src/runtime/agent/orchestrator/session/manager/pending-claim-ledger.mjs +68 -0
  289. package/src/runtime/agent/orchestrator/session/manager/pending-delivered-ledger.mjs +56 -0
  290. package/src/runtime/agent/orchestrator/session/manager/pending-lifecycle-epoch.mjs +95 -0
  291. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +95 -681
  292. package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +268 -0
  293. package/src/runtime/agent/orchestrator/session/manager/pending-spool-file.mjs +122 -0
  294. package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +16 -0
  295. package/src/runtime/agent/orchestrator/session/manager/pending-spool-sweep.mjs +73 -0
  296. package/src/runtime/agent/orchestrator/session/manager/prepared-resume-cache.mjs +122 -0
  297. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +19 -15
  298. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +25 -38
  299. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +118 -82
  300. package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +19 -19
  301. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +33 -659
  302. package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +135 -0
  303. package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +151 -0
  304. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +154 -0
  305. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +133 -0
  306. package/src/runtime/agent/orchestrator/session/manager/status-telemetry.mjs +7 -7
  307. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +14 -40
  308. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +50 -26
  309. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +45 -42
  310. package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +29 -33
  311. package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +12 -18
  312. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +19 -18
  313. package/src/runtime/agent/orchestrator/session/provider-prefix-guard.mjs +182 -48
  314. package/src/runtime/agent/orchestrator/session/reduction-metrics.mjs +19 -0
  315. package/src/runtime/agent/orchestrator/session/save-session-worker-stdio.mjs +28 -0
  316. package/src/runtime/agent/orchestrator/session/save-session-worker.mjs +29 -38
  317. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +236 -72
  318. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +355 -27
  319. package/src/runtime/agent/orchestrator/session/store/fs-probe.mjs +10 -6
  320. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +288 -0
  321. package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +61 -0
  322. package/src/runtime/agent/orchestrator/session/store/listing.mjs +93 -70
  323. package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +76 -0
  324. package/src/runtime/agent/orchestrator/session/store/live-state.mjs +11 -14
  325. package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +53 -0
  326. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +246 -37
  327. package/src/runtime/agent/orchestrator/session/store/load-session.mjs +60 -0
  328. package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +58 -26
  329. package/src/runtime/agent/orchestrator/session/store/pending-saves.mjs +55 -0
  330. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +202 -79
  331. package/src/runtime/agent/orchestrator/session/store/serialize.mjs +7 -19
  332. package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +149 -0
  333. package/src/runtime/agent/orchestrator/session/store/session-observers.mjs +55 -0
  334. package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +12 -13
  335. package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +2 -1
  336. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +1 -1
  337. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +100 -8
  338. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +156 -0
  339. package/src/runtime/agent/orchestrator/session/store/write-guards.mjs +17 -12
  340. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +525 -0
  341. package/src/runtime/agent/orchestrator/session/store-summary-archived-agent.mjs +126 -0
  342. package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +31 -0
  343. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +69 -21
  344. package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +47 -0
  345. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +237 -857
  346. package/src/runtime/agent/orchestrator/session/store-summary-visibility.mjs +3 -3
  347. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +73 -20
  348. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +127 -0
  349. package/src/runtime/agent/orchestrator/session/store.mjs +199 -878
  350. package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +6 -1
  351. package/src/runtime/agent/orchestrator/session/thinking-replay-recovery.mjs +18 -17
  352. package/src/runtime/agent/orchestrator/session/token-estimate-floors.mjs +134 -22
  353. package/src/runtime/agent/orchestrator/session/token-estimate.mjs +14 -1
  354. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +32 -39
  355. package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +1 -1
  356. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +45 -35
  357. package/src/runtime/agent/orchestrator/stable-hash-stringify.mjs +10 -0
  358. package/src/runtime/agent/orchestrator/stall-policy.mjs +12 -10
  359. package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +7 -10
  360. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +122 -179
  361. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +16 -8
  362. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +3 -8
  363. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +12 -6
  364. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +5 -18
  365. package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +41 -39
  366. package/src/runtime/agent/orchestrator/tools/builtin/device-paths.mjs +5 -2
  367. package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +54 -48
  368. package/src/runtime/agent/orchestrator/tools/builtin/find-files-tool.mjs +14 -34
  369. package/src/runtime/agent/orchestrator/tools/builtin/git-command-policy.mjs +62 -42
  370. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +132 -138
  371. package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +8 -5
  372. package/src/runtime/agent/orchestrator/tools/builtin/glob-walk.mjs +9 -12
  373. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-chunk-merge.mjs +2 -13
  374. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +22 -25
  375. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +23 -22
  376. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +0 -5
  377. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-pattern-fanout.mjs +8 -13
  378. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-request.mjs +4 -13
  379. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-single-file-rescue.mjs +70 -85
  380. package/src/runtime/agent/orchestrator/tools/builtin/lib/list-helpers.mjs +19 -4
  381. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +17 -23
  382. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +21 -8
  383. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +7 -15
  384. package/src/runtime/agent/orchestrator/tools/builtin/native-search-client.mjs +46 -41
  385. package/src/runtime/agent/orchestrator/tools/builtin/native-search-runner.mjs +0 -4
  386. package/src/runtime/agent/orchestrator/tools/builtin/native-search-transport.mjs +12 -14
  387. package/src/runtime/agent/orchestrator/tools/builtin/path-diagnostics.mjs +73 -89
  388. package/src/runtime/agent/orchestrator/tools/builtin/path-locks.mjs +11 -11
  389. package/src/runtime/agent/orchestrator/tools/builtin/read-args.mjs +1 -2
  390. package/src/runtime/agent/orchestrator/tools/builtin/read-batch.mjs +10 -4
  391. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +11 -26
  392. package/src/runtime/agent/orchestrator/tools/builtin/read-image-resize.mjs +29 -16
  393. package/src/runtime/agent/orchestrator/tools/builtin/read-image.mjs +13 -34
  394. package/src/runtime/agent/orchestrator/tools/builtin/read-mode-tool.mjs +115 -193
  395. package/src/runtime/agent/orchestrator/tools/builtin/read-office-files.mjs +94 -95
  396. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +20 -38
  397. package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +11 -14
  398. package/src/runtime/agent/orchestrator/tools/builtin/read-ranges.mjs +4 -8
  399. package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +4 -1
  400. package/src/runtime/agent/orchestrator/tools/builtin/read-single-render.mjs +8 -19
  401. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +10 -3
  402. package/src/runtime/agent/orchestrator/tools/builtin/read-snapshot-runtime.mjs +80 -72
  403. package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +65 -55
  404. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +153 -157
  405. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +6 -3
  406. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/reach-preflight.mjs +1 -1
  407. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +15 -14
  408. package/src/runtime/agent/orchestrator/tools/builtin/read-windows.mjs +2 -2
  409. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +184 -15
  410. package/src/runtime/agent/orchestrator/tools/builtin/search-builders.mjs +34 -32
  411. package/src/runtime/agent/orchestrator/tools/builtin/search-glob-tool.mjs +10 -13
  412. package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +2 -9
  413. package/src/runtime/agent/orchestrator/tools/builtin/search-path-diagnostics.mjs +4 -15
  414. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +89 -119
  415. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +12 -5
  416. package/src/runtime/agent/orchestrator/tools/builtin/shell-lossless-compact.mjs +1 -3
  417. package/src/runtime/agent/orchestrator/tools/builtin/shell-output.mjs +1 -1
  418. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +17 -16
  419. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +17 -9
  420. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +1 -76
  421. package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +125 -115
  422. package/src/runtime/agent/orchestrator/tools/builtin/text-stats.mjs +6 -3
  423. package/src/runtime/agent/orchestrator/tools/builtin/tool-output-limit.mjs +10 -6
  424. package/src/runtime/agent/orchestrator/tools/builtin.mjs +27 -30
  425. package/src/runtime/agent/orchestrator/tools/code-graph/aggregate-roots.mjs +9 -18
  426. package/src/runtime/agent/orchestrator/tools/code-graph/ast-calls.mjs +2 -4
  427. package/src/runtime/agent/orchestrator/tools/code-graph/build-file-infos.mjs +182 -0
  428. package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +82 -262
  429. package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +8 -32
  430. package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +15 -14
  431. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/federation.mjs +4 -3
  432. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/work.mjs +2 -1
  433. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +23 -19
  434. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +9 -15
  435. package/src/runtime/agent/orchestrator/tools/code-graph/search-references.mjs +33 -29
  436. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +76 -96
  437. package/src/runtime/agent/orchestrator/tools/code-graph/source-access.mjs +15 -12
  438. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +4 -10
  439. package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.golden.json +1 -1
  440. package/src/runtime/agent/orchestrator/tools/code-graph/text-mask.mjs +0 -1
  441. package/src/runtime/agent/orchestrator/tools/code-graph/trusted-roots.mjs +1 -1
  442. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +16 -16
  443. package/src/runtime/agent/orchestrator/tools/code-graph.mjs +6 -7
  444. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +66 -80
  445. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +7 -6
  446. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +15 -11
  447. package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +37 -14
  448. package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +4 -14
  449. package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promotion-results.mjs +1 -1
  450. package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +3 -4
  451. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +0 -3
  452. package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +1 -1
  453. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +9 -13
  454. package/src/runtime/agent/orchestrator/tools/patch/apply-patch/codex-batch.mjs +62 -74
  455. package/src/runtime/agent/orchestrator/tools/patch/apply-patch/route.mjs +4 -9
  456. package/src/runtime/agent/orchestrator/tools/patch/dispatch/native-report.mjs +2 -2
  457. package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +80 -88
  458. package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +7 -21
  459. package/src/runtime/agent/orchestrator/tools/patch/mutation-output.mjs +1 -1
  460. package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +45 -93
  461. package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +1 -5
  462. package/src/runtime/agent/orchestrator/tools/patch/parsing.mjs +14 -19
  463. package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +23 -16
  464. package/src/runtime/agent/orchestrator/tools/patch/post-patch-excerpts.mjs +4 -11
  465. package/src/runtime/agent/orchestrator/tools/patch/read-redirects.mjs +12 -20
  466. package/src/runtime/agent/orchestrator/tools/patch/replay-capture.mjs +5 -6
  467. package/src/runtime/agent/orchestrator/tools/patch/section-coalesce.mjs +2 -2
  468. package/src/runtime/agent/orchestrator/tools/patch/sequence/report.mjs +1 -1
  469. package/src/runtime/agent/orchestrator/tools/patch/sequence/units.mjs +8 -9
  470. package/src/runtime/agent/orchestrator/tools/patch/text-lines.mjs +4 -4
  471. package/src/runtime/agent/orchestrator/tools/patch/ui-diff.mjs +6 -6
  472. package/src/runtime/agent/orchestrator/tools/patch/v4a-anchors.mjs +11 -8
  473. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +22 -47
  474. package/src/runtime/agent/orchestrator/tools/patch/v4a-windows.mjs +4 -19
  475. package/src/runtime/agent/orchestrator/tools/patch/wave.mjs +13 -2
  476. package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +15 -9
  477. package/src/runtime/agent/orchestrator/tools/patch-manifest.json +15 -11
  478. package/src/runtime/agent/orchestrator/tools/patch.mjs +6 -27
  479. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +60 -50
  480. package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +37 -24
  481. package/src/runtime/agent/orchestrator/tools/shell-policy-danger-target.mjs +14 -22
  482. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +24 -31
  483. package/src/runtime/agent/orchestrator/tools/shell-snapshot.mjs +48 -44
  484. package/src/runtime/agent/orchestrator/tools/spawn-binary-fetcher.mjs +3 -3
  485. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +15 -11
  486. package/src/runtime/attachments/store.mjs +201 -28
  487. package/src/runtime/browser-bridge/action-schema.mjs +11 -8
  488. package/src/runtime/browser-bridge/client.mjs +20 -9
  489. package/src/runtime/browser-bridge/tool-defs.mjs +3 -0
  490. package/src/runtime/channels/index.mjs +1 -1
  491. package/src/runtime/channels/lib/event-pipeline.mjs +8 -8
  492. package/src/runtime/channels/lib/event-queue.mjs +18 -29
  493. package/src/runtime/channels/lib/executor.mjs +21 -36
  494. package/src/runtime/channels/lib/owned-runtime.mjs +0 -6
  495. package/src/runtime/channels/lib/owner-heartbeat.mjs +0 -4
  496. package/src/runtime/channels/lib/runtime-paths.mjs +30 -98
  497. package/src/runtime/channels/lib/scheduler.mjs +24 -35
  498. package/src/runtime/channels/lib/status-snapshot.mjs +1 -5
  499. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +27 -28
  500. package/src/runtime/channels/lib/voice-transcription.mjs +179 -129
  501. package/src/runtime/channels/lib/webhook/listener-lifecycle.mjs +1 -1
  502. package/src/runtime/channels/lib/webhook/relay-tunnel/leg-heartbeat.mjs +1 -2
  503. package/src/runtime/channels/lib/webhook/relay-tunnel/local-forward.mjs +1 -2
  504. package/src/runtime/channels/lib/webhook/relay-tunnel.mjs +13 -4
  505. package/src/runtime/channels/lib/webhook/request-handler.mjs +16 -6
  506. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +1 -1
  507. package/src/runtime/channels/lib/webhook/signature.mjs +1 -1
  508. package/src/runtime/channels/lib/webhook/verification.mjs +33 -20
  509. package/src/runtime/channels/lib/webhook.mjs +3 -13
  510. package/src/runtime/channels/lib/whisper-port.mjs +36 -15
  511. package/src/runtime/channels/lib/whisper-server.mjs +18 -28
  512. package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -2
  513. package/src/runtime/channels/lib/worker-ipc.mjs +2 -3
  514. package/src/runtime/channels/lib/worker-main.mjs +2 -13
  515. package/src/runtime/computer-bridge/action-schema.mjs +56 -16
  516. package/src/runtime/computer-bridge/actions.mjs +2 -0
  517. package/src/runtime/computer-bridge/client.mjs +134 -2
  518. package/src/runtime/computer-bridge/core-actions.mjs +29 -6
  519. package/src/runtime/computer-bridge/error-recovery.mjs +17 -0
  520. package/src/runtime/computer-bridge/pending-continuation.mjs +9 -4
  521. package/src/runtime/computer-bridge/tool-defs.mjs +4 -4
  522. package/src/runtime/github/client.mjs +2 -3
  523. package/src/runtime/github/commands.mjs +9 -3
  524. package/src/runtime/github/contract.mjs +37 -30
  525. package/src/runtime/local-provider/catalog.mjs +4 -3
  526. package/src/runtime/local-provider/context-settings.mjs +3 -1
  527. package/src/runtime/local-provider/data/manifest.json +2 -1
  528. package/src/runtime/local-provider/hardware.mjs +7 -20
  529. package/src/runtime/local-provider/hugging-face.mjs +29 -25
  530. package/src/runtime/local-provider/managed-runtime.mjs +0 -2
  531. package/src/runtime/local-provider/registered-models.mjs +7 -1
  532. package/src/runtime/local-provider/resumable-installations.mjs +12 -19
  533. package/src/runtime/media/adapters/xai-media.mjs +14 -2
  534. package/src/runtime/media/auth.mjs +16 -13
  535. package/src/runtime/media/catalog.mjs +22 -13
  536. package/src/runtime/media/jobs.mjs +63 -61
  537. package/src/runtime/media/lanes.mjs +4 -3
  538. package/src/runtime/media/store.mjs +53 -6
  539. package/src/runtime/media/tool.mjs +5 -3
  540. package/src/runtime/memory/index.mjs +17 -19
  541. package/src/runtime/memory/lib/agent-ipc.mjs +1 -5
  542. package/src/runtime/memory/lib/core-memory-store.mjs +3 -7
  543. package/src/runtime/memory/lib/cycle1/cycle1-plan.mjs +2 -2
  544. package/src/runtime/memory/lib/embedding-provider.mjs +25 -39
  545. package/src/runtime/memory/lib/embedding-worker.mjs +43 -39
  546. package/src/runtime/memory/lib/http-router/admin-routes.mjs +5 -51
  547. package/src/runtime/memory/lib/http-router/admin-trace-routes.mjs +65 -0
  548. package/src/runtime/memory/lib/http-router/session-routes.mjs +25 -4
  549. package/src/runtime/memory/lib/http-wire.mjs +3 -2
  550. package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -1
  551. package/src/runtime/memory/lib/ingest/transcript-tail.mjs +3 -3
  552. package/src/runtime/memory/lib/ingest/transcript-watcher.mjs +2 -10
  553. package/src/runtime/memory/lib/light-ko-morph.mjs +43 -41
  554. package/src/runtime/memory/lib/memory-action-handlers/cycle-actions.mjs +19 -144
  555. package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +83 -0
  556. package/src/runtime/memory/lib/memory-action-handlers/cycle-rebuild-action.mjs +94 -0
  557. package/src/runtime/memory/lib/memory-action-handlers/manage-actions.mjs +92 -53
  558. package/src/runtime/memory/lib/memory-categories.mjs +13 -0
  559. package/src/runtime/memory/lib/memory-chunk-quality.mjs +134 -74
  560. package/src/runtime/memory/lib/memory-cycle-requests.mjs +64 -70
  561. package/src/runtime/memory/lib/memory-cycle.mjs +0 -1
  562. package/src/runtime/memory/lib/memory-cycle1.mjs +20 -36
  563. package/src/runtime/memory/lib/memory-daemon-lifecycle.mjs +4 -12
  564. package/src/runtime/memory/lib/memory-embed.mjs +11 -10
  565. package/src/runtime/memory/lib/memory-ops-policy.mjs +7 -8
  566. package/src/runtime/memory/lib/memory-port-advertiser.mjs +3 -9
  567. package/src/runtime/memory/lib/memory-recall-scope-filter.mjs +9 -10
  568. package/src/runtime/memory/lib/memory-schema/score-params.mjs +1 -1
  569. package/src/runtime/memory/lib/memory-score.mjs +0 -13
  570. package/src/runtime/memory/lib/memory-session-merge.mjs +2 -16
  571. package/src/runtime/memory/lib/memory.mjs +34 -54
  572. package/src/runtime/memory/lib/pg/adapter.mjs +56 -73
  573. package/src/runtime/memory/lib/pg/process.mjs +26 -32
  574. package/src/runtime/memory/lib/pg/supervisor.mjs +13 -16
  575. package/src/runtime/memory/lib/query-handlers.mjs +2 -1
  576. package/src/runtime/memory/lib/query-hybrid-search.mjs +10 -25
  577. package/src/runtime/memory/lib/query-maintenance-handlers.mjs +112 -89
  578. package/src/runtime/memory/lib/query-ranking.mjs +16 -22
  579. package/src/runtime/memory/lib/recall-embedding-readiness.mjs +3 -3
  580. package/src/runtime/memory/lib/recall-event-context.mjs +1 -1
  581. package/src/runtime/memory/lib/recall-format.mjs +6 -12
  582. package/src/runtime/memory/lib/recall-hybrid/hybrid-sql.mjs +2 -2
  583. package/src/runtime/memory/lib/recall-hybrid/plan.mjs +2 -9
  584. package/src/runtime/memory/lib/recall-order.mjs +12 -0
  585. package/src/runtime/memory/lib/runtime-fetcher.mjs +74 -79
  586. package/src/runtime/memory/lib/session-ingest-runtime.mjs +2 -5
  587. package/src/runtime/memory/lib/trace-store/agent-call-rows.mjs +13 -5
  588. package/src/runtime/memory/lib/trace-store.mjs +25 -47
  589. package/src/runtime/memory/lib/transcript-ingest.mjs +7 -4
  590. package/src/runtime/memory/tool-defs.mjs +6 -9
  591. package/src/runtime/office/README.md +22 -3
  592. package/src/runtime/office/authoring/pptx-author-action.mjs +55 -13
  593. package/src/runtime/office/authoring/pptx-author-session.mjs +6 -9
  594. package/src/runtime/office/authoring/pptx-brief.mjs +11 -4
  595. package/src/runtime/office/authoring/pptx-html-build.mjs +535 -0
  596. package/src/runtime/office/authoring/pptx-html-geometry.mjs +401 -0
  597. package/src/runtime/office/authoring/pptx-html-measure.mjs +587 -0
  598. package/src/runtime/office/authoring/pptx-html-runner.mjs +256 -0
  599. package/src/runtime/office/authoring/pptx-receipt.mjs +165 -87
  600. package/src/runtime/office/authoring/pptx-review-artifacts.mjs +17 -4
  601. package/src/runtime/office/authoring/pptx-script-normalize.mjs +211 -13
  602. package/src/runtime/office/bench/benchmark.mjs +104 -88
  603. package/src/runtime/office/bench/contract-benchmark.mjs +2 -1
  604. package/src/runtime/office/bench/polish-benchmark.mjs +3 -1
  605. package/src/runtime/office/bench/quality-live-benchmark.mjs +1 -3
  606. package/src/runtime/office/capabilities-aliases.mjs +16 -3
  607. package/src/runtime/office/capabilities-catalog.mjs +34 -5
  608. package/src/runtime/office/capabilities-signatures.mjs +157 -41
  609. package/src/runtime/office/capabilities.mjs +81 -26
  610. package/src/runtime/office/com/com-adapter.mjs +36 -25
  611. package/src/runtime/office/com/office-com-host.ps1 +2788 -522
  612. package/src/runtime/office/com/office-com-session-host.ps1 +117 -57
  613. package/src/runtime/office/com/office-word-formatting.ps1 +68 -10
  614. package/src/runtime/office/core/docx-toc-pages.mjs +23 -0
  615. package/src/runtime/office/core/office-actions-batch.mjs +338 -31
  616. package/src/runtime/office/core/office-actions-inspect.mjs +98 -50
  617. package/src/runtime/office/core/office-actions-open.mjs +11 -7
  618. package/src/runtime/office/core/office-actions-read.mjs +21 -2
  619. package/src/runtime/office/core/office-core.mjs +869 -13
  620. package/src/runtime/office/core/office-documents.mjs +2 -4
  621. package/src/runtime/office/core/office-finalize/commit-stage.mjs +3 -0
  622. package/src/runtime/office/core/office-finalize/review-stage.mjs +11 -2
  623. package/src/runtime/office/core/office-finalize/session-save.mjs +9 -6
  624. package/src/runtime/office/core/office-qa/fix-operations.mjs +8 -3
  625. package/src/runtime/office/core/office-qa/preview-stage.mjs +2 -1
  626. package/src/runtime/office/core/office-recalculation.mjs +1 -5
  627. package/src/runtime/office/core/office-render-preview.mjs +13 -1
  628. package/src/runtime/office/core/office-session-dispatch.mjs +86 -0
  629. package/src/runtime/office/core/office-sessionless-actions.mjs +121 -0
  630. package/src/runtime/office/core/office-sessions.mjs +257 -11
  631. package/src/runtime/office/core/office-transactions.mjs +6 -19
  632. package/src/runtime/office/core/pptx-page-cache.mjs +1 -2
  633. package/src/runtime/office/core/snapshot-contract.mjs +4 -2
  634. package/src/runtime/office/core/tabular.mjs +34 -23
  635. package/src/runtime/office/design/composition-system.mjs +33 -29
  636. package/src/runtime/office/design/content-model.mjs +4 -6
  637. package/src/runtime/office/design/design-art-direction.mjs +19 -19
  638. package/src/runtime/office/design/design-creative-director.mjs +1 -1
  639. package/src/runtime/office/design/design-discipline.mjs +26 -0
  640. package/src/runtime/office/design/design-system.mjs +13 -6
  641. package/src/runtime/office/design/design-tokens.mjs +10 -6
  642. package/src/runtime/office/design/docx/design-docx/front-matter.mjs +17 -2
  643. package/src/runtime/office/design/docx/design-docx/section.mjs +95 -15
  644. package/src/runtime/office/design/docx/design-docx/writer.mjs +2 -1
  645. package/src/runtime/office/design/docx/design-docx-components.mjs +158 -167
  646. package/src/runtime/office/design/docx/design-docx.mjs +5 -1
  647. package/src/runtime/office/design/docx/document-typography.mjs +36 -4
  648. package/src/runtime/office/design/library/design-library-core.mjs +8 -7
  649. package/src/runtime/office/design/library/design-library-pack.mjs +11 -23
  650. package/src/runtime/office/design/library/design-library.mjs +54 -67
  651. package/src/runtime/office/design/library/design-template-fill.mjs +119 -6
  652. package/src/runtime/office/design/library/design-template-index.mjs +2 -11
  653. package/src/runtime/office/design/library/design-template-induct.mjs +76 -7
  654. package/src/runtime/office/design/library/design-template-inspect.mjs +8 -1
  655. package/src/runtime/office/design/library/templates/mixdog-executive.pptx +0 -0
  656. package/src/runtime/office/design/native-design.mjs +2 -3
  657. package/src/runtime/office/design/xlsx/design-xlsx-components.mjs +94 -29
  658. package/src/runtime/office/design/xlsx/design-xlsx.mjs +494 -83
  659. package/src/runtime/office/index.mjs +11 -171
  660. package/src/runtime/office/office-test-support.mjs +7 -0
  661. package/src/runtime/office/pdf/pdf-adapter.mjs +36 -10
  662. package/src/runtime/office/pdf/pdf-batch-content.mjs +17 -9
  663. package/src/runtime/office/pdf/pdf-batch-structure.mjs +171 -7
  664. package/src/runtime/office/pdf/pdf-document.mjs +1 -1
  665. package/src/runtime/office/pdf/pdf-draw.mjs +14 -29
  666. package/src/runtime/office/pdf/pdf-fonts.mjs +94 -28
  667. package/src/runtime/office/pdf/pdf-forms.mjs +45 -8
  668. package/src/runtime/office/pdf/pdf-ocr.mjs +18 -12
  669. package/src/runtime/office/pdf/pdf-render.mjs +85 -83
  670. package/src/runtime/office/pdf/pdf-search.mjs +3 -4
  671. package/src/runtime/office/pdf/pdf-writer.mjs +697 -99
  672. package/src/runtime/office/portable/docx-formatting.mjs +5 -0
  673. package/src/runtime/office/portable/docx-revisions.mjs +9 -10
  674. package/src/runtime/office/portable/docx-runs.mjs +4 -7
  675. package/src/runtime/office/portable/docx-tracked-edits.mjs +59 -18
  676. package/src/runtime/office/portable/font-provisioner.mjs +30 -19
  677. package/src/runtime/office/portable/ooxml-validator.mjs +4 -1
  678. package/src/runtime/office/portable/placeholder-scan.mjs +51 -0
  679. package/src/runtime/office/portable/portable-cells.mjs +52 -3
  680. package/src/runtime/office/portable/portable-chart.mjs +133 -24
  681. package/src/runtime/office/portable/portable-docx-edits.mjs +260 -96
  682. package/src/runtime/office/portable/portable-docx-operations.mjs +253 -65
  683. package/src/runtime/office/portable/portable-docx-parts.mjs +269 -105
  684. package/src/runtime/office/portable/portable-docx-styles.mjs +67 -0
  685. package/src/runtime/office/portable/portable-docx-xml.mjs +335 -39
  686. package/src/runtime/office/portable/portable-docx.mjs +17 -1
  687. package/src/runtime/office/portable/portable-opc.mjs +89 -44
  688. package/src/runtime/office/portable/portable-package.mjs +27 -26
  689. package/src/runtime/office/portable/portable-pivot.mjs +84 -19
  690. package/src/runtime/office/portable/portable-pptx-chart.mjs +47 -14
  691. package/src/runtime/office/portable/portable-pptx-charts.mjs +294 -42
  692. package/src/runtime/office/portable/portable-pptx-core.mjs +111 -35
  693. package/src/runtime/office/portable/portable-pptx-deck.mjs +17 -11
  694. package/src/runtime/office/portable/portable-pptx-package.mjs +104 -46
  695. package/src/runtime/office/portable/portable-pptx-shapes.mjs +170 -101
  696. package/src/runtime/office/portable/portable-pptx.mjs +3 -1
  697. package/src/runtime/office/portable/portable-sheet-audits.mjs +130 -87
  698. package/src/runtime/office/portable/portable-sheet-page.mjs +147 -49
  699. package/src/runtime/office/portable/portable-sheet-parts.mjs +4 -5
  700. package/src/runtime/office/portable/portable-sheet-styles.mjs +46 -23
  701. package/src/runtime/office/portable/portable-sheet-xml.mjs +72 -15
  702. package/src/runtime/office/portable/portable-slide-shapes.mjs +215 -13
  703. package/src/runtime/office/portable/portable-snapshot-docx.mjs +150 -5
  704. package/src/runtime/office/portable/portable-snapshot-pptx.mjs +37 -6
  705. package/src/runtime/office/portable/portable-snapshot-shared.mjs +6 -4
  706. package/src/runtime/office/portable/portable-snapshot-xlsx.mjs +51 -24
  707. package/src/runtime/office/portable/portable-soffice.mjs +210 -33
  708. package/src/runtime/office/portable/portable-validation-package.mjs +131 -22
  709. package/src/runtime/office/portable/portable-validation.mjs +262 -134
  710. package/src/runtime/office/portable/portable-xlsx-cell-values.mjs +13 -0
  711. package/src/runtime/office/portable/portable-xlsx-charts.mjs +280 -0
  712. package/src/runtime/office/portable/portable-xlsx-drawings.mjs +328 -0
  713. package/src/runtime/office/portable/portable-xlsx-operations.mjs +46 -638
  714. package/src/runtime/office/portable/portable-xlsx-pivot-ops.mjs +168 -0
  715. package/src/runtime/office/portable/portable-xlsx-range-layout.mjs +308 -0
  716. package/src/runtime/office/portable/portable-xlsx-reference-shift.mjs +727 -0
  717. package/src/runtime/office/portable/portable-xlsx-sheet-edits.mjs +236 -75
  718. package/src/runtime/office/portable/portable-xlsx.mjs +37 -2
  719. package/src/runtime/office/portable/portable-xml.mjs +106 -2
  720. package/src/runtime/office/portable/pptx-relations.mjs +11 -0
  721. package/src/runtime/office/portable/pptx-table-fit.mjs +78 -0
  722. package/src/runtime/office/portable/pptx-targets.mjs +2 -1
  723. package/src/runtime/office/portable/review-editability.mjs +4 -11
  724. package/src/runtime/office/portable/text-metrics.mjs +136 -78
  725. package/src/runtime/office/portable/xlsx-assertions.mjs +144 -136
  726. package/src/runtime/office/portable/xlsx-audit-support.mjs +17 -18
  727. package/src/runtime/office/portable/xlsx-contract.mjs +56 -9
  728. package/src/runtime/office/portable/xlsx-formula-audit.mjs +47 -31
  729. package/src/runtime/office/portable/xlsx-formula-engine.mjs +38 -15
  730. package/src/runtime/office/portable/xlsx-recalculate.mjs +16 -18
  731. package/src/runtime/office/portable/xlsx-sheet-hygiene.mjs +43 -6
  732. package/src/runtime/office/quality/assurance-checklist.mjs +5 -2
  733. package/src/runtime/office/quality/assurance-rendered.mjs +3 -2
  734. package/src/runtime/office/quality/assurance-structure-docx.mjs +13 -1
  735. package/src/runtime/office/quality/assurance-structure-pptx.mjs +93 -19
  736. package/src/runtime/office/quality/assurance-structure-xlsx.mjs +70 -18
  737. package/src/runtime/office/quality/assurance-trust.mjs +25 -10
  738. package/src/runtime/office/quality/design-aesthetics-metrics.mjs +1 -1
  739. package/src/runtime/office/quality/design-aesthetics.mjs +172 -145
  740. package/src/runtime/office/quality/design-deck-diversity.mjs +7 -23
  741. package/src/runtime/office/quality/design-review-authored.mjs +27 -10
  742. package/src/runtime/office/quality/design-review-critique.mjs +69 -66
  743. package/src/runtime/office/quality/design-review.mjs +118 -104
  744. package/src/runtime/office/quality/document-acceptance.mjs +10 -3
  745. package/src/runtime/office/quality/inline-audit.mjs +47 -5
  746. package/src/runtime/office/quality/pptx-deck-rubric.mjs +14 -6
  747. package/src/runtime/office/quality/pptx-slide-roles.mjs +7 -9
  748. package/src/runtime/office/quality/presentation-acceptance.mjs +2 -6
  749. package/src/runtime/office/quality/quality-pipeline.mjs +29 -14
  750. package/src/runtime/office/quality/quality-score.mjs +3 -2
  751. package/src/runtime/office/quality/render-air.mjs +12 -5
  752. package/src/runtime/office/shared/column-alignments.mjs +30 -0
  753. package/src/runtime/office/shared/column-widths.mjs +45 -0
  754. package/src/runtime/office/shared/korean-particles.mjs +49 -0
  755. package/src/runtime/office/shared/labels.mjs +2 -0
  756. package/src/runtime/office/shared/line-breaks.mjs +34 -0
  757. package/src/runtime/office/shared/page-sizes.mjs +30 -0
  758. package/src/runtime/office/tool-defs.mjs +6 -4
  759. package/src/runtime/shared/agent-reap-state.mjs +8 -4
  760. package/src/runtime/shared/atomic-file.mjs +56 -60
  761. package/src/runtime/shared/background-tasks.mjs +22 -19
  762. package/src/runtime/shared/browser-launch.mjs +90 -0
  763. package/src/runtime/shared/buffered-appender.mjs +1 -2
  764. package/src/runtime/shared/child-spawn-gate.mjs +11 -15
  765. package/src/runtime/shared/child-spawn-remote.mjs +6 -8
  766. package/src/runtime/shared/clean.mjs +13 -0
  767. package/src/runtime/shared/compact-event-label.mjs +11 -0
  768. package/src/runtime/shared/config.mjs +8 -15
  769. package/src/runtime/shared/developer-options.mjs +88 -0
  770. package/src/runtime/shared/edit-tool-dialect.mjs +8 -8
  771. package/src/runtime/shared/err-text.mjs +23 -18
  772. package/src/runtime/shared/file-lock.mjs +268 -130
  773. package/src/runtime/shared/git-runner-worker.mjs +79 -0
  774. package/src/runtime/shared/git-runner.mjs +20 -0
  775. package/src/runtime/shared/idle-gc.mjs +30 -2
  776. package/src/runtime/shared/inline-file-kind.mjs +53 -0
  777. package/src/runtime/shared/listener-leak-warning.mjs +15 -0
  778. package/src/runtime/shared/llm/cost.mjs +15 -11
  779. package/src/runtime/shared/llm/usage-accounting.mjs +24 -12
  780. package/src/runtime/shared/llm/usage-ledger-quota.mjs +759 -0
  781. package/src/runtime/shared/llm/usage-ledger-repair.mjs +195 -98
  782. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +277 -0
  783. package/src/runtime/shared/llm/usage-ledger-worker.mjs +72 -0
  784. package/src/runtime/shared/llm/usage-ledger.mjs +219 -217
  785. package/src/runtime/shared/llm/usage-log.mjs +13 -17
  786. package/src/runtime/shared/llm/usage-pricing-refresh.mjs +114 -16
  787. package/src/runtime/shared/llm/usage-rollup.mjs +4 -77
  788. package/src/runtime/shared/llm/usage-session-history.mjs +1 -231
  789. package/src/runtime/shared/llm/usage-test-support.mjs +33 -0
  790. package/src/runtime/shared/native-asset.mjs +22 -2
  791. package/src/runtime/shared/notify-trace.mjs +6 -3
  792. package/src/runtime/shared/object.mjs +7 -0
  793. package/src/runtime/shared/plugin-metadata.mjs +7 -10
  794. package/src/runtime/shared/plugin-paths.mjs +24 -2
  795. package/src/runtime/shared/pristine-execution.mjs +9 -14
  796. package/src/runtime/shared/process-lifecycle.mjs +34 -52
  797. package/src/runtime/shared/process-shutdown.mjs +8 -7
  798. package/src/runtime/shared/read-row-numbers.mjs +63 -0
  799. package/src/runtime/shared/resource-admission.mjs +19 -23
  800. package/src/runtime/shared/schedule-model-ref.mjs +14 -0
  801. package/src/runtime/shared/schedule-session-run.mjs +3 -13
  802. package/src/runtime/shared/schedules-db.mjs +16 -39
  803. package/src/runtime/shared/service-discovery.mjs +3 -7
  804. package/src/runtime/shared/skill-document.mjs +5 -0
  805. package/src/runtime/shared/staged-child-result.mjs +2 -7
  806. package/src/runtime/shared/staged-update.mjs +4 -10
  807. package/src/runtime/shared/tool-card-model/agent-surface.mjs +23 -17
  808. package/src/runtime/shared/tool-card-model/background-task.mjs +4 -9
  809. package/src/runtime/shared/tool-card-model/card-status.mjs +2 -1
  810. package/src/runtime/shared/tool-card-model/displayed-result.mjs +4 -3
  811. package/src/runtime/shared/tool-card-model/generic-detail.mjs +5 -3
  812. package/src/runtime/shared/tool-card-model/inline-text.mjs +1 -3
  813. package/src/runtime/shared/tool-card-model/terminal-status.mjs +10 -8
  814. package/src/runtime/shared/tool-card-model.golden-cases.mjs +10 -2
  815. package/src/runtime/shared/tool-card-model.golden.json +3 -12
  816. package/src/runtime/shared/tool-execution-contract.mjs +27 -37
  817. package/src/runtime/shared/tool-primitives.mjs +19 -42
  818. package/src/runtime/shared/tool-result-summary.mjs +13 -17
  819. package/src/runtime/shared/tool-surface.mjs +34 -38
  820. package/src/runtime/shared/tool-work-units.mjs +24 -28
  821. package/src/runtime/shared/transcript-writer/rotation.mjs +11 -14
  822. package/src/runtime/shared/turn-snapshot-store.mjs +16 -22
  823. package/src/runtime/shared/turn-snapshot.mjs +65 -62
  824. package/src/runtime/shared/turn-worktree-snapshot.mjs +25 -100
  825. package/src/runtime/shared/update-checker.mjs +8 -7
  826. package/src/runtime/shared/user-cwd.mjs +15 -23
  827. package/src/runtime/shared/user-data-guard.mjs +14 -21
  828. package/src/runtime/shared/webhook-session-run.mjs +3 -15
  829. package/src/runtime/shared/worker-requests.mjs +114 -0
  830. package/src/runtime/tidy/apply.mjs +2 -2
  831. package/src/runtime/tidy/core-install.mjs +2 -3
  832. package/src/runtime/tidy/engines-manifest.json +6 -0
  833. package/src/runtime/tidy/history-comment.mjs +37 -32
  834. package/src/runtime/tidy/install.mjs +2 -2
  835. package/src/runtime/tidy/languages.mjs +13 -11
  836. package/src/runtime/tidy/process.mjs +20 -23
  837. package/src/runtime/tidy/report.mjs +174 -34
  838. package/src/runtime/tidy/resolve.mjs +27 -25
  839. package/src/runtime/tidy/runners/air.mjs +3 -21
  840. package/src/runtime/tidy/runners/biome.mjs +26 -11
  841. package/src/runtime/tidy/runners/clang-format.mjs +2 -2
  842. package/src/runtime/tidy/runners/dotnet-format.mjs +13 -11
  843. package/src/runtime/tidy/runners/dprint.mjs +3 -24
  844. package/src/runtime/tidy/runners/index.mjs +0 -2
  845. package/src/runtime/tidy/runners/mago.mjs +12 -28
  846. package/src/runtime/tidy/runners/ruff.mjs +3 -9
  847. package/src/runtime/tidy/runners/rustfmt.mjs +10 -9
  848. package/src/runtime/tidy/runners/shared.mjs +52 -10
  849. package/src/runtime/tidy/runners/shellcheck.mjs +1 -8
  850. package/src/runtime/tidy/runners/stylua.mjs +3 -21
  851. package/src/runtime/tidy/shadow.mjs +130 -0
  852. package/src/runtime/tidy/structural.mjs +5 -5
  853. package/src/runtime/tidy/tool-defs.mjs +3 -3
  854. package/src/runtime/tidy/tool.mjs +33 -0
  855. package/src/runtime/tidy/worktree.mjs +109 -0
  856. package/src/runtime/web-search/index.mjs +160 -128
  857. package/src/runtime/web-search/lib/http-fetch.mjs +40 -55
  858. package/src/runtime/web-search/lib/ssrf-guard.mjs +66 -52
  859. package/src/runtime/web-search/lib/web-tools.mjs +7 -97
  860. package/src/runtime/web-search/tool-defs.mjs +2 -1
  861. package/src/session-runtime/boot/apis.mjs +29 -6
  862. package/src/session-runtime/boot/facade.mjs +2 -0
  863. package/src/session-runtime/boot/infrastructure.mjs +2 -7
  864. package/src/session-runtime/boot/providers.mjs +0 -2
  865. package/src/session-runtime/boot/session.mjs +0 -1
  866. package/src/session-runtime/config-helpers.mjs +9 -9
  867. package/src/session-runtime/config-lifecycle/config-writers.mjs +10 -11
  868. package/src/session-runtime/context-inspection.mjs +76 -30
  869. package/src/session-runtime/context-status-cache.mjs +10 -52
  870. package/src/session-runtime/context-status-inspection.mjs +54 -25
  871. package/src/session-runtime/context-status-shape.mjs +1 -18
  872. package/src/session-runtime/context-status.mjs +3 -15
  873. package/src/session-runtime/cwd-plugins/core-memory-context.mjs +1 -4
  874. package/src/session-runtime/cwd-plugins.mjs +7 -8
  875. package/src/session-runtime/extension-scopes.mjs +2 -3
  876. package/src/session-runtime/fs-utils.mjs +1 -2
  877. package/src/session-runtime/goal-control.mjs +3 -4
  878. package/src/session-runtime/goal-deadlines.mjs +13 -24
  879. package/src/session-runtime/goal-facade-api.mjs +15 -12
  880. package/src/session-runtime/goal-mutations.mjs +10 -19
  881. package/src/session-runtime/goal-reminder.mjs +4 -4
  882. package/src/session-runtime/goal-runtime.mjs +10 -8
  883. package/src/session-runtime/goal-state.mjs +33 -1
  884. package/src/session-runtime/goal-storage.mjs +7 -2
  885. package/src/session-runtime/goal-tasks.mjs +9 -28
  886. package/src/session-runtime/goal-text.mjs +61 -14
  887. package/src/session-runtime/goal-tool-defs.mjs +15 -11
  888. package/src/session-runtime/goal-tool-exec.mjs +5 -11
  889. package/src/session-runtime/goal-turns.mjs +74 -6
  890. package/src/session-runtime/hook-payload.mjs +4 -2
  891. package/src/session-runtime/inheritance-fit.mjs +3 -3
  892. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +4 -4
  893. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +0 -2
  894. package/src/session-runtime/lifecycle/session-switch/resume.mjs +3 -6
  895. package/src/session-runtime/lifecycle/teardown.mjs +36 -4
  896. package/src/session-runtime/local-provider-settings.mjs +5 -1
  897. package/src/session-runtime/mcp-glue/server-catalog.mjs +6 -8
  898. package/src/session-runtime/mcp-glue/server-input.mjs +11 -14
  899. package/src/session-runtime/mcp-glue.mjs +0 -2
  900. package/src/session-runtime/media-api.mjs +3 -0
  901. package/src/session-runtime/model-capabilities.mjs +3 -9
  902. package/src/session-runtime/model-route/web-search-route.mjs +2 -4
  903. package/src/session-runtime/native-web-search/routes.mjs +2 -10
  904. package/src/session-runtime/notification-bus.mjs +33 -8
  905. package/src/session-runtime/plugin-mcp.mjs +13 -12
  906. package/src/session-runtime/prewarm/channel-start.mjs +6 -1
  907. package/src/session-runtime/provider-auth/accounts.mjs +2 -2
  908. package/src/session-runtime/provider-auth/login.mjs +0 -7
  909. package/src/session-runtime/provider-models.mjs +7 -1
  910. package/src/session-runtime/provider-readiness.mjs +19 -22
  911. package/src/session-runtime/provider-request-snapshot.mjs +220 -103
  912. package/src/session-runtime/provider-usage.mjs +81 -14
  913. package/src/session-runtime/quick-web-search-models.mjs +6 -6
  914. package/src/session-runtime/resource-mcp-api.mjs +1 -6
  915. package/src/session-runtime/resource-plugins-api.mjs +1 -2
  916. package/src/session-runtime/runtime-facade.mjs +3 -1
  917. package/src/session-runtime/runtime-modules.mjs +1 -0
  918. package/src/session-runtime/runtime-paths.mjs +1 -3
  919. package/src/session-runtime/self-update.mjs +11 -13
  920. package/src/session-runtime/session-create/materialize.mjs +4 -10
  921. package/src/session-runtime/session-hooks.mjs +37 -96
  922. package/src/session-runtime/session-lifecycle.mjs +0 -2
  923. package/src/session-runtime/session-route-policy.mjs +2 -1
  924. package/src/session-runtime/session-text.mjs +6 -5
  925. package/src/session-runtime/session-title.mjs +6 -6
  926. package/src/session-runtime/settings-api.mjs +5 -3
  927. package/src/session-runtime/settings-developer-api.mjs +22 -0
  928. package/src/session-runtime/setup-tool/executor.mjs +16 -5
  929. package/src/session-runtime/setup-tool/ui-requests.mjs +14 -4
  930. package/src/session-runtime/skills-api.mjs +5 -5
  931. package/src/session-runtime/statusline-route.mjs +1 -4
  932. package/src/session-runtime/tool-catalog-data.mjs +4 -3
  933. package/src/session-runtime/tool-catalog-schema.mjs +0 -6
  934. package/src/session-runtime/tool-catalog.mjs +52 -64
  935. package/src/session-runtime/tool-defs.mjs +1 -1
  936. package/src/session-runtime/turn/turn-run/snapshot-tracker.mjs +6 -2
  937. package/src/session-runtime/turn/turn-run/transcript.mjs +1 -2
  938. package/src/session-runtime/usage-stats-api.mjs +75 -4
  939. package/src/session-runtime/workflow/agents.mjs +44 -24
  940. package/src/session-runtime/workflow/context.mjs +3 -1
  941. package/src/session-runtime/workflow/packs.mjs +49 -13
  942. package/src/session-runtime/workflow/shared-scan-cache.mjs +83 -0
  943. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +2 -10
  944. package/src/session-runtime/workflow-agents-api/onboarding.mjs +7 -1
  945. package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +2 -7
  946. package/src/session-runtime/workflow-ids.mjs +1 -2
  947. package/src/standalone/agent-task-status.mjs +1 -19
  948. package/src/standalone/agent-tool/close-flow/close-all.mjs +67 -0
  949. package/src/standalone/agent-tool/close-flow.mjs +4 -62
  950. package/src/standalone/agent-tool/execute-send.mjs +80 -0
  951. package/src/standalone/agent-tool/execute-spawn.mjs +76 -0
  952. package/src/standalone/agent-tool/execute.mjs +7 -147
  953. package/src/standalone/agent-tool/helpers.mjs +24 -24
  954. package/src/standalone/agent-tool/job-task-reconcile.mjs +14 -2
  955. package/src/standalone/agent-tool/job-views/session-progress.mjs +20 -0
  956. package/src/standalone/agent-tool/lead-worker-index/row-settlement.mjs +6 -25
  957. package/src/standalone/agent-tool/notify/early-completion.mjs +58 -0
  958. package/src/standalone/agent-tool/notify.mjs +7 -55
  959. package/src/standalone/agent-tool/provider-init.mjs +68 -64
  960. package/src/standalone/agent-tool/render.mjs +122 -119
  961. package/src/standalone/agent-tool/send-flow.mjs +10 -9
  962. package/src/standalone/agent-tool/spawn-flow/spawn-plan.mjs +89 -0
  963. package/src/standalone/agent-tool/spawn-flow/spawn-prep.mjs +16 -75
  964. package/src/standalone/agent-tool/spawn-flow/spawn-run.mjs +10 -9
  965. package/src/standalone/agent-tool/tag-registry.mjs +1 -0
  966. package/src/standalone/agent-tool/terminal-reaper/tombstones.mjs +54 -5
  967. package/src/standalone/agent-tool/worker-index/mutation-batch.mjs +1 -5
  968. package/src/standalone/agent-tool/worker-rows.mjs +0 -7
  969. package/src/standalone/agent-tool.mjs +3 -2
  970. package/src/standalone/agent-watchdog-registry.mjs +28 -17
  971. package/src/standalone/channel-admin.mjs +77 -28
  972. package/src/standalone/channel-binding.mjs +6 -10
  973. package/src/standalone/channel-client/notify-stream.mjs +4 -11
  974. package/src/standalone/channel-client/reconnect.mjs +1 -3
  975. package/src/standalone/channel-transport/call-dispatch.mjs +2 -4
  976. package/src/standalone/channel-transport/client-registry/client-grace.mjs +1 -3
  977. package/src/standalone/channel-transport/client-registry/registration-replays.mjs +3 -7
  978. package/src/standalone/channel-transport/http-routes.mjs +2 -1
  979. package/src/standalone/channel-transport/remote-binding.mjs +10 -79
  980. package/src/standalone/channel-transport/remote-intent.mjs +52 -0
  981. package/src/standalone/channel-transport/remote-notify.mjs +15 -107
  982. package/src/standalone/channel-transport/remote-pointer.mjs +121 -0
  983. package/src/standalone/channel-transport/remote-state.mjs +47 -0
  984. package/src/standalone/channel-worker/daemon-attach.mjs +1 -1
  985. package/src/standalone/channel-worker/daemon-spawn.mjs +14 -52
  986. package/src/standalone/daemon-agent-control.mjs +65 -0
  987. package/src/standalone/daemon-candidate.mjs +81 -0
  988. package/src/standalone/daemon-channels-loader.mjs +60 -0
  989. package/src/standalone/daemon-desktop-runtime.mjs +28 -0
  990. package/src/standalone/daemon-lag-profiler.mjs +229 -0
  991. package/src/standalone/daemon-local-session-bridge.mjs +62 -0
  992. package/src/standalone/daemon-stored-session-views.mjs +65 -0
  993. package/src/standalone/daemon.mjs +219 -320
  994. package/src/standalone/desktop-service-registry.mjs +9 -7
  995. package/src/standalone/folder-dialog.mjs +19 -15
  996. package/src/standalone/hook-bus/command-handler.mjs +60 -49
  997. package/src/standalone/hook-bus/config.mjs +27 -22
  998. package/src/standalone/hook-bus/event-runner.mjs +7 -74
  999. package/src/standalone/hook-bus/handler-dispatch.mjs +75 -0
  1000. package/src/standalone/hook-bus/handlers.mjs +40 -39
  1001. package/src/standalone/memory-runtime-proxy/calls.mjs +7 -0
  1002. package/src/standalone/memory-runtime-proxy/start.mjs +4 -9
  1003. package/src/standalone/memory-runtime-proxy.mjs +1 -0
  1004. package/src/standalone/provider-admin.mjs +97 -109
  1005. package/src/standalone/seeds.mjs +1 -6
  1006. package/src/standalone/session-client/attachment-calls.mjs +67 -0
  1007. package/src/standalone/session-client/stream-link.mjs +85 -0
  1008. package/src/standalone/session-client.mjs +62 -183
  1009. package/src/standalone/session-frame-stream.mjs +47 -11
  1010. package/src/standalone/session-protocol.mjs +5 -1
  1011. package/src/standalone/session-proxy/projection.mjs +2 -11
  1012. package/src/standalone/session-proxy/transport-calls.mjs +2 -5
  1013. package/src/standalone/session-proxy.mjs +1 -4
  1014. package/src/standalone/session-runtime-agent-control-client.mjs +11 -27
  1015. package/src/standalone/session-runtime-agent-control.mjs +85 -0
  1016. package/src/standalone/session-runtime-host.mjs +52 -511
  1017. package/src/standalone/session-runtime-inline-host/telemetry.mjs +38 -0
  1018. package/src/standalone/session-runtime-inline-host.mjs +6 -37
  1019. package/src/standalone/session-runtime-proxy.mjs +164 -0
  1020. package/src/standalone/session-runtime-shard-router.mjs +5 -9
  1021. package/src/standalone/session-runtime-spawn-leases.mjs +82 -0
  1022. package/src/standalone/session-runtime-worker.mjs +27 -7
  1023. package/src/standalone/session-service/agent-tree/agent-child.mjs +59 -0
  1024. package/src/standalone/session-service/agent-tree/agent-rehydrate.mjs +1 -1
  1025. package/src/standalone/session-service/agent-tree/agent-turns.mjs +22 -54
  1026. package/src/standalone/session-service/agent-tree.mjs +15 -2
  1027. package/src/standalone/session-service/entries/disposal.mjs +72 -0
  1028. package/src/standalone/session-service/entries/external-binding.mjs +6 -3
  1029. package/src/standalone/session-service/entries/lifecycle.mjs +15 -59
  1030. package/src/standalone/session-service/projection/address-index.mjs +5 -1
  1031. package/src/standalone/session-service/projection/frames.mjs +24 -11
  1032. package/src/standalone/session-service/projection/revisions.mjs +52 -16
  1033. package/src/standalone/session-service/projection/transcript-window.mjs +258 -0
  1034. package/src/standalone/session-service/projection.mjs +12 -2
  1035. package/src/standalone/session-service/retention/busy.mjs +50 -0
  1036. package/src/standalone/session-service/retention.mjs +43 -44
  1037. package/src/standalone/session-service/session-calls/goal-recovery.mjs +44 -0
  1038. package/src/standalone/session-service/session-calls/session-action.mjs +5 -8
  1039. package/src/standalone/session-service/session-calls/session-turns.mjs +12 -42
  1040. package/src/standalone/session-service/session-calls/session-views.mjs +84 -20
  1041. package/src/standalone/session-service/session-calls.mjs +3 -2
  1042. package/src/standalone/session-service/stored-reader.mjs +107 -10
  1043. package/src/standalone/session-service/viewers.mjs +73 -7
  1044. package/src/standalone/session-service.mjs +9 -0
  1045. package/src/standalone/session-state-patch.d.mts +7 -0
  1046. package/src/standalone/session-state-patch.mjs +37 -9
  1047. package/src/standalone/session-transport/call-lanes.mjs +2 -4
  1048. package/src/standalone/session-transport/stack.mjs +131 -0
  1049. package/src/standalone/session-transport.mjs +10 -103
  1050. package/src/standalone/usage-dashboard-model.mjs +2 -2
  1051. package/src/standalone/usage-dashboard.mjs +166 -167
  1052. package/src/standalone/usage-stats-model.mjs +117 -97
  1053. package/src/tui/App.jsx +27 -211
  1054. package/src/tui/app/app-format.mjs +10 -12
  1055. package/src/tui/app/app-view/floating-panel.jsx +232 -0
  1056. package/src/tui/app/app-view/text-entry-labels.mjs +81 -0
  1057. package/src/tui/app/app-view/transcript-viewport/trailing-bands.jsx +88 -0
  1058. package/src/tui/app/app-view/transcript-viewport/transcript-rows.jsx +87 -0
  1059. package/src/tui/app/app-view/transcript-viewport.jsx +74 -0
  1060. package/src/tui/app/app-view.jsx +56 -501
  1061. package/src/tui/app/clipboard.mjs +16 -2
  1062. package/src/tui/app/core-memory-picker/core-rows.mjs +32 -0
  1063. package/src/tui/app/core-memory-picker/entry-prompts.mjs +45 -0
  1064. package/src/tui/app/core-memory-picker/list-panels.mjs +75 -0
  1065. package/src/tui/app/core-memory-picker.mjs +26 -120
  1066. package/src/tui/app/create-app-pickers.mjs +3 -1
  1067. package/src/tui/app/doctor.mjs +174 -63
  1068. package/src/tui/app/extension-pickers/skills-pickers/project-skills.mjs +38 -0
  1069. package/src/tui/app/extension-pickers/skills-pickers/skill-detail.mjs +80 -0
  1070. package/src/tui/app/extension-pickers/skills-pickers/skill-items.mjs +44 -0
  1071. package/src/tui/app/extension-pickers/skills-pickers.mjs +31 -137
  1072. package/src/tui/app/maintenance-pickers/developer-picker.mjs +168 -0
  1073. package/src/tui/app/maintenance-pickers.mjs +12 -2
  1074. package/src/tui/app/model-options.mjs +59 -66
  1075. package/src/tui/app/model-picker/model-footer.mjs +21 -18
  1076. package/src/tui/app/model-picker/route-selection/context-window.mjs +47 -0
  1077. package/src/tui/app/model-picker/route-selection/effort.mjs +86 -0
  1078. package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +84 -0
  1079. package/src/tui/app/model-picker/route-selection/model-key.mjs +5 -0
  1080. package/src/tui/app/model-picker/route-selection.mjs +34 -200
  1081. package/src/tui/app/mouse-input/button-gestures.mjs +380 -0
  1082. package/src/tui/app/mouse-input/edge-autoscroll.mjs +53 -0
  1083. package/src/tui/app/mouse-input/geometry.mjs +109 -0
  1084. package/src/tui/app/mouse-input/sgr-buttons.mjs +14 -0
  1085. package/src/tui/app/mouse-input/wheel-router.mjs +96 -0
  1086. package/src/tui/app/onboarding/models-step.mjs +1 -1
  1087. package/src/tui/app/onboarding/role-model-picker.mjs +2 -2
  1088. package/src/tui/app/onboarding/step-data.mjs +1 -1
  1089. package/src/tui/app/panel-signature.mjs +58 -0
  1090. package/src/tui/app/project-picker/create-flow.mjs +3 -3
  1091. package/src/tui/app/project-picker/picker-state.mjs +1 -5
  1092. package/src/tui/app/project-picker/project-service.mjs +3 -7
  1093. package/src/tui/app/prompt-submit/provider-prompts.mjs +7 -2
  1094. package/src/tui/app/prompt-submit.mjs +2 -7
  1095. package/src/tui/app/provider-setup/api-key-actions.mjs +7 -80
  1096. package/src/tui/app/provider-setup/oauth-actions.mjs +2 -10
  1097. package/src/tui/app/provider-setup/provider-items.mjs +22 -9
  1098. package/src/tui/app/provider-usable.mjs +16 -0
  1099. package/src/tui/app/settings-picker/settings-navigation.mjs +1 -0
  1100. package/src/tui/app/settings-picker/settings-rows.mjs +6 -0
  1101. package/src/tui/app/settings-picker/settings-toggles/cycled.mjs +4 -0
  1102. package/src/tui/app/settings-picker/settings-toggles/listed-cyclers.mjs +77 -0
  1103. package/src/tui/app/settings-picker/settings-toggles/store-toggles.mjs +61 -0
  1104. package/src/tui/app/settings-picker/settings-toggles/theme-cycler.mjs +36 -0
  1105. package/src/tui/app/settings-picker/settings-toggles.mjs +41 -162
  1106. package/src/tui/app/shell-layout/surfaces.mjs +1 -14
  1107. package/src/tui/app/shell-layout/viewport.mjs +1 -2
  1108. package/src/tui/app/slash-commands.mjs +14 -4
  1109. package/src/tui/app/slash-dispatch/session-commands.mjs +2 -5
  1110. package/src/tui/app/store-service-call.mjs +17 -0
  1111. package/src/tui/app/text-entry-policy.mjs +1 -3
  1112. package/src/tui/app/transcript-anchor-sync.mjs +1 -1
  1113. package/src/tui/app/transcript-row-estimate.mjs +52 -119
  1114. package/src/tui/app/transcript-window.mjs +21 -4
  1115. package/src/tui/app/use-disabled-skills.mjs +52 -0
  1116. package/src/tui/app/use-global-key-input/copy-first.mjs +43 -0
  1117. package/src/tui/app/use-global-key-input/shift-arrow.mjs +30 -0
  1118. package/src/tui/app/use-global-key-input.mjs +12 -75
  1119. package/src/tui/app/use-model-catalog-cache.mjs +86 -0
  1120. package/src/tui/app/use-mouse-input.mjs +78 -614
  1121. package/src/tui/app/use-pasted-buffers.mjs +55 -81
  1122. package/src/tui/app/use-prompt-draft-flow/draft-change.mjs +66 -0
  1123. package/src/tui/app/use-prompt-draft-flow/prompt-cancels.mjs +40 -0
  1124. package/src/tui/app/use-prompt-draft-flow.mjs +39 -78
  1125. package/src/tui/app/use-prompt-handlers.mjs +1 -0
  1126. package/src/tui/app/use-prompt-queue-history/prompt-history.mjs +22 -0
  1127. package/src/tui/app/use-prompt-queue-history/restore-to-prompt.mjs +147 -0
  1128. package/src/tui/app/use-prompt-queue-history.mjs +20 -117
  1129. package/src/tui/app/use-selection-focus.mjs +5 -10
  1130. package/src/tui/app/use-selection-geometry.mjs +13 -16
  1131. package/src/tui/app/use-selection-paint/paint-queue.mjs +90 -0
  1132. package/src/tui/app/use-selection-paint/selection-clip.mjs +33 -0
  1133. package/src/tui/app/use-selection-paint.mjs +31 -102
  1134. package/src/tui/app/use-transcript-activity.mjs +32 -38
  1135. package/src/tui/app/use-transcript-scroll.mjs +2 -4
  1136. package/src/tui/app/use-transcript-window/instance-state.mjs +1 -1
  1137. package/src/tui/app/use-transcript-window/selection-shift.mjs +2 -2
  1138. package/src/tui/app/use-transcript-window/visible-items.mjs +0 -2
  1139. package/src/tui/app/use-welcome-prompt-hint.mjs +12 -3
  1140. package/src/tui/app/workflow-cycle.mjs +63 -0
  1141. package/src/tui/components/AnsiText.jsx +47 -15
  1142. package/src/tui/components/ContextPanel.jsx +8 -3
  1143. package/src/tui/components/ItemRightHintOverprint.jsx +14 -25
  1144. package/src/tui/components/Markdown.jsx +5 -20
  1145. package/src/tui/components/MarkdownTable.jsx +4 -9
  1146. package/src/tui/components/Message.jsx +1 -1
  1147. package/src/tui/components/Picker.jsx +32 -48
  1148. package/src/tui/components/PromptInput.jsx +123 -395
  1149. package/src/tui/components/QueuedCommands.jsx +1 -3
  1150. package/src/tui/components/SlashCommandPalette.jsx +1 -1
  1151. package/src/tui/components/Spinner.jsx +6 -8
  1152. package/src/tui/components/StatusLine.jsx +45 -70
  1153. package/src/tui/components/TextEntryPanel.jsx +28 -119
  1154. package/src/tui/components/ToolExecution.jsx +13 -31
  1155. package/src/tui/components/TranscriptItem.jsx +0 -2
  1156. package/src/tui/components/TurnDone.jsx +4 -29
  1157. package/src/tui/components/UsagePanel.jsx +7 -31
  1158. package/src/tui/components/prompt-input/cursor-anchor.mjs +66 -0
  1159. package/src/tui/components/prompt-input/edit-helpers.mjs +47 -4
  1160. package/src/tui/components/prompt-input/key-signals.mjs +102 -0
  1161. package/src/tui/components/prompt-input/mouse-selection.mjs +118 -0
  1162. package/src/tui/components/prompt-input/restore-policy.d.mts +0 -1
  1163. package/src/tui/components/prompt-input/restore-policy.mjs +3 -8
  1164. package/src/tui/components/prompt-input/selected-text.jsx +25 -0
  1165. package/src/tui/components/prompt-input/undo-stack.mjs +75 -0
  1166. package/src/tui/components/tool-execution/surface-detail.mjs +4 -29
  1167. package/src/tui/components/tool-execution/text-format.mjs +9 -12
  1168. package/src/tui/components/tool-output-format.mjs +4 -5
  1169. package/src/tui/dist/index.mjs +38140 -4513
  1170. package/src/tui/index.jsx +6 -7
  1171. package/src/tui/markdown/format-token.mjs +9 -16
  1172. package/src/tui/markdown/lru.mjs +14 -0
  1173. package/src/tui/markdown/measure-rendered-rows.mjs +12 -47
  1174. package/src/tui/markdown/render-ansi.mjs +8 -12
  1175. package/src/tui/markdown/stream-fence.mjs +3 -7
  1176. package/src/tui/markdown/streaming-markdown.mjs +8 -7
  1177. package/src/tui/markdown/table-layout/box-lines.mjs +46 -0
  1178. package/src/tui/markdown/table-layout/cells.mjs +23 -0
  1179. package/src/tui/markdown/table-layout/column-widths.mjs +65 -0
  1180. package/src/tui/markdown/table-layout/vertical-lines.mjs +46 -0
  1181. package/src/tui/markdown/table-layout.mjs +22 -152
  1182. package/src/tui/paste-attachments.mjs +6 -16
  1183. package/src/tui/prompt-history-store.mjs +0 -9
  1184. package/src/tui/session/active-tool-summary.mjs +19 -27
  1185. package/src/tui/session/agent-envelope.mjs +22 -21
  1186. package/src/tui/session/agent-job-feed/agent-job-card.mjs +2 -2
  1187. package/src/tui/session/context-state.mjs +3 -1
  1188. package/src/tui/session/cross-surface-share.mjs +15 -20
  1189. package/src/tui/session/goal-continuation/continuation-queue.mjs +3 -3
  1190. package/src/tui/session/goal-continuation/goal-visibility.mjs +4 -1
  1191. package/src/tui/session/goal-continuation.mjs +7 -3
  1192. package/src/tui/session/goal-turn-state.mjs +2 -2
  1193. package/src/tui/session/initial-state.mjs +2 -1
  1194. package/src/tui/session/labels.mjs +1 -10
  1195. package/src/tui/session/live-share/delta.mjs +1 -1
  1196. package/src/tui/session/live-share/owner.mjs +9 -7
  1197. package/src/tui/session/live-share/retry.mjs +15 -0
  1198. package/src/tui/session/live-share/viewer/frame-router.mjs +32 -0
  1199. package/src/tui/session/live-share/viewer/pipe-client.mjs +108 -0
  1200. package/src/tui/session/live-share/viewer.mjs +23 -114
  1201. package/src/tui/session/notice-surface.mjs +1 -1
  1202. package/src/tui/session/notice-text.mjs +21 -17
  1203. package/src/tui/session/notification-plan.mjs +8 -5
  1204. package/src/tui/session/prompt-history.mjs +7 -5
  1205. package/src/tui/session/queue-helpers.mjs +12 -14
  1206. package/src/tui/session/render-timing.mjs +1 -1
  1207. package/src/tui/session/session-api/commands.mjs +12 -15
  1208. package/src/tui/session/session-api/controls.mjs +2 -1
  1209. package/src/tui/session/session-api/intake/abort.mjs +7 -9
  1210. package/src/tui/session/session-api/intake/rewind.mjs +2 -5
  1211. package/src/tui/session/session-api/intake/submission.mjs +4 -9
  1212. package/src/tui/session/session-api/integrations.mjs +60 -12
  1213. package/src/tui/session/session-api/lifecycle/resume.mjs +7 -0
  1214. package/src/tui/session/session-api/lifecycle/session-reset.mjs +76 -74
  1215. package/src/tui/session/session-api/media.mjs +27 -14
  1216. package/src/tui/session/session-api/settings.mjs +2 -0
  1217. package/src/tui/session/session-api-ext.mjs +31 -51
  1218. package/src/tui/session/session-flow/drain.mjs +18 -5
  1219. package/src/tui/session/session-flow/failed-turn-rewind.mjs +1 -7
  1220. package/src/tui/session/session-flow/queue/entry-shape.mjs +53 -0
  1221. package/src/tui/session/session-flow/queue/take-entries.mjs +82 -0
  1222. package/src/tui/session/session-flow/queue.mjs +10 -112
  1223. package/src/tui/session/session-flow/session-reset.mjs +2 -7
  1224. package/src/tui/session/session-flow/steering.mjs +10 -0
  1225. package/src/tui/session/shared-dir-watch.mjs +69 -0
  1226. package/src/tui/session/tool-approval.mjs +15 -20
  1227. package/src/tui/session/tool-card-results/grouped-result.mjs +2 -2
  1228. package/src/tui/session/tool-card-results/item-patch.mjs +8 -5
  1229. package/src/tui/session/tool-result-status.mjs +52 -3
  1230. package/src/tui/session/tool-result-text.mjs +16 -30
  1231. package/src/tui/session/transcript-intake.mjs +1 -1
  1232. package/src/tui/session/transcript-spill/spill-dir.mjs +7 -2
  1233. package/src/tui/session/transcript-spill/spill-writer.mjs +45 -6
  1234. package/src/tui/session/transcript-spill.mjs +20 -28
  1235. package/src/tui/session/transcript-store/replace-items.mjs +66 -0
  1236. package/src/tui/session/transcript-store/streaming-tail.mjs +49 -0
  1237. package/src/tui/session/transcript-store.mjs +17 -102
  1238. package/src/tui/session/tui-steering-persist.mjs +53 -57
  1239. package/src/tui/session/turn-aggregate-cards/early-complete.mjs +4 -18
  1240. package/src/tui/session/turn-stream.mjs +46 -2
  1241. package/src/tui/session/turn-tool-cards.mjs +2 -10
  1242. package/src/tui/session/turn.mjs +7 -2
  1243. package/src/tui/session-local.mjs +71 -17
  1244. package/src/tui/statusline-ansi-bridge.mjs +1 -40
  1245. package/src/tui/themes/onedark.mjs +4 -3
  1246. package/src/ui/ansi.mjs +0 -2
  1247. package/src/ui/markdown.mjs +3 -2
  1248. package/src/ui/model-display.mjs +1 -2
  1249. package/src/ui/statusline-agents.mjs +10 -21
  1250. package/src/ui/statusline-format.mjs +7 -0
  1251. package/src/ui/statusline-segments.mjs +2 -11
  1252. package/src/ui/statusline.mjs +5 -9
  1253. package/src/ui/streaming-markdown-heal.mjs +16 -3
  1254. package/src/vendor/statusline/src/gateway/route-meta.mjs +44 -13
  1255. package/src/workflows/default/WORKFLOW.md +2 -1
  1256. package/scripts/lib/isolated-root-cleanup.mjs +0 -25
  1257. package/src/rules/shared/05-parallel-calls.md +0 -13
  1258. package/src/runtime/agent/orchestrator/session/browser-snapshot-supersession.mjs +0 -61
  1259. package/src/runtime/agent/orchestrator/session/evidence-union.mjs +0 -31
  1260. package/src/runtime/agent/orchestrator/tools/builtin/diff-utils.mjs +0 -128
  1261. package/src/runtime/channels/lib/cli-worker-host.mjs +0 -2
  1262. package/src/runtime/memory/lib/llm-worker-host.mjs +0 -11
  1263. package/src/session-runtime/memory-runtime-prewarm.mjs +0 -15
  1264. package/src/standalone/opencode-go-login.mjs +0 -140
@@ -1,38 +1,8 @@
1
1
  // Worksheet-level operations the portable XLSX backend applies: sheet
2
2
  // management, images, header/footer, conditional formats, validation, sort,
3
3
  // autofit, pivot tables and charts.
4
- import { extname, posix } from 'node:path';
5
- import { resolveCellStyles } from './portable-sheet-styles.mjs';
6
4
  import { conditionalFormatKind, listValidationChoices, listValidationFormula } from './xlsx-contract.mjs';
7
- import { chartXml } from './portable-chart.mjs';
8
- import { fitDrawingSheetOnePageWide, worksheetGeometry } from './portable-sheet-page.mjs';
9
- import { toEmu } from './portable-slide-shapes.mjs';
10
- import { readFile } from 'node:fs/promises';
11
- import { summarizePivotFields, writePivotTable } from './portable-pivot.mjs';
12
- import {
13
- cellRecords,
14
- cellStyleIndexes,
15
- columnLabel,
16
- columnNumber,
17
- expandRange,
18
- parseCellRef,
19
- setCellStylesInSheet,
20
- setCellsInSheet,
21
- sharedStrings,
22
- workbookSheets,
23
- } from './portable-cells.mjs';
24
- import {
25
- CHART_CONTENT_TYPE,
26
- IMAGE_CONTENT_TYPES,
27
- PIXELS_TO_POINTS,
28
- addPackageRelationship,
29
- ensureContentTypeOverride,
30
- ensureDefaultContentType,
31
- imagePixelSize,
32
- nextRelationshipId,
33
- partRelationshipPath,
34
- zipText,
35
- } from './portable-opc.mjs';
5
+ import { nextRelationshipId, partRelationshipPath, zipText } from './portable-opc.mjs';
36
6
  import {
37
7
  OFFICE_RELATIONSHIP_BASE,
38
8
  SPREADSHEET_MAIN,
@@ -42,22 +12,17 @@ import {
42
12
  xmlDecode,
43
13
  xmlEncode,
44
14
  } from './portable-xml.mjs';
45
- import { ensureWorksheetDrawing } from './portable-sheet-parts.mjs';
46
15
  import {
47
16
  appendDifferentialFormat,
48
17
  appendWorksheetSection,
18
+ areaReference,
49
19
  conditionalScaleRule,
50
- displayWidth,
51
- formattedNumberWidth,
52
- hiddenSheetAreas,
53
- mergedRanges,
54
20
  parseAreaRange,
55
- quoteSheetName,
56
21
  upsertDefinedName,
57
22
  upsertWorksheetSection,
58
23
  worksheetSection,
59
- writeColumnWidths,
60
24
  } from './portable-sheet-xml.mjs';
25
+ import { dropCalculationChain, renameSheetReferences } from './portable-xlsx-reference-shift.mjs';
61
26
 
62
27
  export const WORKSHEET_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml';
63
28
 
@@ -80,72 +45,6 @@ function headerFooterFields(text) {
80
45
  .replace(/\{file\}/gi, '&F');
81
46
  }
82
47
 
83
- // The sort key is named the way the caller already reads the sheet: a column
84
- // letter, the header the column carries, or nothing when the first column of
85
- // the range is the key.
86
- function sortKeyColumn(op, area, headerValue) {
87
- const declared = String(op.by ?? op.column ?? op.byColumn ?? '').trim();
88
- if (!declared) return area.startCol;
89
- if (/^[A-Za-z]{1,3}$/.test(declared)) {
90
- const column = columnNumber(declared.toUpperCase());
91
- if (column < area.startCol || column > area.endCol) {
92
- throw new Error(`XLSX sort_range by "${declared}" is outside ${op.range}; name a column the range covers.`);
93
- }
94
- return column;
95
- }
96
- const headers = [];
97
- for (let col = area.startCol; col <= area.endCol; col += 1) {
98
- const value = headerValue(col);
99
- const text = value == null ? '' : String(value).trim();
100
- if (text) headers.push(`${columnLabel(col)} (${text})`);
101
- if (text && text === declared) return col;
102
- }
103
- throw new Error(
104
- `XLSX sort_range by "${declared}" matches no column in ${op.range}. Name a column letter or one of its headers: ${headers.join(', ') || '(the range has no header row)'}.`
105
- );
106
- }
107
-
108
- // Excel orders numbers before text and leaves blanks last in both directions;
109
- // text is compared the way the reader's locale reads it, so 강릉 sorts before
110
- // 광주 rather than by code point.
111
- const SORT_COLLATOR = new Intl.Collator(undefined, { numeric: true, sensitivity: 'base' });
112
-
113
- function compareSortValues(left, right) {
114
- const blank = (value) => value == null || value === '';
115
- if (blank(left) && blank(right)) return 0;
116
- if (blank(left)) return 1;
117
- if (blank(right)) return -1;
118
- const leftNumber = typeof left === 'number' ? left : Number(left);
119
- const rightNumber = typeof right === 'number' ? right : Number(right);
120
- const leftNumeric = typeof left === 'number' || (String(left).trim() !== '' && Number.isFinite(leftNumber));
121
- const rightNumeric = typeof right === 'number' || (String(right).trim() !== '' && Number.isFinite(rightNumber));
122
- if (leftNumeric && rightNumeric) return leftNumber - rightNumber;
123
- if (leftNumeric) return -1;
124
- if (rightNumeric) return 1;
125
- return SORT_COLLATOR.compare(String(left), String(right));
126
- }
127
-
128
- // A snapshot reports where a picture or chart sits as cells (A1 to C5), so a
129
- // caller placing one names a cell too. The sheet's own column widths and row
130
- // heights turn that cell into the point offset the drawing anchor stores.
131
- function cellAnchorPoints(xml, cell) {
132
- const { columnPoints, rowPoints } = worksheetGeometry(xml);
133
- const { col, row } = parseCellRef(cell);
134
- const column = columnNumber(col);
135
- let left = 0;
136
- for (let index = 1; index < column; index += 1) left += columnPoints(index);
137
- let top = 0;
138
- for (let index = 1; index < row; index += 1) top += rowPoints(index);
139
- return { left, top };
140
- }
141
-
142
- // A reader who cannot see the picture hears this description; Excel reads it
143
- // from the drawing's descr.
144
- function pictureDescription(altText) {
145
- const text = String(altText ?? '').trim();
146
- return text ? ` descr="${xmlEncode(text)}"` : '';
147
- }
148
-
149
48
  // Cell validation as both backends express it: the OOXML names here, the Excel
150
49
  // enumeration in the COM host.
151
50
  const XLSX_VALIDATION_TYPES = Object.freeze({
@@ -256,132 +155,63 @@ export async function addWorksheet(zip, name) {
256
155
  return { name: label, path: part, sheetId };
257
156
  }
258
157
 
259
- export async function renameWorksheet(zip, sheet, name) {
158
+ // Excel renames a sheet in every formula, name, rule and chart series that names it; the workbook entry alone left
159
+ // them naming a sheet that no longer exists.
160
+ export async function renameWorksheet(zip, sheet, name, sheets) {
260
161
  const label = assertWorksheetName('rename_sheet', name);
261
162
  const workbookPath = 'xl/workbook.xml';
262
- const workbook = await zipText(zip, workbookPath);
263
163
  const pattern = new RegExp(`<sheet\\b[^>]*\\bname="${tagPattern(xmlEncode(sheet.name))}"[^>]*\\/>`, 'i');
164
+ if (!pattern.test(await zipText(zip, workbookPath))) throw new Error(`Worksheet not found: ${sheet.name}`);
165
+ const rewritten = await renameSheetReferences(zip, sheets, sheet, label, 'rename_sheet');
166
+ const workbook = await zipText(zip, workbookPath);
264
167
  const match = pattern.exec(workbook);
265
- if (!match) throw new Error(`Worksheet not found: ${sheet.name}`);
266
168
  const replaced = match[0].replace(/\bname="[^"]*"/, `name="${xmlEncode(label)}"`);
267
169
  zip.file(
268
170
  workbookPath,
269
171
  `${workbook.slice(0, match.index)}${replaced}${workbook.slice(match.index + match[0].length)}`
270
172
  );
271
- return { from: sheet.name, to: label };
173
+ return { from: sheet.name, to: label, referencesRewritten: rewritten };
272
174
  }
273
175
 
274
176
  export async function deleteWorksheet(zip, sheets, sheet) {
275
177
  if (sheets.length <= 1) throw new Error('A workbook must keep at least one worksheet');
276
178
  const index = sheets.findIndex((entry) => entry.name === sheet.name);
277
179
  const workbookPath = 'xl/workbook.xml';
278
- let workbook = await zipText(zip, workbookPath);
279
180
  const pattern = new RegExp(`<sheet\\b[^>]*\\bname="${tagPattern(xmlEncode(sheet.name))}"[^>]*\\/>`, 'i');
181
+ if (!pattern.test(await zipText(zip, workbookPath))) throw new Error(`Worksheet not found: ${sheet.name}`);
182
+ // What named the sheet reads #REF! in its place, as Excel leaves it.
183
+ await renameSheetReferences(zip, sheets, sheet, null, 'delete_sheet');
184
+ let workbook = await zipText(zip, workbookPath);
280
185
  const match = pattern.exec(workbook);
281
- if (!match) throw new Error(`Worksheet not found: ${sheet.name}`);
282
186
  workbook = `${workbook.slice(0, match.index)}${workbook.slice(match.index + match[0].length)}`;
283
- workbook = upsertDefinedName(workbook, '', (item) => Number(xmlAttribute(item, 'localSheetId')) === index);
187
+ // A workbook-level name carries no localSheetId at all, and an absent
188
+ // attribute reads back as an empty string: taking that as 0 deleted every
189
+ // global name along with the first sheet.
190
+ const localSheetId = (item) => {
191
+ const raw = xmlAttribute(item, 'localSheetId');
192
+ return /^\d+$/.test(raw) ? Number(raw) : null;
193
+ };
194
+ workbook = upsertDefinedName(workbook, '', (item) => localSheetId(item) === index);
284
195
  workbook = workbook.replace(/<definedName\b[^>]*?(?:\/>|>[\s\S]*?<\/definedName>)/g, (item) => {
285
- const local = Number(xmlAttribute(item, 'localSheetId'));
286
- return Number.isFinite(local) && local > index
287
- ? item.replace(/\blocalSheetId="\d+"/, `localSheetId="${local - 1}"`)
288
- : item;
196
+ const local = localSheetId(item);
197
+ return local !== null && local > index ? item.replace(/\blocalSheetId="\d+"/, `localSheetId="${local - 1}"`) : item;
289
198
  });
290
199
  zip.file(workbookPath, workbook);
291
200
  const relsPath = 'xl/_rels/workbook.xml.rels';
292
201
  const rels = await zipText(zip, relsPath);
293
202
  zip.file(relsPath, rels.replace(new RegExp(`<Relationship\\b[^>]*\\bId="${tagPattern(sheet.rid)}"[^>]*\\/>`), ''));
294
203
  zip.remove(sheet.path);
295
- const partRels = `${posix.dirname(sheet.path)}/_rels/${posix.basename(sheet.path)}.rels`;
204
+ const partRels = partRelationshipPath(sheet.path);
296
205
  if (zip.file(partRels)) zip.remove(partRels);
297
206
  const types = await zipText(zip, '[Content_Types].xml');
298
207
  zip.file(
299
208
  '[Content_Types].xml',
300
209
  types.replace(new RegExp(`<Override\\b[^>]*\\bPartName="/${tagPattern(sheet.path)}"[^>]*\\/>`), '')
301
210
  );
211
+ await dropCalculationChain(zip);
302
212
  return { sheet: sheet.name };
303
213
  }
304
214
 
305
- // Stores the image bytes as the next xl/media part of its type.
306
- async function storeImageMedia(zip, op) {
307
- const extension = extname(String(op.path || ''))
308
- .replace(/^\./, '')
309
- .toLowerCase();
310
- const contentType = IMAGE_CONTENT_TYPES[extension];
311
- if (!contentType) {
312
- throw new Error(
313
- `Unsupported image type: .${extension || 'unknown'}. Use ${Object.keys(IMAGE_CONTENT_TYPES).join(', ')}`
314
- );
315
- }
316
- const data = await readFile(op.path);
317
- let mediaOrdinal = 1;
318
- while (zip.file(`xl/media/image${mediaOrdinal}.${extension}`)) mediaOrdinal += 1;
319
- const mediaPart = `xl/media/image${mediaOrdinal}.${extension}`;
320
- zip.file(mediaPart, data);
321
- await ensureDefaultContentType(zip, extension, contentType);
322
- return { mediaPart, data };
323
- }
324
-
325
- // The requested size, or the picture's own size in points.
326
- function imagePlacementSize(op, data) {
327
- const pixels = imagePixelSize(data);
328
- const naturalWidth = pixels ? pixels.width * PIXELS_TO_POINTS : 240;
329
- const naturalHeight = pixels ? pixels.height * PIXELS_TO_POINTS : 180;
330
- return {
331
- width: Number(op.width) > 0 ? Number(op.width) : naturalWidth,
332
- height: Number(op.height) > 0 ? Number(op.height) : naturalHeight,
333
- };
334
- }
335
-
336
- function imageAnchorXml({ embedId, anchorCount, left, top, width, height, altText }) {
337
- return (
338
- '<xdr:absoluteAnchor>' +
339
- `<xdr:pos x="${toEmu(left)}" y="${toEmu(top)}"/>` +
340
- `<xdr:ext cx="${Math.max(1, toEmu(width))}" cy="${Math.max(1, toEmu(height))}"/>` +
341
- `<xdr:pic><xdr:nvPicPr><xdr:cNvPr id="${anchorCount + 2}" name="Picture ${anchorCount + 1}"${pictureDescription(altText)}/>` +
342
- '<xdr:cNvPicPr><a:picLocks noChangeAspect="1"/></xdr:cNvPicPr></xdr:nvPicPr>' +
343
- `<xdr:blipFill><a:blip r:embed="${embedId}"/><a:stretch><a:fillRect/></a:stretch></xdr:blipFill>` +
344
- '<xdr:spPr><a:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/></a:xfrm>' +
345
- '<a:prstGeom prst="rect"><a:avLst/></a:prstGeom></xdr:spPr></xdr:pic>' +
346
- '<xdr:clientData/></xdr:absoluteAnchor>'
347
- );
348
- }
349
-
350
- /** Places a picture on the sheet's drawing, sized from the file when no size is given. */
351
- export async function addWorksheetImage(zip, sheet, xml, op) {
352
- const { mediaPart, data } = await storeImageMedia(zip, op);
353
- const drawing = await ensureWorksheetDrawing(zip, sheet, xml);
354
- const imageFit = fitDrawingSheetOnePageWide(drawing.worksheet);
355
- xml = imageFit.xml;
356
- const embedId = await addPackageRelationship(
357
- zip,
358
- partRelationshipPath(drawing.part),
359
- `${OFFICE_RELATIONSHIP_BASE}/image`,
360
- posix.relative(posix.dirname(drawing.part), mediaPart)
361
- );
362
- const drawingXml = await zipText(zip, drawing.part);
363
- const anchorCount = (drawingXml.match(/<xdr:(absolute|two|one)CellAnchor\b/g) || []).length;
364
- const placement = op.cell ? cellAnchorPoints(xml, op.cell) : { left: 0, top: 0 };
365
- const anchor = imageAnchorXml({
366
- embedId,
367
- anchorCount,
368
- left: op.left ?? placement.left,
369
- top: op.top ?? placement.top,
370
- ...imagePlacementSize(op, data),
371
- altText: op.altText,
372
- });
373
- zip.file(drawing.part, drawingXml.replace('</xdr:wsDr>', `${anchor}</xdr:wsDr>`));
374
- zip.file(sheet.path, xml);
375
- return {
376
- op: op.op,
377
- changed: true,
378
- sheet: sheet.name,
379
- image: mediaPart,
380
- ...(op.cell ? { cell: String(op.cell).toUpperCase() } : {}),
381
- ...(String(op.altText ?? '').trim() ? { altText: String(op.altText).trim() } : {}),
382
- };
383
- }
384
-
385
215
  // Splits one story's string into its L/C/R slots. && is the caller's own
386
216
  // ampersand; &L/&C/&R open a slot and every other code (&P, &N, &D) belongs
387
217
  // to the slot being read.
@@ -449,8 +279,7 @@ export async function setWorksheetHeaderFooter(zip, sheet, xml, op) {
449
279
 
450
280
  /** Adds a conditional rule over a range, or removes the rules already on it. */
451
281
  export async function applyConditionalFormat(zip, sheet, xml, op) {
452
- const area = parseAreaRange(op.range);
453
- const reference = `${columnLabel(area.startCol)}${area.startRow}:${columnLabel(area.endCol)}${area.endRow}`;
282
+ const reference = areaReference(parseAreaRange(op.range));
454
283
  if (op.op === 'delete_conditional_formats') {
455
284
  const pattern = new RegExp(
456
285
  `<conditionalFormatting\\b[^>]*\\bsqref="${tagPattern(reference)}"[^>]*>[\\s\\S]*?<\\/conditionalFormatting>`,
@@ -504,8 +333,9 @@ async function expressionConditionalRule(zip, op, priority) {
504
333
  function validationOperator(op, type) {
505
334
  const requested = String(op.operator || '').trim();
506
335
  let operator = '';
507
- if (requested) operator = XLSX_VALIDATION_OPERATORS[requested.toLowerCase()];
508
- else if (op.formula2 != null && !['list', 'custom'].includes(type)) operator = 'between';
336
+ if (requested && Object.hasOwn(XLSX_VALIDATION_OPERATORS, requested.toLowerCase())) {
337
+ operator = XLSX_VALIDATION_OPERATORS[requested.toLowerCase()];
338
+ } else if (op.formula2 != null && !['list', 'custom'].includes(type)) operator = 'between';
509
339
  if (requested && !operator) {
510
340
  throw new Error(`add_validation operator must be one of ${Object.keys(XLSX_VALIDATION_OPERATORS).join(', ')}`);
511
341
  }
@@ -528,8 +358,7 @@ function dataValidationXml(op, { type, operator, reference }) {
528
358
 
529
359
  /** One data validation over a range, appended to the validations already there. */
530
360
  export function addWorksheetValidation(zip, sheet, xml, op) {
531
- const area = parseAreaRange(op.range);
532
- const reference = `${columnLabel(area.startCol)}${area.startRow}:${columnLabel(area.endCol)}${area.endRow}`;
361
+ const reference = areaReference(parseAreaRange(op.range));
533
362
  // A list is the common case and what Excel writes through the same
534
363
  // operation, so it is the default; the other kinds guard a number, a
535
364
  // date, or a length, and take a second bound. A formula that states a
@@ -538,7 +367,7 @@ export function addWorksheetValidation(zip, sheet, xml, op) {
538
367
  const kind = String(op.type || (listValidationFormula(op.formula1) ? 'list' : 'custom'))
539
368
  .trim()
540
369
  .toLowerCase();
541
- const type = XLSX_VALIDATION_TYPES[kind];
370
+ const type = Object.hasOwn(XLSX_VALIDATION_TYPES, kind) ? XLSX_VALIDATION_TYPES[kind] : '';
542
371
  if (!type) {
543
372
  throw new Error(`add_validation type must be one of ${Object.keys(XLSX_VALIDATION_TYPES).join(', ')}`);
544
373
  }
@@ -565,438 +394,17 @@ export function addWorksheetValidation(zip, sheet, xml, op) {
565
394
  };
566
395
  }
567
396
 
568
- // The sorts Excel itself refuses, and the ones that would silently corrupt
569
- // the sheet: formulas inside the moved rows, hidden rows among them, and
570
- // merged cells crossing them.
571
- function refuseUnsortableRange(xml, area, firstRow, records, refAt) {
572
- // A sort moves whole rows. A formula inside them would keep pointing at
573
- // the row number it was written for, so the sorted sheet would compute
574
- // someone else's numbers: sort the values, then write the formulas.
575
- const formulas = [];
576
- for (let row = firstRow; row <= area.endRow; row += 1) {
577
- for (let col = area.startCol; col <= area.endCol; col += 1) {
578
- if (records.get(refAt(row, col))?.formula) formulas.push(refAt(row, col));
579
- }
580
- }
581
- if (formulas.length) {
582
- const named = formulas.slice(0, 3).join(', ') + (formulas.length > 3 ? ` and ${formulas.length - 3} more` : '');
583
- const holds =
584
- formulas.length === 1 ? 'holds a formula whose references would' : 'hold formulas whose references would';
585
- throw new Error(
586
- `XLSX sort_range moves rows, and ${named} ${holds} follow the move. Sort a range of values, then write the formulas over the sorted rows.`
587
- );
588
- }
589
- // A filtered sheet hides rows, not records: the flag stays on the row
590
- // number while the values move under it, so a sort would leave a
591
- // different record hidden than the one the reader filtered away.
592
- const withheld = [...hiddenSheetAreas(xml).rows].filter((row) => row >= firstRow && row <= area.endRow);
593
- if (withheld.length) {
594
- throw new Error(
595
- `XLSX sort_range would move values under hidden row${withheld.length > 1 ? 's' : ''} ${withheld.slice(0, 5).join(', ')}, leaving a different record withheld. Show them first with set_row_visibility visible: true, or sort a range without them.`
596
- );
597
- }
598
- // Excel refuses the same case: a merged cell cannot travel with one row.
599
- const merges = mergedRanges(xml).filter((range) => {
600
- const merge = expandRange(range);
601
- return (
602
- merge.endRow >= firstRow &&
603
- merge.startRow <= area.endRow &&
604
- merge.endCol >= area.startCol &&
605
- merge.startCol <= area.endCol
606
- );
607
- });
608
- if (merges.length) {
609
- throw new Error(
610
- `XLSX sort_range cannot move rows through the merged cell${merges.length > 1 ? 's' : ''} ${merges.slice(0, 5).join(', ')}; Excel refuses the same sort. Unmerge them first with unmerge_cells.`
611
- );
612
- }
613
- }
614
-
615
- // The cell refs of the sortable body, row by row.
616
- function rangeRows(area, firstRow, refAt) {
617
- return Array.from({ length: area.endRow - firstRow + 1 }, (_unused, offset) => firstRow + offset).map((row) =>
618
- Array.from({ length: area.endCol - area.startCol + 1 }, (_empty, index) => refAt(row, area.startCol + index))
619
- );
620
- }
621
-
622
- function writeSortedRows(xml, sorted, area, firstRow, refAt) {
623
- const placed = sorted.flatMap((cells, offset) =>
624
- cells.map((cell, index) => ({ ref: refAt(firstRow + offset, area.startCol + index), ...cell }))
625
- );
626
- const withValues = setCellsInSheet(
627
- xml,
628
- placed.map(({ ref, value }) => ({ ref, value }))
629
- );
630
- return setCellStylesInSheet(
631
- withValues,
632
- placed.map(({ ref, style }) => ({ ref, style }))
633
- );
634
- }
635
-
636
- /** Sorts the values of a range, refusing the cases Excel itself refuses. */
637
- export async function sortWorksheetRange(zip, sheet, xml, op) {
638
- const area = expandRange(op.range);
639
- const records = new Map(cellRecords(xml, await sharedStrings(zip)).map((cell) => [cell.ref, cell]));
640
- const header = op.hasHeader !== false;
641
- const firstRow = area.startRow + (header ? 1 : 0);
642
- const refAt = (row, col) => `${columnLabel(col)}${row}`;
643
- refuseUnsortableRange(xml, area, firstRow, records, refAt);
644
- const column = sortKeyColumn(op, area, (col) => records.get(refAt(area.startRow, col))?.value);
645
- const descending = String(op.order || 'asc')
646
- .trim()
647
- .toLowerCase()
648
- .startsWith('desc');
649
- const rows = rangeRows(area, firstRow, refAt);
650
- const styles = cellStyleIndexes(xml, rows.flat());
651
- const body = rows.map((refs) =>
652
- refs.map((ref) => ({ value: records.get(ref)?.value ?? null, style: styles.get(ref) || 0 }))
653
- );
654
- const keyIndex = column - area.startCol;
655
- const sorted = [...body].sort(
656
- (left, right) => compareSortValues(left[keyIndex]?.value, right[keyIndex]?.value) * (descending ? -1 : 1)
657
- );
658
- zip.file(sheet.path, writeSortedRows(xml, sorted, area, firstRow, refAt));
659
- return {
660
- op: op.op,
661
- changed: true,
662
- sheet: sheet.name,
663
- range: op.range,
664
- by: columnLabel(column),
665
- order: descending ? 'desc' : 'asc',
666
- rows: sorted.length,
667
- };
668
- }
669
-
670
- // The widest printed text of each column in the area, skipping the cells a
671
- // horizontal merge spans.
672
- function measuredColumnWidths(records, area, spans) {
673
- const measured = new Map();
674
- for (const record of records) {
675
- const parsed = parseCellRef(record.ref);
676
- const column = columnNumber(parsed.col);
677
- if (area.startCol && (column < area.startCol || column > area.endCol)) continue;
678
- if (area.startRow && (parsed.row < area.startRow || parsed.row > area.endRow)) continue;
679
- if (
680
- spans.some(
681
- (span) =>
682
- span.startCol !== span.endCol &&
683
- span.startCol <= column &&
684
- column <= span.endCol &&
685
- span.startRow <= parsed.row &&
686
- parsed.row <= span.endRow
687
- )
688
- )
689
- continue;
690
- const value = record.formula ? record.cachedValue : record.value;
691
- const text = String(value ?? '');
692
- const numeric = record.dataType !== 'text' && text.trim() !== '' && Number.isFinite(Number(text));
693
- const needed = numeric ? formattedNumberWidth(Number(text), record.style?.numberFormat || '') : displayWidth(text);
694
- measured.set(column, Math.max(measured.get(column) || 0, needed));
695
- }
696
- return measured;
697
- }
698
-
699
- /** Widths measured from what each cell prints, with the floor a composed sheet asks for. */
700
- export async function autofitWorksheetRange(zip, sheet, xml, op) {
701
- const area = parseAreaRange(op.range);
702
- // A row fit names rows (1:12) and asks for their height. Measuring columns
703
- // there rewrote every column width from its text, which silently undid the
704
- // widths a composed layout had just asked for.
705
- if (op.rows === true && !area.startCol) {
706
- return { op: op.op, changed: true, sheet: sheet.name, rows: true, columns: 0 };
707
- }
708
- // Widths follow what the cell prints: a number carries its format's
709
- // separators, decimals, and units, not the digits it stores.
710
- const cellStyles = resolveCellStyles(await zipText(zip, 'xl/styles.xml'));
711
- const records = cellRecords(xml, await sharedStrings(zip), { styles: cellStyles });
712
- const spans = mergedRanges(xml).map((entry) => parseAreaRange(entry));
713
- const measured = measuredColumnWidths(records, area, spans);
714
- // Fit-to-page never enlarges a sheet, so a layout whose columns hold only
715
- // their text prints as a small block in the corner of the page. minWidth is
716
- // the floor a composed sheet asks for: the columns still grow to their
717
- // content, and every column in the range - including the empty ones a
718
- // merged band spans - reaches that floor so the block keeps its width.
719
- const floor = Number(op.minWidth) > 0 ? Math.min(80, Number(op.minWidth)) : 8;
720
- if (Number(op.minWidth) > 0 && area.startCol && area.endCol - area.startCol < 64) {
721
- for (let column = area.startCol; column <= area.endCol; column += 1) {
722
- if (!measured.has(column)) measured.set(column, 0);
723
- }
724
- }
725
- const widths = new Map(
726
- [...measured.entries()].map(([column, width]) => [
727
- column,
728
- Math.min(80, Math.max(floor, Math.round((width + 2) * 10) / 10)),
729
- ])
730
- );
731
- zip.file(sheet.path, writeColumnWidths(xml, widths));
732
- return { op: op.op, changed: true, sheet: sheet.name, columns: widths.size };
733
- }
734
-
735
- // The row, column and value field names an add_pivot_table op names, within
736
- // what the portable writer can lay out.
737
- function pivotFieldNames(op) {
738
- const asList = (value) => {
739
- let list = [value];
740
- if (Array.isArray(value)) list = value;
741
- else if (value == null) list = [];
742
- return list.map((entry) => String(entry ?? '').trim()).filter(Boolean);
743
- };
744
- const rowNames = asList(op.rows);
745
- const columnNames = asList(op.columns);
746
- const valueNames = asList(op.values);
747
- if (!valueNames.length) throw new Error('add_pivot_table requires at least one value field');
748
- if (rowNames.length > 1 || columnNames.length > 1) {
749
- throw new Error(
750
- 'Portable add_pivot_table supports one row field and one column field; run the edit with Microsoft Excel for deeper nesting'
751
- );
752
- }
753
- if (valueNames.length > 1 && columnNames.length) {
754
- throw new Error('Portable add_pivot_table supports multiple value fields only without a column field');
755
- }
756
- return { rowNames, columnNames, valueNames };
757
- }
758
-
759
- // The source range as its header row plus data rows of cached values.
760
- async function pivotSourceTable(zip, xml, area) {
761
- const grid = new Map(cellRecords(xml, await sharedStrings(zip)).map((record) => [record.ref, record]));
762
- const cellValue = (column, row) => {
763
- const record = grid.get(`${columnLabel(column)}${row}`);
764
- if (!record) return null;
765
- return record.formula ? record.cachedValue : record.value;
766
- };
767
- const headers = [];
768
- for (let column = area.startCol; column <= area.endCol; column += 1) {
769
- headers.push(String(cellValue(column, area.startRow) ?? ''));
770
- }
771
- if (headers.some((entry) => !entry)) {
772
- throw new Error('add_pivot_table requires a field name in every column of the first source row');
773
- }
774
- const records = [];
775
- for (let row = area.startRow + 1; row <= area.endRow; row += 1) {
776
- records.push(headers.map((_, index) => cellValue(area.startCol + index, row)));
777
- }
778
- if (!records.length) throw new Error('add_pivot_table source range has no data rows');
779
- return { headers, records };
780
- }
781
-
782
- /** One row field and one column field over a bounded source range. */
783
- export async function addWorksheetPivotTable(zip, sheet, xml, op) {
784
- const area = parseAreaRange(op.source);
785
- if (!area.startRow || !area.startCol || area.endRow <= area.startRow) {
786
- throw new Error('add_pivot_table requires a bounded source range whose first row holds field names');
787
- }
788
- const { rowNames, columnNames, valueNames } = pivotFieldNames(op);
789
- const { headers, records } = await pivotSourceTable(zip, xml, area);
790
- const fieldIndex = (name) => {
791
- const index = headers.indexOf(name);
792
- if (index < 0) {
793
- throw new Error(`add_pivot_table field "${name}" is not in the source header row (${headers.join(', ')})`);
794
- }
795
- return index;
796
- };
797
- const destinationName = String(op.destinationSheet || sheet.name);
798
- const destination = (await workbookSheets(zip)).find((entry) => entry.name === destinationName);
799
- if (!destination) throw new Error(`add_pivot_table destination sheet "${destinationName}" was not found`);
800
- const pivotName = String(
801
- op.name ||
802
- `MixdogPivot${Object.keys(zip.files).filter((part) => /^xl\/pivotTables\/pivotTable\d+\.xml$/.test(part)).length + 1}`
803
- );
804
- const written = await writePivotTable(zip, {
805
- fields: summarizePivotFields(headers, records),
806
- records,
807
- sourceSheet: sheet.name,
808
- sourceRef: `${columnLabel(area.startCol)}${area.startRow}:${columnLabel(area.endCol)}${area.endRow}`,
809
- destinationSheetPath: destination.path,
810
- destination: String(op.destination || 'A1'),
811
- name: pivotName,
812
- rowField: rowNames.length ? fieldIndex(rowNames[0]) : -1,
813
- columnField: columnNames.length ? fieldIndex(columnNames[0]) : -1,
814
- valueFields: valueNames.map(fieldIndex),
815
- });
816
- return {
817
- op: op.op,
818
- changed: true,
819
- sheet: destinationName,
820
- name: pivotName,
821
- rows: records.length,
822
- fields: headers.length,
823
- part: written.tablePart,
824
- };
825
- }
826
-
827
- // The block a chart reads. One bounded area, or several joined by commas the
828
- // way Excel's own Range("A7:A12,D7:D12") reads them: the first column of the
829
- // first area holds the categories, every other column of every area is a
830
- // series, so a chart can skip the columns between its category and its value.
831
- // plotBy:'rows' reads the same block turned a quarter: the first row holds
832
- // the categories and every other row is one series, which is how a sheet
833
- // that grows a column per period is already written.
834
- function chartDataBlock(op) {
835
- const plotByRows = String(op.plotBy ?? 'columns').toLowerCase() === 'rows';
836
- const areas = String(op.range ?? '')
837
- .split(',')
838
- .map((part) => parseAreaRange(part.trim()));
839
- const area = areas[0];
840
- const seriesColumns = areas.flatMap((entry, index) => {
841
- const from = index === 0 ? entry.startCol + 1 : entry.startCol;
842
- return Array.from({ length: Math.max(0, entry.endCol - from + 1) }, (_, offset) => from + offset);
843
- });
844
- const seriesRows = area
845
- ? Array.from({ length: Math.max(0, area.endRow - area.startRow) }, (_, offset) => area.startRow + 1 + offset)
846
- : [];
847
- const wholeBlock = plotByRows
848
- ? areas.length === 1 && area?.endCol > area?.startCol
849
- : areas.every(
850
- (entry) => entry.startRow && entry.startCol && entry.startRow === area.startRow && entry.endRow === area.endRow
851
- );
852
- const lanes = plotByRows ? seriesRows : seriesColumns;
853
- if (!area?.startRow || !area.startCol || !lanes.length || !wholeBlock) {
854
- throw new Error(
855
- plotByRows
856
- ? "add_chart plotBy:'rows' requires one bounded range whose first row holds the categories and whose first column names each series"
857
- : 'add_chart requires a bounded range whose first column holds categories (comma-joined areas must share the same rows)'
858
- );
859
- }
860
- return { plotByRows, area, lanes };
861
- }
862
-
863
- // The category labels along the header row (plotted by rows) or the first column.
864
- function chartCategories(cellValue, area, plotByRows) {
865
- const categories = [];
866
- if (plotByRows) {
867
- for (let column = area.startCol + 1; column <= area.endCol; column += 1) {
868
- categories.push(String(cellValue(column, area.startRow) ?? ''));
869
- }
870
- } else {
871
- for (let row = area.startRow + 1; row <= area.endRow; row += 1) {
872
- categories.push(String(cellValue(area.startCol, row) ?? ''));
873
- }
874
- }
875
- return categories;
876
- }
877
-
878
- // One series' numbers: the lane's row (plotted by rows) or its column.
879
- function laneValues(cellValue, area, plotByRows, lane) {
880
- const numbers = [];
881
- if (plotByRows) {
882
- for (let column = area.startCol + 1; column <= area.endCol; column += 1) {
883
- numbers.push(Number(cellValue(column, lane)));
884
- }
885
- } else {
886
- for (let row = area.startRow + 1; row <= area.endRow; row += 1) {
887
- numbers.push(Number(cellValue(lane, row)));
888
- }
889
- }
890
- return numbers;
891
- }
892
-
893
- // Categories, series values and the sheet references the chart part cites.
894
- async function readChartData(zip, xml, sheet, op, { plotByRows, area, lanes }) {
895
- const grid = new Map(cellRecords(xml, await sharedStrings(zip)).map((record) => [record.ref, record]));
896
- const cellValue = (column, row) => {
897
- const record = grid.get(`${columnLabel(column)}${row}`);
898
- if (!record) return null;
899
- return record.formula ? record.cachedValue : record.value;
900
- };
901
- const categories = chartCategories(cellValue, area, plotByRows);
902
- const palette = Array.isArray(op.seriesColors) ? op.seriesColors : [];
903
- const pointColors = ['pie', 'doughnut', 'donut'].includes(String(op.chartType).toLowerCase()) && palette.length;
904
- const sheetReference = quoteSheetName(sheet.name);
905
- const series = [];
906
- const names = [];
907
- const values = [];
908
- for (const [index, lane] of lanes.entries()) {
909
- const label = columnLabel(plotByRows ? area.startCol : lane);
910
- const numbers = laneValues(cellValue, area, plotByRows, lane);
911
- series.push({
912
- name: String(
913
- (plotByRows ? cellValue(area.startCol, lane) : cellValue(lane, area.startRow)) ?? `Series ${index + 1}`
914
- ),
915
- values: numbers,
916
- ...(palette.length ? { color: palette[index % palette.length] } : {}),
917
- ...(pointColors ? { pointColors: categories.map((_, point) => palette[point % palette.length]) } : {}),
918
- });
919
- names.push(plotByRows ? `${sheetReference}!$${label}$${lane}` : `${sheetReference}!$${label}$${area.startRow}`);
920
- values.push(
921
- plotByRows
922
- ? `${sheetReference}!$${columnLabel(area.startCol + 1)}$${lane}:$${columnLabel(area.endCol)}$${lane}`
923
- : `${sheetReference}!$${label}$${area.startRow + 1}:$${label}$${area.endRow}`
924
- );
925
- }
926
- const categoryLabel = columnLabel(area.startCol);
927
- const category = plotByRows
928
- ? `${sheetReference}!$${columnLabel(area.startCol + 1)}$${area.startRow}:$${columnLabel(area.endCol)}$${area.startRow}`
929
- : `${sheetReference}!$${categoryLabel}$${area.startRow + 1}:$${categoryLabel}$${area.endRow}`;
930
- return { categories, series, references: { sheet: sheetReference, category, names, values } };
931
- }
932
-
933
- function nextChartPart(zip) {
934
- let chartOrdinal = 1;
935
- while (zip.file(`xl/charts/chart${chartOrdinal}.xml`)) chartOrdinal += 1;
936
- return `xl/charts/chart${chartOrdinal}.xml`;
937
- }
938
-
939
- function chartFrameAnchor(op, framePlacement, anchorCount, chartRelationshipId) {
940
- return (
941
- '<xdr:absoluteAnchor>' +
942
- `<xdr:pos x="${toEmu(op.left ?? framePlacement.left)}" y="${toEmu(op.top ?? framePlacement.top)}"/>` +
943
- `<xdr:ext cx="${Math.max(1, toEmu(op.width ?? 480))}" cy="${Math.max(1, toEmu(op.height ?? 280))}"/>` +
944
- '<xdr:graphicFrame macro="">' +
945
- `<xdr:nvGraphicFramePr><xdr:cNvPr id="${anchorCount + 2}" name="Chart ${anchorCount + 1}"/>` +
946
- '<xdr:cNvGraphicFramePr/></xdr:nvGraphicFramePr>' +
947
- '<xdr:xfrm><a:off x="0" y="0"/><a:ext cx="0" cy="0"/></xdr:xfrm>' +
948
- '<a:graphic><a:graphicData uri="http://schemas.openxmlformats.org/drawingml/2006/chart">' +
949
- '<c:chart xmlns:c="http://schemas.openxmlformats.org/drawingml/2006/chart"' +
950
- ` xmlns:r="${OFFICE_RELATIONSHIP_BASE}" r:id="${chartRelationshipId}"/>` +
951
- '</a:graphicData></a:graphic></xdr:graphicFrame>' +
952
- '<xdr:clientData/></xdr:absoluteAnchor>'
953
- );
954
- }
955
-
956
- /** A chart part, its drawing anchor, and the series read out of the sheet. */
957
- export async function addWorksheetChart(zip, sheet, xml, op) {
958
- const block = chartDataBlock(op);
959
- const { categories, series, references } = await readChartData(zip, xml, sheet, op, block);
960
- const chartPart = nextChartPart(zip);
961
- zip.file(
962
- chartPart,
963
- chartXml({
964
- chartType: op.chartType,
965
- title: op.title,
966
- categories,
967
- series,
968
- references,
969
- showValues: op.showValues === true,
970
- dataLabelPosition: op.dataLabelPosition,
971
- dataLabelColor: op.dataLabelColor,
972
- valueNumberFormat: op.valueNumberFormat,
973
- showLegend: op.showLegend,
974
- zeroBaseline: op.zeroBaseline,
975
- })
976
- );
977
- await ensureContentTypeOverride(zip, `/${chartPart}`, CHART_CONTENT_TYPE);
978
- const drawing = await ensureWorksheetDrawing(zip, sheet, xml);
979
- const drawingPart = drawing.part;
980
- const chartFit = fitDrawingSheetOnePageWide(drawing.worksheet);
981
- xml = chartFit.xml;
982
- zip.file(sheet.path, xml);
983
- const chartRelationshipId = await addPackageRelationship(
984
- zip,
985
- partRelationshipPath(drawingPart),
986
- `${OFFICE_RELATIONSHIP_BASE}/chart`,
987
- posix.relative(posix.dirname(drawingPart), chartPart)
988
- );
989
- const drawingXml = await zipText(zip, drawingPart);
990
- const anchorCount = (drawingXml.match(/<xdr:(absolute|two|one)CellAnchor\b/g) || []).length;
991
- const framePlacement = op.cell ? cellAnchorPoints(xml, op.cell) : { left: 300, top: 20 };
992
- const anchor = chartFrameAnchor(op, framePlacement, anchorCount, chartRelationshipId);
993
- zip.file(drawingPart, drawingXml.replace('</xdr:wsDr>', `${anchor}</xdr:wsDr>`));
994
- return {
995
- op: op.op,
996
- changed: true,
997
- sheet: sheet.name,
998
- chart: chartPart,
999
- series: series.length,
1000
- ...(chartFit.applied ? { pageFit: 'one-page-wide' } : {}),
1001
- };
1002
- }
397
+ // Sorting a range's rows and measuring its column widths live in
398
+ // portable-xlsx-range-layout.mjs, same facade contract.
399
+ export { sortWorksheetRange, autofitWorksheetRange } from './portable-xlsx-range-layout.mjs';
400
+
401
+ // Worksheet drawings (picture placement, frame moves, frame deletion) live in
402
+ // portable-xlsx-drawings.mjs; re-exported so prior importers of this module
403
+ // stay unchanged.
404
+ export { addWorksheetImage, setWorksheetDrawing, deleteWorksheetDrawing } from './portable-xlsx-drawings.mjs';
405
+ // Chart parts and the series they read out of the sheet live in
406
+ // portable-xlsx-charts.mjs, same facade contract.
407
+ export { addWorksheetChart } from './portable-xlsx-charts.mjs';
408
+ // The pivot-table operation (field rules + source read) lives in
409
+ // portable-xlsx-pivot-ops.mjs, same facade contract.
410
+ export { addWorksheetPivotTable } from './portable-xlsx-pivot-ops.mjs';