mixdog 0.9.174 → 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (935) hide show
  1. package/README.md +11 -12
  2. package/package.json +2 -2
  3. package/scripts/agent-turn-trace-probe.mjs +1 -1
  4. package/scripts/build-ffmpeg-runtime.sh +16 -0
  5. package/scripts/build-runtime-linux.sh +8 -2
  6. package/scripts/build-runtime-macos.sh +8 -2
  7. package/scripts/computer-task-cost-report.mjs +1 -9
  8. package/scripts/context-renewal-live-check.mjs +2 -1
  9. package/scripts/graph-parity.mjs +78 -55
  10. package/scripts/lib/bench-sandbox.mjs +67 -0
  11. package/scripts/lib/bench-sandbox.test.mjs +54 -0
  12. package/scripts/lib/coverage.mjs +2 -4
  13. package/scripts/lib/run-node-tests.mjs +24 -1
  14. package/scripts/lib/session-bench-fmt.mjs +65 -0
  15. package/scripts/lib/session-bench-render.mjs +394 -0
  16. package/scripts/lib/smoke-loop-shared.mjs +28 -0
  17. package/scripts/lib/smoke-loop-shared.test.mjs +22 -0
  18. package/scripts/lib/trace-row.mjs +40 -0
  19. package/scripts/lib/trace-row.test.mjs +47 -0
  20. package/scripts/lib/trace-stats.mjs +7 -0
  21. package/scripts/lib/trace-stats.test.mjs +7 -1
  22. package/scripts/llm-trace-summary.mjs +2 -44
  23. package/scripts/memory-chunk-quality.mjs +1 -1
  24. package/scripts/memory-layer2-check.mjs +1 -1
  25. package/scripts/pg-memory-diet.mjs +1 -1
  26. package/scripts/plan-runtime-release-tag.mjs +57 -0
  27. package/scripts/prepare-native-assets.mjs +1 -1
  28. package/scripts/provider-contract-test-env.mjs +21 -0
  29. package/scripts/release-paths.mjs +1 -0
  30. package/scripts/routing-corpus.mjs +1 -11
  31. package/scripts/session-diag.mjs +2 -44
  32. package/scripts/smoke-runtime-negative.sh +7 -1
  33. package/scripts/test-data-dir.mjs +19 -0
  34. package/scripts/tidy/sync-engines-manifest.mjs +8 -10
  35. package/scripts/tool-efficiency-diag.mjs +1 -4
  36. package/scripts/voice-runtime-config.json +1 -1
  37. package/src/app.mjs +1 -1
  38. package/src/defaults/skills/code-tidy/SKILL.md +5 -2
  39. package/src/defaults/skills/pptx/SKILL.md +1 -1
  40. package/src/defaults/skills/pptx/references/pictures.md +1 -1
  41. package/src/defaults/skills/pptx/scripts/review-deck.mjs +13 -4
  42. package/src/defaults/skills/skill-creator/scripts/validate-skill.mjs +40 -40
  43. package/src/defaults/skills/xlsx/SKILL.md +1 -0
  44. package/src/headless-exec.mjs +4 -2
  45. package/src/headless-role.mjs +81 -68
  46. package/src/lib/keychain-cjs.cjs +26 -49
  47. package/src/lib/mixdog-debug.cjs +1 -1
  48. package/src/lib/rules-builder.cjs +4 -3
  49. package/src/mixdog-session-runtime.mjs +2 -2
  50. package/src/repl/slash-commands.mjs +1 -1
  51. package/src/repl/stream-sink.mjs +1 -1
  52. package/src/repl/turn-output.mjs +2 -2
  53. package/src/repl.mjs +1 -1
  54. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +1 -1
  55. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +20 -16
  56. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +0 -3
  57. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +23 -22
  58. package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +2 -2
  59. package/src/runtime/{shared/llm/index.mjs → agent/orchestrator/maintenance-preset.mjs} +2 -2
  60. package/src/runtime/agent/orchestrator/mcp/client-config.mjs +2 -1
  61. package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +7 -36
  62. package/src/runtime/agent/orchestrator/mcp/client.mjs +28 -2
  63. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +1 -1
  64. package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +6 -1
  65. package/src/runtime/agent/orchestrator/providers/anthropic-betas.mjs +1 -47
  66. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +1 -383
  67. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -59
  68. package/src/runtime/agent/orchestrator/providers/anthropic-midstream-recovery.mjs +32 -31
  69. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +2 -2
  70. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +10 -1
  71. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +12 -61
  72. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +2 -1
  73. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request.mjs +2 -0
  74. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +30 -67
  75. package/src/runtime/agent/orchestrator/providers/anthropic-recovery-guards.mjs +9 -12
  76. package/src/runtime/agent/orchestrator/providers/anthropic-server-fallback.mjs +3 -1
  77. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/leak-guard.mjs +1 -1
  78. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +20 -12
  79. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events.mjs +12 -2
  80. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-outcome.mjs +4 -3
  81. package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn.mjs +5 -1
  82. package/src/runtime/agent/orchestrator/providers/anthropic-sse-watchdogs.mjs +18 -10
  83. package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +20 -16
  84. package/src/runtime/agent/orchestrator/providers/anthropic-thinking-contract.mjs +1 -26
  85. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +9 -13
  86. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +8 -3
  87. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +4 -8
  88. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +21 -30
  89. package/src/runtime/agent/orchestrator/providers/antigravity-response.mjs +1 -1
  90. package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +4 -2
  91. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +10 -8
  92. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +13 -10
  93. package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +29 -0
  94. package/src/runtime/agent/orchestrator/providers/cursor-wire-guards.mjs +0 -1
  95. package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +10 -26
  96. package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +2 -3
  97. package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +7 -3
  98. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +9 -15
  99. package/src/runtime/agent/orchestrator/providers/cursor.mjs +31 -5
  100. package/src/runtime/agent/orchestrator/providers/gemini-cache-policy.mjs +1 -2
  101. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +1 -4
  102. package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
  103. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +48 -46
  104. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +18 -19
  105. package/src/runtime/agent/orchestrator/providers/gemini.mjs +3 -26
  106. package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +41 -0
  107. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +5 -19
  108. package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +16 -83
  109. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +26 -8
  110. package/src/runtime/agent/orchestrator/providers/lib/anthropic-models.mjs +8 -0
  111. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +30 -1
  112. package/src/runtime/agent/orchestrator/providers/lib/anthropic-stream-labels.mjs +6 -0
  113. package/src/runtime/agent/orchestrator/providers/lib/anthropic-system-blocks.mjs +17 -0
  114. package/src/runtime/agent/orchestrator/providers/{anthropic-leaked-toolcall.mjs → lib/leaked-toolcall.mjs} +7 -7
  115. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +44 -0
  116. package/src/runtime/agent/orchestrator/providers/lib/send-callbacks.mjs +12 -0
  117. package/src/runtime/agent/orchestrator/providers/lib/sse-framing.mjs +9 -8
  118. package/src/runtime/agent/orchestrator/providers/lib/transport-fallback-trace.mjs +25 -0
  119. package/src/runtime/agent/orchestrator/providers/model-catalog-projection.mjs +1 -181
  120. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +1 -796
  121. package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +1 -71
  122. package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +87 -0
  123. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +4 -5
  124. package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +4 -5
  125. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +2 -21
  126. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-result.mjs +1 -1
  127. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +2 -3
  128. package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/tool-call-acc.mjs +1 -2
  129. package/src/runtime/agent/orchestrator/providers/openai-compat-options.mjs +4 -8
  130. package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +45 -32
  131. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +2 -2
  132. package/src/runtime/agent/orchestrator/providers/openai-compat-responses-state.mjs +2 -2
  133. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +6 -12
  134. package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +2 -2
  135. package/src/runtime/agent/orchestrator/providers/openai-compat-trace.mjs +2 -2
  136. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +14 -22
  137. package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +25 -34
  138. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +14 -14
  139. package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +3 -1
  140. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +2 -2
  141. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-items.mjs +1 -1
  142. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-outcome.mjs +2 -13
  143. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-state.mjs +1 -1
  144. package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/text-relay.mjs +1 -1
  145. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +2 -2
  146. package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +2 -44
  147. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +2 -16
  148. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +6 -5
  149. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +4 -1
  150. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +3 -2
  151. package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +2 -2
  152. package/src/runtime/agent/orchestrator/providers/openai-ws-text-relay.mjs +1 -1
  153. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +6 -4
  154. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +2 -1
  155. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +2 -2
  156. package/src/runtime/agent/orchestrator/providers/provider-catalog-cache.mjs +1 -130
  157. package/src/runtime/agent/orchestrator/providers/registry.mjs +20 -16
  158. package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +21 -20
  159. package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +17 -17
  160. package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +193 -0
  161. package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +421 -0
  162. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/context-inspection.mjs +17 -17
  163. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/context-status-inspection.mjs +1 -1
  164. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/context-status-shape.mjs +3 -3
  165. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/context-status.mjs +1 -1
  166. package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +101 -0
  167. package/src/runtime/agent/orchestrator/runtime-core/effort.mjs +145 -0
  168. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/extension-scopes.mjs +5 -5
  169. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/fs-utils.mjs +1 -1
  170. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-control.mjs +2 -2
  171. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-mutations.mjs +2 -2
  172. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-reminder.mjs +1 -1
  173. package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +326 -0
  174. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-storage.mjs +2 -2
  175. package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +148 -0
  176. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-title.mjs +2 -2
  177. package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +140 -0
  178. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-turns.mjs +1 -1
  179. package/src/runtime/agent/orchestrator/runtime-core/model-capabilities.mjs +140 -0
  180. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/orchestration.mjs +1 -1
  181. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/plugin-mcp.mjs +2 -2
  182. package/src/runtime/agent/orchestrator/runtime-core/session-id.mjs +2 -0
  183. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/session-route-policy.mjs +2 -2
  184. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/session-text.mjs +3 -3
  185. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/session-title.mjs +1 -2
  186. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/skill-tool-loading.mjs +1 -1
  187. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/tool-catalog-schema.mjs +1 -1
  188. package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +747 -0
  189. package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +149 -0
  190. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/workflow/agents.mjs +11 -7
  191. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/workflow/context.mjs +6 -4
  192. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/workflow/packs.mjs +2 -3
  193. package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/workflow-ids.mjs +1 -1
  194. package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +255 -0
  195. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +3 -4
  196. package/src/runtime/agent/orchestrator/session/cache/prefetch-cache.mjs +2 -4
  197. package/src/runtime/agent/orchestrator/session/cache/read-cache.mjs +1 -1
  198. package/src/runtime/agent/orchestrator/session/context-identity-writer.mjs +162 -0
  199. package/src/runtime/agent/orchestrator/session/context-tool-pairs.mjs +2 -2
  200. package/src/runtime/agent/orchestrator/session/context-tool-schema.mjs +87 -0
  201. package/src/runtime/agent/orchestrator/session/context-utils.mjs +3 -245
  202. package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +2 -3
  203. package/src/runtime/agent/orchestrator/session/eager-dispatch/mutation-paths.mjs +54 -0
  204. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +1 -1
  205. package/src/runtime/agent/orchestrator/session/lifecycle-scan.mjs +1 -16
  206. package/src/runtime/agent/orchestrator/session/loop/arg-schema-coerce.mjs +2 -2
  207. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +13 -1
  208. package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +3 -3
  209. package/src/runtime/agent/orchestrator/session/loop/deferred-call-through.mjs +4 -4
  210. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +1 -1
  211. package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +2 -2
  212. package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/continuation.mjs +1 -1
  213. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +2 -3
  214. package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +2 -2
  215. package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +6 -3
  216. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +1 -1
  217. package/src/runtime/agent/orchestrator/session/loop/tool-exec/call-prep.mjs +3 -2
  218. package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +6 -10
  219. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +2 -2
  220. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +1 -1
  221. package/src/runtime/agent/orchestrator/session/loop.mjs +5 -6
  222. package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +1 -1
  223. package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +2 -2
  224. package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +2 -2
  225. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +5 -5
  226. package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +40 -64
  227. package/src/runtime/agent/orchestrator/session/manager/pending-lifecycle-epoch.mjs +2 -2
  228. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +24 -16
  229. package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
  230. package/src/runtime/agent/orchestrator/session/manager/pending-spool-file.mjs +7 -13
  231. package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +17 -2
  232. package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +139 -0
  233. package/src/runtime/agent/orchestrator/session/manager/pending-spool-sweep.mjs +34 -14
  234. package/src/runtime/agent/orchestrator/session/manager/prefetch-bridge/file-prefetch.mjs +1 -1
  235. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +4 -18
  236. package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +1 -1
  237. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +10 -18
  238. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +1 -1
  239. package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -2
  240. package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +1 -1
  241. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +2 -2
  242. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +6 -10
  243. package/src/runtime/agent/orchestrator/session/manager.mjs +1 -2
  244. package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +11 -6
  245. package/src/runtime/agent/orchestrator/session/result-classification.mjs +1 -1
  246. package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +194 -0
  247. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +6 -198
  248. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +7 -7
  249. package/src/runtime/agent/orchestrator/session/store/fs-probe.mjs +0 -19
  250. package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +15 -8
  251. package/src/runtime/agent/orchestrator/session/store/listing.mjs +18 -29
  252. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +6 -36
  253. package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +148 -0
  254. package/src/runtime/agent/orchestrator/session/store/save-fault.mjs +3 -3
  255. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +15 -142
  256. package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +3 -3
  257. package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +4 -2
  258. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +1 -1
  259. package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +3 -2
  260. package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +9 -22
  261. package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +14 -6
  262. package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +200 -52
  263. package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +81 -0
  264. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +38 -4
  265. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +5 -2
  266. package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +3 -5
  267. package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +54 -0
  268. package/src/runtime/agent/orchestrator/session/store.mjs +5 -9
  269. package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +19 -8
  270. package/src/runtime/agent/orchestrator/session/tool-batch/flush.mjs +1 -1
  271. package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
  272. package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
  273. package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +489 -0
  274. package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +419 -0
  275. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +358 -0
  276. package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +157 -0
  277. package/src/runtime/agent/orchestrator/tools/bash-policy-scan.mjs +2 -3
  278. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +32 -11
  279. package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +1 -31
  280. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/benign-exit.mjs +7 -3
  281. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/deadline-plan.mjs +11 -3
  282. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -0
  283. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +13 -7
  284. package/src/runtime/agent/orchestrator/tools/builtin/binary-file.mjs +6 -3
  285. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +11 -5
  286. package/src/runtime/agent/orchestrator/tools/builtin/device-paths.mjs +1 -206
  287. package/src/runtime/agent/orchestrator/tools/builtin/find-files-tool.mjs +1 -1
  288. package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +39 -3
  289. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +5 -7
  290. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-request.mjs +7 -25
  291. package/src/runtime/agent/orchestrator/tools/builtin/lib/list-helpers.mjs +27 -1
  292. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +37 -0
  293. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-insights.mjs +1 -1
  294. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +28 -18
  295. package/src/runtime/agent/orchestrator/tools/builtin/native-search-client.mjs +6 -10
  296. package/src/runtime/agent/orchestrator/tools/builtin/path-utils.mjs +15 -17
  297. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +3 -3
  298. package/src/runtime/agent/orchestrator/tools/builtin/read-image-resize.mjs +1 -399
  299. package/src/runtime/agent/orchestrator/tools/builtin/read-line-collector.mjs +3 -2
  300. package/src/runtime/agent/orchestrator/tools/builtin/read-office-files.mjs +8 -15
  301. package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +5 -8
  302. package/src/runtime/agent/orchestrator/tools/builtin/read-single-render.mjs +3 -2
  303. package/src/runtime/agent/orchestrator/tools/builtin/read-source-windows.mjs +2 -2
  304. package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -5
  305. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +50 -5
  306. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-render.mjs +1 -1
  307. package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +2 -5
  308. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +11 -1
  309. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +1 -1
  310. package/src/runtime/agent/orchestrator/tools/builtin/search-glob-tool.mjs +3 -35
  311. package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +0 -12
  312. package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +50 -0
  313. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +9 -26
  314. package/src/runtime/agent/orchestrator/tools/builtin/shell-lossless-compact.mjs +2 -1
  315. package/src/runtime/agent/orchestrator/tools/builtin/shell-output.mjs +6 -5
  316. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +8 -3
  317. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +6 -14
  318. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-validation.mjs +3 -9
  319. package/src/runtime/agent/orchestrator/tools/builtin/tool-output-limit.mjs +1 -60
  320. package/src/runtime/agent/orchestrator/tools/builtin.mjs +10 -32
  321. package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +2 -2
  322. package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +3 -3
  323. package/src/runtime/agent/orchestrator/tools/code-graph/project-root.mjs +3 -7
  324. package/src/runtime/agent/orchestrator/tools/code-graph/search-references.mjs +15 -10
  325. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +6 -10
  326. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +4 -0
  327. package/src/runtime/agent/orchestrator/tools/code-graph/text-columns.mjs +3 -3
  328. package/src/runtime/agent/orchestrator/tools/code-graph/trusted-roots.mjs +3 -7
  329. package/src/runtime/agent/orchestrator/tools/code-graph-state.mjs +1 -84
  330. package/src/runtime/agent/orchestrator/tools/destructive-warning.mjs +11 -11
  331. package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
  332. package/src/runtime/agent/orchestrator/tools/io-trace.mjs +28 -0
  333. package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +38 -5
  334. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +10 -4
  335. package/src/runtime/agent/orchestrator/tools/patch/apply-patch/codex-batch.mjs +6 -26
  336. package/src/runtime/agent/orchestrator/tools/patch/apply-patch/request.mjs +0 -3
  337. package/src/runtime/agent/orchestrator/tools/patch/dispatch/native-report.mjs +2 -1
  338. package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +3 -10
  339. package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +1 -1
  340. package/src/runtime/agent/orchestrator/tools/patch/mutation-output.mjs +6 -19
  341. package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +5 -15
  342. package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +1 -3
  343. package/src/runtime/agent/orchestrator/tools/patch/paths.mjs +4 -0
  344. package/src/runtime/agent/orchestrator/tools/patch/sequence/run.mjs +1 -3
  345. package/src/runtime/agent/orchestrator/tools/patch/sequence/units.mjs +4 -10
  346. package/src/runtime/agent/orchestrator/tools/patch/sequence.mjs +1 -2
  347. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +5 -11
  348. package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +1 -2
  349. package/src/runtime/agent/orchestrator/tools/patch-manifest-path.mjs +3 -0
  350. package/src/runtime/agent/orchestrator/tools/patch-manifest.json +12 -12
  351. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +87 -12
  352. package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +6 -3
  353. package/src/runtime/agent/orchestrator/tools/shell-exec-policy.mjs +1 -1
  354. package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +15 -25
  355. package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
  356. package/src/runtime/{shared/llm → agent/orchestrator}/usage-log.mjs +1 -1
  357. package/src/runtime/attachments/pdf-extract.mjs +32 -29
  358. package/src/runtime/attachments/store.mjs +2 -1
  359. package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -2
  360. package/src/runtime/browser-bridge/client.mjs +30 -9
  361. package/src/runtime/channels/data/voice-runtime-manifest.json +21 -21
  362. package/src/runtime/channels/lib/config.mjs +4 -4
  363. package/src/runtime/channels/lib/event-pipeline.mjs +3 -3
  364. package/src/runtime/channels/lib/event-queue.mjs +1 -0
  365. package/src/runtime/channels/lib/executor.mjs +3 -25
  366. package/src/runtime/channels/lib/runtime-paths.mjs +36 -41
  367. package/src/runtime/channels/lib/scheduler.mjs +28 -44
  368. package/src/runtime/{shared → channels/lib}/schedules-db.mjs +3 -3
  369. package/src/runtime/channels/lib/tool-dispatch.mjs +3 -8
  370. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +19 -23
  371. package/src/runtime/channels/lib/voice-transcription.mjs +13 -9
  372. package/src/runtime/channels/lib/webhook/log.mjs +2 -29
  373. package/src/runtime/channels/lib/webhook/request-handler.mjs +4 -5
  374. package/src/runtime/channels/lib/webhook/session-dispatch.mjs +8 -12
  375. package/src/runtime/channels/lib/webhook/signature.mjs +15 -19
  376. package/src/runtime/channels/lib/webhook/untrusted-fence.mjs +9 -0
  377. package/src/runtime/channels/lib/webhook.mjs +1 -1
  378. package/src/runtime/{shared → channels/lib}/webhooks-db.mjs +3 -3
  379. package/src/runtime/channels/lib/whisper-server.mjs +3 -2
  380. package/src/runtime/channels/lib/worker-bootstrap.mjs +19 -21
  381. package/src/runtime/channels/lib/worker-main.mjs +49 -58
  382. package/src/runtime/computer-bridge/client.mjs +7 -10
  383. package/src/runtime/computer-bridge/core-actions.mjs +1 -1
  384. package/src/runtime/computer-bridge/limits.d.mts +0 -1
  385. package/src/runtime/github/client.mjs +11 -6
  386. package/src/runtime/github/commands.mjs +4 -2
  387. package/src/runtime/github/contract.mjs +3 -1
  388. package/src/runtime/local-provider/hugging-face.mjs +3 -3
  389. package/src/runtime/local-provider/registered-models.mjs +3 -1
  390. package/src/runtime/local-provider/request-queue.mjs +24 -29
  391. package/src/runtime/local-provider/serial-chain.mjs +19 -0
  392. package/src/runtime/local-provider/server-process.mjs +2 -10
  393. package/src/runtime/media/adapters/antigravity-image.mjs +2 -2
  394. package/src/runtime/media/adapters/codex-image.mjs +2 -2
  395. package/src/runtime/media/adapters/gemini-image.mjs +2 -1
  396. package/src/runtime/media/adapters/gemini-video.mjs +3 -7
  397. package/src/runtime/media/adapters/xai-media.mjs +3 -7
  398. package/src/runtime/media/bounded-signal.mjs +13 -0
  399. package/src/runtime/media/store.mjs +9 -3
  400. package/src/runtime/memory/data/runtime-manifest.json +11 -11
  401. package/src/runtime/memory/index.mjs +6 -21
  402. package/src/runtime/memory/lib/core-memory-file.mjs +1 -1
  403. package/src/runtime/memory/lib/cycle-scheduler/backlog-probe.mjs +2 -1
  404. package/src/runtime/memory/lib/cycle1/cycle1-plan.mjs +1 -1
  405. package/src/runtime/memory/lib/embedding-idle-lease.mjs +18 -0
  406. package/src/runtime/memory/lib/embedding-provider.mjs +13 -0
  407. package/src/runtime/memory/lib/embedding-worker.mjs +12 -1
  408. package/src/runtime/memory/lib/http-router/ingest-routes.mjs +1 -1
  409. package/src/runtime/memory/lib/http-router/session-routes.mjs +1 -1
  410. package/src/runtime/memory/lib/ingest/transcript-discovery.mjs +1 -1
  411. package/src/runtime/memory/lib/memory-action-handlers/manage-actions.mjs +1 -1
  412. package/src/runtime/memory/lib/memory-cycle1.mjs +24 -1
  413. package/src/runtime/memory/lib/memory-cycle2-quarantine.mjs +99 -0
  414. package/src/runtime/memory/lib/memory-cycle2-review.mjs +8 -2
  415. package/src/runtime/memory/lib/memory-cycle2.mjs +49 -9
  416. package/src/runtime/memory/lib/memory-embed.mjs +3 -2
  417. package/src/runtime/memory/lib/memory-extraction.mjs +1 -2
  418. package/src/runtime/memory/lib/memory-fingerprint.mjs +1 -1
  419. package/src/runtime/memory/lib/memory-ops-policy.mjs +18 -2
  420. package/src/runtime/memory/lib/memory-retrievers.mjs +2 -2
  421. package/src/runtime/memory/lib/memory-text-utils.mjs +1 -1
  422. package/src/runtime/memory/lib/pg/adapter.mjs +3 -3
  423. package/src/runtime/memory/lib/pg/process.mjs +2 -2
  424. package/src/runtime/memory/lib/pg/supervisor.mjs +1 -2
  425. package/src/runtime/memory/lib/query-ranking.mjs +2 -2
  426. package/src/runtime/memory/lib/query-search-plan.mjs +1 -1
  427. package/src/runtime/memory/lib/recall-format.mjs +3 -4
  428. package/src/runtime/memory/lib/runtime-fetcher.mjs +94 -23
  429. package/src/runtime/memory/lib/session-ingest-runtime.mjs +1 -1
  430. package/src/runtime/memory/lib/trace-store.mjs +6 -2
  431. package/src/runtime/office/authoring/pptx-author-action.mjs +8 -3
  432. package/src/runtime/office/authoring/pptx-brief.mjs +3 -3
  433. package/src/runtime/office/authoring/pptx-html-build.mjs +109 -37
  434. package/src/runtime/office/authoring/pptx-html-geometry.mjs +188 -46
  435. package/src/runtime/office/authoring/pptx-html-measure.mjs +60 -21
  436. package/src/runtime/office/authoring/pptx-html-runner.mjs +83 -29
  437. package/src/runtime/office/authoring/pptx-script-normalize.mjs +156 -16
  438. package/src/runtime/office/bench/polish-benchmark.mjs +204 -201
  439. package/src/runtime/office/bench/quality-live-benchmark.mjs +8 -4
  440. package/src/runtime/office/capabilities-catalog.mjs +12 -1
  441. package/src/runtime/office/capabilities-signatures.mjs +31 -11
  442. package/src/runtime/office/capabilities.mjs +39 -20
  443. package/src/runtime/office/com/com-adapter.mjs +16 -14
  444. package/src/runtime/office/com/office-com-host.ps1 +118 -140
  445. package/src/runtime/office/core/excel-snapshot-normalize.mjs +149 -0
  446. package/src/runtime/office/core/office-actions-batch.mjs +4 -7
  447. package/src/runtime/office/core/office-actions-inspect.mjs +17 -14
  448. package/src/runtime/office/core/office-actions-open.mjs +1 -6
  449. package/src/runtime/office/core/office-core.mjs +107 -49
  450. package/src/runtime/office/core/office-finalize/review-stage.mjs +4 -1
  451. package/src/runtime/office/core/office-qa/design-review-stage.mjs +2 -9
  452. package/src/runtime/office/core/office-qa/review-assembly.mjs +9 -7
  453. package/src/runtime/office/core/office-sessions.mjs +10 -149
  454. package/src/runtime/office/design/composition-system.mjs +5 -10
  455. package/src/runtime/office/design/design-system.mjs +1 -2
  456. package/src/runtime/office/design/docx/design-docx/section.mjs +1 -1
  457. package/src/runtime/office/design/docx/design-docx-components.mjs +2 -1
  458. package/src/runtime/office/design/docx/design-docx.mjs +2 -2
  459. package/src/runtime/office/design/xlsx/design-xlsx.mjs +6 -2
  460. package/src/runtime/office/pdf/pdf-analysis.mjs +39 -32
  461. package/src/runtime/office/pdf/pdf-batch-content.mjs +1 -1
  462. package/src/runtime/office/pdf/pdf-writer.mjs +26 -22
  463. package/src/runtime/office/portable/docx-tracked-edits.mjs +6 -6
  464. package/src/runtime/office/portable/font-provisioner.mjs +37 -11
  465. package/src/runtime/office/portable/portable-cells.mjs +2 -6
  466. package/src/runtime/office/portable/portable-chart.mjs +6 -6
  467. package/src/runtime/office/portable/portable-docx-edits.mjs +4 -9
  468. package/src/runtime/office/portable/portable-docx-operations.mjs +16 -13
  469. package/src/runtime/office/portable/portable-docx-parts.mjs +7 -2
  470. package/src/runtime/office/portable/portable-docx-xml.mjs +36 -28
  471. package/src/runtime/office/portable/portable-opc.mjs +11 -13
  472. package/src/runtime/office/portable/portable-package.mjs +3 -4
  473. package/src/runtime/office/portable/portable-pivot.mjs +7 -3
  474. package/src/runtime/office/portable/portable-pptx-charts.mjs +59 -42
  475. package/src/runtime/office/portable/portable-pptx-core.mjs +14 -4
  476. package/src/runtime/office/portable/portable-pptx-package.mjs +5 -4
  477. package/src/runtime/office/portable/portable-pptx-shapes.mjs +25 -8
  478. package/src/runtime/office/portable/portable-sheet-audits.mjs +4 -8
  479. package/src/runtime/office/portable/portable-sheet-page.mjs +2 -2
  480. package/src/runtime/office/portable/portable-sheet-xml.mjs +1 -1
  481. package/src/runtime/office/portable/portable-snapshot-docx.mjs +2 -3
  482. package/src/runtime/office/portable/portable-snapshot-pptx.mjs +3 -1
  483. package/src/runtime/office/portable/portable-soffice.mjs +27 -22
  484. package/src/runtime/office/portable/portable-validation-package.mjs +1 -2
  485. package/src/runtime/office/portable/portable-validation.mjs +9 -3
  486. package/src/runtime/office/portable/portable-xlsx-operations.mjs +2 -49
  487. package/src/runtime/office/portable/portable-xlsx-pivot-ops.mjs +10 -5
  488. package/src/runtime/office/portable/portable-xlsx-range-layout.mjs +3 -2
  489. package/src/runtime/office/portable/portable-xlsx-reference-shift.mjs +189 -98
  490. package/src/runtime/office/portable/portable-xlsx-sheet-edits.mjs +26 -6
  491. package/src/runtime/office/portable/portable-xml.mjs +1 -4
  492. package/src/runtime/office/portable/text-metrics.mjs +14 -17
  493. package/src/runtime/office/portable/xlsx-contract.mjs +37 -3
  494. package/src/runtime/office/portable/xlsx-formula-engine.mjs +7 -1
  495. package/src/runtime/office/quality/assurance-checklist.mjs +1 -1
  496. package/src/runtime/office/quality/assurance-rendered.mjs +1 -1
  497. package/src/runtime/office/quality/assurance-structure-pptx.mjs +17 -8
  498. package/src/runtime/office/quality/assurance-structure.mjs +0 -2
  499. package/src/runtime/office/quality/design-aesthetics.mjs +2 -9
  500. package/src/runtime/office/quality/design-deck-diversity.mjs +2 -9
  501. package/src/runtime/office/quality/design-review.mjs +3 -3
  502. package/src/runtime/office/quality/pptx-slide-roles.mjs +3 -3
  503. package/src/runtime/office/shared/line-breaks.mjs +3 -1
  504. package/src/runtime/office/tool-defs.mjs +2 -2
  505. package/src/runtime/shared/async-log-appender.mjs +83 -0
  506. package/src/runtime/shared/automation-presence.mjs +9 -0
  507. package/src/runtime/shared/buffered-appender.mjs +10 -7
  508. package/src/runtime/shared/child-spawn-gate.mjs +2 -37
  509. package/src/runtime/shared/code-graph-state.mjs +84 -0
  510. package/src/runtime/shared/config.mjs +71 -89
  511. package/src/runtime/shared/context-inspection.mjs +56 -0
  512. package/src/runtime/shared/context-measurement.mjs +83 -0
  513. package/src/runtime/shared/device-paths.mjs +206 -0
  514. package/src/{standalone → runtime/shared}/fair-call-scheduler/owner-groups.mjs +1 -1
  515. package/src/runtime/shared/fair-call-scheduler.mjs +198 -0
  516. package/src/runtime/shared/file-lock.mjs +85 -55
  517. package/src/runtime/shared/http-request-body.mjs +3 -1
  518. package/src/runtime/shared/llm/anthropic-betas.mjs +46 -0
  519. package/src/runtime/shared/llm/anthropic-effort.mjs +378 -0
  520. package/src/runtime/shared/llm/anthropic-thinking-contract.mjs +29 -0
  521. package/src/runtime/shared/llm/cost.mjs +19 -10
  522. package/src/runtime/shared/llm/model-catalog-projection.mjs +182 -0
  523. package/src/runtime/shared/llm/model-catalog.mjs +799 -0
  524. package/src/runtime/shared/llm/model-pricing-rates.mjs +78 -0
  525. package/src/runtime/shared/llm/provider-catalog-cache.mjs +130 -0
  526. package/src/runtime/shared/llm/usage-accounting.mjs +12 -11
  527. package/src/runtime/shared/llm/usage-context.mjs +7 -0
  528. package/src/runtime/shared/llm/usage-ledger-import.mjs +14 -3
  529. package/src/runtime/shared/llm/usage-ledger-quota.mjs +97 -37
  530. package/src/runtime/shared/llm/usage-ledger-repair.mjs +3 -1
  531. package/src/runtime/shared/llm/usage-ledger-rollup.mjs +6 -10
  532. package/src/runtime/shared/llm/usage-ledger.mjs +6 -7
  533. package/src/runtime/shared/llm/usage-pricing-refresh.mjs +1 -1
  534. package/src/runtime/shared/llm/usage-rollup.mjs +0 -1
  535. package/src/runtime/shared/model-display.mjs +178 -0
  536. package/src/runtime/shared/notify-trace.mjs +14 -3
  537. package/src/runtime/shared/owner-fair-gate.mjs +1 -1
  538. package/src/runtime/shared/pending-json-projection.mjs +17 -0
  539. package/src/runtime/shared/pristine-execution.mjs +4 -3
  540. package/src/runtime/shared/process-lifecycle.mjs +18 -7
  541. package/src/runtime/shared/read-image-resize.mjs +399 -0
  542. package/src/runtime/shared/schedule-model-ref.mjs +2 -2
  543. package/src/runtime/shared/staged-update.mjs +7 -36
  544. package/src/runtime/shared/statusline/ansi.mjs +161 -0
  545. package/src/{ui → runtime/shared/statusline}/statusline-format.mjs +5 -5
  546. package/src/{ui → runtime/shared/statusline}/statusline-segments.mjs +54 -50
  547. package/src/runtime/shared/tool-card-model/background-task.mjs +1 -1
  548. package/src/runtime/shared/tool-card-model/card-detail.mjs +2 -2
  549. package/src/runtime/shared/tool-card-model/card-status.mjs +7 -5
  550. package/src/runtime/shared/tool-card-model/git-result.mjs +10 -0
  551. package/src/runtime/shared/tool-card-model/terminal-status.mjs +6 -2
  552. package/src/runtime/shared/tool-card-model.golden-cases.mjs +2 -1
  553. package/src/runtime/shared/tool-output-limit.mjs +60 -0
  554. package/src/runtime/shared/tool-primitives.mjs +1 -1
  555. package/src/runtime/shared/tool-result-summary.mjs +1 -0
  556. package/src/runtime/shared/tool-status.mjs +35 -2
  557. package/src/runtime/shared/transcript-metadata.mjs +1 -1
  558. package/src/runtime/shared/transcript-writer/transcript-file.mjs +1 -2
  559. package/src/runtime/shared/turn-snapshot-store.mjs +23 -17
  560. package/src/runtime/shared/turn-worktree-snapshot.mjs +8 -4
  561. package/src/runtime/shared/update-checker.mjs +1 -3
  562. package/src/runtime/tidy/apply.mjs +2 -2
  563. package/src/runtime/tidy/function-length.mjs +63 -0
  564. package/src/runtime/tidy/report.mjs +6 -3
  565. package/src/runtime/tidy/runners/shared.mjs +1 -0
  566. package/src/runtime/tidy/runners/shellcheck.mjs +1 -1
  567. package/src/runtime/tidy/tool.mjs +10 -3
  568. package/src/runtime/web-search/index.mjs +6 -17
  569. package/src/runtime/web-search/lib/cache.mjs +8 -54
  570. package/src/runtime/web-search/lib/config.mjs +2 -6
  571. package/src/runtime/web-search/lib/debounced-json-writer.mjs +62 -0
  572. package/src/runtime/web-search/lib/http-fetch.mjs +24 -112
  573. package/src/runtime/web-search/lib/package-version.mjs +10 -0
  574. package/src/runtime/web-search/lib/ssrf-guard.mjs +34 -28
  575. package/src/runtime/web-search/lib/state.mjs +8 -53
  576. package/src/runtime/web-search/lib/web-tools.mjs +5 -5
  577. package/src/session-runtime/agent-tool-routing.mjs +3 -9
  578. package/src/{runtime/shared → session-runtime}/automation-workflow.mjs +4 -4
  579. package/src/session-runtime/boot/apis.mjs +4 -5
  580. package/src/session-runtime/boot/begin.mjs +1 -1
  581. package/src/session-runtime/boot/config.mjs +2 -2
  582. package/src/session-runtime/boot/facade.mjs +2 -2
  583. package/src/session-runtime/boot/infrastructure.mjs +4 -4
  584. package/src/session-runtime/boot/providers.mjs +6 -6
  585. package/src/session-runtime/boot/session.mjs +1 -1
  586. package/src/session-runtime/boot/shared.mjs +5 -7
  587. package/src/session-runtime/boot/tools.mjs +6 -6
  588. package/src/session-runtime/bridge-first-use-gate.mjs +1 -1
  589. package/src/session-runtime/builtin-features.mjs +1 -193
  590. package/src/session-runtime/channel-config-api.mjs +3 -3
  591. package/src/session-runtime/config-helpers.mjs +1 -420
  592. package/src/session-runtime/config-lifecycle.mjs +2 -2
  593. package/src/session-runtime/cwd-plugins/core-memory-context.mjs +2 -2
  594. package/src/session-runtime/cwd-plugins/plugin-status.mjs +1 -1
  595. package/src/session-runtime/deferred-tool-delta.mjs +1 -101
  596. package/src/session-runtime/effort.mjs +1 -145
  597. package/src/session-runtime/goal-facade-api.mjs +1 -1
  598. package/src/session-runtime/goal-state.mjs +1 -325
  599. package/src/session-runtime/goal-tasks.mjs +1 -137
  600. package/src/session-runtime/goal-tool-defs.mjs +1 -140
  601. package/src/session-runtime/hook-payload.mjs +4 -5
  602. package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -3
  603. package/src/session-runtime/internal-tool-executor/caller-context.mjs +8 -0
  604. package/src/session-runtime/internal-tool-executor/feature-tools.mjs +3 -2
  605. package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +4 -6
  606. package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +2 -2
  607. package/src/session-runtime/internal-tool-executor.mjs +1 -1
  608. package/src/session-runtime/lifecycle/inheritance.mjs +1 -1
  609. package/src/session-runtime/lifecycle/session-catalog.mjs +3 -3
  610. package/src/session-runtime/lifecycle/session-switch/resume.mjs +2 -2
  611. package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +1 -1
  612. package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
  613. package/src/session-runtime/lifecycle/shared.mjs +1 -1
  614. package/src/session-runtime/mcp-glue/connect.mjs +1 -1
  615. package/src/session-runtime/mcp-glue/server-catalog.mjs +1 -1
  616. package/src/session-runtime/mcp-glue/server-input.mjs +1 -1
  617. package/src/session-runtime/model-capabilities.mjs +1 -140
  618. package/src/session-runtime/model-recency.mjs +1 -1
  619. package/src/session-runtime/model-route/route-persist.mjs +2 -2
  620. package/src/session-runtime/model-route/route-tuning.mjs +3 -3
  621. package/src/session-runtime/model-route/set-route.mjs +6 -6
  622. package/src/session-runtime/model-route/web-search-route.mjs +5 -5
  623. package/src/session-runtime/model-route-api.mjs +1 -1
  624. package/src/session-runtime/native-web-search/routes.mjs +1 -1
  625. package/src/session-runtime/native-web-search/tool-shape.mjs +2 -2
  626. package/src/session-runtime/output-styles.mjs +2 -2
  627. package/src/session-runtime/prewarm/channel-start.mjs +1 -0
  628. package/src/session-runtime/provider-auth/accounts.mjs +7 -2
  629. package/src/session-runtime/provider-auth/login.mjs +1 -1
  630. package/src/session-runtime/provider-auth-api.mjs +1 -1
  631. package/src/session-runtime/provider-models/model-meta.mjs +1 -1
  632. package/src/session-runtime/provider-models/row-hydration.mjs +3 -3
  633. package/src/session-runtime/provider-usage.mjs +2 -2
  634. package/src/session-runtime/quick-model-rows/model-meta.mjs +1 -1
  635. package/src/session-runtime/quick-model-rows/provider-rows.mjs +1 -1
  636. package/src/session-runtime/quick-model-rows/web-search-rows.mjs +2 -2
  637. package/src/session-runtime/resource-api.mjs +2 -2
  638. package/src/session-runtime/resource-mcp-api.mjs +3 -3
  639. package/src/session-runtime/resource-plugins-api.mjs +3 -3
  640. package/src/session-runtime/resource-recall-api.mjs +2 -2
  641. package/src/session-runtime/resource-scope-decorate.mjs +2 -2
  642. package/src/session-runtime/route-resolution.mjs +3 -3
  643. package/src/session-runtime/route-state.mjs +4 -4
  644. package/src/session-runtime/runtime-bootstrap.mjs +1 -1
  645. package/src/session-runtime/runtime-facade.mjs +1 -1
  646. package/src/session-runtime/runtime-feature-gates.mjs +2 -2
  647. package/src/session-runtime/runtime-modules.mjs +3 -3
  648. package/src/session-runtime/runtime-paths.mjs +6 -2
  649. package/src/session-runtime/runtime-tool-routing.mjs +2 -2
  650. package/src/{runtime/shared → session-runtime}/schedule-session-run.mjs +5 -5
  651. package/src/{standalone → session-runtime/services}/agent-task-status.mjs +1 -1
  652. package/src/{standalone → session-runtime/services}/agent-tool/close-flow/close-all.mjs +2 -2
  653. package/src/{standalone → session-runtime/services}/agent-tool/close-flow.mjs +1 -1
  654. package/src/{standalone → session-runtime/services}/agent-tool/execute.mjs +1 -1
  655. package/src/{standalone → session-runtime/services}/agent-tool/helpers.mjs +6 -6
  656. package/src/session-runtime/services/agent-tool/index-write-queue.mjs +209 -0
  657. package/src/{standalone → session-runtime/services}/agent-tool/job-task-reconcile.mjs +2 -2
  658. package/src/{standalone → session-runtime/services}/agent-tool/job-views/job-lookup.mjs +5 -1
  659. package/src/{standalone → session-runtime/services}/agent-tool/job-views/job-render.mjs +1 -1
  660. package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +101 -0
  661. package/src/{standalone → session-runtime/services}/agent-tool/job-views/spawn-meta.mjs +1 -1
  662. package/src/session-runtime/services/agent-tool/job-views.mjs +59 -0
  663. package/src/session-runtime/services/agent-tool/lead-worker-index/index-file.mjs +48 -0
  664. package/src/{standalone → session-runtime/services}/agent-tool/lead-worker-index/row-settlement.mjs +3 -3
  665. package/src/{standalone → session-runtime/services}/agent-tool/lead-worker-index.mjs +10 -2
  666. package/src/{standalone → session-runtime/services}/agent-tool/notify/early-completion.mjs +2 -2
  667. package/src/{standalone → session-runtime/services}/agent-tool/notify.mjs +4 -4
  668. package/src/{standalone → session-runtime/services}/agent-tool/render.mjs +2 -2
  669. package/src/{standalone → session-runtime/services}/agent-tool/send-flow.mjs +6 -2
  670. package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow/job-start.mjs +2 -2
  671. package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow/spawn-plan.mjs +3 -3
  672. package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow/spawn-prep.mjs +3 -3
  673. package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow/spawn-run.mjs +3 -3
  674. package/src/{standalone → session-runtime/services}/agent-tool/spawn-preset.mjs +1 -1
  675. package/src/session-runtime/services/agent-tool/tag-registry.mjs +121 -0
  676. package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper/reap-timers.mjs +1 -1
  677. package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper/scan-admission.mjs +1 -1
  678. package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper/stale-rows.mjs +1 -1
  679. package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper/tombstones.mjs +5 -2
  680. package/src/session-runtime/services/agent-tool/tool-def.mjs +60 -0
  681. package/src/{standalone → session-runtime/services}/agent-tool/turn-review.mjs +1 -1
  682. package/src/{standalone → session-runtime/services}/agent-tool/worker-index/row-liveness.mjs +1 -1
  683. package/src/{standalone → session-runtime/services}/agent-tool/worker-index/row-store.mjs +46 -20
  684. package/src/{standalone → session-runtime/services}/agent-tool/worker-index.mjs +8 -1
  685. package/src/{standalone → session-runtime/services}/agent-tool/worker-rows.mjs +1 -1
  686. package/src/session-runtime/services/agent-tool.mjs +151 -0
  687. package/src/{standalone → session-runtime/services}/agent-watchdog-registry.mjs +1 -1
  688. package/src/{standalone → session-runtime/services}/channel-admin.mjs +8 -10
  689. package/src/{standalone → session-runtime/services}/channel-client.mjs +1 -1
  690. package/src/{standalone → session-runtime/services}/channel-session-router.mjs +1 -1
  691. package/src/{standalone → session-runtime/services}/channel-worker/client-heartbeat.mjs +1 -1
  692. package/src/{standalone → session-runtime/services}/channel-worker/daemon-attach.mjs +1 -1
  693. package/src/{standalone → session-runtime/services}/channel-worker/daemon-spawn.mjs +5 -5
  694. package/src/session-runtime/services/channel-worker.mjs +140 -0
  695. package/src/session-runtime/services/daemon-crash-capture/daemon-exit-record.mjs +189 -0
  696. package/src/{standalone → session-runtime/services}/daemon-crash-capture/retention.mjs +1 -1
  697. package/src/{standalone → session-runtime/services}/daemon-crash-capture/spawn-capture.mjs +12 -1
  698. package/src/{standalone → session-runtime/services}/daemon-crash-capture.mjs +6 -0
  699. package/src/{standalone → session-runtime/services}/hook-bus/command-handler.mjs +1 -1
  700. package/src/{standalone → session-runtime/services}/hook-bus/event-runner.mjs +1 -1
  701. package/src/{standalone → session-runtime/services}/hook-bus/handler-dispatch.mjs +1 -1
  702. package/src/{standalone → session-runtime/services}/hook-bus/handlers.mjs +5 -4
  703. package/src/{standalone → session-runtime/services}/hook-bus/rule-file.mjs +2 -2
  704. package/src/{standalone → session-runtime/services}/hook-bus/tool-gate.mjs +1 -1
  705. package/src/{standalone → session-runtime/services}/memory-runtime-proxy/client-registry.mjs +1 -1
  706. package/src/{standalone → session-runtime/services}/memory-runtime-proxy/daemon-spawn.mjs +4 -4
  707. package/src/{standalone → session-runtime/services}/memory-runtime-proxy/discovery.mjs +5 -5
  708. package/src/{standalone → session-runtime/services}/memory-runtime-proxy/owner-claim.mjs +2 -2
  709. package/src/{standalone → session-runtime/services}/memory-runtime-proxy/rpc.mjs +0 -4
  710. package/src/{standalone → session-runtime/services}/memory-runtime-proxy/start.mjs +1 -1
  711. package/src/{standalone → session-runtime/services}/memory-runtime-proxy/tool-wire.mjs +1 -1
  712. package/src/session-runtime/services/memory-runtime-proxy.mjs +130 -0
  713. package/src/{standalone → session-runtime/services}/plugin-admin.mjs +6 -6
  714. package/src/session-runtime/services/provider-admin.mjs +576 -0
  715. package/src/{standalone → session-runtime/services}/seeds.mjs +3 -3
  716. package/src/{standalone → session-runtime/services}/usage-dashboard-model.mjs +1 -1
  717. package/src/session-runtime/services/usage-dashboard.mjs +278 -0
  718. package/src/{standalone → session-runtime/services}/usage-stats-hours.mjs +1 -1
  719. package/src/session-runtime/services/usage-stats-model.mjs +657 -0
  720. package/src/session-runtime/services/usage-stats-period.mjs +178 -0
  721. package/src/session-runtime/session-create/materialize.mjs +3 -3
  722. package/src/session-runtime/session-create/session-options.mjs +14 -7
  723. package/src/session-runtime/session-lifecycle.mjs +2 -2
  724. package/src/session-runtime/settings-builtin-tools-api.mjs +1 -1
  725. package/src/session-runtime/setup-tool/executor.mjs +2 -2
  726. package/src/session-runtime/skills-api.mjs +2 -2
  727. package/src/session-runtime/statusline-route.mjs +1 -1
  728. package/src/session-runtime/tool-catalog.mjs +1 -753
  729. package/src/session-runtime/tool-defs.mjs +1 -149
  730. package/src/session-runtime/tool-policy-refresh.mjs +7 -5
  731. package/src/session-runtime/tool-surface.mjs +5 -5
  732. package/src/session-runtime/turn/agent-ops.mjs +2 -2
  733. package/src/session-runtime/turn/session-ops.mjs +2 -2
  734. package/src/session-runtime/turn/share-ops.mjs +4 -3
  735. package/src/session-runtime/turn/turn-run/turn-prepare.mjs +1 -1
  736. package/src/session-runtime/turn/turn-run/turn-settle.mjs +4 -4
  737. package/src/session-runtime/usage-stats-api.mjs +18 -2
  738. package/src/session-runtime/warmup/statusline-usage-warmup.mjs +2 -2
  739. package/src/{runtime/shared → session-runtime}/webhook-session-run.mjs +5 -5
  740. package/src/session-runtime/workflow-agents-api/agent-editor.mjs +2 -2
  741. package/src/session-runtime/workflow-agents-api/agent-route.mjs +4 -4
  742. package/src/session-runtime/workflow-agents-api/onboarding.mjs +2 -2
  743. package/src/session-runtime/workflow-agents-api/shared.mjs +4 -6
  744. package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +1 -1
  745. package/src/session-runtime/workflow.mjs +1 -255
  746. package/src/standalone/agent-tool/job-views/session-progress.mjs +1 -101
  747. package/src/standalone/agent-tool/job-views.mjs +1 -59
  748. package/src/standalone/agent-tool/tag-registry.mjs +1 -121
  749. package/src/standalone/agent-tool/tool-def.mjs +1 -60
  750. package/src/standalone/agent-tool.mjs +1 -151
  751. package/src/standalone/channel-worker.mjs +1 -140
  752. package/src/standalone/daemon-agent-control.mjs +1 -1
  753. package/src/standalone/daemon-desktop-runtime.mjs +2 -2
  754. package/src/standalone/daemon-stored-session-views.mjs +1 -1
  755. package/src/standalone/daemon.mjs +38 -5
  756. package/src/standalone/fair-call-scheduler.mjs +1 -198
  757. package/src/standalone/folder-dialog.mjs +12 -8
  758. package/src/standalone/memory-runtime-proxy.mjs +1 -130
  759. package/src/standalone/provider-admin.mjs +1 -576
  760. package/src/standalone/session-client/frame-stream.mjs +1 -1
  761. package/src/standalone/session-client.mjs +2 -2
  762. package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -1
  763. package/src/standalone/session-service/projection/transcript-window.mjs +2 -2
  764. package/src/standalone/usage-dashboard.mjs +1 -278
  765. package/src/standalone/usage-stats-model.mjs +1 -653
  766. package/src/standalone/usage-stats-period.mjs +1 -178
  767. package/src/tui/App.jsx +107 -256
  768. package/src/tui/app/app-view/floating-panel.jsx +3 -12
  769. package/src/tui/app/app-view/welcome-banner.jsx +36 -0
  770. package/src/tui/app/app-view.jsx +18 -45
  771. package/src/tui/app/create-app-pickers.mjs +1 -1
  772. package/src/tui/app/doctor.mjs +15 -1
  773. package/src/tui/app/extension-pickers/mcp-servers-picker.mjs +7 -3
  774. package/src/tui/app/maintenance-pickers/auto-clear-picker.mjs +5 -8
  775. package/src/tui/app/model-options.mjs +2 -3
  776. package/src/tui/app/model-picker/model-footer.mjs +1 -1
  777. package/src/tui/app/model-picker/route-selection.mjs +1 -3
  778. package/src/tui/app/mouse-input/button-gestures.mjs +13 -31
  779. package/src/tui/app/mouse-input/wheel-router.mjs +22 -32
  780. package/src/tui/app/picker-enter-latch.mjs +21 -0
  781. package/src/tui/app/picker-index-mode.mjs +34 -0
  782. package/src/tui/app/shell-layout/panel-transition.mjs +7 -12
  783. package/src/tui/app/shell-layout/row-budgets.mjs +4 -9
  784. package/src/tui/app/slash-palette.mjs +31 -0
  785. package/src/tui/app/text-layout.mjs +1 -1
  786. package/src/tui/app/theme-effort-pickers.mjs +1 -1
  787. package/src/tui/app/transcript-window.mjs +1 -5
  788. package/src/tui/app/usage-context-panels/context-model.mjs +1 -1
  789. package/src/tui/app/use-global-key-input.mjs +0 -1
  790. package/src/tui/app/use-interaction-refs.mjs +55 -0
  791. package/src/tui/app/use-onboarding-start.mjs +45 -0
  792. package/src/tui/app/use-panel-transition.mjs +40 -0
  793. package/src/tui/app/use-prompt-draft-flow.mjs +4 -13
  794. package/src/tui/app/use-prompt-layout-rows.mjs +39 -0
  795. package/src/tui/app/use-prompt-queue-history/prompt-history.mjs +1 -1
  796. package/src/tui/app/use-prompt-state.mjs +40 -0
  797. package/src/tui/app/use-selection-paint.mjs +9 -5
  798. package/src/tui/app/use-transcript-scroll-state.mjs +61 -0
  799. package/src/tui/app/use-transcript-window.mjs +0 -1
  800. package/src/tui/app/use-ui-open-request.mjs +18 -0
  801. package/src/tui/app/use-workflow-tab-cycle.mjs +39 -0
  802. package/src/tui/components/ContextInspector.jsx +1 -1
  803. package/src/tui/components/ContextPanel.jsx +1 -1
  804. package/src/tui/components/Picker.jsx +41 -322
  805. package/src/tui/components/PromptInput.jsx +34 -468
  806. package/src/tui/components/StatusLine.jsx +8 -555
  807. package/src/tui/components/TextEntryPanel.jsx +25 -211
  808. package/src/tui/components/ToolExecution.jsx +43 -328
  809. package/src/tui/components/UsagePanel.jsx +1 -1
  810. package/src/tui/components/picker/PickerItemRow.jsx +85 -0
  811. package/src/tui/components/picker/picker-layout.mjs +46 -0
  812. package/src/tui/components/picker/use-picker-input.mjs +165 -0
  813. package/src/tui/components/picker/use-picker-selection.mjs +67 -0
  814. package/src/tui/components/prompt-input/edit-chords.mjs +87 -0
  815. package/src/tui/components/prompt-input/edit-helpers.mjs +15 -12
  816. package/src/tui/components/prompt-input/escape-key.mjs +87 -0
  817. package/src/tui/components/prompt-input/key-handler.mjs +364 -0
  818. package/src/tui/components/status-line/boot-schedule.mjs +83 -0
  819. package/src/tui/components/status-line/local-line.mjs +213 -0
  820. package/src/tui/components/status-line/use-statusline-text.mjs +319 -0
  821. package/src/tui/components/statusline-module-loader.mjs +21 -0
  822. package/src/tui/components/text-entry-layout.mjs +104 -0
  823. package/src/tui/components/text-entry-value.jsx +47 -0
  824. package/src/tui/components/tool-execution/aggregate-card.jsx +141 -0
  825. package/src/tui/components/tool-execution/pending-placeholder.jsx +24 -0
  826. package/src/tui/components/tool-execution/standard-card.jsx +229 -0
  827. package/src/tui/components/tool-output-format.mjs +3 -5
  828. package/src/tui/dist/index.mjs +3616 -3022
  829. package/src/tui/index.jsx +85 -66
  830. package/src/tui/markdown/format-token.mjs +3 -3
  831. package/src/tui/paste-attachments.mjs +1 -1
  832. package/src/tui/prompt-history-store.mjs +17 -6
  833. package/src/tui/session/agent-envelope.mjs +1 -489
  834. package/src/tui/session/context-state.mjs +2 -2
  835. package/src/tui/session/goal-continuation/continuation-queue.mjs +1 -1
  836. package/src/tui/session/goal-continuation/deadline-delivery.mjs +1 -1
  837. package/src/tui/session/goal-continuation/goal-visibility.mjs +1 -1
  838. package/src/tui/session/initial-state.mjs +1 -1
  839. package/src/tui/session/live-share/wire.mjs +3 -0
  840. package/src/tui/session/oauth-flows.mjs +1 -7
  841. package/src/tui/session/session-api/commands.mjs +5 -3
  842. package/src/tui/session/session-api/controls.mjs +1 -1
  843. package/src/tui/session/session-api/intake/submission.mjs +8 -3
  844. package/src/tui/session/session-api/integrations.mjs +1 -1
  845. package/src/tui/session/session-api/routes.mjs +9 -8
  846. package/src/tui/session/session-api/settings.mjs +24 -23
  847. package/src/tui/session/session-api/shared.mjs +13 -2
  848. package/src/tui/session/session-api-ext.mjs +7 -415
  849. package/src/tui/session/session-flow/drain.mjs +86 -82
  850. package/src/tui/session/session-flow/queue.mjs +3 -1
  851. package/src/tui/session/tool-result-status.mjs +1 -354
  852. package/src/tui/session/tool-result-text.mjs +1 -157
  853. package/src/tui/session/transcript-intake.mjs +1 -1
  854. package/src/tui/session/transcript-spill/spill-dir.mjs +4 -1
  855. package/src/tui/session/transcript-spill/spill-writer.mjs +1 -1
  856. package/src/tui/session/tui-steering-persist.mjs +44 -86
  857. package/src/tui/session-local.mjs +8 -5
  858. package/src/tui/statusline-ansi-bridge.mjs +1 -1
  859. package/src/tui/theme.mjs +1 -1
  860. package/src/ui/ansi.mjs +1 -161
  861. package/src/ui/context-inspection.mjs +1 -56
  862. package/src/ui/context-measurement.mjs +1 -83
  863. package/src/ui/markdown.mjs +3 -3
  864. package/src/ui/model-display.mjs +1 -173
  865. package/src/ui/statusline-agents.mjs +22 -21
  866. package/src/ui/statusline.mjs +21 -24
  867. package/src/ui/stream-finalize.mjs +1 -1
  868. package/src/ui/tool-card.mjs +1 -1
  869. package/src/vendor/statusline/src/gateway/route-meta.mjs +157 -29
  870. package/scripts/fixtures/spawn-lease-child-harness.mjs +0 -8
  871. package/scripts/fixtures/spawn-lease-fixture-worker.mjs +0 -37
  872. package/src/runtime/agent/orchestrator/activity-bus.mjs +0 -31
  873. package/src/runtime/shared/child-spawn-remote.mjs +0 -210
  874. package/src/runtime/shared/session-runtime-health.mjs +0 -201
  875. package/src/standalone/agent-tool/lead-worker-index/index-file.mjs +0 -45
  876. package/src/standalone/session-runtime-agent-control-client.mjs +0 -117
  877. package/src/standalone/session-runtime-agent-control.mjs +0 -85
  878. package/src/standalone/session-runtime-host-factory.mjs +0 -22
  879. package/src/standalone/session-runtime-host.mjs +0 -742
  880. package/src/standalone/session-runtime-provider-cooldown.mjs +0 -78
  881. package/src/standalone/session-runtime-proxy.mjs +0 -164
  882. package/src/standalone/session-runtime-record.mjs +0 -18
  883. package/src/standalone/session-runtime-shard-router.mjs +0 -151
  884. package/src/standalone/session-runtime-spawn-leases.mjs +0 -82
  885. package/src/standalone/session-runtime-worker.mjs +0 -678
  886. package/src/standalone/session-runtime-workload.mjs +0 -98
  887. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/context-status-cache.mjs +0 -0
  888. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/deferred-tool-availability.mjs +0 -0
  889. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-deadlines.mjs +0 -0
  890. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-runtime.mjs +0 -0
  891. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-store.mjs +0 -0
  892. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-text.mjs +0 -0
  893. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/goal-tool-exec.mjs +0 -0
  894. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/provider-request-snapshot.mjs +0 -0
  895. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/provider-request-tools.mjs +0 -0
  896. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/tool-catalog-data.mjs +0 -0
  897. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/tool-profile.mjs +0 -0
  898. /package/src/{session-runtime → runtime/agent/orchestrator/runtime-core}/workflow/shared-scan-cache.mjs +0 -0
  899. /package/src/{standalone → runtime/shared}/fair-call-scheduler/queue-item.mjs +0 -0
  900. /package/src/runtime/{agent/orchestrator/providers → shared/llm}/provider-model-identities.mjs +0 -0
  901. /package/src/{standalone → runtime/shared}/projects.mjs +0 -0
  902. /package/src/{standalone → session-runtime/services}/agent-tool/execute-send.mjs +0 -0
  903. /package/src/{standalone → session-runtime/services}/agent-tool/execute-spawn.mjs +0 -0
  904. /package/src/{standalone → session-runtime/services}/agent-tool/job-views/agent-list.mjs +0 -0
  905. /package/src/{standalone → session-runtime/services}/agent-tool/lead-worker-index/lead-rows.mjs +0 -0
  906. /package/src/{standalone → session-runtime/services}/agent-tool/lead-worker-index/reap-timers.mjs +0 -0
  907. /package/src/{standalone → session-runtime/services}/agent-tool/provider-init.mjs +0 -0
  908. /package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow/deferred-spawn.mjs +0 -0
  909. /package/src/{standalone → session-runtime/services}/agent-tool/spawn-flow.mjs +0 -0
  910. /package/src/{standalone → session-runtime/services}/agent-tool/tag-maps.mjs +0 -0
  911. /package/src/{standalone → session-runtime/services}/agent-tool/tag-registry/tag-lookup.mjs +0 -0
  912. /package/src/{standalone → session-runtime/services}/agent-tool/tag-registry/tag-refresh.mjs +0 -0
  913. /package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper/row-helpers.mjs +0 -0
  914. /package/src/{standalone → session-runtime/services}/agent-tool/terminal-reaper.mjs +0 -0
  915. /package/src/{standalone → session-runtime/services}/agent-tool/terminal-trace.mjs +0 -0
  916. /package/src/{standalone → session-runtime/services}/agent-tool/worker-index/mutation-batch.mjs +0 -0
  917. /package/src/{standalone → session-runtime/services}/agent-tool/worker-index/row-shape.mjs +0 -0
  918. /package/src/{standalone → session-runtime/services}/channel-client/daemon-request.mjs +0 -0
  919. /package/src/{standalone → session-runtime/services}/channel-client/notify-stream.mjs +0 -0
  920. /package/src/{standalone → session-runtime/services}/channel-client/reconnect.mjs +0 -0
  921. /package/src/{standalone → session-runtime/services}/channel-client/registration.mjs +0 -0
  922. /package/src/{standalone → session-runtime/services}/daemon-candidate.mjs +0 -0
  923. /package/src/{standalone → session-runtime/services}/daemon-crash-capture/paths.mjs +0 -0
  924. /package/src/{standalone → session-runtime/services}/hook-bus/config-loader.mjs +0 -0
  925. /package/src/{standalone → session-runtime/services}/hook-bus/config.mjs +0 -0
  926. /package/src/{standalone → session-runtime/services}/hook-bus/constants.mjs +0 -0
  927. /package/src/{standalone → session-runtime/services}/hook-bus/event-log.mjs +0 -0
  928. /package/src/{standalone → session-runtime/services}/hook-bus/handler-timeout.mjs +0 -0
  929. /package/src/{standalone → session-runtime/services}/hook-bus/payload.mjs +0 -0
  930. /package/src/{standalone → session-runtime/services}/hook-bus/rule-store.mjs +0 -0
  931. /package/src/{standalone → session-runtime/services}/hook-bus/rules.mjs +0 -0
  932. /package/src/{standalone → session-runtime/services}/hook-bus.mjs +0 -0
  933. /package/src/{standalone → session-runtime/services}/memory-runtime-proxy/calls.mjs +0 -0
  934. /package/src/{standalone → session-runtime/services}/memory-runtime-proxy/state.mjs +0 -0
  935. /package/src/{standalone → session-runtime/services}/sse-frames.mjs +0 -0
