mixdog 0.9.159 → 0.9.161

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 (871) hide show
  1. package/LICENSES/MIT.txt +1 -1
  2. package/NOTICE.md +2 -1
  3. package/README.md +3 -1
  4. package/package.json +23 -13
  5. package/scripts/build-tui.mjs +1 -16
  6. package/scripts/lib/local-provider-live-scenarios.mjs +22 -0
  7. package/scripts/lib/test-timing-reporter.mjs +38 -0
  8. package/scripts/local-provider-live-check.mjs +141 -0
  9. package/scripts/office/aesthetics-probe.mjs +59 -0
  10. package/scripts/office/author-deck.mjs +56 -0
  11. package/scripts/office/build-pptx-icons.mjs +48 -0
  12. package/scripts/office-design-audit.mjs +1 -1
  13. package/scripts/office-live-test-plan.mjs +34 -0
  14. package/scripts/pdf-rotation-stress.mjs +74 -0
  15. package/scripts/perf/cold-reconnect-probe.mjs +109 -0
  16. package/scripts/perf/transcript-baseline.mjs +56 -0
  17. package/scripts/perf/transcript-runtime-probe.mjs +62 -0
  18. package/scripts/release-paths.mjs +8 -38
  19. package/scripts/run-advisory-spec.mjs +6 -0
  20. package/scripts/run-office-live-tests.mjs +51 -18
  21. package/scripts/suite-health.mjs +3 -5
  22. package/scripts/test.mjs +100 -0
  23. package/scripts/tui-frame-harness-shim.mjs +1 -1
  24. package/scripts/tui-frame-harness.mjs +7 -2
  25. package/scripts/tui-transcript-jitter-harness.mjs +0 -11
  26. package/src/app.mjs +2 -14
  27. package/src/defaults/cycle3-review-prompt.md +32 -14
  28. package/src/defaults/plugin.json +6 -0
  29. package/src/defaults/skills/browser-use/SKILL.md +159 -0
  30. package/src/defaults/skills/computer-use/SKILL.md +157 -0
  31. package/src/defaults/skills/docx/SKILL.md +52 -0
  32. package/src/defaults/skills/image/SKILL.md +94 -0
  33. package/src/defaults/skills/local-provider/SKILL.md +115 -0
  34. package/src/defaults/skills/pdf/SKILL.md +51 -0
  35. package/src/defaults/skills/pptx/SKILL.md +145 -0
  36. package/src/defaults/skills/pptx/references/charts.md +153 -0
  37. package/src/defaults/skills/pptx/references/composition.md +182 -0
  38. package/src/defaults/skills/pptx/references/direction.md +70 -0
  39. package/src/defaults/skills/pptx/references/kit.md +551 -0
  40. package/src/defaults/skills/pptx/references/pictures.md +76 -0
  41. package/src/defaults/skills/pptx/references/review.md +104 -0
  42. package/src/defaults/skills/pptx/scripts/qc-pages.mjs +368 -0
  43. package/src/defaults/skills/pptx/scripts/review-deck.mjs +155 -0
  44. package/src/defaults/skills/pptx/scripts/source-extract.mjs +121 -0
  45. package/src/defaults/skills/setup/SKILL.md +86 -460
  46. package/src/defaults/skills/setup/references/actions.md +127 -0
  47. package/src/defaults/skills/setup/references/surfaces.md +72 -0
  48. package/src/defaults/skills/skill-creator/SKILL.md +191 -0
  49. package/src/defaults/skills/skill-creator/references/design.md +182 -0
  50. package/src/defaults/skills/skill-creator/references/evaluation.md +111 -0
  51. package/src/defaults/skills/skill-creator/references/source-review.md +94 -0
  52. package/src/defaults/skills/skill-creator/scripts/validate-skill.mjs +166 -0
  53. package/src/defaults/skills/video/SKILL.md +63 -0
  54. package/src/defaults/skills/xlsx/SKILL.md +72 -0
  55. package/src/defaults/skills/xlsx/references/model-conventions.md +52 -0
  56. package/src/headless-exec.mjs +1 -4
  57. package/src/headless-role.mjs +2 -5
  58. package/src/help.mjs +1 -1
  59. package/src/lib/output-style-meta.cjs +5 -1
  60. package/src/lib/rules-builder.cjs +24 -23
  61. package/src/mixdog-session-runtime.mjs +16 -7
  62. package/src/output-styles/extreme-minimal.md +1 -1
  63. package/src/rules/lead/01-general.md +5 -4
  64. package/src/rules/shared/00-general.md +4 -0
  65. package/src/rules/shared/30-exploration.md +2 -1
  66. package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +2 -2
  67. package/src/runtime/agent/orchestrator/agent-runtime/agent-loop-policy.mjs +1 -6
  68. package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -63
  69. package/src/runtime/agent/orchestrator/agent-runtime/completion-text.mjs +13 -0
  70. package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +0 -1
  71. package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +4 -15
  72. package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -1
  73. package/src/runtime/agent/orchestrator/agent-trace-io.mjs +1 -2
  74. package/src/runtime/agent/orchestrator/agent-trace.mjs +3 -4
  75. package/src/runtime/agent/orchestrator/cache-break-trace.mjs +1 -1
  76. package/src/runtime/agent/orchestrator/config.mjs +64 -7
  77. package/src/runtime/agent/orchestrator/context/collect.mjs +122 -58
  78. package/src/runtime/agent/orchestrator/dispatch-persist.mjs +1 -1
  79. package/src/runtime/agent/orchestrator/internal-tools.mjs +0 -5
  80. package/src/runtime/agent/orchestrator/mcp/client.mjs +2 -34
  81. package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +5 -16
  82. package/src/runtime/agent/orchestrator/providers/anthropic-betas.mjs +10 -0
  83. package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +7 -0
  84. package/src/runtime/agent/orchestrator/providers/anthropic-fable-history.mjs +77 -0
  85. package/src/runtime/agent/orchestrator/providers/anthropic-leaked-toolcall.mjs +1 -1
  86. package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +1 -15
  87. package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +14 -63
  88. package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +5 -5
  89. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +111 -0
  90. package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +5 -146
  91. package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +124 -45
  92. package/src/runtime/agent/orchestrator/providers/anthropic-thinking-contract.mjs +13 -0
  93. package/src/runtime/agent/orchestrator/providers/anthropic.mjs +50 -42
  94. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +5 -22
  95. package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +7 -10
  96. package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +2 -85
  97. package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +91 -0
  98. package/src/runtime/agent/orchestrator/providers/api-usage.mjs +4 -19
  99. package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +21 -0
  100. package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +1 -1
  101. package/src/runtime/agent/orchestrator/providers/cursor-wire-guards.mjs +63 -6
  102. package/src/runtime/agent/orchestrator/providers/cursor-wire-normalization.mjs +12 -7
  103. package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +27 -7
  104. package/src/runtime/agent/orchestrator/providers/cursor.mjs +16 -10
  105. package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +150 -0
  106. package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +1 -1
  107. package/src/runtime/agent/orchestrator/providers/gemini-history-signatures.mjs +29 -0
  108. package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +5 -4
  109. package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +5 -6
  110. package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +48 -0
  111. package/src/runtime/agent/orchestrator/providers/gemini.mjs +23 -26
  112. package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +5 -36
  113. package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +19 -38
  114. package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +1 -7
  115. package/src/runtime/agent/orchestrator/providers/lib/anthropic-image-input.mjs +105 -0
  116. package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +50 -94
  117. package/src/runtime/agent/orchestrator/providers/lib/json-memory-cache.mjs +27 -0
  118. package/src/runtime/agent/orchestrator/providers/lib/oauth-pkce.mjs +27 -0
  119. package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +29 -0
  120. package/src/runtime/agent/orchestrator/providers/lib/provider-replay.mjs +9 -6
  121. package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +143 -0
  122. package/src/runtime/agent/orchestrator/providers/mixdog-local-wire.mjs +25 -0
  123. package/src/runtime/agent/orchestrator/providers/mixdog-local.mjs +79 -0
  124. package/src/runtime/agent/orchestrator/providers/model-catalog-projection.mjs +8 -0
  125. package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +18 -1
  126. package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +2 -2
  127. package/src/runtime/agent/orchestrator/providers/model-service-tiers.mjs +11 -0
  128. package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +1 -1
  129. package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +0 -8
  130. package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +205 -0
  131. package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +5 -3
  132. package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +17 -14
  133. package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +1 -1
  134. package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +22 -25
  135. package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +18 -0
  136. package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +2 -15
  137. package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +4 -29
  138. package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +3 -4
  139. package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +48 -84
  140. package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +152 -0
  141. package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +15 -243
  142. package/src/runtime/agent/orchestrator/providers/openai-ws-headers.mjs +1 -36
  143. package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +2 -3
  144. package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +6 -38
  145. package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +7 -20
  146. package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +44 -19
  147. package/src/runtime/agent/orchestrator/providers/registry.mjs +15 -0
  148. package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +44 -5
  149. package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +0 -5
  150. package/src/runtime/agent/orchestrator/providers/stream-json-pool.mjs +2 -6
  151. package/src/runtime/agent/orchestrator/session/agent-loop.mjs +41 -57
  152. package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +38 -11
  153. package/src/runtime/agent/orchestrator/session/cache/util.mjs +3 -3
  154. package/src/runtime/agent/orchestrator/session/compact/budget.mjs +1 -112
  155. package/src/runtime/agent/orchestrator/session/compact/messages.mjs +1 -1
  156. package/src/runtime/agent/orchestrator/session/compact/runner.mjs +7 -2
  157. package/src/runtime/agent/orchestrator/session/compact/summary.mjs +3 -5
  158. package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +0 -12
  159. package/src/runtime/agent/orchestrator/session/context-compaction-policy.mjs +18 -23
  160. package/src/runtime/agent/orchestrator/session/context-fingerprint.mjs +54 -0
  161. package/src/runtime/agent/orchestrator/session/context-utils.mjs +9 -58
  162. package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -5
  163. package/src/runtime/agent/orchestrator/session/evidence-union.mjs +3 -7
  164. package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -8
  165. package/src/runtime/agent/orchestrator/session/loop/arg-schema-coerce.mjs +92 -0
  166. package/src/runtime/agent/orchestrator/session/loop/compact-debug.mjs +2 -10
  167. package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +38 -63
  168. package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +14 -14
  169. package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -1
  170. package/src/runtime/agent/orchestrator/session/loop/steering.mjs +17 -0
  171. package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +5 -2
  172. package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +6 -1
  173. package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +7 -2
  174. package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +87 -38
  175. package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -14
  176. package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +30 -33
  177. package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +355 -0
  178. package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -6
  179. package/src/runtime/agent/orchestrator/session/manager/message-sanitize.mjs +1 -1
  180. package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +324 -0
  181. package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +62 -688
  182. package/src/runtime/agent/orchestrator/session/manager/prompt-surface-publish.mjs +35 -0
  183. package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +15 -2
  184. package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +38 -79
  185. package/src/runtime/agent/orchestrator/session/manager/rules-source-cache.mjs +61 -0
  186. package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +1 -1
  187. package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +44 -14
  188. package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +9 -4
  189. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +3 -3
  190. package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +2 -28
  191. package/src/runtime/agent/orchestrator/session/manager.mjs +1 -0
  192. package/src/runtime/agent/orchestrator/session/provider-prefix-guard.mjs +1 -1
  193. package/src/runtime/agent/orchestrator/session/result-classification.mjs +0 -67
  194. package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -0
  195. package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +62 -0
  196. package/src/runtime/agent/orchestrator/session/store/fs-probe.mjs +1 -20
  197. package/src/runtime/agent/orchestrator/session/store/listing.mjs +60 -9
  198. package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +0 -19
  199. package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +0 -11
  200. package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +117 -134
  201. package/src/runtime/agent/orchestrator/session/store-summary-visibility.mjs +4 -4
  202. package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +131 -0
  203. package/src/runtime/agent/orchestrator/session/store.mjs +20 -46
  204. package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +133 -0
  205. package/src/runtime/agent/orchestrator/session/thinking-replay-recovery.mjs +1 -4
  206. package/src/runtime/agent/orchestrator/session/token-estimate-floors.mjs +34 -0
  207. package/src/runtime/agent/orchestrator/session/token-estimate.mjs +3 -36
  208. package/src/runtime/agent/orchestrator/session/tool-batch.mjs +4 -0
  209. package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +5 -5
  210. package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +1 -7
  211. package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +2 -1
  212. package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +1 -1
  213. package/src/runtime/agent/orchestrator/tools/builtin/binary-file.mjs +0 -25
  214. package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +7 -5
  215. package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +2 -7
  216. package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +1 -5
  217. package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +19 -0
  218. package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +1 -2
  219. package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +1 -1
  220. package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +26 -2
  221. package/src/runtime/agent/orchestrator/tools/builtin/local-search-telemetry.mjs +0 -9
  222. package/src/runtime/agent/orchestrator/tools/builtin/native-search-client.mjs +0 -20
  223. package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -6
  224. package/src/runtime/agent/orchestrator/tools/builtin/read-image-resize.mjs +7 -16
  225. package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +1 -14
  226. package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
  227. package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +5 -22
  228. package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +0 -1
  229. package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +1 -1
  230. package/src/runtime/agent/orchestrator/tools/builtin/search-admission.mjs +1 -1
  231. package/src/runtime/agent/orchestrator/tools/builtin/search-glob-tool.mjs +17 -75
  232. package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +3 -19
  233. package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +4 -57
  234. package/src/runtime/agent/orchestrator/tools/builtin/shell-lossless-compact.mjs +0 -12
  235. package/src/runtime/agent/orchestrator/tools/builtin/shell-output.mjs +1 -1
  236. package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +1 -1
  237. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +1 -7
  238. package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +3 -25
  239. package/src/runtime/agent/orchestrator/tools/builtin.mjs +9 -7
  240. package/src/runtime/agent/orchestrator/tools/code-graph/aggregate-roots.mjs +276 -0
  241. package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +38 -16
  242. package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +11 -3
  243. package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +23 -355
  244. package/src/runtime/agent/orchestrator/tools/code-graph/exact-file-graph.mjs +92 -0
  245. package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
  246. package/src/runtime/agent/orchestrator/tools/code-graph/search-references.mjs +1 -11
  247. package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +2 -4
  248. package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +8 -0
  249. package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
  250. package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +51 -124
  251. package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +2 -68
  252. package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +1 -10
  253. package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +0 -1
  254. package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +1 -2
  255. package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +2 -1
  256. package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +1 -1
  257. package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +2 -14
  258. package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +57 -138
  259. package/src/runtime/agent/orchestrator/tools/progress-message.mjs +4 -0
  260. package/src/runtime/agent/orchestrator/tools/shell-command.mjs +2 -2
  261. package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +4 -8
  262. package/src/runtime/agent/orchestrator/tools/spawn-binary-fetcher.mjs +45 -122
  263. package/src/runtime/attachments/pdf-extract.mjs +14 -6
  264. package/src/runtime/attachments/pdfjs-runtime.mjs +12 -0
  265. package/src/runtime/attachments/store.mjs +8 -8
  266. package/src/runtime/bridge-discovery.mjs +67 -0
  267. package/src/runtime/browser-bridge/action-schema.d.mts +6 -0
  268. package/src/runtime/browser-bridge/action-schema.mjs +9 -3
  269. package/src/runtime/browser-bridge/client.mjs +18 -31
  270. package/src/runtime/browser-bridge/tool-defs.mjs +16 -7
  271. package/src/runtime/channels/lib/boot-profile.mjs +3 -16
  272. package/src/runtime/channels/lib/config.mjs +0 -1
  273. package/src/runtime/channels/lib/runtime-paths.mjs +2 -15
  274. package/src/runtime/channels/lib/scheduler.mjs +0 -15
  275. package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +7 -59
  276. package/src/runtime/channels/lib/worker-main.mjs +2 -30
  277. package/src/runtime/computer-bridge/action-schema.mjs +7 -5
  278. package/src/runtime/computer-bridge/actions.d.mts +6 -0
  279. package/src/runtime/computer-bridge/actions.mjs +75 -0
  280. package/src/runtime/computer-bridge/client.mjs +21 -39
  281. package/src/runtime/computer-bridge/core-actions.mjs +2 -3
  282. package/src/runtime/computer-bridge/error-recovery.mjs +15 -3
  283. package/src/runtime/computer-bridge/limits.d.mts +8 -0
  284. package/src/runtime/computer-bridge/limits.mjs +67 -0
  285. package/src/runtime/computer-bridge/tool-defs.mjs +10 -16
  286. package/src/runtime/github/client.d.mts +17 -0
  287. package/src/runtime/github/client.mjs +127 -0
  288. package/src/runtime/github/commands.mjs +106 -0
  289. package/src/runtime/github/contract.d.mts +58 -0
  290. package/src/runtime/github/contract.mjs +147 -0
  291. package/src/runtime/github/tool.mjs +64 -0
  292. package/src/runtime/local-provider/asset-installer.mjs +261 -0
  293. package/src/runtime/local-provider/asset-storage.mjs +36 -0
  294. package/src/runtime/local-provider/catalog.mjs +151 -0
  295. package/src/runtime/local-provider/data/manifest.json +48 -0
  296. package/src/runtime/local-provider/gguf-header.mjs +92 -0
  297. package/src/runtime/local-provider/hardware.mjs +83 -0
  298. package/src/runtime/local-provider/hugging-face.mjs +111 -0
  299. package/src/runtime/local-provider/input-capabilities.mjs +19 -0
  300. package/src/runtime/local-provider/install-progress.mjs +77 -0
  301. package/src/runtime/local-provider/managed-runtime.mjs +45 -0
  302. package/src/runtime/local-provider/model-maintenance.mjs +114 -0
  303. package/src/runtime/local-provider/model-state.mjs +53 -0
  304. package/src/runtime/local-provider/registered-models.mjs +67 -0
  305. package/src/runtime/local-provider/request-queue.mjs +125 -0
  306. package/src/runtime/local-provider/resumable-installations.mjs +27 -0
  307. package/src/runtime/local-provider/server-process.mjs +209 -0
  308. package/src/runtime/local-provider/server.mjs +99 -0
  309. package/src/runtime/media/download.mjs +1 -1
  310. package/src/runtime/media/lanes.mjs +1 -1
  311. package/src/runtime/media/renditions.mjs +1 -1
  312. package/src/runtime/media/store.mjs +1 -1
  313. package/src/runtime/media/tool-defs.mjs +40 -0
  314. package/src/runtime/media/tool.mjs +277 -0
  315. package/src/runtime/memory/index.mjs +11 -29
  316. package/src/runtime/memory/lib/core-memory-candidates.mjs +0 -5
  317. package/src/runtime/memory/lib/core-memory-file.mjs +2 -2
  318. package/src/runtime/memory/lib/core-memory-store.mjs +37 -8
  319. package/src/runtime/memory/lib/cycle-scheduler.mjs +16 -2
  320. package/src/runtime/memory/lib/embedding-model-config.mjs +2 -4
  321. package/src/runtime/memory/lib/embedding-reindex.mjs +2 -4
  322. package/src/runtime/memory/lib/http-router.mjs +13 -1
  323. package/src/runtime/memory/lib/http-wire.mjs +1 -1
  324. package/src/runtime/memory/lib/memory-action-handlers.mjs +4 -1
  325. package/src/runtime/memory/lib/memory-config-flags.mjs +8 -12
  326. package/src/runtime/memory/lib/memory-cycle-requests.mjs +0 -40
  327. package/src/runtime/memory/lib/memory-cycle1.mjs +1 -5
  328. package/src/runtime/memory/lib/memory-cycle2-gate.mjs +30 -9
  329. package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +35 -4
  330. package/src/runtime/memory/lib/memory-cycle2.mjs +1 -1
  331. package/src/runtime/memory/lib/memory-cycle3-evidence.mjs +117 -0
  332. package/src/runtime/memory/lib/memory-cycle3-guards.mjs +272 -0
  333. package/src/runtime/memory/lib/memory-cycle3.mjs +81 -238
  334. package/src/runtime/memory/lib/memory-embed.mjs +1 -4
  335. package/src/runtime/memory/lib/memory-score.mjs +0 -13
  336. package/src/runtime/memory/lib/memory-text-utils.mjs +7 -1
  337. package/src/runtime/memory/lib/pg/adapter.mjs +2 -2
  338. package/src/runtime/memory/lib/phase-merge-verdicts.mjs +54 -0
  339. package/src/runtime/memory/lib/prompt-surface-file.mjs +98 -0
  340. package/src/runtime/memory/lib/query-handlers.mjs +4 -1
  341. package/src/runtime/memory/lib/recall-embedding-readiness.mjs +1 -1
  342. package/src/runtime/memory/lib/recall-format.mjs +15 -7
  343. package/src/runtime/memory/lib/recall-order.mjs +6 -0
  344. package/src/runtime/memory/lib/runtime-fetcher.mjs +25 -52
  345. package/src/runtime/memory/lib/session-ingest.mjs +3 -3
  346. package/src/runtime/memory/lib/trace-mode.mjs +1 -1
  347. package/src/runtime/memory/lib/trace-store.mjs +1 -10
  348. package/src/runtime/memory/lib/transcript-ingest.mjs +2 -2
  349. package/src/runtime/office/README.md +54 -0
  350. package/src/runtime/office/authoring/pptx-author-action.mjs +166 -0
  351. package/src/runtime/office/authoring/pptx-author-session.mjs +112 -0
  352. package/src/runtime/office/authoring/pptx-brief.mjs +270 -0
  353. package/src/runtime/office/authoring/pptx-contact-sheet.mjs +54 -0
  354. package/src/runtime/office/authoring/pptx-icons.json +1 -0
  355. package/src/runtime/office/authoring/pptx-icons.mjs +50 -0
  356. package/src/runtime/office/authoring/pptx-kit.mjs +33 -0
  357. package/src/runtime/office/authoring/pptx-receipt.mjs +388 -0
  358. package/src/runtime/office/authoring/pptx-review-artifacts.mjs +32 -0
  359. package/src/runtime/office/authoring/pptx-script-contract.mjs +15 -0
  360. package/src/runtime/office/authoring/pptx-script-normalize.mjs +244 -0
  361. package/src/runtime/office/authoring/pptx-script-runner.mjs +142 -0
  362. package/src/runtime/office/{assurance-benchmark.mjs → bench/assurance-benchmark.mjs} +8 -98
  363. package/src/runtime/office/bench/bench-support.mjs +18 -0
  364. package/src/runtime/office/{benchmark.mjs → bench/benchmark.mjs} +6 -11
  365. package/src/runtime/office/{contract-benchmark.mjs → bench/contract-benchmark.mjs} +4 -9
  366. package/src/runtime/office/bench/deck-bench.mjs +78 -0
  367. package/src/runtime/office/{polish-benchmark.mjs → bench/polish-benchmark.mjs} +2 -7
  368. package/src/runtime/office/{quality-live-benchmark.mjs → bench/quality-live-benchmark.mjs} +5 -260
  369. package/src/runtime/office/capabilities.mjs +105 -45
  370. package/src/runtime/office/{com-adapter.mjs → com/com-adapter.mjs} +58 -53
  371. package/src/runtime/office/com/office-com-cleanup.ps1 +126 -0
  372. package/src/runtime/office/{office-com-host.ps1 → com/office-com-host.ps1} +427 -90
  373. package/src/runtime/office/{office-com-session-host.ps1 → com/office-com-session-host.ps1} +117 -90
  374. package/src/runtime/office/com/office-session-client.mjs +91 -0
  375. package/src/runtime/office/{journal.mjs → core/journal.mjs} +1 -1
  376. package/src/runtime/office/core/office-actions-batch.mjs +348 -0
  377. package/src/runtime/office/core/office-actions-inspect.mjs +157 -0
  378. package/src/runtime/office/core/office-actions-lifecycle.mjs +253 -0
  379. package/src/runtime/office/core/office-actions-render.mjs +307 -0
  380. package/src/runtime/office/core/office-actions.mjs +6 -0
  381. package/src/runtime/office/{office-core.mjs → core/office-core.mjs} +26 -5
  382. package/src/runtime/office/core/office-render-preview.mjs +160 -0
  383. package/src/runtime/office/{office-sessions.mjs → core/office-sessions.mjs} +141 -9
  384. package/src/runtime/office/{office-transactions.mjs → core/office-transactions.mjs} +2 -1
  385. package/src/runtime/office/core/pptx-page-cache.mjs +70 -0
  386. package/src/runtime/office/{snapshot-contract.mjs → core/snapshot-contract.mjs} +28 -0
  387. package/src/runtime/office/{tabular.mjs → core/tabular.mjs} +2 -12
  388. package/src/runtime/office/{composition-system.mjs → design/composition-system.mjs} +2 -11
  389. package/src/runtime/office/{content-model.mjs → design/content-model.mjs} +1 -14
  390. package/src/runtime/office/{design-art-direction.mjs → design/design-art-direction.mjs} +51 -65
  391. package/src/runtime/office/{design-creative-director.mjs → design/design-creative-director.mjs} +7 -25
  392. package/src/runtime/office/design/design-discipline.mjs +310 -0
  393. package/src/runtime/office/{design-system.mjs → design/design-system.mjs} +14 -102
  394. package/src/runtime/office/{design-tokens.mjs → design/design-tokens.mjs} +33 -47
  395. package/src/runtime/office/{design-docx.mjs → design/docx/design-docx.mjs} +2 -1
  396. package/src/runtime/office/{design-library-core.mjs → design/library/design-library-core.mjs} +8 -34
  397. package/src/runtime/office/{design-library-pack.mjs → design/library/design-library-pack.mjs} +16 -1
  398. package/src/runtime/office/{design-library.mjs → design/library/design-library.mjs} +15 -2
  399. package/src/runtime/office/{design-template-index.mjs → design/library/design-template-index.mjs} +24 -2
  400. package/src/runtime/office/{design-template-inspect.mjs → design/library/design-template-inspect.mjs} +1 -12
  401. package/src/runtime/office/{design-xlsx-components.mjs → design/xlsx/design-xlsx-components.mjs} +2 -1
  402. package/src/runtime/office/{design-xlsx.mjs → design/xlsx/design-xlsx.mjs} +3 -1
  403. package/src/runtime/office/index.mjs +99 -30
  404. package/src/runtime/office/office-test-support.mjs +66 -0
  405. package/src/runtime/office/{document-preview.mjs → pdf/document-preview.mjs} +1 -1
  406. package/src/runtime/office/pdf/pdf-adapter.mjs +824 -0
  407. package/src/runtime/office/pdf/pdf-analysis.mjs +733 -0
  408. package/src/runtime/office/pdf/pdf-draw.mjs +91 -0
  409. package/src/runtime/office/pdf/pdf-fonts.mjs +91 -0
  410. package/src/runtime/office/pdf/pdf-forms.mjs +265 -0
  411. package/src/runtime/office/{pdf-render.mjs → pdf/pdf-render.mjs} +42 -36
  412. package/src/runtime/office/pdf/pdf-safety.mjs +50 -0
  413. package/src/runtime/office/pdf/pdf-search.mjs +187 -0
  414. package/src/runtime/office/{pdf-security.mjs → pdf/pdf-security.mjs} +7 -3
  415. package/src/runtime/office/pdf/pdf-writer.mjs +195 -0
  416. package/src/runtime/office/portable/docx-revisions.mjs +474 -0
  417. package/src/runtime/office/portable/docx-runs.mjs +293 -0
  418. package/src/runtime/office/portable/docx-tracked-edits.mjs +165 -0
  419. package/src/runtime/office/portable/font-provisioner.mjs +210 -0
  420. package/src/runtime/office/{ooxml-validator.mjs → portable/ooxml-validator.mjs} +26 -3
  421. package/src/runtime/office/{portable-cells.mjs → portable/portable-cells.mjs} +12 -3
  422. package/src/runtime/office/portable/portable-chart-faults.mjs +96 -0
  423. package/src/runtime/office/{portable-chart.mjs → portable/portable-chart.mjs} +21 -19
  424. package/src/runtime/office/{portable-docx-parts.mjs → portable/portable-docx-parts.mjs} +97 -0
  425. package/src/runtime/office/{portable-docx-xml.mjs → portable/portable-docx-xml.mjs} +2 -2
  426. package/src/runtime/office/{portable-docx.mjs → portable/portable-docx.mjs} +211 -36
  427. package/src/runtime/office/{portable-opc.mjs → portable/portable-opc.mjs} +11 -3
  428. package/src/runtime/office/{portable-package.mjs → portable/portable-package.mjs} +7 -25
  429. package/src/runtime/office/{portable-pivot.mjs → portable/portable-pivot.mjs} +1 -1
  430. package/src/runtime/office/{portable-pptx-chart.mjs → portable/portable-pptx-chart.mjs} +4 -2
  431. package/src/runtime/office/{portable-pptx-charts.mjs → portable/portable-pptx-charts.mjs} +5 -19
  432. package/src/runtime/office/{portable-pptx-core.mjs → portable/portable-pptx-core.mjs} +14 -3
  433. package/src/runtime/office/{portable-pptx-package.mjs → portable/portable-pptx-package.mjs} +62 -5
  434. package/src/runtime/office/{portable-pptx-shapes.mjs → portable/portable-pptx-shapes.mjs} +1 -1
  435. package/src/runtime/office/{portable-pptx.mjs → portable/portable-pptx.mjs} +11 -2
  436. package/src/runtime/office/{portable-sheet-styles.mjs → portable/portable-sheet-styles.mjs} +74 -11
  437. package/src/runtime/office/{portable-slide-shapes.mjs → portable/portable-slide-shapes.mjs} +8 -15
  438. package/src/runtime/office/{portable-snapshot.mjs → portable/portable-snapshot.mjs} +254 -27
  439. package/src/runtime/office/{portable-soffice.mjs → portable/portable-soffice.mjs} +45 -1
  440. package/src/runtime/office/{portable-validation.mjs → portable/portable-validation.mjs} +73 -34
  441. package/src/runtime/office/{portable-xlsx.mjs → portable/portable-xlsx.mjs} +3 -1
  442. package/src/runtime/office/{portable-xml.mjs → portable/portable-xml.mjs} +20 -0
  443. package/src/runtime/office/portable/pptx-relations.mjs +92 -0
  444. package/src/runtime/office/portable/pptx-targets.mjs +30 -0
  445. package/src/runtime/office/portable/review-editability.mjs +111 -0
  446. package/src/runtime/office/{text-metrics.mjs → portable/text-metrics.mjs} +232 -28
  447. package/src/runtime/office/{xlsx-assertions.mjs → portable/xlsx-assertions.mjs} +5 -21
  448. package/src/runtime/office/portable/xlsx-audit-support.mjs +132 -0
  449. package/src/runtime/office/{xlsx-contract.mjs → portable/xlsx-contract.mjs} +50 -12
  450. package/src/runtime/office/portable/xlsx-conventions.mjs +75 -0
  451. package/src/runtime/office/portable/xlsx-formula-audit.mjs +247 -0
  452. package/src/runtime/office/portable/xlsx-sheet-hygiene.mjs +100 -0
  453. package/src/runtime/office/quality/assurance-checklist.mjs +185 -0
  454. package/src/runtime/office/quality/assurance-rendered.mjs +167 -0
  455. package/src/runtime/office/quality/assurance-structure.mjs +440 -0
  456. package/src/runtime/office/quality/assurance-trust.mjs +246 -0
  457. package/src/runtime/office/quality/assurance.mjs +11 -0
  458. package/src/runtime/office/quality/design-aesthetics-metrics.mjs +271 -0
  459. package/src/runtime/office/quality/design-aesthetics.mjs +285 -0
  460. package/src/runtime/office/{design-deck-diversity.mjs → quality/design-deck-diversity.mjs} +31 -1
  461. package/src/runtime/office/quality/design-review-authored.mjs +113 -0
  462. package/src/runtime/office/quality/design-review-critique.mjs +120 -0
  463. package/src/runtime/office/{design-review.mjs → quality/design-review.mjs} +167 -123
  464. package/src/runtime/office/quality/inline-audit.mjs +139 -0
  465. package/src/runtime/office/quality/pptx-deck-rubric.mjs +93 -0
  466. package/src/runtime/office/quality/pptx-slide-roles.mjs +136 -0
  467. package/src/runtime/office/quality/quality-pipeline.mjs +280 -0
  468. package/src/runtime/office/{quality-score.mjs → quality/quality-score.mjs} +2 -4
  469. package/src/runtime/office/quality/render-air.mjs +114 -0
  470. package/src/runtime/office/shared/asar-path.mjs +5 -0
  471. package/src/runtime/office/shared/values.mjs +32 -0
  472. package/src/runtime/office/tool-defs.mjs +35 -29
  473. package/src/runtime/shared/agent-route-config.mjs +3 -3
  474. package/src/runtime/shared/atomic-file.mjs +27 -20
  475. package/src/runtime/shared/background-tasks.mjs +2 -37
  476. package/src/runtime/shared/boot-profile.mjs +26 -0
  477. package/src/runtime/shared/bounded-download.mjs +40 -0
  478. package/src/runtime/shared/bridge-tool-args.mjs +1 -1
  479. package/src/runtime/shared/buffered-appender.mjs +1 -1
  480. package/src/runtime/shared/child-guardian.mjs +1 -5
  481. package/src/runtime/shared/child-spawn-gate.mjs +2 -2
  482. package/src/runtime/shared/clean.mjs +5 -0
  483. package/src/runtime/shared/config.mjs +8 -30
  484. package/src/runtime/shared/edit-tool-dialect.mjs +19 -6
  485. package/src/runtime/shared/env.mjs +41 -0
  486. package/src/runtime/shared/err-text.mjs +15 -5
  487. package/src/runtime/shared/error-presentation.mjs +101 -0
  488. package/src/runtime/shared/extension-scopes.mjs +139 -0
  489. package/src/runtime/shared/json-file.mjs +6 -0
  490. package/src/runtime/shared/llm/cost.mjs +2 -2
  491. package/src/runtime/shared/llm/http-agent.mjs +18 -6
  492. package/src/runtime/shared/markdown-frontmatter.mjs +2 -4
  493. package/src/runtime/shared/memory-snapshot.mjs +0 -4
  494. package/src/runtime/shared/native-asset.mjs +149 -0
  495. package/src/runtime/shared/numbers.mjs +12 -0
  496. package/src/runtime/shared/object.mjs +7 -0
  497. package/src/runtime/shared/owner-fair-gate.mjs +1 -5
  498. package/src/runtime/shared/plugin-manifest.mjs +44 -0
  499. package/src/runtime/shared/pristine-execution.mjs +4 -7
  500. package/src/runtime/shared/process-lifecycle.mjs +1 -5
  501. package/src/runtime/shared/resource-admission.mjs +4 -7
  502. package/src/runtime/shared/service-discovery.mjs +1 -22
  503. package/src/runtime/shared/session-runtime-health.mjs +15 -1
  504. package/src/runtime/shared/skill-document.mjs +36 -8
  505. package/src/runtime/shared/task-notification-envelope.mjs +0 -25
  506. package/src/runtime/shared/time-format.mjs +1 -1
  507. package/src/runtime/shared/tool-execution-contract.mjs +29 -7
  508. package/src/runtime/shared/tool-result-summary.mjs +1 -1
  509. package/src/runtime/shared/tool-surface.mjs +21 -21
  510. package/src/runtime/shared/tool-workload-gates.mjs +1 -5
  511. package/src/runtime/shared/transcript-writer.mjs +5 -2
  512. package/src/runtime/shared/transport-error-text.mjs +128 -0
  513. package/src/runtime/shared/turn-snapshot-store.mjs +81 -7
  514. package/src/runtime/shared/turn-snapshot.mjs +147 -19
  515. package/src/runtime/shared/user-data-guard.mjs +1 -73
  516. package/src/runtime/web-search/lib/web-tools.mjs +0 -157
  517. package/src/session-runtime/agent-tool-routing.mjs +56 -0
  518. package/src/session-runtime/boot-profile.mjs +6 -18
  519. package/src/session-runtime/builtin-features.d.mts +8 -0
  520. package/src/session-runtime/builtin-features.mjs +42 -4
  521. package/src/session-runtime/config-helpers.mjs +1 -1
  522. package/src/session-runtime/context-status.mjs +44 -11
  523. package/src/session-runtime/effort.mjs +28 -32
  524. package/src/session-runtime/extension-scopes.mjs +94 -0
  525. package/src/session-runtime/fs-utils.mjs +1 -3
  526. package/src/session-runtime/goal-facade-api.mjs +52 -0
  527. package/src/session-runtime/goal-reminder.mjs +12 -5
  528. package/src/session-runtime/goal-runtime.mjs +196 -305
  529. package/src/session-runtime/goal-storage.mjs +60 -0
  530. package/src/session-runtime/goal-tasks.mjs +125 -0
  531. package/src/session-runtime/goal-text.mjs +8 -5
  532. package/src/session-runtime/goal-tool-defs.mjs +91 -0
  533. package/src/session-runtime/hitch-profile.mjs +1 -1
  534. package/src/session-runtime/hook-payload.mjs +32 -0
  535. package/src/session-runtime/internal-tool-executor.mjs +171 -0
  536. package/src/session-runtime/lifecycle-api.mjs +7 -2
  537. package/src/session-runtime/local-model-api.mjs +22 -0
  538. package/src/session-runtime/local-provider-settings.mjs +49 -0
  539. package/src/session-runtime/mcp-glue.mjs +8 -3
  540. package/src/session-runtime/model-capabilities.mjs +3 -15
  541. package/src/session-runtime/model-recency.mjs +3 -0
  542. package/src/session-runtime/model-route-api.mjs +26 -51
  543. package/src/session-runtime/native-teardown.mjs +42 -0
  544. package/src/session-runtime/notification-bus.mjs +13 -1
  545. package/src/session-runtime/plugin-mcp.mjs +9 -30
  546. package/src/session-runtime/provider-auth-api.mjs +2 -13
  547. package/src/session-runtime/provider-models.mjs +9 -0
  548. package/src/session-runtime/provider-readiness.mjs +131 -0
  549. package/src/session-runtime/provider-request-snapshot.mjs +0 -19
  550. package/src/session-runtime/resource-api.mjs +70 -3
  551. package/src/session-runtime/runtime-core.mjs +176 -705
  552. package/src/session-runtime/runtime-facade.mjs +112 -0
  553. package/src/session-runtime/runtime-modules.mjs +56 -0
  554. package/src/session-runtime/runtime-review-api.mjs +19 -0
  555. package/src/session-runtime/runtime-tunables.mjs +1 -1
  556. package/src/session-runtime/session-lifecycle.mjs +14 -4
  557. package/src/session-runtime/session-route-policy.mjs +26 -0
  558. package/src/session-runtime/session-text.mjs +3 -32
  559. package/src/session-runtime/session-turn-api.mjs +16 -4
  560. package/src/session-runtime/settings-api.mjs +56 -3
  561. package/src/session-runtime/setup-tool/executor.mjs +316 -0
  562. package/src/session-runtime/setup-tool/tool-defs.mjs +164 -0
  563. package/src/session-runtime/skills-api.mjs +39 -13
  564. package/src/session-runtime/tool-catalog-data.mjs +3 -2
  565. package/src/session-runtime/tool-catalog-schema.mjs +1 -16
  566. package/src/session-runtime/tool-catalog.mjs +0 -6
  567. package/src/session-runtime/tool-defs.mjs +1 -1
  568. package/src/session-runtime/tool-policy-refresh.mjs +4 -1
  569. package/src/session-runtime/tool-profile.mjs +1 -0
  570. package/src/session-runtime/tool-surface.mjs +2 -0
  571. package/src/session-runtime/workflow-agents-api.mjs +2 -1
  572. package/src/session-runtime/workflow.mjs +2 -2
  573. package/src/standalone/agent-tool/helpers.mjs +31 -7
  574. package/src/standalone/agent-tool/lead-worker-index.mjs +3 -27
  575. package/src/standalone/agent-tool/notify.mjs +1 -0
  576. package/src/standalone/agent-tool/worker-index.mjs +1 -25
  577. package/src/standalone/agent-tool.mjs +0 -24
  578. package/src/standalone/boot-phase-profiler.mjs +60 -0
  579. package/src/standalone/channel-admin.mjs +1 -42
  580. package/src/standalone/channel-transport.mjs +21 -4
  581. package/src/standalone/daemon-boot-coordinator.mjs +103 -0
  582. package/src/standalone/daemon.mjs +50 -46
  583. package/src/standalone/desktop-service-registry.mjs +226 -0
  584. package/src/standalone/fair-call-scheduler.mjs +1 -4
  585. package/src/standalone/hook-bus/config.mjs +1 -1
  586. package/src/standalone/hook-bus.mjs +11 -0
  587. package/src/standalone/plugin-admin.mjs +3 -15
  588. package/src/standalone/provider-admin.mjs +40 -53
  589. package/src/standalone/seeds.mjs +62 -18
  590. package/src/standalone/session-attachment-pool.mjs +127 -0
  591. package/src/standalone/session-client.mjs +53 -669
  592. package/src/standalone/session-protocol.mjs +12 -1
  593. package/src/standalone/session-proxy.mjs +538 -0
  594. package/src/standalone/session-runtime-inline-host.mjs +28 -11
  595. package/src/standalone/session-runtime-worker.mjs +13 -3
  596. package/src/standalone/session-service/agent-tree.mjs +477 -0
  597. package/src/standalone/session-service/project-catalog.mjs +86 -0
  598. package/src/standalone/session-service/projection.mjs +295 -0
  599. package/src/standalone/session-service-api.mjs +56 -0
  600. package/src/standalone/session-service.mjs +151 -1078
  601. package/src/standalone/session-state-projection.mjs +57 -0
  602. package/src/standalone/session-transport.mjs +44 -5
  603. package/src/standalone/session-wire-values.mjs +54 -0
  604. package/src/standalone/session-wire.mjs +1 -1
  605. package/src/standalone/usage-dashboard.mjs +3 -30
  606. package/src/tui/App.jsx +14 -0
  607. package/src/tui/app/app-format.mjs +5 -13
  608. package/src/tui/app/app-view.jsx +1 -0
  609. package/src/tui/app/extension-pickers.mjs +20 -4
  610. package/src/tui/app/input-parsers.mjs +3 -21
  611. package/src/tui/app/model-options.mjs +7 -5
  612. package/src/tui/app/prompt-submit.mjs +0 -18
  613. package/src/tui/app/provider-setup-picker.mjs +24 -76
  614. package/src/tui/app/transcript-row-estimate.mjs +0 -1
  615. package/src/tui/app/transcript-window.mjs +2 -13
  616. package/src/tui/app/use-transcript-scroll.mjs +1 -1
  617. package/src/tui/app/use-transcript-window.mjs +1 -1
  618. package/src/tui/components/PromptInput.jsx +4 -4
  619. package/src/tui/display-width.mjs +5 -6
  620. package/src/tui/dist/index.mjs +5349 -5096
  621. package/src/tui/index.jsx +4 -2
  622. package/src/tui/markdown/format-token.mjs +0 -5
  623. package/src/tui/markdown/streaming-markdown.mjs +2 -157
  624. package/src/tui/prompt-history-store.mjs +0 -13
  625. package/src/tui/session/agent-envelope.mjs +38 -5
  626. package/src/tui/session/agent-job-feed.mjs +8 -0
  627. package/src/tui/session/boot-profile.mjs +2 -14
  628. package/src/tui/session/context-state.mjs +0 -4
  629. package/src/tui/session/goal-continuation.mjs +1 -10
  630. package/src/tui/session/notification-plan.mjs +8 -0
  631. package/src/tui/session/render-frame-source.mjs +22 -0
  632. package/src/tui/session/render-timing.mjs +13 -3
  633. package/src/tui/session/session-api-ext.mjs +18 -9
  634. package/src/tui/session/session-api.mjs +28 -0
  635. package/src/tui/session/session-stats.mjs +7 -41
  636. package/src/tui/session/transcript-spill.mjs +2 -83
  637. package/src/tui/session/turn-aggregate-cards.mjs +252 -0
  638. package/src/tui/session/turn-deferred-cards.mjs +127 -0
  639. package/src/tui/session/turn.mjs +77 -379
  640. package/src/tui/session-local.mjs +19 -74
  641. package/src/ui/model-display.mjs +57 -1
  642. package/src/ui/statusline-agents.mjs +1 -5
  643. package/src/ui/statusline-segments.mjs +1 -5
  644. package/src/ui/statusline.mjs +16 -6
  645. package/src/ui/streaming-markdown-heal.mjs +147 -0
  646. package/src/vendor/statusline/bin/statusline-route.mjs +1 -1
  647. package/src/vendor/statusline/src/gateway/route-meta.mjs +1 -1
  648. package/src/workflows/default/WORKFLOW.md +5 -3
  649. package/src/workflows/solo/WORKFLOW.md +5 -3
  650. package/src/runtime/agent/orchestrator/agent-runtime/commit-message-completion.mjs +0 -67
  651. package/src/runtime/agent/orchestrator/providers/lib/env-utils.mjs +0 -15
  652. package/src/runtime/agent/orchestrator/session/compact/file-reattach.mjs +0 -112
  653. package/src/runtime/agent/orchestrator/session/compact/handoff.mjs +0 -476
  654. package/src/runtime/agent/orchestrator/session/loop/env.mjs +0 -14
  655. package/src/runtime/agent/orchestrator/session/manager/env-utils.mjs +0 -8
  656. package/src/runtime/office/assurance.mjs +0 -962
  657. package/src/runtime/office/design-aesthetics.mjs +0 -460
  658. package/src/runtime/office/design-frontier-review.mjs +0 -129
  659. package/src/runtime/office/design-layout-grammar.mjs +0 -134
  660. package/src/runtime/office/design-pptx-executive.mjs +0 -335
  661. package/src/runtime/office/design-pptx-plan.mjs +0 -1002
  662. package/src/runtime/office/design-pptx-primitives.mjs +0 -87
  663. package/src/runtime/office/design-pptx-semantic-flow.mjs +0 -111
  664. package/src/runtime/office/design-pptx-semantic-visuals.mjs +0 -885
  665. package/src/runtime/office/design-pptx-stack.mjs +0 -58
  666. package/src/runtime/office/design-pptx.mjs +0 -776
  667. package/src/runtime/office/office-actions.mjs +0 -979
  668. package/src/runtime/office/pdf-adapter.mjs +0 -591
  669. package/src/runtime/office/pdf-analysis.mjs +0 -429
  670. package/src/runtime/office/quality-pipeline.mjs +0 -154
  671. package/src/session-runtime/env.mjs +0 -16
  672. package/vendor/ink/build/ansi-tokenizer.d.ts +0 -38
  673. package/vendor/ink/build/ansi-tokenizer.js +0 -316
  674. package/vendor/ink/build/ansi-tokenizer.js.map +0 -1
  675. package/vendor/ink/build/colorize.d.ts +0 -3
  676. package/vendor/ink/build/colorize.js +0 -48
  677. package/vendor/ink/build/colorize.js.map +0 -1
  678. package/vendor/ink/build/components/AccessibilityContext.d.ts +0 -3
  679. package/vendor/ink/build/components/AccessibilityContext.js +0 -5
  680. package/vendor/ink/build/components/AccessibilityContext.js.map +0 -1
  681. package/vendor/ink/build/components/AnimationContext.d.ts +0 -9
  682. package/vendor/ink/build/components/AnimationContext.js +0 -13
  683. package/vendor/ink/build/components/AnimationContext.js.map +0 -1
  684. package/vendor/ink/build/components/App.d.ts +0 -24
  685. package/vendor/ink/build/components/App.js +0 -608
  686. package/vendor/ink/build/components/App.js.map +0 -1
  687. package/vendor/ink/build/components/AppContext.d.ts +0 -80
  688. package/vendor/ink/build/components/AppContext.js +0 -25
  689. package/vendor/ink/build/components/AppContext.js.map +0 -1
  690. package/vendor/ink/build/components/BackgroundContext.d.ts +0 -4
  691. package/vendor/ink/build/components/BackgroundContext.js +0 -3
  692. package/vendor/ink/build/components/BackgroundContext.js.map +0 -1
  693. package/vendor/ink/build/components/Box.d.ts +0 -130
  694. package/vendor/ink/build/components/Box.js +0 -34
  695. package/vendor/ink/build/components/Box.js.map +0 -1
  696. package/vendor/ink/build/components/CursorContext.d.ts +0 -11
  697. package/vendor/ink/build/components/CursorContext.js +0 -8
  698. package/vendor/ink/build/components/CursorContext.js.map +0 -1
  699. package/vendor/ink/build/components/ErrorBoundary.d.ts +0 -18
  700. package/vendor/ink/build/components/ErrorBoundary.js +0 -23
  701. package/vendor/ink/build/components/ErrorBoundary.js.map +0 -1
  702. package/vendor/ink/build/components/ErrorOverview.d.ts +0 -6
  703. package/vendor/ink/build/components/ErrorOverview.js +0 -90
  704. package/vendor/ink/build/components/ErrorOverview.js.map +0 -1
  705. package/vendor/ink/build/components/FocusContext.d.ts +0 -16
  706. package/vendor/ink/build/components/FocusContext.js +0 -17
  707. package/vendor/ink/build/components/FocusContext.js.map +0 -1
  708. package/vendor/ink/build/components/Newline.d.ts +0 -13
  709. package/vendor/ink/build/components/Newline.js +0 -8
  710. package/vendor/ink/build/components/Newline.js.map +0 -1
  711. package/vendor/ink/build/components/Spacer.d.ts +0 -7
  712. package/vendor/ink/build/components/Spacer.js +0 -11
  713. package/vendor/ink/build/components/Spacer.js.map +0 -1
  714. package/vendor/ink/build/components/Static.d.ts +0 -24
  715. package/vendor/ink/build/components/Static.js +0 -28
  716. package/vendor/ink/build/components/Static.js.map +0 -1
  717. package/vendor/ink/build/components/StderrContext.d.ts +0 -15
  718. package/vendor/ink/build/components/StderrContext.js +0 -13
  719. package/vendor/ink/build/components/StderrContext.js.map +0 -1
  720. package/vendor/ink/build/components/StdinContext.d.ts +0 -28
  721. package/vendor/ink/build/components/StdinContext.js +0 -20
  722. package/vendor/ink/build/components/StdinContext.js.map +0 -1
  723. package/vendor/ink/build/components/StdoutContext.d.ts +0 -15
  724. package/vendor/ink/build/components/StdoutContext.js +0 -13
  725. package/vendor/ink/build/components/StdoutContext.js.map +0 -1
  726. package/vendor/ink/build/components/Text.d.ts +0 -55
  727. package/vendor/ink/build/components/Text.js +0 -50
  728. package/vendor/ink/build/components/Text.js.map +0 -1
  729. package/vendor/ink/build/components/Transform.d.ts +0 -16
  730. package/vendor/ink/build/components/Transform.js +0 -15
  731. package/vendor/ink/build/components/Transform.js.map +0 -1
  732. package/vendor/ink/build/cursor-helpers.d.ts +0 -39
  733. package/vendor/ink/build/cursor-helpers.js +0 -62
  734. package/vendor/ink/build/cursor-helpers.js.map +0 -1
  735. package/vendor/ink/build/devtools-window-polyfill.d.ts +0 -1
  736. package/vendor/ink/build/devtools-window-polyfill.js +0 -68
  737. package/vendor/ink/build/devtools-window-polyfill.js.map +0 -1
  738. package/vendor/ink/build/devtools.d.ts +0 -1
  739. package/vendor/ink/build/devtools.js +0 -36
  740. package/vendor/ink/build/devtools.js.map +0 -1
  741. package/vendor/ink/build/display-width.js +0 -96
  742. package/vendor/ink/build/dom.d.ts +0 -62
  743. package/vendor/ink/build/dom.js +0 -143
  744. package/vendor/ink/build/dom.js.map +0 -1
  745. package/vendor/ink/build/get-max-width.d.ts +0 -3
  746. package/vendor/ink/build/get-max-width.js +0 -10
  747. package/vendor/ink/build/get-max-width.js.map +0 -1
  748. package/vendor/ink/build/hooks/use-animation.d.ts +0 -49
  749. package/vendor/ink/build/hooks/use-animation.js +0 -87
  750. package/vendor/ink/build/hooks/use-animation.js.map +0 -1
  751. package/vendor/ink/build/hooks/use-app.d.ts +0 -5
  752. package/vendor/ink/build/hooks/use-app.js +0 -8
  753. package/vendor/ink/build/hooks/use-app.js.map +0 -1
  754. package/vendor/ink/build/hooks/use-box-metrics.d.ts +0 -59
  755. package/vendor/ink/build/hooks/use-box-metrics.js +0 -81
  756. package/vendor/ink/build/hooks/use-box-metrics.js.map +0 -1
  757. package/vendor/ink/build/hooks/use-cursor.d.ts +0 -12
  758. package/vendor/ink/build/hooks/use-cursor.js +0 -29
  759. package/vendor/ink/build/hooks/use-cursor.js.map +0 -1
  760. package/vendor/ink/build/hooks/use-focus-manager.d.ts +0 -43
  761. package/vendor/ink/build/hooks/use-focus-manager.js +0 -18
  762. package/vendor/ink/build/hooks/use-focus-manager.js.map +0 -1
  763. package/vendor/ink/build/hooks/use-focus.d.ts +0 -30
  764. package/vendor/ink/build/hooks/use-focus.js +0 -43
  765. package/vendor/ink/build/hooks/use-focus.js.map +0 -1
  766. package/vendor/ink/build/hooks/use-input.d.ts +0 -132
  767. package/vendor/ink/build/hooks/use-input.js +0 -126
  768. package/vendor/ink/build/hooks/use-input.js.map +0 -1
  769. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +0 -6
  770. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +0 -12
  771. package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +0 -1
  772. package/vendor/ink/build/hooks/use-paste.d.ts +0 -35
  773. package/vendor/ink/build/hooks/use-paste.js +0 -62
  774. package/vendor/ink/build/hooks/use-paste.js.map +0 -1
  775. package/vendor/ink/build/hooks/use-stderr.d.ts +0 -5
  776. package/vendor/ink/build/hooks/use-stderr.js +0 -8
  777. package/vendor/ink/build/hooks/use-stderr.js.map +0 -1
  778. package/vendor/ink/build/hooks/use-stdin.d.ts +0 -7
  779. package/vendor/ink/build/hooks/use-stdin.js +0 -9
  780. package/vendor/ink/build/hooks/use-stdin.js.map +0 -1
  781. package/vendor/ink/build/hooks/use-stdout.d.ts +0 -5
  782. package/vendor/ink/build/hooks/use-stdout.js +0 -8
  783. package/vendor/ink/build/hooks/use-stdout.js.map +0 -1
  784. package/vendor/ink/build/hooks/use-window-size.d.ts +0 -18
  785. package/vendor/ink/build/hooks/use-window-size.js +0 -22
  786. package/vendor/ink/build/hooks/use-window-size.js.map +0 -1
  787. package/vendor/ink/build/index.d.ts +0 -42
  788. package/vendor/ink/build/index.js +0 -24
  789. package/vendor/ink/build/index.js.map +0 -1
  790. package/vendor/ink/build/ink.d.ts +0 -146
  791. package/vendor/ink/build/ink.js +0 -1287
  792. package/vendor/ink/build/ink.js.map +0 -1
  793. package/vendor/ink/build/input-parser.d.ts +0 -15
  794. package/vendor/ink/build/input-parser.js +0 -63
  795. package/vendor/ink/build/input-parser.js.map +0 -1
  796. package/vendor/ink/build/instances.d.ts +0 -3
  797. package/vendor/ink/build/instances.js +0 -8
  798. package/vendor/ink/build/instances.js.map +0 -1
  799. package/vendor/ink/build/kitty-keyboard.d.ts +0 -23
  800. package/vendor/ink/build/kitty-keyboard.js +0 -32
  801. package/vendor/ink/build/kitty-keyboard.js.map +0 -1
  802. package/vendor/ink/build/log-update.d.ts +0 -20
  803. package/vendor/ink/build/log-update.js +0 -320
  804. package/vendor/ink/build/log-update.js.map +0 -1
  805. package/vendor/ink/build/measure-element.d.ts +0 -20
  806. package/vendor/ink/build/measure-element.js +0 -13
  807. package/vendor/ink/build/measure-element.js.map +0 -1
  808. package/vendor/ink/build/measure-text.d.ts +0 -6
  809. package/vendor/ink/build/measure-text.js +0 -24
  810. package/vendor/ink/build/measure-text.js.map +0 -1
  811. package/vendor/ink/build/output.d.ts +0 -35
  812. package/vendor/ink/build/output.js +0 -567
  813. package/vendor/ink/build/output.js.map +0 -1
  814. package/vendor/ink/build/parse-keypress.d.ts +0 -20
  815. package/vendor/ink/build/parse-keypress.js +0 -495
  816. package/vendor/ink/build/parse-keypress.js.map +0 -1
  817. package/vendor/ink/build/reconciler.d.ts +0 -4
  818. package/vendor/ink/build/reconciler.js +0 -306
  819. package/vendor/ink/build/reconciler.js.map +0 -1
  820. package/vendor/ink/build/render-background.d.ts +0 -4
  821. package/vendor/ink/build/render-background.js +0 -25
  822. package/vendor/ink/build/render-background.js.map +0 -1
  823. package/vendor/ink/build/render-border.d.ts +0 -4
  824. package/vendor/ink/build/render-border.js +0 -84
  825. package/vendor/ink/build/render-border.js.map +0 -1
  826. package/vendor/ink/build/render-node-to-output.d.ts +0 -14
  827. package/vendor/ink/build/render-node-to-output.js +0 -207
  828. package/vendor/ink/build/render-node-to-output.js.map +0 -1
  829. package/vendor/ink/build/render-to-string.d.ts +0 -38
  830. package/vendor/ink/build/render-to-string.js +0 -116
  831. package/vendor/ink/build/render-to-string.js.map +0 -1
  832. package/vendor/ink/build/render.d.ts +0 -176
  833. package/vendor/ink/build/render.js +0 -84
  834. package/vendor/ink/build/render.js.map +0 -1
  835. package/vendor/ink/build/renderer.d.ts +0 -8
  836. package/vendor/ink/build/renderer.js +0 -67
  837. package/vendor/ink/build/renderer.js.map +0 -1
  838. package/vendor/ink/build/sanitize-ansi.d.ts +0 -2
  839. package/vendor/ink/build/sanitize-ansi.js +0 -27
  840. package/vendor/ink/build/sanitize-ansi.js.map +0 -1
  841. package/vendor/ink/build/selection-rect.js +0 -80
  842. package/vendor/ink/build/squash-text-nodes.d.ts +0 -3
  843. package/vendor/ink/build/squash-text-nodes.js +0 -36
  844. package/vendor/ink/build/squash-text-nodes.js.map +0 -1
  845. package/vendor/ink/build/styles.d.ts +0 -302
  846. package/vendor/ink/build/styles.js +0 -303
  847. package/vendor/ink/build/styles.js.map +0 -1
  848. package/vendor/ink/build/termio-keypress.js +0 -271
  849. package/vendor/ink/build/termio-tokenize.js +0 -188
  850. package/vendor/ink/build/utils.d.ts +0 -9
  851. package/vendor/ink/build/utils.js +0 -19
  852. package/vendor/ink/build/utils.js.map +0 -1
  853. package/vendor/ink/build/wrap-text.d.ts +0 -5
  854. package/vendor/ink/build/wrap-text.js +0 -204
  855. package/vendor/ink/build/wrap-text.js.map +0 -1
  856. package/vendor/ink/build/write-synchronized.d.ts +0 -4
  857. package/vendor/ink/build/write-synchronized.js +0 -9
  858. package/vendor/ink/build/write-synchronized.js.map +0 -1
  859. package/vendor/ink/license +0 -10
  860. package/vendor/ink/package.json +0 -137
  861. /package/src/runtime/office/{office-documents.mjs → core/office-documents.mjs} +0 -0
  862. /package/src/runtime/office/{pagination.mjs → core/pagination.mjs} +0 -0
  863. /package/src/runtime/office/{design-docx-components.mjs → design/docx/design-docx-components.mjs} +0 -0
  864. /package/src/runtime/office/{templates → design/library/templates}/mixdog-executive.pptx +0 -0
  865. /package/src/runtime/office/{templates → design/library/templates}/mixdog-executive.pptx.mixdog.json +0 -0
  866. /package/src/runtime/office/{image-layout.mjs → portable/image-layout.mjs} +0 -0
  867. /package/src/runtime/office/{portable-ooxml.mjs → portable/portable-ooxml.mjs} +0 -0
  868. /package/src/runtime/office/{portable-pptx-deck.mjs → portable/portable-pptx-deck.mjs} +0 -0
  869. /package/src/runtime/office/{portable-sheet-parts.mjs → portable/portable-sheet-parts.mjs} +0 -0
  870. /package/src/runtime/office/{portable-sheet-xml.mjs → portable/portable-sheet-xml.mjs} +0 -0
  871. /package/src/runtime/office/{visual-diff.mjs → quality/visual-diff.mjs} +0 -0
