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.
- package/LICENSES/MIT.txt +1 -1
- package/NOTICE.md +2 -1
- package/README.md +3 -1
- package/package.json +23 -13
- package/scripts/build-tui.mjs +1 -16
- package/scripts/lib/local-provider-live-scenarios.mjs +22 -0
- package/scripts/lib/test-timing-reporter.mjs +38 -0
- package/scripts/local-provider-live-check.mjs +141 -0
- package/scripts/office/aesthetics-probe.mjs +59 -0
- package/scripts/office/author-deck.mjs +56 -0
- package/scripts/office/build-pptx-icons.mjs +48 -0
- package/scripts/office-design-audit.mjs +1 -1
- package/scripts/office-live-test-plan.mjs +34 -0
- package/scripts/pdf-rotation-stress.mjs +74 -0
- package/scripts/perf/cold-reconnect-probe.mjs +109 -0
- package/scripts/perf/transcript-baseline.mjs +56 -0
- package/scripts/perf/transcript-runtime-probe.mjs +62 -0
- package/scripts/release-paths.mjs +8 -38
- package/scripts/run-advisory-spec.mjs +6 -0
- package/scripts/run-office-live-tests.mjs +51 -18
- package/scripts/suite-health.mjs +3 -5
- package/scripts/test.mjs +100 -0
- package/scripts/tui-frame-harness-shim.mjs +1 -1
- package/scripts/tui-frame-harness.mjs +7 -2
- package/scripts/tui-transcript-jitter-harness.mjs +0 -11
- package/src/app.mjs +2 -14
- package/src/defaults/cycle3-review-prompt.md +32 -14
- package/src/defaults/plugin.json +6 -0
- package/src/defaults/skills/browser-use/SKILL.md +159 -0
- package/src/defaults/skills/computer-use/SKILL.md +157 -0
- package/src/defaults/skills/docx/SKILL.md +52 -0
- package/src/defaults/skills/image/SKILL.md +94 -0
- package/src/defaults/skills/local-provider/SKILL.md +115 -0
- package/src/defaults/skills/pdf/SKILL.md +51 -0
- package/src/defaults/skills/pptx/SKILL.md +145 -0
- package/src/defaults/skills/pptx/references/charts.md +153 -0
- package/src/defaults/skills/pptx/references/composition.md +182 -0
- package/src/defaults/skills/pptx/references/direction.md +70 -0
- package/src/defaults/skills/pptx/references/kit.md +551 -0
- package/src/defaults/skills/pptx/references/pictures.md +76 -0
- package/src/defaults/skills/pptx/references/review.md +104 -0
- package/src/defaults/skills/pptx/scripts/qc-pages.mjs +368 -0
- package/src/defaults/skills/pptx/scripts/review-deck.mjs +155 -0
- package/src/defaults/skills/pptx/scripts/source-extract.mjs +121 -0
- package/src/defaults/skills/setup/SKILL.md +86 -460
- package/src/defaults/skills/setup/references/actions.md +127 -0
- package/src/defaults/skills/setup/references/surfaces.md +72 -0
- package/src/defaults/skills/skill-creator/SKILL.md +191 -0
- package/src/defaults/skills/skill-creator/references/design.md +182 -0
- package/src/defaults/skills/skill-creator/references/evaluation.md +111 -0
- package/src/defaults/skills/skill-creator/references/source-review.md +94 -0
- package/src/defaults/skills/skill-creator/scripts/validate-skill.mjs +166 -0
- package/src/defaults/skills/video/SKILL.md +63 -0
- package/src/defaults/skills/xlsx/SKILL.md +72 -0
- package/src/defaults/skills/xlsx/references/model-conventions.md +52 -0
- package/src/headless-exec.mjs +1 -4
- package/src/headless-role.mjs +2 -5
- package/src/help.mjs +1 -1
- package/src/lib/output-style-meta.cjs +5 -1
- package/src/lib/rules-builder.cjs +24 -23
- package/src/mixdog-session-runtime.mjs +16 -7
- package/src/output-styles/extreme-minimal.md +1 -1
- package/src/rules/lead/01-general.md +5 -4
- package/src/rules/shared/00-general.md +4 -0
- package/src/rules/shared/30-exploration.md +2 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +2 -2
- package/src/runtime/agent/orchestrator/agent-runtime/agent-loop-policy.mjs +1 -6
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -63
- package/src/runtime/agent/orchestrator/agent-runtime/completion-text.mjs +13 -0
- package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +0 -1
- package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +4 -15
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -1
- package/src/runtime/agent/orchestrator/agent-trace-io.mjs +1 -2
- package/src/runtime/agent/orchestrator/agent-trace.mjs +3 -4
- package/src/runtime/agent/orchestrator/cache-break-trace.mjs +1 -1
- package/src/runtime/agent/orchestrator/config.mjs +64 -7
- package/src/runtime/agent/orchestrator/context/collect.mjs +122 -58
- package/src/runtime/agent/orchestrator/dispatch-persist.mjs +1 -1
- package/src/runtime/agent/orchestrator/internal-tools.mjs +0 -5
- package/src/runtime/agent/orchestrator/mcp/client.mjs +2 -34
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +5 -16
- package/src/runtime/agent/orchestrator/providers/anthropic-betas.mjs +10 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-effort.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-fable-history.mjs +77 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-leaked-toolcall.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +1 -15
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +14 -63
- package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +5 -5
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +111 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +5 -146
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +124 -45
- package/src/runtime/agent/orchestrator/providers/anthropic-thinking-contract.mjs +13 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +50 -42
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +5 -22
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +7 -10
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +2 -85
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +91 -0
- package/src/runtime/agent/orchestrator/providers/api-usage.mjs +4 -19
- package/src/runtime/agent/orchestrator/providers/compat-request-policy.mjs +21 -0
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-wire-guards.mjs +63 -6
- package/src/runtime/agent/orchestrator/providers/cursor-wire-normalization.mjs +12 -7
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +27 -7
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +16 -10
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +150 -0
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/gemini-history-signatures.mjs +29 -0
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +5 -4
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +5 -6
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +48 -0
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +23 -26
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +5 -36
- package/src/runtime/agent/orchestrator/providers/grok-oauth-tokens.mjs +19 -38
- package/src/runtime/agent/orchestrator/providers/grok-oauth.mjs +1 -7
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-image-input.mjs +105 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +50 -94
- package/src/runtime/agent/orchestrator/providers/lib/json-memory-cache.mjs +27 -0
- package/src/runtime/agent/orchestrator/providers/lib/oauth-pkce.mjs +27 -0
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +29 -0
- package/src/runtime/agent/orchestrator/providers/lib/provider-replay.mjs +9 -6
- package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +143 -0
- package/src/runtime/agent/orchestrator/providers/mixdog-local-wire.mjs +25 -0
- package/src/runtime/agent/orchestrator/providers/mixdog-local.mjs +79 -0
- package/src/runtime/agent/orchestrator/providers/model-catalog-projection.mjs +8 -0
- package/src/runtime/agent/orchestrator/providers/model-catalog.mjs +18 -1
- package/src/runtime/agent/orchestrator/providers/model-list-sanitize.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/model-service-tiers.mjs +11 -0
- package/src/runtime/agent/orchestrator/providers/oauth-usage.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-presets.mjs +0 -8
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +205 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +5 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +17 -14
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +22 -25
- package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +18 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +2 -15
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +4 -29
- package/src/runtime/agent/orchestrator/providers/openai-oauth-ws.mjs +3 -4
- package/src/runtime/agent/orchestrator/providers/openai-oauth.mjs +48 -84
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +152 -0
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +15 -243
- package/src/runtime/agent/orchestrator/providers/openai-ws-headers.mjs +1 -36
- package/src/runtime/agent/orchestrator/providers/openai-ws-pool.mjs +2 -3
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +6 -38
- package/src/runtime/agent/orchestrator/providers/opencode-go-usage.mjs +7 -20
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +44 -19
- package/src/runtime/agent/orchestrator/providers/registry.mjs +15 -0
- package/src/runtime/agent/orchestrator/providers/retry-classifier.mjs +44 -5
- package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +0 -5
- package/src/runtime/agent/orchestrator/providers/stream-json-pool.mjs +2 -6
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +41 -57
- package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +38 -11
- package/src/runtime/agent/orchestrator/session/cache/util.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/compact/budget.mjs +1 -112
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +7 -2
- package/src/runtime/agent/orchestrator/session/compact/summary.mjs +3 -5
- package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +0 -12
- package/src/runtime/agent/orchestrator/session/context-compaction-policy.mjs +18 -23
- package/src/runtime/agent/orchestrator/session/context-fingerprint.mjs +54 -0
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +9 -58
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -5
- package/src/runtime/agent/orchestrator/session/evidence-union.mjs +3 -7
- package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -8
- package/src/runtime/agent/orchestrator/session/loop/arg-schema-coerce.mjs +92 -0
- package/src/runtime/agent/orchestrator/session/loop/compact-debug.mjs +2 -10
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +38 -63
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +14 -14
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +17 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +7 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +87 -38
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -14
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +30 -33
- package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +355 -0
- package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -6
- package/src/runtime/agent/orchestrator/session/manager/message-sanitize.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +324 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +62 -688
- package/src/runtime/agent/orchestrator/session/manager/prompt-surface-publish.mjs +35 -0
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +15 -2
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +38 -79
- package/src/runtime/agent/orchestrator/session/manager/rules-source-cache.mjs +61 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +44 -14
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +9 -4
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +2 -28
- package/src/runtime/agent/orchestrator/session/manager.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/provider-prefix-guard.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/result-classification.mjs +0 -67
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +62 -0
- package/src/runtime/agent/orchestrator/session/store/fs-probe.mjs +1 -20
- package/src/runtime/agent/orchestrator/session/store/listing.mjs +60 -9
- package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +0 -19
- package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +0 -11
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +117 -134
- package/src/runtime/agent/orchestrator/session/store-summary-visibility.mjs +4 -4
- package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +131 -0
- package/src/runtime/agent/orchestrator/session/store.mjs +20 -46
- package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +133 -0
- package/src/runtime/agent/orchestrator/session/thinking-replay-recovery.mjs +1 -4
- package/src/runtime/agent/orchestrator/session/token-estimate-floors.mjs +34 -0
- package/src/runtime/agent/orchestrator/session/token-estimate.mjs +3 -36
- package/src/runtime/agent/orchestrator/session/tool-batch.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +5 -5
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +1 -7
- package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/binary-file.mjs +0 -25
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +7 -5
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +2 -7
- package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +1 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +19 -0
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +1 -2
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/list-tool.mjs +26 -2
- package/src/runtime/agent/orchestrator/tools/builtin/local-search-telemetry.mjs +0 -9
- package/src/runtime/agent/orchestrator/tools/builtin/native-search-client.mjs +0 -20
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +0 -6
- package/src/runtime/agent/orchestrator/tools/builtin/read-image-resize.mjs +7 -16
- package/src/runtime/agent/orchestrator/tools/builtin/read-open.mjs +1 -14
- package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-tool.mjs +5 -22
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/search-admission.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/search-glob-tool.mjs +17 -75
- package/src/runtime/agent/orchestrator/tools/builtin/search-grep-tool.mjs +3 -19
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +4 -57
- package/src/runtime/agent/orchestrator/tools/builtin/shell-lossless-compact.mjs +0 -12
- package/src/runtime/agent/orchestrator/tools/builtin/shell-output.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/snapshot-helpers.mjs +1 -7
- package/src/runtime/agent/orchestrator/tools/builtin/snapshot-store.mjs +3 -25
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +9 -7
- package/src/runtime/agent/orchestrator/tools/code-graph/aggregate-roots.mjs +276 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/build.mjs +38 -16
- package/src/runtime/agent/orchestrator/tools/code-graph/disk-cache.mjs +11 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch.mjs +23 -355
- package/src/runtime/agent/orchestrator/tools/code-graph/exact-file-graph.mjs +92 -0
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/search-references.mjs +1 -11
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +2 -4
- package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +8 -0
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/graph-binary-fetcher.mjs +51 -124
- package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +2 -68
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +1 -10
- package/src/runtime/agent/orchestrator/tools/patch/dispatch.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/patch/matcher.mjs +1 -2
- package/src/runtime/agent/orchestrator/tools/patch/native-server.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/patch/orchestrator.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/patch/v4a-convert.mjs +2 -14
- package/src/runtime/agent/orchestrator/tools/patch-binary-fetcher.mjs +57 -138
- package/src/runtime/agent/orchestrator/tools/progress-message.mjs +4 -0
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +4 -8
- package/src/runtime/agent/orchestrator/tools/spawn-binary-fetcher.mjs +45 -122
- package/src/runtime/attachments/pdf-extract.mjs +14 -6
- package/src/runtime/attachments/pdfjs-runtime.mjs +12 -0
- package/src/runtime/attachments/store.mjs +8 -8
- package/src/runtime/bridge-discovery.mjs +67 -0
- package/src/runtime/browser-bridge/action-schema.d.mts +6 -0
- package/src/runtime/browser-bridge/action-schema.mjs +9 -3
- package/src/runtime/browser-bridge/client.mjs +18 -31
- package/src/runtime/browser-bridge/tool-defs.mjs +16 -7
- package/src/runtime/channels/lib/boot-profile.mjs +3 -16
- package/src/runtime/channels/lib/config.mjs +0 -1
- package/src/runtime/channels/lib/runtime-paths.mjs +2 -15
- package/src/runtime/channels/lib/scheduler.mjs +0 -15
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +7 -59
- package/src/runtime/channels/lib/worker-main.mjs +2 -30
- package/src/runtime/computer-bridge/action-schema.mjs +7 -5
- package/src/runtime/computer-bridge/actions.d.mts +6 -0
- package/src/runtime/computer-bridge/actions.mjs +75 -0
- package/src/runtime/computer-bridge/client.mjs +21 -39
- package/src/runtime/computer-bridge/core-actions.mjs +2 -3
- package/src/runtime/computer-bridge/error-recovery.mjs +15 -3
- package/src/runtime/computer-bridge/limits.d.mts +8 -0
- package/src/runtime/computer-bridge/limits.mjs +67 -0
- package/src/runtime/computer-bridge/tool-defs.mjs +10 -16
- package/src/runtime/github/client.d.mts +17 -0
- package/src/runtime/github/client.mjs +127 -0
- package/src/runtime/github/commands.mjs +106 -0
- package/src/runtime/github/contract.d.mts +58 -0
- package/src/runtime/github/contract.mjs +147 -0
- package/src/runtime/github/tool.mjs +64 -0
- package/src/runtime/local-provider/asset-installer.mjs +261 -0
- package/src/runtime/local-provider/asset-storage.mjs +36 -0
- package/src/runtime/local-provider/catalog.mjs +151 -0
- package/src/runtime/local-provider/data/manifest.json +48 -0
- package/src/runtime/local-provider/gguf-header.mjs +92 -0
- package/src/runtime/local-provider/hardware.mjs +83 -0
- package/src/runtime/local-provider/hugging-face.mjs +111 -0
- package/src/runtime/local-provider/input-capabilities.mjs +19 -0
- package/src/runtime/local-provider/install-progress.mjs +77 -0
- package/src/runtime/local-provider/managed-runtime.mjs +45 -0
- package/src/runtime/local-provider/model-maintenance.mjs +114 -0
- package/src/runtime/local-provider/model-state.mjs +53 -0
- package/src/runtime/local-provider/registered-models.mjs +67 -0
- package/src/runtime/local-provider/request-queue.mjs +125 -0
- package/src/runtime/local-provider/resumable-installations.mjs +27 -0
- package/src/runtime/local-provider/server-process.mjs +209 -0
- package/src/runtime/local-provider/server.mjs +99 -0
- package/src/runtime/media/download.mjs +1 -1
- package/src/runtime/media/lanes.mjs +1 -1
- package/src/runtime/media/renditions.mjs +1 -1
- package/src/runtime/media/store.mjs +1 -1
- package/src/runtime/media/tool-defs.mjs +40 -0
- package/src/runtime/media/tool.mjs +277 -0
- package/src/runtime/memory/index.mjs +11 -29
- package/src/runtime/memory/lib/core-memory-candidates.mjs +0 -5
- package/src/runtime/memory/lib/core-memory-file.mjs +2 -2
- package/src/runtime/memory/lib/core-memory-store.mjs +37 -8
- package/src/runtime/memory/lib/cycle-scheduler.mjs +16 -2
- package/src/runtime/memory/lib/embedding-model-config.mjs +2 -4
- package/src/runtime/memory/lib/embedding-reindex.mjs +2 -4
- package/src/runtime/memory/lib/http-router.mjs +13 -1
- package/src/runtime/memory/lib/http-wire.mjs +1 -1
- package/src/runtime/memory/lib/memory-action-handlers.mjs +4 -1
- package/src/runtime/memory/lib/memory-config-flags.mjs +8 -12
- package/src/runtime/memory/lib/memory-cycle-requests.mjs +0 -40
- package/src/runtime/memory/lib/memory-cycle1.mjs +1 -5
- package/src/runtime/memory/lib/memory-cycle2-gate.mjs +30 -9
- package/src/runtime/memory/lib/memory-cycle2-mutations.mjs +35 -4
- package/src/runtime/memory/lib/memory-cycle2.mjs +1 -1
- package/src/runtime/memory/lib/memory-cycle3-evidence.mjs +117 -0
- package/src/runtime/memory/lib/memory-cycle3-guards.mjs +272 -0
- package/src/runtime/memory/lib/memory-cycle3.mjs +81 -238
- package/src/runtime/memory/lib/memory-embed.mjs +1 -4
- package/src/runtime/memory/lib/memory-score.mjs +0 -13
- package/src/runtime/memory/lib/memory-text-utils.mjs +7 -1
- package/src/runtime/memory/lib/pg/adapter.mjs +2 -2
- package/src/runtime/memory/lib/phase-merge-verdicts.mjs +54 -0
- package/src/runtime/memory/lib/prompt-surface-file.mjs +98 -0
- package/src/runtime/memory/lib/query-handlers.mjs +4 -1
- package/src/runtime/memory/lib/recall-embedding-readiness.mjs +1 -1
- package/src/runtime/memory/lib/recall-format.mjs +15 -7
- package/src/runtime/memory/lib/recall-order.mjs +6 -0
- package/src/runtime/memory/lib/runtime-fetcher.mjs +25 -52
- package/src/runtime/memory/lib/session-ingest.mjs +3 -3
- package/src/runtime/memory/lib/trace-mode.mjs +1 -1
- package/src/runtime/memory/lib/trace-store.mjs +1 -10
- package/src/runtime/memory/lib/transcript-ingest.mjs +2 -2
- package/src/runtime/office/README.md +54 -0
- package/src/runtime/office/authoring/pptx-author-action.mjs +166 -0
- package/src/runtime/office/authoring/pptx-author-session.mjs +112 -0
- package/src/runtime/office/authoring/pptx-brief.mjs +270 -0
- package/src/runtime/office/authoring/pptx-contact-sheet.mjs +54 -0
- package/src/runtime/office/authoring/pptx-icons.json +1 -0
- package/src/runtime/office/authoring/pptx-icons.mjs +50 -0
- package/src/runtime/office/authoring/pptx-kit.mjs +33 -0
- package/src/runtime/office/authoring/pptx-receipt.mjs +388 -0
- package/src/runtime/office/authoring/pptx-review-artifacts.mjs +32 -0
- package/src/runtime/office/authoring/pptx-script-contract.mjs +15 -0
- package/src/runtime/office/authoring/pptx-script-normalize.mjs +244 -0
- package/src/runtime/office/authoring/pptx-script-runner.mjs +142 -0
- package/src/runtime/office/{assurance-benchmark.mjs → bench/assurance-benchmark.mjs} +8 -98
- package/src/runtime/office/bench/bench-support.mjs +18 -0
- package/src/runtime/office/{benchmark.mjs → bench/benchmark.mjs} +6 -11
- package/src/runtime/office/{contract-benchmark.mjs → bench/contract-benchmark.mjs} +4 -9
- package/src/runtime/office/bench/deck-bench.mjs +78 -0
- package/src/runtime/office/{polish-benchmark.mjs → bench/polish-benchmark.mjs} +2 -7
- package/src/runtime/office/{quality-live-benchmark.mjs → bench/quality-live-benchmark.mjs} +5 -260
- package/src/runtime/office/capabilities.mjs +105 -45
- package/src/runtime/office/{com-adapter.mjs → com/com-adapter.mjs} +58 -53
- package/src/runtime/office/com/office-com-cleanup.ps1 +126 -0
- package/src/runtime/office/{office-com-host.ps1 → com/office-com-host.ps1} +427 -90
- package/src/runtime/office/{office-com-session-host.ps1 → com/office-com-session-host.ps1} +117 -90
- package/src/runtime/office/com/office-session-client.mjs +91 -0
- package/src/runtime/office/{journal.mjs → core/journal.mjs} +1 -1
- package/src/runtime/office/core/office-actions-batch.mjs +348 -0
- package/src/runtime/office/core/office-actions-inspect.mjs +157 -0
- package/src/runtime/office/core/office-actions-lifecycle.mjs +253 -0
- package/src/runtime/office/core/office-actions-render.mjs +307 -0
- package/src/runtime/office/core/office-actions.mjs +6 -0
- package/src/runtime/office/{office-core.mjs → core/office-core.mjs} +26 -5
- package/src/runtime/office/core/office-render-preview.mjs +160 -0
- package/src/runtime/office/{office-sessions.mjs → core/office-sessions.mjs} +141 -9
- package/src/runtime/office/{office-transactions.mjs → core/office-transactions.mjs} +2 -1
- package/src/runtime/office/core/pptx-page-cache.mjs +70 -0
- package/src/runtime/office/{snapshot-contract.mjs → core/snapshot-contract.mjs} +28 -0
- package/src/runtime/office/{tabular.mjs → core/tabular.mjs} +2 -12
- package/src/runtime/office/{composition-system.mjs → design/composition-system.mjs} +2 -11
- package/src/runtime/office/{content-model.mjs → design/content-model.mjs} +1 -14
- package/src/runtime/office/{design-art-direction.mjs → design/design-art-direction.mjs} +51 -65
- package/src/runtime/office/{design-creative-director.mjs → design/design-creative-director.mjs} +7 -25
- package/src/runtime/office/design/design-discipline.mjs +310 -0
- package/src/runtime/office/{design-system.mjs → design/design-system.mjs} +14 -102
- package/src/runtime/office/{design-tokens.mjs → design/design-tokens.mjs} +33 -47
- package/src/runtime/office/{design-docx.mjs → design/docx/design-docx.mjs} +2 -1
- package/src/runtime/office/{design-library-core.mjs → design/library/design-library-core.mjs} +8 -34
- package/src/runtime/office/{design-library-pack.mjs → design/library/design-library-pack.mjs} +16 -1
- package/src/runtime/office/{design-library.mjs → design/library/design-library.mjs} +15 -2
- package/src/runtime/office/{design-template-index.mjs → design/library/design-template-index.mjs} +24 -2
- package/src/runtime/office/{design-template-inspect.mjs → design/library/design-template-inspect.mjs} +1 -12
- package/src/runtime/office/{design-xlsx-components.mjs → design/xlsx/design-xlsx-components.mjs} +2 -1
- package/src/runtime/office/{design-xlsx.mjs → design/xlsx/design-xlsx.mjs} +3 -1
- package/src/runtime/office/index.mjs +99 -30
- package/src/runtime/office/office-test-support.mjs +66 -0
- package/src/runtime/office/{document-preview.mjs → pdf/document-preview.mjs} +1 -1
- package/src/runtime/office/pdf/pdf-adapter.mjs +824 -0
- package/src/runtime/office/pdf/pdf-analysis.mjs +733 -0
- package/src/runtime/office/pdf/pdf-draw.mjs +91 -0
- package/src/runtime/office/pdf/pdf-fonts.mjs +91 -0
- package/src/runtime/office/pdf/pdf-forms.mjs +265 -0
- package/src/runtime/office/{pdf-render.mjs → pdf/pdf-render.mjs} +42 -36
- package/src/runtime/office/pdf/pdf-safety.mjs +50 -0
- package/src/runtime/office/pdf/pdf-search.mjs +187 -0
- package/src/runtime/office/{pdf-security.mjs → pdf/pdf-security.mjs} +7 -3
- package/src/runtime/office/pdf/pdf-writer.mjs +195 -0
- package/src/runtime/office/portable/docx-revisions.mjs +474 -0
- package/src/runtime/office/portable/docx-runs.mjs +293 -0
- package/src/runtime/office/portable/docx-tracked-edits.mjs +165 -0
- package/src/runtime/office/portable/font-provisioner.mjs +210 -0
- package/src/runtime/office/{ooxml-validator.mjs → portable/ooxml-validator.mjs} +26 -3
- package/src/runtime/office/{portable-cells.mjs → portable/portable-cells.mjs} +12 -3
- package/src/runtime/office/portable/portable-chart-faults.mjs +96 -0
- package/src/runtime/office/{portable-chart.mjs → portable/portable-chart.mjs} +21 -19
- package/src/runtime/office/{portable-docx-parts.mjs → portable/portable-docx-parts.mjs} +97 -0
- package/src/runtime/office/{portable-docx-xml.mjs → portable/portable-docx-xml.mjs} +2 -2
- package/src/runtime/office/{portable-docx.mjs → portable/portable-docx.mjs} +211 -36
- package/src/runtime/office/{portable-opc.mjs → portable/portable-opc.mjs} +11 -3
- package/src/runtime/office/{portable-package.mjs → portable/portable-package.mjs} +7 -25
- package/src/runtime/office/{portable-pivot.mjs → portable/portable-pivot.mjs} +1 -1
- package/src/runtime/office/{portable-pptx-chart.mjs → portable/portable-pptx-chart.mjs} +4 -2
- package/src/runtime/office/{portable-pptx-charts.mjs → portable/portable-pptx-charts.mjs} +5 -19
- package/src/runtime/office/{portable-pptx-core.mjs → portable/portable-pptx-core.mjs} +14 -3
- package/src/runtime/office/{portable-pptx-package.mjs → portable/portable-pptx-package.mjs} +62 -5
- package/src/runtime/office/{portable-pptx-shapes.mjs → portable/portable-pptx-shapes.mjs} +1 -1
- package/src/runtime/office/{portable-pptx.mjs → portable/portable-pptx.mjs} +11 -2
- package/src/runtime/office/{portable-sheet-styles.mjs → portable/portable-sheet-styles.mjs} +74 -11
- package/src/runtime/office/{portable-slide-shapes.mjs → portable/portable-slide-shapes.mjs} +8 -15
- package/src/runtime/office/{portable-snapshot.mjs → portable/portable-snapshot.mjs} +254 -27
- package/src/runtime/office/{portable-soffice.mjs → portable/portable-soffice.mjs} +45 -1
- package/src/runtime/office/{portable-validation.mjs → portable/portable-validation.mjs} +73 -34
- package/src/runtime/office/{portable-xlsx.mjs → portable/portable-xlsx.mjs} +3 -1
- package/src/runtime/office/{portable-xml.mjs → portable/portable-xml.mjs} +20 -0
- package/src/runtime/office/portable/pptx-relations.mjs +92 -0
- package/src/runtime/office/portable/pptx-targets.mjs +30 -0
- package/src/runtime/office/portable/review-editability.mjs +111 -0
- package/src/runtime/office/{text-metrics.mjs → portable/text-metrics.mjs} +232 -28
- package/src/runtime/office/{xlsx-assertions.mjs → portable/xlsx-assertions.mjs} +5 -21
- package/src/runtime/office/portable/xlsx-audit-support.mjs +132 -0
- package/src/runtime/office/{xlsx-contract.mjs → portable/xlsx-contract.mjs} +50 -12
- package/src/runtime/office/portable/xlsx-conventions.mjs +75 -0
- package/src/runtime/office/portable/xlsx-formula-audit.mjs +247 -0
- package/src/runtime/office/portable/xlsx-sheet-hygiene.mjs +100 -0
- package/src/runtime/office/quality/assurance-checklist.mjs +185 -0
- package/src/runtime/office/quality/assurance-rendered.mjs +167 -0
- package/src/runtime/office/quality/assurance-structure.mjs +440 -0
- package/src/runtime/office/quality/assurance-trust.mjs +246 -0
- package/src/runtime/office/quality/assurance.mjs +11 -0
- package/src/runtime/office/quality/design-aesthetics-metrics.mjs +271 -0
- package/src/runtime/office/quality/design-aesthetics.mjs +285 -0
- package/src/runtime/office/{design-deck-diversity.mjs → quality/design-deck-diversity.mjs} +31 -1
- package/src/runtime/office/quality/design-review-authored.mjs +113 -0
- package/src/runtime/office/quality/design-review-critique.mjs +120 -0
- package/src/runtime/office/{design-review.mjs → quality/design-review.mjs} +167 -123
- package/src/runtime/office/quality/inline-audit.mjs +139 -0
- package/src/runtime/office/quality/pptx-deck-rubric.mjs +93 -0
- package/src/runtime/office/quality/pptx-slide-roles.mjs +136 -0
- package/src/runtime/office/quality/quality-pipeline.mjs +280 -0
- package/src/runtime/office/{quality-score.mjs → quality/quality-score.mjs} +2 -4
- package/src/runtime/office/quality/render-air.mjs +114 -0
- package/src/runtime/office/shared/asar-path.mjs +5 -0
- package/src/runtime/office/shared/values.mjs +32 -0
- package/src/runtime/office/tool-defs.mjs +35 -29
- package/src/runtime/shared/agent-route-config.mjs +3 -3
- package/src/runtime/shared/atomic-file.mjs +27 -20
- package/src/runtime/shared/background-tasks.mjs +2 -37
- package/src/runtime/shared/boot-profile.mjs +26 -0
- package/src/runtime/shared/bounded-download.mjs +40 -0
- package/src/runtime/shared/bridge-tool-args.mjs +1 -1
- package/src/runtime/shared/buffered-appender.mjs +1 -1
- package/src/runtime/shared/child-guardian.mjs +1 -5
- package/src/runtime/shared/child-spawn-gate.mjs +2 -2
- package/src/runtime/shared/clean.mjs +5 -0
- package/src/runtime/shared/config.mjs +8 -30
- package/src/runtime/shared/edit-tool-dialect.mjs +19 -6
- package/src/runtime/shared/env.mjs +41 -0
- package/src/runtime/shared/err-text.mjs +15 -5
- package/src/runtime/shared/error-presentation.mjs +101 -0
- package/src/runtime/shared/extension-scopes.mjs +139 -0
- package/src/runtime/shared/json-file.mjs +6 -0
- package/src/runtime/shared/llm/cost.mjs +2 -2
- package/src/runtime/shared/llm/http-agent.mjs +18 -6
- package/src/runtime/shared/markdown-frontmatter.mjs +2 -4
- package/src/runtime/shared/memory-snapshot.mjs +0 -4
- package/src/runtime/shared/native-asset.mjs +149 -0
- package/src/runtime/shared/numbers.mjs +12 -0
- package/src/runtime/shared/object.mjs +7 -0
- package/src/runtime/shared/owner-fair-gate.mjs +1 -5
- package/src/runtime/shared/plugin-manifest.mjs +44 -0
- package/src/runtime/shared/pristine-execution.mjs +4 -7
- package/src/runtime/shared/process-lifecycle.mjs +1 -5
- package/src/runtime/shared/resource-admission.mjs +4 -7
- package/src/runtime/shared/service-discovery.mjs +1 -22
- package/src/runtime/shared/session-runtime-health.mjs +15 -1
- package/src/runtime/shared/skill-document.mjs +36 -8
- package/src/runtime/shared/task-notification-envelope.mjs +0 -25
- package/src/runtime/shared/time-format.mjs +1 -1
- package/src/runtime/shared/tool-execution-contract.mjs +29 -7
- package/src/runtime/shared/tool-result-summary.mjs +1 -1
- package/src/runtime/shared/tool-surface.mjs +21 -21
- package/src/runtime/shared/tool-workload-gates.mjs +1 -5
- package/src/runtime/shared/transcript-writer.mjs +5 -2
- package/src/runtime/shared/transport-error-text.mjs +128 -0
- package/src/runtime/shared/turn-snapshot-store.mjs +81 -7
- package/src/runtime/shared/turn-snapshot.mjs +147 -19
- package/src/runtime/shared/user-data-guard.mjs +1 -73
- package/src/runtime/web-search/lib/web-tools.mjs +0 -157
- package/src/session-runtime/agent-tool-routing.mjs +56 -0
- package/src/session-runtime/boot-profile.mjs +6 -18
- package/src/session-runtime/builtin-features.d.mts +8 -0
- package/src/session-runtime/builtin-features.mjs +42 -4
- package/src/session-runtime/config-helpers.mjs +1 -1
- package/src/session-runtime/context-status.mjs +44 -11
- package/src/session-runtime/effort.mjs +28 -32
- package/src/session-runtime/extension-scopes.mjs +94 -0
- package/src/session-runtime/fs-utils.mjs +1 -3
- package/src/session-runtime/goal-facade-api.mjs +52 -0
- package/src/session-runtime/goal-reminder.mjs +12 -5
- package/src/session-runtime/goal-runtime.mjs +196 -305
- package/src/session-runtime/goal-storage.mjs +60 -0
- package/src/session-runtime/goal-tasks.mjs +125 -0
- package/src/session-runtime/goal-text.mjs +8 -5
- package/src/session-runtime/goal-tool-defs.mjs +91 -0
- package/src/session-runtime/hitch-profile.mjs +1 -1
- package/src/session-runtime/hook-payload.mjs +32 -0
- package/src/session-runtime/internal-tool-executor.mjs +171 -0
- package/src/session-runtime/lifecycle-api.mjs +7 -2
- package/src/session-runtime/local-model-api.mjs +22 -0
- package/src/session-runtime/local-provider-settings.mjs +49 -0
- package/src/session-runtime/mcp-glue.mjs +8 -3
- package/src/session-runtime/model-capabilities.mjs +3 -15
- package/src/session-runtime/model-recency.mjs +3 -0
- package/src/session-runtime/model-route-api.mjs +26 -51
- package/src/session-runtime/native-teardown.mjs +42 -0
- package/src/session-runtime/notification-bus.mjs +13 -1
- package/src/session-runtime/plugin-mcp.mjs +9 -30
- package/src/session-runtime/provider-auth-api.mjs +2 -13
- package/src/session-runtime/provider-models.mjs +9 -0
- package/src/session-runtime/provider-readiness.mjs +131 -0
- package/src/session-runtime/provider-request-snapshot.mjs +0 -19
- package/src/session-runtime/resource-api.mjs +70 -3
- package/src/session-runtime/runtime-core.mjs +176 -705
- package/src/session-runtime/runtime-facade.mjs +112 -0
- package/src/session-runtime/runtime-modules.mjs +56 -0
- package/src/session-runtime/runtime-review-api.mjs +19 -0
- package/src/session-runtime/runtime-tunables.mjs +1 -1
- package/src/session-runtime/session-lifecycle.mjs +14 -4
- package/src/session-runtime/session-route-policy.mjs +26 -0
- package/src/session-runtime/session-text.mjs +3 -32
- package/src/session-runtime/session-turn-api.mjs +16 -4
- package/src/session-runtime/settings-api.mjs +56 -3
- package/src/session-runtime/setup-tool/executor.mjs +316 -0
- package/src/session-runtime/setup-tool/tool-defs.mjs +164 -0
- package/src/session-runtime/skills-api.mjs +39 -13
- package/src/session-runtime/tool-catalog-data.mjs +3 -2
- package/src/session-runtime/tool-catalog-schema.mjs +1 -16
- package/src/session-runtime/tool-catalog.mjs +0 -6
- package/src/session-runtime/tool-defs.mjs +1 -1
- package/src/session-runtime/tool-policy-refresh.mjs +4 -1
- package/src/session-runtime/tool-profile.mjs +1 -0
- package/src/session-runtime/tool-surface.mjs +2 -0
- package/src/session-runtime/workflow-agents-api.mjs +2 -1
- package/src/session-runtime/workflow.mjs +2 -2
- package/src/standalone/agent-tool/helpers.mjs +31 -7
- package/src/standalone/agent-tool/lead-worker-index.mjs +3 -27
- package/src/standalone/agent-tool/notify.mjs +1 -0
- package/src/standalone/agent-tool/worker-index.mjs +1 -25
- package/src/standalone/agent-tool.mjs +0 -24
- package/src/standalone/boot-phase-profiler.mjs +60 -0
- package/src/standalone/channel-admin.mjs +1 -42
- package/src/standalone/channel-transport.mjs +21 -4
- package/src/standalone/daemon-boot-coordinator.mjs +103 -0
- package/src/standalone/daemon.mjs +50 -46
- package/src/standalone/desktop-service-registry.mjs +226 -0
- package/src/standalone/fair-call-scheduler.mjs +1 -4
- package/src/standalone/hook-bus/config.mjs +1 -1
- package/src/standalone/hook-bus.mjs +11 -0
- package/src/standalone/plugin-admin.mjs +3 -15
- package/src/standalone/provider-admin.mjs +40 -53
- package/src/standalone/seeds.mjs +62 -18
- package/src/standalone/session-attachment-pool.mjs +127 -0
- package/src/standalone/session-client.mjs +53 -669
- package/src/standalone/session-protocol.mjs +12 -1
- package/src/standalone/session-proxy.mjs +538 -0
- package/src/standalone/session-runtime-inline-host.mjs +28 -11
- package/src/standalone/session-runtime-worker.mjs +13 -3
- package/src/standalone/session-service/agent-tree.mjs +477 -0
- package/src/standalone/session-service/project-catalog.mjs +86 -0
- package/src/standalone/session-service/projection.mjs +295 -0
- package/src/standalone/session-service-api.mjs +56 -0
- package/src/standalone/session-service.mjs +151 -1078
- package/src/standalone/session-state-projection.mjs +57 -0
- package/src/standalone/session-transport.mjs +44 -5
- package/src/standalone/session-wire-values.mjs +54 -0
- package/src/standalone/session-wire.mjs +1 -1
- package/src/standalone/usage-dashboard.mjs +3 -30
- package/src/tui/App.jsx +14 -0
- package/src/tui/app/app-format.mjs +5 -13
- package/src/tui/app/app-view.jsx +1 -0
- package/src/tui/app/extension-pickers.mjs +20 -4
- package/src/tui/app/input-parsers.mjs +3 -21
- package/src/tui/app/model-options.mjs +7 -5
- package/src/tui/app/prompt-submit.mjs +0 -18
- package/src/tui/app/provider-setup-picker.mjs +24 -76
- package/src/tui/app/transcript-row-estimate.mjs +0 -1
- package/src/tui/app/transcript-window.mjs +2 -13
- package/src/tui/app/use-transcript-scroll.mjs +1 -1
- package/src/tui/app/use-transcript-window.mjs +1 -1
- package/src/tui/components/PromptInput.jsx +4 -4
- package/src/tui/display-width.mjs +5 -6
- package/src/tui/dist/index.mjs +5349 -5096
- package/src/tui/index.jsx +4 -2
- package/src/tui/markdown/format-token.mjs +0 -5
- package/src/tui/markdown/streaming-markdown.mjs +2 -157
- package/src/tui/prompt-history-store.mjs +0 -13
- package/src/tui/session/agent-envelope.mjs +38 -5
- package/src/tui/session/agent-job-feed.mjs +8 -0
- package/src/tui/session/boot-profile.mjs +2 -14
- package/src/tui/session/context-state.mjs +0 -4
- package/src/tui/session/goal-continuation.mjs +1 -10
- package/src/tui/session/notification-plan.mjs +8 -0
- package/src/tui/session/render-frame-source.mjs +22 -0
- package/src/tui/session/render-timing.mjs +13 -3
- package/src/tui/session/session-api-ext.mjs +18 -9
- package/src/tui/session/session-api.mjs +28 -0
- package/src/tui/session/session-stats.mjs +7 -41
- package/src/tui/session/transcript-spill.mjs +2 -83
- package/src/tui/session/turn-aggregate-cards.mjs +252 -0
- package/src/tui/session/turn-deferred-cards.mjs +127 -0
- package/src/tui/session/turn.mjs +77 -379
- package/src/tui/session-local.mjs +19 -74
- package/src/ui/model-display.mjs +57 -1
- package/src/ui/statusline-agents.mjs +1 -5
- package/src/ui/statusline-segments.mjs +1 -5
- package/src/ui/statusline.mjs +16 -6
- package/src/ui/streaming-markdown-heal.mjs +147 -0
- package/src/vendor/statusline/bin/statusline-route.mjs +1 -1
- package/src/vendor/statusline/src/gateway/route-meta.mjs +1 -1
- package/src/workflows/default/WORKFLOW.md +5 -3
- package/src/workflows/solo/WORKFLOW.md +5 -3
- package/src/runtime/agent/orchestrator/agent-runtime/commit-message-completion.mjs +0 -67
- package/src/runtime/agent/orchestrator/providers/lib/env-utils.mjs +0 -15
- package/src/runtime/agent/orchestrator/session/compact/file-reattach.mjs +0 -112
- package/src/runtime/agent/orchestrator/session/compact/handoff.mjs +0 -476
- package/src/runtime/agent/orchestrator/session/loop/env.mjs +0 -14
- package/src/runtime/agent/orchestrator/session/manager/env-utils.mjs +0 -8
- package/src/runtime/office/assurance.mjs +0 -962
- package/src/runtime/office/design-aesthetics.mjs +0 -460
- package/src/runtime/office/design-frontier-review.mjs +0 -129
- package/src/runtime/office/design-layout-grammar.mjs +0 -134
- package/src/runtime/office/design-pptx-executive.mjs +0 -335
- package/src/runtime/office/design-pptx-plan.mjs +0 -1002
- package/src/runtime/office/design-pptx-primitives.mjs +0 -87
- package/src/runtime/office/design-pptx-semantic-flow.mjs +0 -111
- package/src/runtime/office/design-pptx-semantic-visuals.mjs +0 -885
- package/src/runtime/office/design-pptx-stack.mjs +0 -58
- package/src/runtime/office/design-pptx.mjs +0 -776
- package/src/runtime/office/office-actions.mjs +0 -979
- package/src/runtime/office/pdf-adapter.mjs +0 -591
- package/src/runtime/office/pdf-analysis.mjs +0 -429
- package/src/runtime/office/quality-pipeline.mjs +0 -154
- package/src/session-runtime/env.mjs +0 -16
- package/vendor/ink/build/ansi-tokenizer.d.ts +0 -38
- package/vendor/ink/build/ansi-tokenizer.js +0 -316
- package/vendor/ink/build/ansi-tokenizer.js.map +0 -1
- package/vendor/ink/build/colorize.d.ts +0 -3
- package/vendor/ink/build/colorize.js +0 -48
- package/vendor/ink/build/colorize.js.map +0 -1
- package/vendor/ink/build/components/AccessibilityContext.d.ts +0 -3
- package/vendor/ink/build/components/AccessibilityContext.js +0 -5
- package/vendor/ink/build/components/AccessibilityContext.js.map +0 -1
- package/vendor/ink/build/components/AnimationContext.d.ts +0 -9
- package/vendor/ink/build/components/AnimationContext.js +0 -13
- package/vendor/ink/build/components/AnimationContext.js.map +0 -1
- package/vendor/ink/build/components/App.d.ts +0 -24
- package/vendor/ink/build/components/App.js +0 -608
- package/vendor/ink/build/components/App.js.map +0 -1
- package/vendor/ink/build/components/AppContext.d.ts +0 -80
- package/vendor/ink/build/components/AppContext.js +0 -25
- package/vendor/ink/build/components/AppContext.js.map +0 -1
- package/vendor/ink/build/components/BackgroundContext.d.ts +0 -4
- package/vendor/ink/build/components/BackgroundContext.js +0 -3
- package/vendor/ink/build/components/BackgroundContext.js.map +0 -1
- package/vendor/ink/build/components/Box.d.ts +0 -130
- package/vendor/ink/build/components/Box.js +0 -34
- package/vendor/ink/build/components/Box.js.map +0 -1
- package/vendor/ink/build/components/CursorContext.d.ts +0 -11
- package/vendor/ink/build/components/CursorContext.js +0 -8
- package/vendor/ink/build/components/CursorContext.js.map +0 -1
- package/vendor/ink/build/components/ErrorBoundary.d.ts +0 -18
- package/vendor/ink/build/components/ErrorBoundary.js +0 -23
- package/vendor/ink/build/components/ErrorBoundary.js.map +0 -1
- package/vendor/ink/build/components/ErrorOverview.d.ts +0 -6
- package/vendor/ink/build/components/ErrorOverview.js +0 -90
- package/vendor/ink/build/components/ErrorOverview.js.map +0 -1
- package/vendor/ink/build/components/FocusContext.d.ts +0 -16
- package/vendor/ink/build/components/FocusContext.js +0 -17
- package/vendor/ink/build/components/FocusContext.js.map +0 -1
- package/vendor/ink/build/components/Newline.d.ts +0 -13
- package/vendor/ink/build/components/Newline.js +0 -8
- package/vendor/ink/build/components/Newline.js.map +0 -1
- package/vendor/ink/build/components/Spacer.d.ts +0 -7
- package/vendor/ink/build/components/Spacer.js +0 -11
- package/vendor/ink/build/components/Spacer.js.map +0 -1
- package/vendor/ink/build/components/Static.d.ts +0 -24
- package/vendor/ink/build/components/Static.js +0 -28
- package/vendor/ink/build/components/Static.js.map +0 -1
- package/vendor/ink/build/components/StderrContext.d.ts +0 -15
- package/vendor/ink/build/components/StderrContext.js +0 -13
- package/vendor/ink/build/components/StderrContext.js.map +0 -1
- package/vendor/ink/build/components/StdinContext.d.ts +0 -28
- package/vendor/ink/build/components/StdinContext.js +0 -20
- package/vendor/ink/build/components/StdinContext.js.map +0 -1
- package/vendor/ink/build/components/StdoutContext.d.ts +0 -15
- package/vendor/ink/build/components/StdoutContext.js +0 -13
- package/vendor/ink/build/components/StdoutContext.js.map +0 -1
- package/vendor/ink/build/components/Text.d.ts +0 -55
- package/vendor/ink/build/components/Text.js +0 -50
- package/vendor/ink/build/components/Text.js.map +0 -1
- package/vendor/ink/build/components/Transform.d.ts +0 -16
- package/vendor/ink/build/components/Transform.js +0 -15
- package/vendor/ink/build/components/Transform.js.map +0 -1
- package/vendor/ink/build/cursor-helpers.d.ts +0 -39
- package/vendor/ink/build/cursor-helpers.js +0 -62
- package/vendor/ink/build/cursor-helpers.js.map +0 -1
- package/vendor/ink/build/devtools-window-polyfill.d.ts +0 -1
- package/vendor/ink/build/devtools-window-polyfill.js +0 -68
- package/vendor/ink/build/devtools-window-polyfill.js.map +0 -1
- package/vendor/ink/build/devtools.d.ts +0 -1
- package/vendor/ink/build/devtools.js +0 -36
- package/vendor/ink/build/devtools.js.map +0 -1
- package/vendor/ink/build/display-width.js +0 -96
- package/vendor/ink/build/dom.d.ts +0 -62
- package/vendor/ink/build/dom.js +0 -143
- package/vendor/ink/build/dom.js.map +0 -1
- package/vendor/ink/build/get-max-width.d.ts +0 -3
- package/vendor/ink/build/get-max-width.js +0 -10
- package/vendor/ink/build/get-max-width.js.map +0 -1
- package/vendor/ink/build/hooks/use-animation.d.ts +0 -49
- package/vendor/ink/build/hooks/use-animation.js +0 -87
- package/vendor/ink/build/hooks/use-animation.js.map +0 -1
- package/vendor/ink/build/hooks/use-app.d.ts +0 -5
- package/vendor/ink/build/hooks/use-app.js +0 -8
- package/vendor/ink/build/hooks/use-app.js.map +0 -1
- package/vendor/ink/build/hooks/use-box-metrics.d.ts +0 -59
- package/vendor/ink/build/hooks/use-box-metrics.js +0 -81
- package/vendor/ink/build/hooks/use-box-metrics.js.map +0 -1
- package/vendor/ink/build/hooks/use-cursor.d.ts +0 -12
- package/vendor/ink/build/hooks/use-cursor.js +0 -29
- package/vendor/ink/build/hooks/use-cursor.js.map +0 -1
- package/vendor/ink/build/hooks/use-focus-manager.d.ts +0 -43
- package/vendor/ink/build/hooks/use-focus-manager.js +0 -18
- package/vendor/ink/build/hooks/use-focus-manager.js.map +0 -1
- package/vendor/ink/build/hooks/use-focus.d.ts +0 -30
- package/vendor/ink/build/hooks/use-focus.js +0 -43
- package/vendor/ink/build/hooks/use-focus.js.map +0 -1
- package/vendor/ink/build/hooks/use-input.d.ts +0 -132
- package/vendor/ink/build/hooks/use-input.js +0 -126
- package/vendor/ink/build/hooks/use-input.js.map +0 -1
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.d.ts +0 -6
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js +0 -12
- package/vendor/ink/build/hooks/use-is-screen-reader-enabled.js.map +0 -1
- package/vendor/ink/build/hooks/use-paste.d.ts +0 -35
- package/vendor/ink/build/hooks/use-paste.js +0 -62
- package/vendor/ink/build/hooks/use-paste.js.map +0 -1
- package/vendor/ink/build/hooks/use-stderr.d.ts +0 -5
- package/vendor/ink/build/hooks/use-stderr.js +0 -8
- package/vendor/ink/build/hooks/use-stderr.js.map +0 -1
- package/vendor/ink/build/hooks/use-stdin.d.ts +0 -7
- package/vendor/ink/build/hooks/use-stdin.js +0 -9
- package/vendor/ink/build/hooks/use-stdin.js.map +0 -1
- package/vendor/ink/build/hooks/use-stdout.d.ts +0 -5
- package/vendor/ink/build/hooks/use-stdout.js +0 -8
- package/vendor/ink/build/hooks/use-stdout.js.map +0 -1
- package/vendor/ink/build/hooks/use-window-size.d.ts +0 -18
- package/vendor/ink/build/hooks/use-window-size.js +0 -22
- package/vendor/ink/build/hooks/use-window-size.js.map +0 -1
- package/vendor/ink/build/index.d.ts +0 -42
- package/vendor/ink/build/index.js +0 -24
- package/vendor/ink/build/index.js.map +0 -1
- package/vendor/ink/build/ink.d.ts +0 -146
- package/vendor/ink/build/ink.js +0 -1287
- package/vendor/ink/build/ink.js.map +0 -1
- package/vendor/ink/build/input-parser.d.ts +0 -15
- package/vendor/ink/build/input-parser.js +0 -63
- package/vendor/ink/build/input-parser.js.map +0 -1
- package/vendor/ink/build/instances.d.ts +0 -3
- package/vendor/ink/build/instances.js +0 -8
- package/vendor/ink/build/instances.js.map +0 -1
- package/vendor/ink/build/kitty-keyboard.d.ts +0 -23
- package/vendor/ink/build/kitty-keyboard.js +0 -32
- package/vendor/ink/build/kitty-keyboard.js.map +0 -1
- package/vendor/ink/build/log-update.d.ts +0 -20
- package/vendor/ink/build/log-update.js +0 -320
- package/vendor/ink/build/log-update.js.map +0 -1
- package/vendor/ink/build/measure-element.d.ts +0 -20
- package/vendor/ink/build/measure-element.js +0 -13
- package/vendor/ink/build/measure-element.js.map +0 -1
- package/vendor/ink/build/measure-text.d.ts +0 -6
- package/vendor/ink/build/measure-text.js +0 -24
- package/vendor/ink/build/measure-text.js.map +0 -1
- package/vendor/ink/build/output.d.ts +0 -35
- package/vendor/ink/build/output.js +0 -567
- package/vendor/ink/build/output.js.map +0 -1
- package/vendor/ink/build/parse-keypress.d.ts +0 -20
- package/vendor/ink/build/parse-keypress.js +0 -495
- package/vendor/ink/build/parse-keypress.js.map +0 -1
- package/vendor/ink/build/reconciler.d.ts +0 -4
- package/vendor/ink/build/reconciler.js +0 -306
- package/vendor/ink/build/reconciler.js.map +0 -1
- package/vendor/ink/build/render-background.d.ts +0 -4
- package/vendor/ink/build/render-background.js +0 -25
- package/vendor/ink/build/render-background.js.map +0 -1
- package/vendor/ink/build/render-border.d.ts +0 -4
- package/vendor/ink/build/render-border.js +0 -84
- package/vendor/ink/build/render-border.js.map +0 -1
- package/vendor/ink/build/render-node-to-output.d.ts +0 -14
- package/vendor/ink/build/render-node-to-output.js +0 -207
- package/vendor/ink/build/render-node-to-output.js.map +0 -1
- package/vendor/ink/build/render-to-string.d.ts +0 -38
- package/vendor/ink/build/render-to-string.js +0 -116
- package/vendor/ink/build/render-to-string.js.map +0 -1
- package/vendor/ink/build/render.d.ts +0 -176
- package/vendor/ink/build/render.js +0 -84
- package/vendor/ink/build/render.js.map +0 -1
- package/vendor/ink/build/renderer.d.ts +0 -8
- package/vendor/ink/build/renderer.js +0 -67
- package/vendor/ink/build/renderer.js.map +0 -1
- package/vendor/ink/build/sanitize-ansi.d.ts +0 -2
- package/vendor/ink/build/sanitize-ansi.js +0 -27
- package/vendor/ink/build/sanitize-ansi.js.map +0 -1
- package/vendor/ink/build/selection-rect.js +0 -80
- package/vendor/ink/build/squash-text-nodes.d.ts +0 -3
- package/vendor/ink/build/squash-text-nodes.js +0 -36
- package/vendor/ink/build/squash-text-nodes.js.map +0 -1
- package/vendor/ink/build/styles.d.ts +0 -302
- package/vendor/ink/build/styles.js +0 -303
- package/vendor/ink/build/styles.js.map +0 -1
- package/vendor/ink/build/termio-keypress.js +0 -271
- package/vendor/ink/build/termio-tokenize.js +0 -188
- package/vendor/ink/build/utils.d.ts +0 -9
- package/vendor/ink/build/utils.js +0 -19
- package/vendor/ink/build/utils.js.map +0 -1
- package/vendor/ink/build/wrap-text.d.ts +0 -5
- package/vendor/ink/build/wrap-text.js +0 -204
- package/vendor/ink/build/wrap-text.js.map +0 -1
- package/vendor/ink/build/write-synchronized.d.ts +0 -4
- package/vendor/ink/build/write-synchronized.js +0 -9
- package/vendor/ink/build/write-synchronized.js.map +0 -1
- package/vendor/ink/license +0 -10
- package/vendor/ink/package.json +0 -137
- /package/src/runtime/office/{office-documents.mjs → core/office-documents.mjs} +0 -0
- /package/src/runtime/office/{pagination.mjs → core/pagination.mjs} +0 -0
- /package/src/runtime/office/{design-docx-components.mjs → design/docx/design-docx-components.mjs} +0 -0
- /package/src/runtime/office/{templates → design/library/templates}/mixdog-executive.pptx +0 -0
- /package/src/runtime/office/{templates → design/library/templates}/mixdog-executive.pptx.mixdog.json +0 -0
- /package/src/runtime/office/{image-layout.mjs → portable/image-layout.mjs} +0 -0
- /package/src/runtime/office/{portable-ooxml.mjs → portable/portable-ooxml.mjs} +0 -0
- /package/src/runtime/office/{portable-pptx-deck.mjs → portable/portable-pptx-deck.mjs} +0 -0
- /package/src/runtime/office/{portable-sheet-parts.mjs → portable/portable-sheet-parts.mjs} +0 -0
- /package/src/runtime/office/{portable-sheet-xml.mjs → portable/portable-sheet-xml.mjs} +0 -0
- /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 (
|
|
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
|
-
|
|
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
|
|
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.
|
|
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:
|
|
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": "
|
|
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": {
|
package/scripts/build-tui.mjs
CHANGED
|
@@ -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
|
|
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
|
+
}
|