@@ -1,3 +1,4 @@
1
+ import { createHash } from 'node:crypto';
1
2
  import { existsSync, promises as fsp } from 'node:fs';
2
3
  import { homedir, platform } from 'node:os';
3
4
  import { join } from 'node:path';
@@ -7,86 +8,100 @@ import { GlobalFonts } from '@napi-rs/canvas';
7
8
 
8
9
  const execFileAsync = promisify(execFile);
9
10
 
11
+ // google/fonts commit the font URLs and sha256 digests below were taken from.
12
+ const GOOGLE_FONTS_COMMIT = '23e54b51ddffbc7713c583748e3bd86f62b1fa4a';
13
+ const GOOGLE_FONTS_RAW = `https://raw.githubusercontent.com/google/fonts/${GOOGLE_FONTS_COMMIT}/ofl`;
14
+
10
15
  export const NOTO_FONT_DEFINITIONS = Object.freeze([
11
16
  {
12
17
  id: 'noto-sans-latin',
13
18
  family: 'Noto Sans',
14
19
  fileName: 'NotoSans-Variable.ttf',
15
20
  registryName: 'Noto Sans (TrueType)',
16
- url: 'https://raw.githubusercontent.com/google/fonts/main/ofl/notosans/NotoSans%5Bwdth%2Cwght%5D.ttf',
21
+ url: `${GOOGLE_FONTS_RAW}/notosans/NotoSans%5Bwdth%2Cwght%5D.ttf`,
17
22
  bytes: 2049096,
23
+ sha256: 'bfb7bb691513f12e734dc346c03a03f784912432d7e3fa8e56efcf906fe86b3d',
18
24
  },
19
25
  {
20
26
  id: 'noto-sans-kr',
21
27
  family: 'Noto Sans KR',
22
28
  fileName: 'NotoSansKR-Variable.ttf',
23
29
  registryName: 'Noto Sans KR (TrueType)',
24
- url: 'https://raw.githubusercontent.com/google/fonts/main/ofl/notosanskr/NotoSansKR%5Bwght%5D.ttf',
30
+ url: `${GOOGLE_FONTS_RAW}/notosanskr/NotoSansKR%5Bwght%5D.ttf`,
25
31
  bytes: 10414588,
32
+ sha256: '194018e6b2b293a7964f037b25c0249ce1418bc9ab3c971060a03aa57861e252',
26
33
  },
27
34
  {
28
35
  id: 'noto-sans-sc',
29
36
  family: 'Noto Sans SC',
30
37
  fileName: 'NotoSansSC-Variable.ttf',
31
38
  registryName: 'Noto Sans SC (TrueType)',
32
- url: 'https://raw.githubusercontent.com/google/fonts/main/ofl/notosanssc/NotoSansSC%5Bwght%5D.ttf',
39
+ url: `${GOOGLE_FONTS_RAW}/notosanssc/NotoSansSC%5Bwght%5D.ttf`,
33
40
  bytes: 17772300,
41
+ sha256: 'a3041811a78c361b1de50f953c805e0244951c21c5bd412f7232ef0d899af0da',
34
42
  },
35
43
  {
36
44
  id: 'noto-sans-jp',
37
45
  family: 'Noto Sans JP',
38
46
  fileName: 'NotoSansJP-Variable.ttf',
39
47
  registryName: 'Noto Sans JP (TrueType)',
40
- url: 'https://raw.githubusercontent.com/google/fonts/main/ofl/notosansjp/NotoSansJP%5Bwght%5D.ttf',
48
+ url: `${GOOGLE_FONTS_RAW}/notosansjp/NotoSansJP%5Bwght%5D.ttf`,
41
49
  bytes: 9589900,
50
+ sha256: 'c2f3b4d463500a2ddcd3849cded1fceeb9fd6d1c32e6cbecd568453ba50fc68f',
42
51
  },
43
52
  {
44
53
  id: 'noto-sans-tc',
45
54
  family: 'Noto Sans TC',
46
55
  fileName: 'NotoSansTC-Variable.ttf',
47
56
  registryName: 'Noto Sans TC (TrueType)',
48
- url: 'https://raw.githubusercontent.com/google/fonts/main/ofl/notosanstc/NotoSansTC%5Bwght%5D.ttf',
57
+ url: `${GOOGLE_FONTS_RAW}/notosanstc/NotoSansTC%5Bwght%5D.ttf`,
49
58
  bytes: 11941968,
59
+ sha256: '864727d210d54f2537bbe23b3a839436c3992af72de9322af5270897246bd44f',
50
60
  },
51
61
  {
52
62
  id: 'noto-sans-arabic',
53
63
  family: 'Noto Sans Arabic',
54
64
  fileName: 'NotoSansArabic-Variable.ttf',
55
65
  registryName: 'Noto Sans Arabic (TrueType)',
56
- url: 'https://raw.githubusercontent.com/google/fonts/main/ofl/notosansarabic/NotoSansArabic%5Bwdth%2Cwght%5D.ttf',
66
+ url: `${GOOGLE_FONTS_RAW}/notosansarabic/NotoSansArabic%5Bwdth%2Cwght%5D.ttf`,
57
67
  bytes: 844676,
68
+ sha256: '63111b5b2e074dd48cc67692e0a2726d86ee94c1c37fe8598257b7b4e87e869e',
58
69
  },
59
70
  {
60
71
  id: 'noto-sans-devanagari',
61
72
  family: 'Noto Sans Devanagari',
62
73
  fileName: 'NotoSansDevanagari-Variable.ttf',
63
74
  registryName: 'Noto Sans Devanagari (TrueType)',
64
- url: 'https://raw.githubusercontent.com/google/fonts/main/ofl/notosansdevanagari/NotoSansDevanagari%5Bwdth%2Cwght%5D.ttf',
65
- bytes: 647144,
75
+ url: `${GOOGLE_FONTS_RAW}/notosansdevanagari/NotoSansDevanagari%5Bwdth%2Cwght%5D.ttf`,
76
+ bytes: 641944,
77
+ sha256: '14ec4af41f27482216d1c2229f417ff9b1425e1babb014e57d1d40d03229853e',
66
78
  },
67
79
  {
68
80
  id: 'noto-sans-thai',
69
81
  family: 'Noto Sans Thai',
70
82
  fileName: 'NotoSansThai-Variable.ttf',
71
83
  registryName: 'Noto Sans Thai (TrueType)',
72
- url: 'https://raw.githubusercontent.com/google/fonts/main/ofl/notosansthai/NotoSansThai%5Bwdth%2Cwght%5D.ttf',
84
+ url: `${GOOGLE_FONTS_RAW}/notosansthai/NotoSansThai%5Bwdth%2Cwght%5D.ttf`,
73
85
  bytes: 218652,
86
+ sha256: '5a1c559bb539583c8a1fd99d1c5b9491e5e14478c9cd2bd0970d5c3096cc9ef8',
74
87
  },
75
88
  {
76
89
  id: 'noto-sans-hebrew',
77
90
  family: 'Noto Sans Hebrew',
78
91
  fileName: 'NotoSansHebrew-Variable.ttf',
79
92
  registryName: 'Noto Sans Hebrew (TrueType)',
80
- url: 'https://raw.githubusercontent.com/google/fonts/main/ofl/notosanshebrew/NotoSansHebrew%5Bwdth%2Cwght%5D.ttf',
93
+ url: `${GOOGLE_FONTS_RAW}/notosanshebrew/NotoSansHebrew%5Bwdth%2Cwght%5D.ttf`,
81
94
  bytes: 112640,
95
+ sha256: '7ef36a2c3593758cdb622e1bdef4f84523e92fbc3ccc667438dd80ff54c2de88',
82
96
  },
83
97
  {
84
98
  id: 'noto-sans-bengali',
85
99
  family: 'Noto Sans Bengali',
86
100
  fileName: 'NotoSansBengali-Variable.ttf',
87
101
  registryName: 'Noto Sans Bengali (TrueType)',
88
- url: 'https://raw.githubusercontent.com/google/fonts/main/ofl/notosansbengali/NotoSansBengali%5Bwdth%2Cwght%5D.ttf',
102
+ url: `${GOOGLE_FONTS_RAW}/notosansbengali/NotoSansBengali%5Bwdth%2Cwght%5D.ttf`,
89
103
  bytes: 463668,
104
+ sha256: 'dcd42978094e584a849c84a51450eeac40c8826057d566ea6d4b9627a403a05a',
90
105
  },
91
106
  ]);