package/LICENSES/MIT.txt CHANGED
@@ -25,7 +25,7 @@ component listed here. Each component keeps its own copyright notice.
25
25
  https://github.com/BurntSushi/ripgrep
26
26
  Copyright (c) 2015 Andrew Gallant
27
27
 
28
- Ink (vendored under vendor/ink, which keeps its own license file)
28
+ Ink (patched runtime dependency; its package retains the upstream license)
29
29
  https://github.com/vadimdemedes/ink
30
30
  Copyright (c) Vadym Demedes <vadimdemedes@hey.com>
31
31
  Copyright (c) Sindre Sorhus <sindresorhus@gmail.com>
package/NOTICE.md CHANGED
@@ -82,7 +82,8 @@ MIT terms. The upstream notice is preserved as `LICENSES/ripgrep-NOTICE.txt`.
82
82
 
83
83
  ### Ink — Copyright (c) Vadim Demedes
84
84
 
85
- Vendored under `vendor/ink` together with its own license file.
85
+ Installed from Mixdog's patched Ink runtime release asset. The package retains
86
+ the upstream MIT license.
86
87
 
87
88
  ## Apache License 2.0
88
89
 
package/README.md CHANGED
@@ -259,7 +259,9 @@ npm start
259
259
 
260
260
  npm run smoke