92
107
 
@@ -163,6 +178,16 @@ function registerFontInProcess(fontPath, family) {
163
178
  return false;
164
179
  }
165
180
 
181
+ export function verifyFontBuffer(fontDef, buffer) {
182
+ if (buffer.length !== fontDef.bytes) {
183
+ throw new Error(`Font ${fontDef.family} size mismatch: expected ${fontDef.bytes} bytes, got ${buffer.length}`);
184
+ }
185
+ const digest = createHash('sha256').update(buffer).digest('hex');
186
+ if (digest !== fontDef.sha256) {
187
+ throw new Error(`Font ${fontDef.family} sha256 mismatch: expected ${fontDef.sha256}, got ${digest}`);
188
+ }
189
+ }
190
+
166
191
  async function installFont(fontDef) {
167
192
  const status = isFontInstalled(fontDef);
168
193
  if (status.installed) {
@@ -182,6 +207,7 @@ async function installFont(fontDef) {
182
207
  }
183
208
 
184
209
  const buffer = Buffer.from(await response.arrayBuffer());
210
+ verifyFontBuffer(fontDef, buffer);
185
211
  await fsp.writeFile(tempPath, buffer);
186
212
  await fsp.rename(tempPath, targetPath);
187
213
 
@@ -118,12 +118,8 @@ export function computedCellValues(xml, strings) {
118
118
  if (!value) continue;
119
119
  const type = /\bt="([^"]*)"/.exec(cell.attributes)?.[1] || '';
120
120
  const text = value[1] || '';
121
- computed.set(
122
- cell.ref,
123
- type === 's'
124
- ? { type: 'str', text: xmlEncode(strings[Number(text)] ?? '') }
125
- : { type: type === 'n' ? '' : type, text }
126
- );
121
+ if (type === 's') computed.set(cell.ref, { type: 'str', text: xmlEncode(strings[Number(text)] ?? '') });
122
+ else computed.set(cell.ref, { type: type === 'n' ? '' : type, text });
127
123
  }