261
261
  npm run smoke:all
262
- npm run test:tool-contracts
262
+ npm test # every *.test.mjs under src/ and scripts/
263
+ npm test -- src/runtime/memory # one directory
264
+ npm run test:slow # *.slow.test.mjs
263
265
  npm run build:tui
264
266
  npm run audit:models
265
267
  ```
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "mixdog",
3
- "version": "0.9.159",
3
+ "version": "0.9.161",
4
4
  "private": false,
5
5
  "type": "module",
6
6
  "description": "Standalone mixdog coding-agent CLI/TUI workspace.",
@@ -46,14 +46,16 @@
46
46
  "src/",
47
47
  "!src/tui/dev",
48
48
  "!src/**/*.test.mjs",
49
- "!src/**/*.test.jsx",
50
- "vendor/"
49
+ "!src/**/*.test.jsx"
51
50
  ],
52
51
  "scripts": {
53
52
  "postinstall": "node scripts/prune-embedding-runtime.mjs && node scripts/prepare-native-assets.mjs",
54
53
  "prepack": "npm run build:tui",
55
54
  "prepublishOnly": "node -e \"if(!process.env.CI){console.error('local npm publish is disabled — run npm run release:patch');process.exit(1)}\"",
56
55
  "start": "node src/cli.mjs",
56
+ "test": "node scripts/test.mjs",
57
+ "test:slow": "node scripts/test.mjs --lane slow",
58
+ "test:live": "node scripts/test.mjs --lane live",
57
59
  "smoke": "node scripts/smoke.mjs",
58
60
  "smoke:all": "npm run smoke && npm run smoke:boot && npm run smoke:patch && npm run smoke:compact",
59
61
  "smoke:boot": "node scripts/boot-smoke.mjs",
@@ -76,15 +78,24 @@
76
78
  "test:session-transport": "node --test \"scripts/session-transport/*.test.mjs\" scripts/daemon-bootstrap-test.mjs src/runtime/shared/child-spawn-remote.test.mjs src/standalone/session-runtime-agent-control-client.test.mjs src/standalone/session-runtime-dispatch-cancel.test.mjs src/standalone/session-runtime-host-factory.test.mjs src/standalone/session-runtime-inline-host.test.mjs src/standalone/session-runtime-provider-cooldown.test.mjs src/standalone/session-runtime-shard-host.test.mjs src/standalone/session-runtime-shard-router.test.mjs",
77
79
  "test:session": "node --test scripts/runtime-turn-contract-test.mjs scripts/session-save-fault-store-test.mjs scripts/turn-review-revert-test.mjs src/runtime/shared/tool-surface.test.mjs src/runtime/bridge-clients.test.mjs src/runtime/computer-bridge/client-semantic-error.test.mjs src/runtime/agent/orchestrator/session/tool-envelope.test.mjs src/runtime/agent/orchestrator/session/eager-dispatch.test.mjs",
78
80
  "test:quick": "npm run test:session && npm run test:session-transport && npm run test:desktop-main --prefix apps/desktop",
79
- "test:office": "node --test scripts/run-office-live-tests.test.mjs src/runtime/office/office-runtime.test.mjs src/runtime/office/office-assurance.test.mjs src/runtime/office/portable-authoring.test.mjs src/runtime/office/slide-quality.test.mjs && npm run test:office-approval --prefix apps/desktop",
81
+ "test:office": "node --test scripts/run-office-live-tests.test.mjs src/runtime/office/office-runtime-contract.test.mjs src/runtime/office/office-runtime-com.test.mjs src/runtime/office/office-runtime-portable.test.mjs src/runtime/office/xlsx-formula-audit.test.mjs src/runtime/office/xlsx-portable-snapshot.test.mjs src/runtime/office/office-runtime-pdf.test.mjs src/runtime/office/office-runtime-design.test.mjs src/runtime/office/office-assurance.test.mjs src/runtime/office/office-design-aesthetics.test.mjs src/runtime/office/portable-authoring.test.mjs src/runtime/office/slide-quality.test.mjs src/runtime/office/authoring/pptx-brief.test.mjs src/runtime/office/authoring/pptx-receipt.test.mjs src/runtime/office/quality/render-air.test.mjs src/runtime/office/quality/pptx-deck-rubric.test.mjs && npm run test:office-approval --prefix apps/desktop",
80
82
  "test:office:live": "node scripts/run-office-live-tests.mjs",
83
+ "test:office:preview": "node --test src/runtime/office/office-render-preview.test.mjs",
84
+ "test:office:review": "node --test src/runtime/office/pptx-independent-review.test.mjs src/runtime/office/pptx-chart-styling.test.mjs",
85
+ "test:office:cleanup": "node --test src/runtime/office/com/office-cleanup.test.mjs src/runtime/office/office-runtime-com.test.mjs",
86
+ "test:office:compat": "node scripts/run-office-live-tests.mjs compat",
87
+ "test:office:live:all": "node scripts/run-office-live-tests.mjs all",
88
+ "test:office:render": "node --test src/runtime/office/pptx-skill-kit.slow.test.mjs",
89
+ "office:icons": "node scripts/office/build-pptx-icons.mjs",
81
90
  "test:media": "node --test src/runtime/media/store.test.mjs src/runtime/media/renditions.test.mjs src/runtime/media/adapters/codex-image.test.mjs",
82
91
  "failures": "node scripts/tool-failures.mjs",
83
92
  "trace:llm": "node scripts/llm-trace-summary.mjs",
84
- "bench:office": "node src/runtime/office/benchmark.mjs",
85
- "bench:office:contract": "node src/runtime/office/contract-benchmark.mjs",
86
- "bench:office:assurance": "node src/runtime/office/assurance-benchmark.mjs",
87
- "bench:office:quality:live": "node src/runtime/office/quality-live-benchmark.mjs",
93
+ "bench:office": "node src/runtime/office/bench/benchmark.mjs",
94
+ "bench:office:contract": "node src/runtime/office/bench/contract-benchmark.mjs",
95
+ "bench:office:assurance": "node src/runtime/office/bench/assurance-benchmark.mjs",
96
+ "bench:office:polish": "node src/runtime/office/bench/polish-benchmark.mjs",
97
+ "bench:office:deck": "node src/runtime/office/bench/deck-bench.mjs",
98
+ "bench:office:quality:live": "node src/runtime/office/bench/quality-live-benchmark.mjs",
88
99
  "diag:sessions": "node scripts/session-diag.mjs",
89
100
  "diag:tools": "node scripts/tool-efficiency-diag.mjs",
90
101
  "diag:sweep": "node scripts/session-sweep.mjs",
@@ -138,7 +149,7 @@
138
149
  "chalk": "^5.6.2",
139
150
  "cli-highlight": "^2.1.11",
140
151
  "diff": "^9.0.0",
141
- "ink": "^7.1.0",
152
+ "ink": "https://github.com/tribgames/mixdog/releases/download/ink-runtime-v7.1.0-mixdog.1/ink-7.1.0.tgz",
142
153
  "jsdom": "^27.0.0",
143
154
  "jszip": "^3.10.1",
144
155
  "marked": "^14.1.4",
@@ -148,6 +159,7 @@
148
159
  "pdf-lib": "^1.17.1",
149
160
  "pdfjs-dist": "^6.2.108",
150
161
  "pg": "^8.22.0",
162
+ "pptxgenjs": "^4.0.1",
151
163
  "puppeteer-core": "^25.2.0",
152
164
  "react": "^19.2.7",
153
165
  "sharp": "^0.35.3",
@@ -171,10 +183,8 @@
171
183
  "devDependencies": {
172
184
  "acorn": "^8.17.0",
173
185
  "esbuild": "^0.28.1",
174
- "eslint-scope": "^9.1.2"
175
- },
176
- "optionalDependencies": {
177
- "@vscode/ripgrep": "^1.18.0"
186
+ "eslint-scope": "^9.1.2",
187
+ "lucide-static": "^1.41.0"
178
188
  },
179
189
  "main": "index.js",
180
190
  "directories": {
@@ -8,8 +8,7 @@
8
8
  *
9
9
  * What is bundled vs external:
10
10
  * - bundled: our JSX only.
11
- * - external: React and Mixdog's checked-in Ink renderer.
12
- * Ink is loaded from vendor/ink directly, never by rewriting node_modules.
11
+ * - external: React and Mixdog's patched Ink runtime dependency.
13
12
  *
14
13
  * Run: node scripts/build-tui.mjs (or `npm run build:tui`)
15
14
  */
@@ -19,17 +18,6 @@ import { fileURLToPath } from 'node:url';
19
18
 
20
19
  const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
21
20
  const SRC = join(ROOT, 'src', 'tui');
22
- const DIST_TO_VENDOR_INK = '../../../vendor/ink/build/index.js';
23
-
24
- const mixdogInkAliasPlugin = {
25
- name: 'mixdog-ink-alias',
26
- setup(build) {
27
- build.onResolve({ filter: /^ink$/ }, () => ({
28
- path: DIST_TO_VENDOR_INK,
29
- external: true,
30
- }));
31
- },
32
- };
33
21
 
34
22
  const sharedRuntimeExternalPlugin = {
35
23
  name: 'mixdog-shared-runtime-external',
@@ -65,8 +53,6 @@ await build({
65
53
  // helpers are bundled so relative paths stay valid from src/tui/dist/.
66
54
  // Process shutdown stays external so the CLI and checked-in TUI bundle use
67
55
  // the same process-global lifecycle state.
68
- // Only `ink` is redirected to Mixdog's checked-in renderer instead of
69
- // node_modules/ink.
70
56
  packages: 'external',
71
57
  // Bundled CJS helpers (e.g. src/lib/mixdog-debug.cjs) compile to esbuild's
72
58
  // __require shim, which throws "Dynamic require of ..." in plain ESM.
@@ -88,7 +74,6 @@ await build({
88
74
  '../../runtime/channels/lib/whisper-server.mjs',
89
75
  ],
90
76
  plugins: [
91
- mixdogInkAliasPlugin,
92
77
  sharedRuntimeExternalPlugin,
93
78
  sessionClientExternalPlugin,
94
79
  ],
@@ -0,0 +1,22 @@
1
+ export async function completeToolConversation({ send, messages, tools, executeTool, maxSteps = 8 }) {
2
+ const transcript = [...messages];
3
+ for (let step = 0; step < maxSteps; step++) {
4
+ const result = await send(transcript, tools);
5
+ if (result.truncated) throw new Error(`Tool conversation was truncated: ${JSON.stringify(result).slice(0, 2000)}`);
6
+ if (!result.toolCalls?.length) return { result, toolSteps: step };
7
+ transcript.push({ role: 'assistant', content: result.content,
8
+ toolCalls: result.toolCalls, reasoningContent: result.reasoningContent });
9
+ for (const tool of result.toolCalls) {
10
+ transcript.push({ role: 'tool', toolCallId: tool.id, content: await executeTool(tool) });
11
+ }
12
+ }
13
+ throw new Error(`Tool conversation exceeded its ${maxSteps}-step bound`);
14
+ }
15
+
16
+ export function assertResponseContains(result, expected) {
17
+ if (typeof result?.content !== 'string' || !result.content.includes(expected)) {
18
+ throw new Error(`Model response did not include ${JSON.stringify(expected)}: ${JSON.stringify({
19
+ content: result?.content, toolCalls: result?.toolCalls, stopReason: result?.stopReason, truncated: result?.truncated,
20
+ }).slice(0, 3000)}`);
21
+ }
22
+ }
@@ -0,0 +1,38 @@
1
+ // Secondary node:test reporter: per-file wall time, slowest files first.
2
+ // Runs beside the spec reporter (scripts/test.mjs) so a slow default lane
3
+ // always names its cause instead of hiding it inside one total. A file over
4
+ // SLOW_HINT_MS belongs in the slow lane (rename to *.slow.test.mjs).
5
+ import { relative } from 'node:path';
6
+
7
+ const SLOW_HINT_MS = 10_000;
8
+ const TOP = 8;
9
+
10
+ // Each test file runs in its own process; its top-level tests arrive as
11
+ // nesting-0 events tagged with the file, so a file's time is the sum of its
12
+ // top-level test durations (module load excluded).
13
+ export default async function* timingReporter(source) {
14
+ const byFile = new Map();
15
+ for await (const event of source) {
16
+ if (event.type !== 'test:pass' && event.type !== 'test:fail') continue;
17
+ if (event.data.nesting !== 0 || !event.data.file) continue;
18
+ const file = relative(process.cwd(), String(event.data.file)).replaceAll('\\', '/');
19
+ const entry = byFile.get(file) ?? { file, ms: 0, failed: false };
20
+ entry.ms += Number(event.data.details?.duration_ms) || 0;
21
+ entry.failed ||= event.type === 'test:fail';
22
+ byFile.set(file, entry);
23
+ }
24
+ const files = [...byFile.values()];
25
+ if (files.length === 0) return;
26
+ files.sort((a, b) => b.ms - a.ms);
27
+ const total = files.reduce((sum, entry) => sum + entry.ms, 0);
28
+ const lines = [
29
+ '',
30
+ `slowest files (${files.length} files, ${(total / 1000).toFixed(1)}s file-time):`,
31
+ ...files.slice(0, TOP).map((entry) => ` ${String(Math.round(entry.ms)).padStart(7)}ms ${entry.file}${entry.failed ? ' (failed)' : ''}`),
32
+ ];
33
+ const slow = files.filter((entry) => entry.ms >= SLOW_HINT_MS && !/\.(?:slow|live)\.test\.mjs$/.test(entry.file));
34
+ if (slow.length) {
35
+ lines.push(` ${slow.length} file(s) over ${SLOW_HINT_MS / 1000}s in the default lane; rename to *.slow.test.mjs to move them out.`);
36
+ }
37
+ yield `${lines.join('\n')}\n`;
38
+ }
@@ -0,0 +1,141 @@
1
+ // Explicit live acceptance runner. It uses an existing owner process only:
2
+ // no server launch, unload, app restart, download, or real tool side effects.
3
+ import assert from 'node:assert/strict';
4
+ import { execFile } from 'node:child_process';
5
+ import { promisify } from 'node:util';
6
+ import { mkdirSync, writeFileSync } from 'node:fs';
7
+ import { dirname, resolve } from 'node:path';
8
+ import { setTimeout as delay } from 'node:timers/promises';
9
+ import { MixdogLocalProvider } from '../src/runtime/agent/orchestrator/providers/mixdog-local.mjs';
10
+ import { recordLocalModelLoad, localModelState } from '../src/runtime/local-provider/model-state.mjs';
11
+ import { completeToolConversation, assertResponseContains } from './lib/local-provider-live-scenarios.mjs';
12
+
13
+ const flags = Object.fromEntries(process.argv.slice(2).map((arg) => {
14
+ const [key, ...rest] = arg.replace(/^--/, '').split('=');
15
+ return [key, rest.join('=')];
16
+ }));
17
+ const pid = Number(flags.pid);
18
+ const durationSeconds = Number(flags.seconds || 600);
19
+ const targetCycles = flags.cycles ? Number(flags.cycles) : null;
20
+ const selectedCase = flags.case || null;
21
+ const cases = ['long-context', 'multi-turn', 'tool-roundtrip', 'concurrent-queue', 'cancel-and-recover'];
22
+ if (!Number.isInteger(pid) || pid <= 0 || !Number.isInteger(durationSeconds) || durationSeconds < 600
23
+ || (targetCycles !== null && (!Number.isInteger(targetCycles) || targetCycles < 1 || targetCycles > 100))
24
+ || (selectedCase && !cases.includes(selectedCase))) {
25
+ throw new Error('Explicit --pid and --seconds>=600 are required; optional --cycles=1..100 and --case select a bounded follow-up.');
26
+ }
27
+ const reportPath = resolve(flags.report || '.runtime/local-provider-live/report.json');
28
+ const exec = promisify(execFile);
29
+ const { stdout } = await exec('powershell', ['-NoProfile', '-NonInteractive', '-Command',
30
+ `(Get-CimInstance Win32_Process -Filter 'ProcessId = ${pid}').CommandLine`], { windowsHide: true, maxBuffer: 128 * 1024 });
31
+ const line = stdout.trim();
32
+ if (!/llama-server\.exe/i.test(line)) throw new Error('The supplied process is not llama-server.');
33
+ const argument = (name) => {
34
+ const match = new RegExp(`--${name}\\s+(?:"([^"]+)"|(\\S+))`).exec(line);
35
+ return match?.[1] || match?.[2] || '';
36
+ };
37
+ const port = Number(argument('port')), apiKey = argument('api-key'), model = argument('alias');
38
+ if (!Number.isInteger(port) || !apiKey || !model) throw new Error('Required local server arguments are unavailable.');
39
+ const baseURL = `http://127.0.0.1:${port}/v1`;
40
+ const headers = { Authorization: `Bearer ${apiKey}` };
41
+ const propsResponse = await fetch(`http://127.0.0.1:${port}/props`, { headers, signal: AbortSignal.timeout(10_000) });
42
+ if (!propsResponse.ok) throw new Error(`Local props HTTP ${propsResponse.status}`);
43
+ recordLocalModelLoad(model, await propsResponse.json(), null);
44
+ const provider = new MixdogLocalProvider({}, { ensureServer: async () => ({ baseURL, apiKey }) });
45
+ const report = { startedAt: new Date().toISOString(), pid, model, durationSeconds, targetCycles, selectedCase, busySkips: 0, cases: [], failures: [] };
46
+ const started = Date.now();
47
+ const persist = () => {
48
+ mkdirSync(dirname(reportPath), { recursive: true });
49
+ writeFileSync(reportPath, JSON.stringify(report, null, 2) + '\n');
50
+ };
51
+ const send = (messages, tools = [], options = {}) => provider.send(messages, model, tools, {
52
+ maxOutputTokens: 2048, ...options,
53
+ signal: options.signal ? AbortSignal.any([options.signal, AbortSignal.timeout(120_000)]) : AbortSignal.timeout(120_000),
54
+ });
55
+ async function check(name, action) {
56
+ if (selectedCase && name.replace(/-\d+$/, '') !== selectedCase) return;
57
+ const at = Date.now();
58
+ try {
59
+ const detail = await action();
60
+ report.cases.push({ name, ok: true, elapsedMs: Date.now() - at, metrics: localModelState(model).inference, detail });
61
+ console.log(`PASS ${name} ${Date.now() - at}ms`);
62
+ } catch (error) {
63
+ const failure = { name, elapsedMs: Date.now() - at, error: String(error?.message || error) };
64
+ report.failures.push(failure);
65
+ console.log(`FAIL ${name}: ${failure.error}`);
66
+ }
67
+ persist();
68
+ }
69
+ let cycle = 0;
70
+ try {
71
+ while (targetCycles !== null ? cycle < targetCycles : Date.now() - started < durationSeconds * 1000 || cycle < 2) {
72
+ if (Date.now() - started > (durationSeconds + 600) * 1000) throw new Error('Live acceptance exceeded its bounded completion window.');
73
+ const slotsResponse = await fetch(`http://127.0.0.1:${port}/slots`, { headers, signal: AbortSignal.timeout(10_000) });
74
+ if (!slotsResponse.ok) throw new Error(`Cannot establish server idleness: HTTP ${slotsResponse.status}`);
75
+ const slots = await slotsResponse.json();
76
+ if (!Array.isArray(slots)) throw new Error('Invalid server slots response');
77
+ if (slots.some((slot) => slot.is_processing)) { report.busySkips++; await delay(2000); continue; }
78
+ cycle++;
79
+ await check(`long-context-${cycle}`, async () => {
80
+ const records = Array.from({ length: 768 }, (_, index) => `Record ${index}: stored value is entry-${index}-copper.`);
81
+ const result = await send([{ role: 'user', content: `${records.join('\n')}\nWhat is the exact stored value of Record 731? Reply with that value only.` }]);
82
+ assert.ok(result.content.includes('entry-731-copper'));
83
+ });
84
+ await check(`multi-turn-${cycle}`, async () => {
85
+ const marker = `marker-${cycle}-amber`;
86
+ const messages = [{ role: 'system', content: 'Answer concisely and accurately.' },
87
+ { role: 'system', content: 'This conversation uses short factual answers.' },
88
+ { role: 'user', content: `Remember this marker for the next question: ${marker}. Briefly acknowledge it.` }];
89
+ const first = await send(messages);
90
+ assert.ok(first.content);
91
+ messages.push({ role: 'assistant', content: first.content, reasoningContent: first.reasoningContent });
92
+ messages.push({ role: 'user', content: 'What was the exact marker? Reply with the marker only.' });
93
+ assert.ok((await send(messages)).content.includes(marker));
94
+ });
95
+ await check(`tool-roundtrip-${cycle}`, async () => {
96
+ const tools = [{ name: 'read_probe_value', description: 'Read the current test value for a named field.',
97
+ inputSchema: { type: 'object', properties: { field: { type: 'string', enum: ['marker'] } }, required: ['field'], additionalProperties: false } }];
98
+ const messages = [{ role: 'user', content: 'Use read_probe_value to read the marker field. Then tell me its returned value.' }];
99
+ const completed = await completeToolConversation({ send, messages, tools, executeTool: async (tool) => {
100
+ assert.equal(tool.name, 'read_probe_value');
101
+ assert.equal(tool.arguments.field, 'marker');
102
+ return `probe-value-${cycle}`;
103
+ } });
104
+ assert.ok(completed.toolSteps > 0, `Model did not use the offered tool: ${JSON.stringify(completed.result).slice(0, 2000)}`);
105
+ assertResponseContains(completed.result, `probe-value-${cycle}`);
106
+ return { toolSteps: completed.toolSteps };
107
+ });
108
+ await check(`concurrent-queue-${cycle}`, async () => {
109
+ const results = await Promise.all([
110
+ send([{ role: 'user', content: 'What is 7 plus 8? Reply with just the result.' }]),
111
+ send([{ role: 'user', content: 'What is 12 minus 5? Reply with just the result.' }]),
112
+ ]);
113
+ assert.match(results[0].content, /15/);
114
+ assert.match(results[1].content, /7/);
115
+ });
116
+ await check(`cancel-and-recover-${cycle}`, async () => {
117
+ const controller = new AbortController();
118
+ let emitted = false;
119
+ await assert.rejects(send([{ role: 'user', content: 'Explain the tradeoffs between caching, memory consumption, and request scheduling in a local inference server.' }], [], {
120
+ signal: controller.signal,
121
+ onStreamDelta(kind) {
122
+ if (kind !== 'transport' && !emitted) { emitted = true; controller.abort(new Error('live check cancellation')); }
123
+ },
124
+ }));
125
+ assert.equal(emitted, true);
126
+ const recovered = await send([{ role: 'user', content: 'Reply with exactly RECOVERED.' }]);
127
+ assert.match(recovered.content, /RECOVERED/);
128
+ });
129
+ }
130
+ } catch (error) {
131
+ report.failures.push({ name: 'runner', error: String(error?.message || error) });
132
+ }
133
+ report.finishedAt = new Date().toISOString();
134
+ report.elapsedMs = Date.now() - started;
135
+ report.cycles = cycle;
136
+ report.passed = report.failures.length === 0 && cycle >= (targetCycles || 2);
137
+ report.scope = 'Existing model process; long-running multi-turn/tool/queue/cancel recovery. No OS sleep, app restart, model reload or new model installation.';
138
+ persist();
139
+ console.log(JSON.stringify({ reportPath, passed: report.passed, cycles: cycle, elapsedMs: report.elapsedMs,
140
+ failures: report.failures.length, maxToolSteps: Math.max(0, ...report.cases.map((entry) => entry.detail?.toolSteps || 0)) }));
141
+ if (!report.passed) process.exitCode = 1;
@@ -0,0 +1,59 @@
1
+ // Stage a rendered deck for SlidesGen-Bench's aesthetics metrics (refs/slidesgen-bench/eval/aesthetics_metrics.py):
2
+ // node scripts/office/aesthetics-probe.mjs <deck.pptx> <page-image-prefix> <out-dir>
3
+ // Copies <prefix>-page-N.png into <out-dir>/slide_images/slide_000N.png and writes the deck's own text-box geometry
4
+ // into <out-dir>/detection/slide_000N.json in the benchmark's layout-detection format ({ boxes: [{ label, coordinate }] }),
5
+ // so the figure-ground contrast (Usability) metric reads text regions from the file the way the benchmark reads its
6
+ // PaddleOCR output — the geometry comes from the saved deck, not from a detector. Then:
7
+ // python eval/aesthetics_metrics.py <out-dir>/slide_images --compute-score --config eval/aesthetics_config.json --no-parallel -o <result.json>
8
+ import { copyFile, mkdir, writeFile } from 'node:fs/promises';
9
+ import { join, resolve } from 'node:path';
10
+ import sharp from 'sharp';
11
+ import { snapshotPortableOoxml } from '../../src/runtime/office/portable/portable-snapshot.mjs';
12
+ import { measureTextBlock } from '../../src/runtime/office/portable/text-metrics.mjs';
13
+
14
+ // A detector's box hugs the glyphs; a kit box is often wider than its text (a kicker in a 6 in box, a source line,
15
+ // a hero label). Width is tightened to the measured text so the contrast reads the type, not the empty paper beside
16
+ // it; height is kept, since the snapshot does not say where in the box the text is anchored.
17
+ function tightWidth(shape) {
18
+ if (shape.table) return shape.width;
19
+ const size = Number(shape.font?.size) || 18;
20
+ const measured = measureTextBlock([{ text: String(shape.text), fontName: shape.font?.name || 'Noto Sans KR', fontSize: size, bold: Boolean(shape.font?.bold) }], { width: shape.width });
21
+ return Math.min(shape.width, Math.max(size, measured.width + 4));
22
+ }
23
+
24
+ const [deck, prefix, out] = process.argv.slice(2);
25
+ if (!deck || !prefix || !out) {
26
+ console.error('usage: node scripts/office/aesthetics-probe.mjs <deck.pptx> <page-image-prefix> <out-dir>');
27
+ process.exit(1);
28
+ }
29
+ const CANVAS = { width: 960, height: 540 }; // 13.33 × 7.5 in, in points — the snapshot's unit
30
+ const snapshot = await snapshotPortableOoxml(resolve(deck), 'pptx', {});
31
+ const slides = snapshot?.slides || snapshot?.document?.slides || [];
32
+ if (!slides.length) throw new Error(`no slides read from ${deck}`);
33
+ await mkdir(join(out, 'slide_images'), { recursive: true });
34
+ await mkdir(join(out, 'detection'), { recursive: true });
35
+ let total = 0;
36
+ for (const slide of slides) {
37
+ const stem = `slide_${String(slide.index).padStart(4, '0')}`;
38
+ const source = `${prefix}-page-${slide.index}.png`;
39
+ const target = join(out, 'slide_images', `${stem}.png`);
40
+ await copyFile(source, target);
41
+ const { width, height } = await sharp(target).metadata();
42
+ const sx = width / CANVAS.width, sy = height / CANVAS.height;
43
+ // Text carriers only: text boxes and native tables. Charts draw their own labels; pictures and fields carry none.
44
+ const boxes = (slide.shapes || [])
45
+ .filter((shape) => String(shape.text || '').trim() && !shape.chart && [shape.left, shape.top, shape.width, shape.height].every(Number.isFinite))
46
+ .map((shape) => ({
47
+ label: 'text',
48
+ score: 1,
49
+ coordinate: [
50
+ Math.max(0, Math.round(shape.left * sx)), Math.max(0, Math.round(shape.top * sy)),
51
+ Math.min(width, Math.round((shape.left + tightWidth(shape)) * sx)), Math.min(height, Math.round((shape.top + shape.height) * sy)),
52
+ ],
53
+ }))
54
+ .filter((box) => box.coordinate[2] - box.coordinate[0] > 2 && box.coordinate[3] - box.coordinate[1] > 2);
55
+ await writeFile(join(out, 'detection', `${stem}.json`), JSON.stringify({ source: 'pptx-snapshot', image: `${stem}.png`, boxes }, null, 2));
56
+ total += boxes.length;
57
+ console.log(`${stem}: ${boxes.length} text regions (${width}×${height})`);
58
+ }
59
+ console.log(`${slides.length} pages staged under ${out} with ${total} text regions`);
@@ -0,0 +1,56 @@
1
+ // Author a deck from the working tree's office runtime (the installed app runs its own copy):
2
+ // node scripts/office/author-deck.mjs <script.js> <deck.pptx> [--mode portable|auto] [--render] [--critique critique.json] [--out result.json]
3
+ // author (measured, no render) → qa → measured issues; --render adds the page images, contact sheet, receipt,
4
+ // and reviewToken; --critique finalizes with the critique file (its reviewToken is filled from the render).
5
+ import { readFile, writeFile } from 'node:fs/promises';
6
+ import { resolve } from 'node:path';
7
+ import { executeOfficeTool } from '../../src/runtime/office/index.mjs';
8
+ import { isAdvisoryOfficeIssue } from '../../src/runtime/office/quality/quality-pipeline.mjs';
9
+
10
+ const value = (result) => JSON.parse(result.content[0].text);
11
+ const argv = process.argv.slice(2);
12
+ const flag = (name) => { const at = argv.indexOf(name); return at >= 0 ? argv[at + 1] : null; };
13
+ const positional = argv.filter((arg, index) => !arg.startsWith('--') && !(index > 0 && argv[index - 1].startsWith('--') && !['--render'].includes(argv[index - 1])));
14
+ const [scriptPath, deckPath] = positional;
15
+ if (!scriptPath || !deckPath) {
16
+ console.error('usage: node scripts/office/author-deck.mjs <script.js> <deck.pptx> [--mode portable|auto] [--render] [--critique critique.json] [--out result.json]');
17
+ process.exit(1);
18
+ }
19
+ const cwd = resolve('.');
20
+ const script = await readFile(scriptPath, 'utf8');
21
+ const mode = flag('--mode') || 'portable';
22
+ const authored = value(await executeOfficeTool({ action: 'author', path: deckPath, script, mode, overwrite: true, render: false }, { cwd }));
23
+ if (!authored.ok) {
24
+ console.error(`author failed: ${authored.error?.message}\n line ${authored.error?.line}\n${authored.error?.excerpt || ''}`);
25
+ process.exit(2);
26
+ }
27
+ const session = authored.session;
28
+ console.log(`authored ${deckPath} (${authored.backend}, kit ${authored.kit}, gradients ${authored.nativeGradients || 0}, ${authored.elapsedMs} ms)`);
29
+ const qa = value(await executeOfficeTool({ action: 'qa', session, render: false }, { cwd }));
30
+ const issues = (qa.issuesAfter || qa.issues || []);
31
+ const measured = issues.filter((issue) => !isAdvisoryOfficeIssue(issue));
32
+ console.log(`qa: ${measured.length} measured, ${issues.length - measured.length} advisory`);
33
+ for (const issue of issues) console.log(` ${measured.includes(issue) ? '!' : '·'} ${issue.code} ${issue.path || ''} ${issue.message || ''}`);
34
+ const result = { deck: deckPath, session, authored: { kit: authored.kit, nativeGradients: authored.nativeGradients || 0, bytes: authored.bytes }, issues };
35
+ if (argv.includes('--render') || flag('--critique')) {
36
+ const rendered = value(await executeOfficeTool({ action: 'render', session }, { cwd }));
37
+ result.render = { output: rendered.output, pageCount: rendered.pageCount, reviewToken: rendered.reviewToken, images: (rendered.images || []).map((image) => image.path), contactSheet: rendered.contactSheet?.path || rendered.contactSheet };
38
+ result.receipt = rendered.receipt;
39
+ console.log(`rendered ${rendered.pageCount} pages → ${rendered.output}`);
40
+ for (const image of rendered.images || []) console.log(` page ${image.page}: ${image.path}`);
41
+ if (rendered.contactSheet?.path) console.log(` contact sheet: ${rendered.contactSheet.path}`);
42
+ if (rendered.receipt?.deck?.rhythm) console.log(` rhythm: ${JSON.stringify(rendered.receipt.deck.rhythm)}`);
43
+ }
44
+ const critiquePath = flag('--critique');
45
+ if (critiquePath) {
46
+ const critique = JSON.parse(await readFile(critiquePath, 'utf8'));
47
+ const finalized = value(await executeOfficeTool({ action: 'finalize', session, design: { reviewed: true, reviewToken: result.render.reviewToken, critique } }, { cwd }));
48
+ result.finalize = finalized;
49
+ console.log(`finalize: ${finalized.ok ? 'ok' : 'blocked'} ${JSON.stringify(finalized.summary || finalized.reason || finalized.issues?.slice(0, 5) || '')}`);
50
+ if (!finalized.ok) for (const issue of finalized.issues || []) console.log(` ! ${issue.code} ${issue.path || ''} ${issue.message || ''}`);
51
+ } else {
52
+ await executeOfficeTool({ action: 'close', session, save: false }, { cwd }).catch(() => {});
53
+ }
54
+ const out = flag('--out');
55
+ if (out) await writeFile(out, JSON.stringify(result, null, 2));
56
+ process.exit(critiquePath && !result.finalize?.ok ? 3 : measured.length ? 4 : 0);
@@ -0,0 +1,48 @@
1
+ // Builds the offline icon set the pptx authoring runtime injects as ICON(name):
2
+ // a curated subset of Lucide (ISC) read from the lucide-static dev dependency,
3
+ // stored as the icons' inner SVG markup so the kit can render them at any color.
4
+ // node scripts/office/build-pptx-icons.mjs
5
+ import { readFile, writeFile } from 'node:fs/promises';
6
+ import { createRequire } from 'node:module';
7
+ import { dirname, join } from 'node:path';
8
+ import { fileURLToPath } from 'node:url';
9
+
10
+ const require = createRequire(import.meta.url);
11
+ const root = dirname(require.resolve('lucide-static/package.json'));
12
+ const { version, license } = JSON.parse(await readFile(join(root, 'package.json'), 'utf8'));
13
+ const out = join(dirname(fileURLToPath(import.meta.url)), '../../src/runtime/office/authoring/pptx-icons.json');
14
+
15
+ // One line per family so a reader can see what the deck can reach for. Names are Lucide's.
16
+ export const ICON_NAMES = [
17
+ // direction and process
18
+ 'arrow-right', 'arrow-left', 'arrow-up', 'arrow-down', 'arrow-up-right', 'arrow-down-right', 'move-right', 'chevron-right', 'chevrons-right', 'corner-down-right', 'repeat', 'refresh-cw', 'rotate-cw', 'route', 'workflow', 'git-branch', 'git-merge', 'git-fork', 'milestone', 'flag', 'goal', 'target', 'crosshair', 'compass', 'map', 'map-pin', 'navigation', 'footprints', 'play', 'pause', 'square', 'circle', 'timer', 'hourglass', 'clock', 'calendar', 'calendar-check', 'history',
19
+ // data and evidence
20
+ 'bar-chart-3', 'bar-chart-4', 'chart-bar', 'chart-column', 'chart-line', 'chart-pie', 'chart-area', 'chart-scatter', 'chart-no-axes-combined', 'trending-up', 'trending-down', 'activity', 'gauge', 'percent', 'hash', 'sigma', 'table', 'table-2', 'database', 'server', 'hard-drive', 'file-text', 'file-check', 'file-search', 'file-bar-chart', 'clipboard-list', 'clipboard-check', 'list-checks', 'list-ordered', 'scale', 'ruler', 'binary', 'calculator',
21
+ // people and organisation
22
+ 'user', 'users', 'user-check', 'user-plus', 'user-round', 'users-round', 'contact', 'building', 'building-2', 'factory', 'landmark', 'store', 'briefcase', 'handshake', 'crown', 'award', 'medal', 'trophy', 'graduation-cap', 'presentation', 'megaphone', 'speech', 'message-circle', 'message-square', 'messages-square', 'mail', 'phone', 'headphones', 'mic', 'vote', 'heart-handshake',
23
+ // money and value
24
+ 'coins', 'banknote', 'wallet', 'credit-card', 'piggy-bank', 'receipt', 'shopping-cart', 'shopping-bag', 'tag', 'tags', 'ticket', 'badge-dollar-sign', 'circle-dollar-sign', 'dollar-sign', 'euro', 'landmark',
25
+ // technology and product
26
+ 'cpu', 'microchip', 'circuit-board', 'bot', 'brain', 'brain-circuit', 'sparkles', 'wand-2', 'code', 'code-2', 'terminal', 'braces', 'bug', 'cloud', 'cloud-upload', 'cloud-download', 'wifi', 'radio', 'satellite', 'smartphone', 'tablet', 'laptop', 'monitor', 'tv', 'camera', 'image', 'video', 'layers', 'layout-grid', 'layout-dashboard', 'component', 'boxes', 'box', 'package', 'container', 'plug', 'zap', 'battery-charging', 'settings', 'settings-2', 'sliders-horizontal', 'wrench', 'hammer', 'cog', 'puzzle', 'blocks', 'link', 'unlink', 'globe', 'network', 'share-2',
27
+ // safety, status, judgement
28
+ 'check', 'check-check', 'circle-check', 'circle-x', 'x', 'circle-alert', 'triangle-alert', 'octagon-alert', 'info', 'circle-help', 'shield', 'shield-check', 'shield-alert', 'lock', 'lock-open', 'key', 'key-round', 'eye', 'eye-off', 'fingerprint', 'scan', 'search', 'filter', 'thumbs-up', 'thumbs-down', 'star', 'heart', 'bookmark', 'bell', 'siren', 'life-buoy', 'ban', 'minus', 'plus', 'equal', 'lightbulb', 'flame', 'rocket', 'anchor', 'scale-3d',
29
+ // nature, place, matter
30
+ 'sun', 'moon', 'cloud-rain', 'snowflake', 'wind', 'droplet', 'leaf', 'sprout', 'trees', 'mountain', 'waves', 'earth', 'recycle', 'thermometer', 'home', 'warehouse', 'truck', 'ship', 'plane', 'train-front', 'car', 'bike', 'fuel', 'utensils', 'coffee', 'pill', 'stethoscope', 'heart-pulse', 'syringe', 'dna', 'atom', 'flask-conical', 'microscope', 'book-open', 'library', 'pen-line', 'pencil', 'paintbrush', 'palette', 'scissors', 'shapes', 'type', 'quote', 'gem', 'gift', 'umbrella', 'infinity', 'orbit',
31
+ ];
32
+
33
+ const icons = {};
34
+ const missing = [];
35
+ for (const name of [...new Set(ICON_NAMES)]) {
36
+ let svg;
37
+ try { svg = await readFile(join(root, 'icons', `${name}.svg`), 'utf8'); } catch { missing.push(name); continue; }
38
+ const inner = svg.replace(/<!--[\s\S]*?-->/g, '').replace(/^[\s\S]*?<svg\b[^>]*>/, '').replace(/<\/svg>\s*$/, '')
39
+ .replace(/\s+/g, ' ').replace(/> </g, '><').trim();
40
+ if (!inner) { missing.push(name); continue; }
41
+ icons[name] = inner;
42
+ }
43
+ if (missing.length) {
44
+ console.error(`missing in lucide-static ${version}: ${missing.join(', ')}`);
45
+ process.exit(1);
46
+ }
47
+ await writeFile(out, `${JSON.stringify({ source: 'lucide-static', version, license, viewBox: '0 0 24 24', stroke: true, icons }, null, 0)}\n`);
48
+ console.log(`${Object.keys(icons).length} icons → ${out}`);
@@ -2,7 +2,7 @@ import { readFile } from 'node:fs/promises';
2
2
  import { basename, resolve } from 'node:path';