128
124
  return computed;
129
125
  }
@@ -1,9 +1,11 @@
1
- import { xmlEncode } from './portable-xml.mjs';
1
+ import {
2
+ DRAWING_MAIN_NS as DRAWING_NAMESPACE,
3
+ OFFICE_RELATIONSHIP_BASE as RELATIONSHIP_NAMESPACE,
4
+ xmlEncode,
5
+ } from './portable-xml.mjs';
2
6
  import { contrastRatio } from './text-metrics.mjs';
3
7
 
4
8
  const CHART_NAMESPACE = 'http://schemas.openxmlformats.org/drawingml/2006/chart';
5
- const DRAWING_NAMESPACE = 'http://schemas.openxmlformats.org/drawingml/2006/main';
6
- const RELATIONSHIP_NAMESPACE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';
7
9
  const CATEGORY_AXIS_ID = 111_111_111;
8
10
  const VALUE_AXIS_ID = 222_222_222;
9
11
 
@@ -305,9 +307,7 @@ export function chartXml({
305
307
  (zeroBaseline == null ? family.element === 'barChart' || family.element === 'areaChart' : zeroBaseline === true);
306
308
  // The order the categories read in: a bar chart lists them top-down, unless the chart being rebuilt was authored the
307
309
  // other way (PowerPoint's own bottom-up default, a template's), which it keeps as PowerPoint's refresh keeps it.
308
- const reversed = axis?.categoryOrientation
309
- ? axis.categoryOrientation === 'maxMin'
310
- : family.direction === 'bar';
310
+ const reversed = axis?.categoryOrientation ? axis.categoryOrientation === 'maxMin' : family.direction === 'bar';
311
311
  const sheet = references?.sheet || 'Sheet1';
312
312
  const categoryFormula = references?.category || `${sheet}!$A$2:$A$${rows.length + 1}`;
313
313
  const plots = entries
@@ -71,6 +71,7 @@ import {
71
71
  wordTableXml,
72
72
  wordTableProperties,
73
73
  wordTextContent,
74
+ wordTextElement,
74
75
  withFirstRunText,
75
76
  } from './portable-docx-xml.mjs';
76
77
  import { documentStyleId } from './portable-docx-styles.mjs';
@@ -119,16 +120,12 @@ function replaceBodyParagraph(current, model, paragraph, nextParagraph) {
119
120
  return `${current.slice(0, model.body.start)}${nextInner}${current.slice(model.body.end)}`;
120
121
  }
121
122
 
122
- function preserveSpace(text) {
123
- return /^\s|\s$/.test(text) ? ' xml:space="preserve"' : '';
124
- }
125
-
126
123
  function commentEntryXml(id, op, text, stamp) {
127
124
  return (
128
125
  `<w:comment w:id="${id}" w:author="${xmlEncode(op.author || 'Mixdog')}"` +
129
126
  ` w:date="${stamp}" w:initials="${xmlEncode(op.initials || 'MD')}">` +
130
127
  `<w:p xmlns:w14="${WORD_2010_NS}" w14:paraId="${commentParagraphId(id)}">` +
131
- `<w:r><w:t${preserveSpace(text)}>${xmlEncode(text)}</w:t></w:r></w:p></w:comment>`
128
+ `<w:r>${wordTextElement(text)}</w:r></w:p></w:comment>`
132
129
  );
133
130
  }
134
131
 
@@ -589,9 +586,7 @@ export async function addDocxHyperlink(zip, op) {
589
586
  'External'
590
587
  )
591
588
  : '';
592
- const run =
593
- '<w:r><w:rPr><w:color w:val="0563C1"/><w:u w:val="single"/></w:rPr>' +
594
- `<w:t${preserveSpace(display)}>${xmlEncode(display)}</w:t></w:r>`;
589
+ const run = `<w:r><w:rPr><w:color w:val="0563C1"/><w:u w:val="single"/></w:rPr>${wordTextElement(display)}</w:r>`;
595
590
  const link =
596
591
  `<w:hyperlink${relationshipId ? ` r:id="${relationshipId}"` : ''}` +
597
592
  `${op.subAddress ? ` w:anchor="${xmlEncode(op.subAddress)}"` : ''}>${run}</w:hyperlink>`;
@@ -725,7 +720,7 @@ export async function deleteDocxComment(zip, op) {
725
720
  .replace(new RegExp(`<w:commentRangeEnd\\b[^>]*\\bw:id="${id}"[^>]*\\/>`, 'g'), '')
726
721
  .replace(
727
722
  new RegExp(
728
- `<w:r>(?:(?!<\\/w:r>)[\\s\\S])*?<w:commentReference\\b[^>]*\\bw:id="${id}"[^>]*\\/>[\\s\\S]*?<\\/w:r>`,
723
+ `<w:r\\b[^>]*>(?:(?!<\\/w:r>)[\\s\\S])*?<w:commentReference\\b[^>]*\\bw:id="${id}"[^>]*\\/>[\\s\\S]*?<\\/w:r>`,
729
724
  'g'
730
725
  ),
731
726
  ''
@@ -29,6 +29,7 @@ import {
29
29
  wordJustification,
30
30
  wordTableProperties,
31
31
  wordTextContent,
32
+ wordTextElement,
32
33
  withFirstRunText,
33
34
  } from './portable-docx-xml.mjs';
34
35
  import { docxRevisionTree, flattenDocxRevisions } from './docx-revisions.mjs';
@@ -106,15 +107,14 @@ export function docxTocEntries(documentXml, lower, upper, headingLevels = new Ma
106
107
  // An entry carries its page after a tab once a render has measured it (numberDocxTableOfContents); the tab stop
107
108
  // on the paragraph sets it on the right margin behind a dot leader, the way Word draws its own contents.
108
109
  export function docxTocCacheRuns(entries, lower) {
109
- return entries.length
110
- ? entries
111
- .map(
112
- (entry) =>
113
- `<w:r><w:t xml:space="preserve">${xmlEncode(`${' '.repeat(entry.level - lower)}${entry.text}`)}</w:t></w:r>` +
114
- (entry.page ? `<w:r><w:tab/></w:r><w:r><w:t>${Number(entry.page)}</w:t></w:r>` : '')
115
- )
116
- .join('<w:r><w:br/></w:r>')
117
- : '<w:r><w:t>Update this field in Word to build the table of contents.</w:t></w:r>';
110
+ if (!entries.length) return '<w:r><w:t>Update this field in Word to build the table of contents.</w:t></w:r>';
111
+ const pageRun = (entry) => (entry.page ? `<w:r><w:tab/></w:r><w:r><w:t>${Number(entry.page)}</w:t></w:r>` : '');
112
+ return entries
113
+ .map(
114
+ (entry) =>
115
+ `<w:r><w:t xml:space="preserve">${xmlEncode(`${' '.repeat(entry.level - lower)}${entry.text}`)}</w:t></w:r>${pageRun(entry)}`
116
+ )
117
+ .join('<w:r><w:br/></w:r>');
118
118
  }
119
119
 
120
120
  const TOC_FIELD = /<w:fldSimple\b([^>]*\bw:instr="([^"]*TOC[^"]*)"[^>]*)>([\s\S]*?)<\/w:fldSimple>/g;
@@ -560,7 +560,7 @@ export async function fitDocxTable(zip, op) {
560
560
  function controlFilledWith(control, contentInner, text) {
561
561
  const first = /<w:r(?:\s[^>]*)?>[\s\S]*?<\/w:r>/.exec(contentInner);
562
562
  const runProperties = first ? /<w:rPr(?:\s[^>]*)?>[\s\S]*?<\/w:rPr>/.exec(first[0])?.[0] || '' : '';
563
- const run = `<w:r>${runProperties}<w:t${/^\s|\s$/.test(text) ? ' xml:space="preserve"' : ''}>${xmlEncode(text)}</w:t></w:r>`;
563
+ const run = `<w:r>${runProperties}${wordTextElement(text)}</w:r>`;
564
564
  const [firstParagraph] = contentInner.match(/<w:p(?:\s[^>]*)?>[\s\S]*?<\/w:p>/) || [];
565
565
  const paragraph = firstParagraph
566
566
  ? `${/^<w:p(?:\s[^>]*)?>(?:<w:pPr(?:\s[^>]*)?>[\s\S]*?<\/w:pPr>)?/.exec(firstParagraph)?.[0] || '<w:p>'}${run}</w:p>`
@@ -704,7 +704,10 @@ function styledDocxCell(cell, op) {
704
704
  const eastAsiaFontAttrs = cellEastAsia ? ` w:eastAsia="${cellEastAsia}"` : '';
705
705
  // bold:false and italic:false switch the weight off, as the Word backend's Font.Bold = 0 does: a data row inserted
706
706
  // before a total copies the total's bold, and asking for it back to regular changed nothing here.
707
- const toggled = (tag, value) => (value === undefined ? '' : value ? `<w:${tag}/><w:${tag}Cs/>` : `<w:${tag} w:val="0"/><w:${tag}Cs w:val="0"/>`);
707
+ const toggled = (tag, value) => {
708
+ if (value === undefined) return '';
709
+ return value ? `<w:${tag}/><w:${tag}Cs/>` : `<w:${tag} w:val="0"/><w:${tag}Cs w:val="0"/>`;
710
+ };
708
711
  const runFormat = [
709
712
  cellFont || cellEastAsia ? `<w:rFonts${latinFontAttrs}${eastAsiaFontAttrs}/>` : '',
710
713
  toggled('b', op.properties?.bold),
@@ -760,7 +763,7 @@ function mergedCellXml(joined, spans) {
760
763
  // Merges the located cell across colSpan columns (dropping the absorbed
761
764
  // cells) and rowSpan rows (continuation cells become vMerge, spanning the same columns: a block merge left the
762
765
  // continuation rows' absorbed cells in place, one grid column too many a cell).
763
- function mergedDocxTable({ table, rows, row, cells, cell }, op) {
766
+ function mergedDocxTable({ table, rows, row, cells }, op) {
764
767
  const colSpan = Math.max(1, Number(op.colSpan) || 1);
765
768
  const rowSpan = Math.max(1, Number(op.rowSpan) || 1);
766
769
  const gridSpan = colSpan > 1 ? `<w:gridSpan w:val="${colSpan}"/>` : '';
@@ -807,7 +810,7 @@ export async function styleOrMergeDocxTableCell(zip, op) {
807
810
  const nextTable =
808
811
  op.op === 'set_table_cell_style'
809
812
  ? table[0].replace(cell[0], styledDocxCell(cell[0], op))
810
- : mergedDocxTable({ table, rows, row, cells, cell }, op);
813
+ : mergedDocxTable({ table, rows, row, cells }, op);
811
814
  current = replaceDocxTable(current, table, nextTable);
812
815
  zip.file('word/document.xml', current);
813
816
  return {
@@ -6,6 +6,7 @@ import {
6
6
  ensureContentTypeOverride,
7
7
  ensureDefaultContentType,
8
8
  imagePixelSize,
9
+ partFromTarget,
9
10
  partRelationshipPath,
10
11
  zipText,
11
12
  } from './portable-opc.mjs';
@@ -463,7 +464,7 @@ export async function writeHeaderFooterPart(zip, { header, body, documentXml = '
463
464
  .map((match) => match[0])
464
465
  .find((element) => new RegExp(`\\bId="${referencedId}"`).test(element));
465
466
  const path = target ? /\bTarget="([^"]+)"/.exec(target)?.[1] || '' : '';
466
- const existing = path ? `word/${path.replace(/^\.?\//, '')}` : '';
467
+ const existing = path ? partFromTarget('word', path) : '';
467
468
  if (existing && zip.file(existing)) {
468
469
  // The story keeps its own root: Word's declares the w14, mc and wp prefixes its paragraphs use, and page
469
470
  // numbers added into Word's footer under a root naming only w and r left a document Word would not open.
@@ -717,7 +718,11 @@ export async function ensureNumbering(zip, kind, { restart = false } = {}) {
717
718
  // its own at 1.
718
719
  export async function appendedNumbering(zip, documentXml, options = {}) {
719
720
  const trailing = documentXml.lastIndexOf('<w:sectPr');
720
- return numberingAfter(zip, documentXml.slice(0, trailing >= 0 ? trailing : documentXml.lastIndexOf('</w:body>')), options);
721
+ return numberingAfter(
722
+ zip,
723
+ documentXml.slice(0, trailing >= 0 ? trailing : documentXml.lastIndexOf('</w:body>')),
724
+ options
725
+ );
721
726
  }
722
727
 
723
728
  // The same choice for an item anywhere in the body, `before` being the body up to it: set_list and
@@ -213,7 +213,7 @@ export function alignWordTableColumns(tableXml, columnAlignments = []) {
213
213
  // nothing marks its edges, so its cell padding shows as an indent — "시니어 엔지니어" started 5 pt right of the "경력"
214
214
  // heading above it and "2023 – 현재" stopped 5 pt short of the rule. Its outer cells drop the padding on the page
215
215
  // side, so the text registers with the paragraphs around it; the padding between columns stays.
216
- export function isLayoutTable(properties = {}) {
216
+ function isLayoutTable(properties = {}) {
217
217
  if (properties.style || properties.shading) return false;
218
218
  const borders = properties.borders;
219
219
  if (!borders || typeof borders !== 'object') return false;
@@ -247,7 +247,7 @@ export function naturalTableColumnWidths(values, properties = {}, available = 0)
247
247
  fontName: properties.fontName || properties.fontNameEastAsia || 'Calibri',
248
248
  fontSize: Number(properties.fontSize) > 0 ? Number(properties.fontSize) : 11,
249
249
  };
250
- const headerBold = rows.length > 1 && properties.headerBold !== false && properties.repeatHeader !== false;
250
+ const headerBold = tableHeaderBold(properties, rows.length);
251
251
  const headers = tableHeaderRows(properties, rows.length);
252
252
  const gutters = isLayoutTable(properties) ? [] : gutterColumns(properties);
253
253
  const measure = (text, rowIndex, column) =>
@@ -268,7 +268,9 @@ function gutterColumns(properties) {
268
268
  );
269
269
  }
270
270
  const gutterMargin = (gutter) =>
271
- gutter ? `<w:tcMar><w:left w:w="${pointsToTwips(CELL_PADDING_POINTS / 2 + GUTTER_POINTS)}" w:type="dxa"/></w:tcMar>` : '';
271
+ gutter
272
+ ? `<w:tcMar><w:left w:w="${pointsToTwips(CELL_PADDING_POINTS / 2 + GUTTER_POINTS)}" w:type="dxa"/></w:tcMar>`
273
+ : '';
272
274
 
273
275
  // The rows a table's header takes: one, or more for a header of several levels — a group label over the columns it
274
276
  // spans ("3분기 처리량" over 7월 · 8월 · 9월) is two. At least one row stays data.
@@ -276,10 +278,18 @@ function tableHeaderRows(properties, rows) {
276
278
  return Math.max(1, Math.min(rows - 1, Math.floor(Number(properties?.headerRows) || 1)));
277
279
  }
278
280
 
279
- const flushCellMargins = (first, last) =>
280
- first || last
281
- ? `<w:tcMar>${first ? '<w:left w:w="0" w:type="dxa"/>' : ''}${last ? '<w:right w:w="0" w:type="dxa"/>' : ''}</w:tcMar>`
282
- : '';
281
+ // The header row is set apart by weight unless the caller opts out (headerBold, or repeatHeader: false for a table
282
+ // whose first row is data); a one-row table has no header to set apart.
283
+ function tableHeaderBold(properties, rows) {
284
+ return rows > 1 && properties?.headerBold !== false && properties?.repeatHeader !== false;
285
+ }
286
+
287
+ const flushCellMargins = (first, last) => {
288
+ if (!first && !last) return '';
289
+ const left = first ? '<w:left w:w="0" w:type="dxa"/>' : '';
290
+ const right = last ? '<w:right w:w="0" w:type="dxa"/>' : '';
291
+ return `<w:tcMar>${left}${right}</w:tcMar>`;
292
+ };
283
293
 
284
294
  // `available` is the text width, in points, of the section the table lands in.
285
295
  export function wordTableXml(operation, { available = 0 } = {}) {
@@ -298,8 +308,7 @@ export function wordTableXml(operation, { available = 0 } = {}) {
298
308
  const runProperties = wordTableRunProperties(operation.properties);
299
309
  // The header row is set apart by weight, on both backends, unless the caller
300
310
  // says otherwise; a header a reader cannot tell from the data is not one.
301
- const headerBold =
302
- rows > 1 && operation.properties?.headerBold !== false && operation.properties?.repeatHeader !== false;
311
+ const headerBold = tableHeaderBold(operation.properties, rows);
303
312
  const headerRunProperties = headerBold ? wordTableRunProperties(operation.properties, { bold: true }) : runProperties;
304
313
  const headers = tableHeaderRows(operation.properties, rows);
305
314
  const gutters = layout ? [] : gutterColumns(operation.properties);
@@ -334,10 +343,7 @@ export function wordTableXml(operation, { available = 0 } = {}) {
334
343
  // run together on a single line.
335
344
  const runs = text
336
345
  .split(/\r?\n/)
337
- .map(
338
- (line, lineIndex) =>
339
- `${lineIndex ? '<w:br/>' : ''}<w:t${/^\s|\s$/.test(line) ? ' xml:space="preserve"' : ''}>${xmlEncode(line)}</w:t>`
340
- )
346
+ .map((line, lineIndex) => `${lineIndex ? '<w:br/>' : ''}${wordTextElement(line)}`)
341
347
  .join('');
342
348
  // Schema order inside pPr: style and spacing before justification.
343
349
  const cellParagraphProperties = `${paragraphProperties(row)}${justifications[column] ? `<w:jc w:val="${justifications[column]}"/>` : ''}`;
@@ -494,6 +500,11 @@ function wordRunFontsXml(name, nameEastAsia) {
494
500
  return `<w:rFonts${latin}${eastAsia}/>`;
495
501
  }
496
502
 
503
+ /** `<w:t>` for one string; edge whitespace is kept with `xml:space="preserve"`, which Word otherwise drops. */
504
+ export function wordTextElement(text, { preserve = false } = {}) {
505
+ return `<w:t${preserve || /^\s|\s$/.test(text) ? ' xml:space="preserve"' : ''}>${xmlEncode(text)}</w:t>`;
506
+ }
507
+
497
508
  /** `<w:tag w:val="…"/>` for a tri-state property: '' when undefined, else its on/off value. */
498
509
  function toggleXml(tag, value, on = '1', off = '0') {
499
510
  if (value === undefined) return '';
@@ -522,11 +533,10 @@ export function wordParagraph(text, { alignment = '', style = '', runProperties
522
533
  style ? `<w:pStyle w:val="${xmlEncode(style)}"/>` : '',
523
534
  justification ? `<w:jc w:val="${justification}"/>` : '',
524
535
  ].join('');
525
- const value = String(text ?? '');
526
536
  return (
527
537
  `<w:p>${properties ? `<w:pPr>${properties}</w:pPr>` : ''}` +
528
538
  `<w:r>${runProperties ? `<w:rPr>${runProperties}</w:rPr>` : ''}` +
529
- `<w:t${/^\s|\s$/.test(value) ? ' xml:space="preserve"' : ''}>${xmlEncode(value)}</w:t></w:r></w:p>`
539
+ `${wordTextElement(String(text ?? ''))}</w:r></w:p>`
530
540
  );
531
541
  }
532
542
 
@@ -627,14 +637,14 @@ export function docxTables(current) {
627
637
  });
628
638
  }
629
639
 
630
- // A table as a caller can pick it out of the page: its size and the words it starts with. A report's metric strip is
631
- // a table too, and "table 1" named it where the results table was meant; the errors now say which table is which.
632
640
  // The grid's columns, as Word counts a table's columns whatever its merges.
633
641
  function tableColumnCount(tableXml, rows = tableRowMatches(tableXml)) {
634
642
  const grid = /<w:tblGrid\b[\s\S]*?<\/w:tblGrid>/.exec(tableXml)?.[0] || '';
635
643
  return (grid.match(/<w:gridCol\b/g) || []).length || (rows.length ? rowCellMatches(rows[0][0]).length : 0);
636
644
  }
637
645
 
646
+ // A table as a caller can pick it out of the page: its size and the words it starts with. A report's metric strip is
647
+ // a table too, and "table 1" named it where the results table was meant; the errors now say which table is which.
638
648
  function tableSummary(tableXml) {
639
649
  const rows = tableRowMatches(tableXml);
640
650
  const columns = tableColumnCount(tableXml, rows);
@@ -655,7 +665,9 @@ export function docxTable(current, number) {
655
665
  .slice(0, 6)
656
666
  .map((table, index) => `${index + 1}: ${tableSummary(table[0])}`)
657
667
  .join('; ');
658
- throw new Error(`DOCX table ${number} not found: the document holds ${tables.length} table(s)${held ? ` (${held})` : ''}`);
668
+ throw new Error(
669
+ `DOCX table ${number} not found: the document holds ${tables.length} table(s)${held ? ` (${held})` : ''}`
670
+ );
659
671
  }
660
672
  return match;
661
673
  }
@@ -763,12 +775,10 @@ function paragraphIndentXml({ indentLeft, indentRight, indentFirstLine }) {
763
775
  // w:hanging: a w:firstLine never goes below zero, and clamped there the mark sat inside the indent and every
764
776
  // wrapped line started under it.
765
777
  const first = Number(indentFirstLine);
766
- const firstLine =
767
- indentFirstLine === undefined
768
- ? ''
769
- : first < 0
770
- ? ` w:hanging="${twips(-first)}"`
771
- : ` w:firstLine="${twips(first)}"`;
778
+ let firstLine = '';
779
+ if (indentFirstLine !== undefined) {
780
+ firstLine = first < 0 ? ` w:hanging="${twips(-first)}"` : ` w:firstLine="${twips(first)}"`;
781
+ }
772
782
  return `<w:ind${left}${right}${firstLine}/>`;
773
783
  }
774
784
 
@@ -778,13 +788,11 @@ function paragraphIndentXml({ indentLeft, indentRight, indentFirstLine }) {
778
788
  * right-aligned figure, a dot leader) never see it.
779
789
  */
780
790
  export function wordTextContent(text, { preserve = false } = {}) {
781
- const textXml = (part) =>
782
- `<w:t${preserve || /^\s|\s$/.test(part) ? ' xml:space="preserve"' : ''}>${xmlEncode(part)}</w:t>`;
783
791
  const value = String(text ?? '');
784
- if (!value.includes('\t')) return textXml(value);
792
+ if (!value.includes('\t')) return wordTextElement(value, { preserve });
785
793
  return value
786
794
  .split('\t')
787
- .map((part) => (part ? textXml(part) : ''))
795
+ .map((part) => (part ? wordTextElement(part, { preserve }) : ''))
788
796
  .join('<w:tab/>');
789
797
  }
790
798
 
@@ -80,7 +80,7 @@ export async function fillTemplateParts(zip, parts, tag, operation, { replace =
80
80
  changed: Object.keys(filled).length > 0,
81
81
  filled,
82
82
  unfilledTokens,
83
- strict: operation.strict === true,
83
+ strict: Boolean(operation.strict),
84
84
  };
85
85
  }
86
86
 
@@ -267,10 +267,7 @@ export function relationshipTargetsByType(relationshipsXml, owner, type) {
267
267
  const id = xmlAttribute(attributes, 'Id');
268
268
  const target = xmlAttribute(attributes, 'Target');
269
269
  if (!id || !target) continue;
270
- targets.set(
271
- id,
272
- target.startsWith('/') ? target.slice(1) : posix.normalize(posix.join(posix.dirname(owner), target))
273
- );
270
+ targets.set(id, partFromTarget(posix.dirname(owner), target));
274
271
  }
275
272
  return targets;
276
273
  }
@@ -291,7 +288,7 @@ function* internalRelationships(xml) {
291
288
 
292
289
  // The part a relationship target names: absolute from the package root,
293
290
  // relative from the directory of the part that declares it.
294
- function partFromTarget(directory, target) {
291
+ export function partFromTarget(directory, target) {
295
292
  return target.startsWith('/') ? target.slice(1) : posix.normalize(posix.join(directory, target));
296
293
  }
297
294
 
@@ -425,7 +422,6 @@ async function clonePartTree(zip, sourcePath, cache = new Map()) {
425
422
 
426
423
  // The relationships a copied slide must own outright before it is editable on
427
424
  // its own: everything else stays shared with the slide it was copied from.
428
-
429
425
  export async function cloneOwnedSlideParts(zip, relationshipsPath) {
430
426
  const xml = await zipText(zip, relationshipsPath);
431
427
  if (!xml) return [];
@@ -453,11 +449,6 @@ export async function cloneOwnedSlideParts(zip, relationshipsPath) {
453
449
  return copied;
454
450
  }
455
451
 
456
- // A page borrowed from another deck was drawn on that deck's layout. When this
457
- // deck already holds the same layout the import points at it; when the two were
458
- // cut from different templates the layout is copied in and adopted by this
459
- // deck's master, so the page keeps the geometry it was built with and the
460
- // master still lists every layout under it.
461
452
  // Slide layout ids live above 2^31 by the OOXML convention PowerPoint writes.
462
453
  const FIRST_SLIDE_LAYOUT_ID = 2_147_483_648;
463
454
 
@@ -501,6 +492,11 @@ async function registerLayoutOnMaster(zip, master, targetPath) {
501
492
  );
502
493
  }
503
494
 
495
+ // A page borrowed from another deck was drawn on that deck's layout. When this
496
+ // deck already holds the same layout the import points at it; when the two were
497
+ // cut from different templates the layout is copied in and adopted by this
498
+ // deck's master, so the page keeps the geometry it was built with and the
499
+ // master still lists every layout under it.
504
500
  async function adoptImportedLayout(source, zip, layoutPath, cache) {
505
501
  const master = Object.keys(zip.files)
506
502
  .filter((name) => /^ppt\/slideMasters\/slideMaster\d+\.xml$/.test(name))
@@ -571,7 +567,9 @@ export function relationshipTarget(relPath, target) {
571
567
  let decoded = xmlDecode(target).split('#')[0].split('?')[0];
572
568
  try {
573
569
  decoded = decodeURIComponent(decoded);
574
- } catch {}
570
+ } catch {
571
+ // A malformed percent escape is a literal part name: keep the text as written.
572
+ }
575
573
  const owner = relationshipOwner(relPath);
576
574
  const base = owner ? posix.dirname(owner) : '';
577
575
  return posix.normalize(decoded.startsWith('/') ? decoded.slice(1) : posix.join(base, decoded));
@@ -472,9 +472,8 @@ function worksheetWithRows(rows) {
472
472
  .map((value, columnIndex) => {
473
473
  if (value == null || value === '') return '';
474
474
  const reference = `${columnLabel(columnIndex + 1)}${rowIndex + 1}`;
475
- const numeric = Number(value);
476
- if (typeof value === 'number' && Number.isFinite(numeric)) {
477
- return `<c r="${reference}"><v>${numeric}</v></c>`;
475
+ if (typeof value === 'number' && Number.isFinite(value)) {
476
+ return `<c r="${reference}"><v>${value}</v></c>`;
478
477
  }
479
478
  return `<c r="${reference}" t="inlineStr"><is><t>${xmlEncode(value)}</t></is></c>`;
480
479
  })
@@ -511,7 +510,7 @@ export function portableCreateSupported(fileKind) {
511
510
 
512
511
  export async function createPortableOoxmlDocument(path, { fileKind, title = '', sheetName = 'Sheet1' } = {}) {
513
512
  const kind = String(fileKind || '').toLowerCase();
514
- const family = Object.hasOwn(FILE_KIND_FAMILIES, kind) ? FILE_KIND_FAMILIES[kind] : '';
513
+ const family = portableCreateSupported(kind) ? FILE_KIND_FAMILIES[kind] : '';
515
514
  if (!family) {
516
515
  throw new Error(
517
516
  `Portable Office creation supports ${Object.keys(FILE_KIND_FAMILIES).join(', ')}; .${kind || 'unknown'} requires Microsoft Office`
@@ -1,13 +1,17 @@
1
1
  import { posix } from 'node:path';
2
2
  import { addPackageRelationship, ensureContentTypeOverride, partRelationshipPath, zipText } from './portable-opc.mjs';
3
3
  import { columnLabel, columnNumber, parseCellRef, setCellInSheet } from './portable-cells.mjs';
4
- import { SPREADSHEET_MAIN, XML_HEADER, xmlEncode } from './portable-xml.mjs';
4
+ import {
5
+ OFFICE_RELATIONSHIP_BASE as RELATIONSHIP_BASE,
6
+ SPREADSHEET_MAIN,
7
+ XML_HEADER,
8
+ xmlEncode,
9
+ } from './portable-xml.mjs';
5
10
 
6
11
  const CACHE_DEFINITION_CONTENT_TYPE =
7
12
  'application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheDefinition+xml';
8
13
  const CACHE_RECORDS_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.pivotCacheRecords+xml';
9
14
  const PIVOT_TABLE_CONTENT_TYPE = 'application/vnd.openxmlformats-officedocument.spreadsheetml.pivotTable+xml';
10
- const RELATIONSHIP_BASE = 'http://schemas.openxmlformats.org/officeDocument/2006/relationships';
11
15
 
12
16
  // axes: the field indexes laid out as rows or columns. A numeric field on an axis is still a set of items — "Year"
13
17
  // across the top is 2013 and 2014, not a sum — so its values are listed as numeric items; left as a bare number
@@ -116,7 +120,7 @@ function cacheRecordsXml(fields, records) {
116
120
  // autofit, or a fit audit to read, so the computed grid is written as cells.
117
121
  // The captions a pivot prints, in the language of its fields: Korean Excel heads a sum "합계 : 매출" and its totals
118
122
  // "총합계"; written in English beside Hangul fields, a pivot read "Sum of 매출" over "Grand Total".
119
- export function pivotCaptions(fields) {
123
+ function pivotCaptions(fields) {
120
124
  const korean = /[\uac00-\ud7af]/.test(fields.map((field) => field?.name ?? '').join(''));
121
125
  return korean
122
126
  ? { sum: (name) => `합계 : ${name}`, grand: '총합계', total: '합계' }