3
3
  import { pathToFileURL } from 'node:url';
4
4
 
5
- import { reviewRenderedOfficePages } from '../src/runtime/office/assurance.mjs';
5
+ import { reviewRenderedOfficePages } from '../src/runtime/office/quality/assurance.mjs';
6
6
 
7
7
  function argumentValue(name) {
8
8
  const index = process.argv.indexOf(name);
@@ -0,0 +1,34 @@
1
+ import { resolve } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+
4
+ const defaultTestPath = fileURLToPath(new URL('../src/runtime/office/office-live-runtime.test.mjs', import.meta.url));
5
+ export const liveProfiles = Object.freeze(['excel', 'word', 'powerpoint', 'author', 'attach', 'contract', 'compat', 'all']);
6
+
7
+ export const liveTestHelp = `실제 Office 검증은 실행 범위를 지정해 주세요.
8
+ npm run test:office:live -- <excel|word|powerpoint|author|attach|contract>
9
+ npm run test:office:compat 매크로·서식 9종 호환성 검증
10
+ npm run test:office:live:all 모든 라이브 검증
11
+ npm run test:office Office를 실행하지 않는 일반 검증
12
+ npm run test:office:render 별도 렌더 검증
13
+ 기존 호출도 지원합니다: <테스트 파일> [테스트 이름 정규식]
14
+ `;
15
+
16
+ export function buildLiveTestPlan(argv, testPath = defaultTestPath) {
17
+ const [selector, namePattern, ...extra] = argv;
18
+ if (!selector || selector === '--help' || selector === '-h') return null;
19
+ if (extra.length) throw new Error('인자가 너무 많습니다.');
20
+ let pattern;
21
+ if (liveProfiles.includes(selector)) {
22
+ if (namePattern) throw new Error('기능 이름 뒤에는 추가 인자를 받지 않습니다.');
23
+ pattern = selector === 'all' ? null : `^\\[${selector}\\]`;
24
+ } else {
25
+ if (!/\.(?:mjs|cjs|js)$/u.test(selector)) throw new Error(`알 수 없는 검증 범위: ${selector}`);
26
+ testPath = resolve(selector);
27
+ pattern = namePattern || null;
28
+ }
29
+ if (pattern) new RegExp(pattern); // Reject malformed filters before starting a child.
30
+ return {
31
+ label: selector,
32
+ args: ['--test', '--test-reporter=tap', ...(pattern ? ['--test-name-pattern', pattern] : []), testPath],
33
+ };
34
+ }