mixdog 1.3.1 → 1.3.2
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/README.md +8 -4
- package/package.json +2 -2
- package/scripts/native-release-status.mjs +238 -0
- package/src/defaults/shipped-history.json +5 -1
- package/src/defaults/skills/pptx/scripts/qc-pages.mjs +3 -2
- package/src/defaults/skills/setup/SKILL.md +23 -1
- package/src/defaults/skills/setup/references/actions.md +50 -3
- package/src/defaults/skills/setup/references/surfaces.md +23 -3
- package/src/defaults/skills/setup-guide/SKILL.md +7 -3
- package/src/defaults/skills/visualize/SKILL.md +9 -6
- package/src/defaults/skills/visualize/references/craft.md +8 -1
- package/src/help.mjs +1 -1
- package/src/lib/keychain-cjs.cjs +4 -1
- package/src/lib/rules-builder.cjs +14 -7
- package/src/rules/agent-mode/AGENT_MODE.md +8 -5
- package/src/rules/agent-mode/MIXY.md +6 -8
- package/src/rules/lead/LEAD.md +2 -2
- package/src/rules/shared/10-tool-workflow.md +4 -0
- package/src/rules/shared/20-research.md +2 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +5 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +8 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +6 -1
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +114 -26
- package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +8 -0
- package/src/runtime/agent/orchestrator/agent-runtime/room-supervisor-completion.mjs +5 -4
- package/src/runtime/agent/orchestrator/agent-trace.mjs +3 -0
- package/src/runtime/agent/orchestrator/cache-break-trace.mjs +4 -0
- package/src/runtime/agent/orchestrator/config-presets.mjs +2 -0
- package/src/runtime/agent/orchestrator/config-storage.mjs +10 -3
- package/src/runtime/agent/orchestrator/config.mjs +11 -0
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -2
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +97 -5
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +6 -10
- package/src/runtime/agent/orchestrator/mcp/client.mjs +7 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +80 -31
- package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +67 -38
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +6 -2
- package/src/runtime/agent/orchestrator/providers/auto-effort.mjs +27 -8
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +31 -4
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +11 -8
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +16 -0
- package/src/runtime/agent/orchestrator/providers/lib/tail-reminder-split.mjs +13 -0
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -1
- package/src/runtime/agent/orchestrator/providers/mixdog-local.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +5 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +9 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +30 -3
- package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +61 -8
- package/src/runtime/agent/orchestrator/providers/registry.mjs +9 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +90 -24
- package/src/runtime/agent/orchestrator/runtime-core/fs-utils.mjs +8 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +68 -22
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +4 -6
- package/src/runtime/agent/orchestrator/runtime-core/route-context-state.mjs +81 -0
- package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +12 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +6 -5
- package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +7 -6
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow/packs.mjs +8 -4
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/agent-mode.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/agent-room-supervisor.d.mts +1 -1
- package/src/runtime/agent/orchestrator/session/agent-room-supervisor.mjs +22 -4
- package/src/runtime/agent/orchestrator/session/agent-room.d.mts +17 -2
- package/src/runtime/agent/orchestrator/session/agent-room.mjs +133 -38
- package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +80 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +14 -11
- package/src/runtime/agent/orchestrator/session/compact/forked-summary.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +68 -18
- package/src/runtime/agent/orchestrator/session/compact/summary-mode.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +87 -0
- package/src/runtime/agent/orchestrator/session/compact/summary.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +41 -10
- package/src/runtime/agent/orchestrator/session/human-gate/delegation.mjs +230 -0
- package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +136 -32
- package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +20 -0
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +21 -9
- package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +73 -0
- package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +55 -27
- package/src/runtime/agent/orchestrator/session/human-gate/unattended-port.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +189 -105
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +6 -2
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +5 -5
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +38 -5
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +21 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +12 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +11 -5
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +13 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +44 -18
- package/src/runtime/agent/orchestrator/session/manager/orchestration-mode-switch-notice.mjs +99 -0
- package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +42 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +3 -9
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-file.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +5 -3
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +40 -1
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +12 -0
- package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +20 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +55 -27
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +3 -8
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +12 -1
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +6 -15
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +24 -8
- package/src/runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs +94 -13
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +42 -10
- package/src/runtime/agent/orchestrator/session/provider-prefix-guard.mjs +21 -3
- package/src/runtime/agent/orchestrator/session/routine-result.d.mts +18 -3
- package/src/runtime/agent/orchestrator/session/routine-result.mjs +120 -9
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +41 -7
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +10 -2
- package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +14 -2
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +15 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +8 -3
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +36 -1
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +40 -5
- package/src/runtime/agent/orchestrator/session/store-summary-last-message.mjs +47 -2
- package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +125 -0
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +78 -43
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +35 -5
- package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +42 -2
- package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +35 -13
- package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +25 -5
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +13 -14
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/transport-artifacts.mjs +9 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +19 -14
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +6 -14
- package/src/runtime/agent/orchestrator/tools/builtin/pdf-test-fixtures.mjs +5 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-image.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-media.mjs +47 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +264 -87
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +10 -4
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +34 -21
- package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +8 -4
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +9 -30
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +24 -12
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +3 -2
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/patch/delete-quarantine.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/patch/replay-capture.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/patch/rollback-state.mjs +33 -2
- package/src/runtime/agent/orchestrator/tools/patch-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +5 -3
- package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +3 -1
- package/src/runtime/attachments/attachment-reference.mjs +155 -0
- package/src/runtime/attachments/limits.mjs +5 -1
- package/src/runtime/attachments/office-extract.mjs +3 -6
- package/src/runtime/attachments/pdf-extract.mjs +84 -10
- package/src/runtime/attachments/store.mjs +49 -30
- package/src/runtime/browser-bridge/client.mjs +73 -20
- package/src/runtime/channels/lib/runtime-paths.mjs +1 -1
- package/src/runtime/channels/lib/scheduler.mjs +14 -7
- package/src/runtime/channels/lib/state-file.mjs +15 -15
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +14 -13
- package/src/runtime/channels/lib/webhook/relay-tunnel.mjs +22 -18
- package/src/runtime/channels/lib/webhook/session-dispatch.mjs +14 -36
- package/src/runtime/channels/lib/worker-main.mjs +3 -2
- package/src/runtime/effort-judge/compact-tokenizer.mjs +8 -2
- package/src/runtime/effort-judge/judge-client.mjs +5 -2
- package/src/runtime/effort-judge/model-install.mjs +16 -8
- package/src/runtime/local-provider/asset-installer.mjs +10 -4
- package/src/runtime/local-provider/catalog.mjs +5 -2
- package/src/runtime/local-provider/registered-models.mjs +64 -27
- package/src/runtime/local-provider/server.mjs +2 -3
- package/src/runtime/media/adapters/image-api.mjs +89 -0
- package/src/runtime/media/auth.mjs +64 -1
- package/src/runtime/media/catalog.mjs +66 -4
- package/src/runtime/media/jobs.mjs +4 -0
- package/src/runtime/media/lanes.mjs +46 -5
- package/src/runtime/media/media-usage.mjs +17 -0
- package/src/runtime/media/renditions.mjs +15 -15
- package/src/runtime/media/store.mjs +36 -35
- package/src/runtime/media/tool.mjs +8 -1
- package/src/runtime/memory/lib/cycle-scheduler/health-ledger.mjs +8 -2
- package/src/runtime/memory/lib/embedding-model-files.mjs +30 -7
- package/src/runtime/memory/lib/ingest/transcript-tail.mjs +16 -7
- package/src/runtime/memory/lib/pg/process.mjs +8 -4
- package/src/runtime/memory/lib/project-id-resolver.mjs +5 -1
- package/src/runtime/memory/lib/runtime-fetcher.mjs +6 -1
- package/src/runtime/office/core/journal.mjs +7 -14
- package/src/runtime/office/design/library/design-library-core.mjs +4 -16
- package/src/runtime/office/pdf/ocr-engine-worker.mjs +37 -0
- package/src/runtime/office/pdf/ocr-engine.mjs +146 -0
- package/src/runtime/office/pdf/pdf-ocr.mjs +51 -21
- package/src/runtime/office/pdf/pdf-render.mjs +30 -18
- package/src/runtime/office/portable/ooxml-validator.mjs +2 -2
- package/src/runtime/office/portable/portable-soffice.mjs +4 -0
- package/src/runtime/shared/agent-kind-migration.mjs +200 -0
- package/src/runtime/shared/agent-message-envelope.d.mts +6 -0
- package/src/runtime/shared/agent-message-envelope.mjs +44 -0
- package/src/runtime/shared/agent-reap-state.d.mts +4 -0
- package/src/runtime/shared/agent-store.mjs +24 -7
- package/src/runtime/shared/agent-task-starts.mjs +27 -0
- package/src/runtime/shared/atomic-file.d.mts +50 -0
- package/src/runtime/shared/atomic-file.mjs +394 -132
- package/src/runtime/shared/background-tasks.mjs +7 -4
- package/src/runtime/shared/bot-hops.mjs +30 -0
- package/src/runtime/shared/bot-split-migration.mjs +1 -1
- package/src/runtime/shared/bounded-download.mjs +4 -2
- package/src/runtime/shared/config.mjs +39 -9
- package/src/runtime/shared/defaults-separation.mjs +6 -2
- package/src/runtime/shared/delegated-approval-host.mjs +74 -0
- package/src/runtime/shared/err-text.mjs +4 -0
- package/src/runtime/shared/error-presentation.mjs +22 -4
- package/src/runtime/shared/file-has-data.mjs +28 -0
- package/src/runtime/shared/llm/usage-ledger-import.mjs +37 -18
- package/src/runtime/shared/pending-agent-work.mjs +54 -0
- package/src/runtime/shared/process-lifecycle.mjs +8 -12
- package/src/runtime/shared/projects.mjs +50 -41
- package/src/runtime/shared/provider-accounts.mjs +17 -12
- package/src/runtime/shared/routine-trigger.d.mts +6 -1
- package/src/runtime/shared/routine-trigger.mjs +14 -6
- package/src/runtime/shared/run-child.d.mts +3 -0
- package/src/runtime/shared/run-child.mjs +24 -3
- package/src/runtime/shared/session-baseline-store.mjs +8 -2
- package/src/runtime/shared/singleton-owner.mjs +7 -6
- package/src/runtime/shared/skill-tool-dependencies.mjs +4 -10
- package/src/runtime/shared/staged-update.mjs +4 -2
- package/src/runtime/shared/statusline/statusline-segments.mjs +4 -15
- package/src/runtime/shared/tool-execution-contract.mjs +6 -0
- package/src/runtime/shared/transcript-metadata.mjs +28 -3
- package/src/runtime/shared/transcript-writer/session-record.mjs +7 -6
- package/src/runtime/shared/turn-snapshot-store.mjs +5 -4
- package/src/runtime/shared/turn-snapshot.mjs +44 -2
- package/src/runtime/shared/user-cwd.mjs +9 -4
- package/src/runtime/shared/user-data-guard.mjs +41 -42
- package/src/runtime/shared/utf8-cut.mjs +10 -0
- package/src/runtime/shared/worktrees/activity-gate.mjs +269 -61
- package/src/runtime/shared/worktrees/registry.mjs +26 -26
- package/src/runtime/tidy/core-install.mjs +26 -4
- package/src/runtime/tidy/install.mjs +91 -23
- package/src/runtime/web-search/lib/config.mjs +4 -16
- package/src/session-runtime/agent-home-delivery.mjs +555 -199
- package/src/session-runtime/agent-room-delivery.mjs +143 -36
- package/src/session-runtime/agent-task-sessions.mjs +667 -165
- package/src/session-runtime/agent-tool-routing.mjs +1 -0
- package/src/session-runtime/boot/apis.mjs +45 -24
- package/src/session-runtime/boot/config.mjs +1 -0
- package/src/session-runtime/boot/facade.mjs +11 -1
- package/src/session-runtime/boot/infrastructure.mjs +14 -2
- package/src/session-runtime/boot/providers.mjs +2 -2
- package/src/session-runtime/boot/shared.mjs +12 -6
- package/src/session-runtime/boot/tools.mjs +2 -2
- package/src/session-runtime/bot-status.mjs +432 -0
- package/src/session-runtime/config-lifecycle/lead-route-sync.mjs +29 -0
- package/src/session-runtime/config-lifecycle.mjs +60 -55
- package/src/session-runtime/cwd-plugins/core-memory-context.mjs +2 -4
- package/src/session-runtime/held-requests.mjs +36 -33
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +10 -1
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -2
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +19 -4
- package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
- package/src/session-runtime/lifecycle/teardown.mjs +11 -3
- package/src/session-runtime/mcp-glue/connect.mjs +100 -186
- package/src/session-runtime/mcp-glue/initial-connect-gate.mjs +57 -0
- package/src/session-runtime/mcp-glue/server-connection.mjs +71 -0
- package/src/session-runtime/media-api.mjs +5 -2
- package/src/session-runtime/model-route/route-tuning.mjs +4 -1
- package/src/session-runtime/model-route/set-route.mjs +61 -1
- package/src/session-runtime/owned-automation-run.mjs +8 -1
- package/src/session-runtime/room-member-gate.mjs +16 -3
- package/src/session-runtime/route-resolution.mjs +16 -8
- package/src/session-runtime/route-state.mjs +1 -59
- package/src/session-runtime/routine-home-turn.mjs +5 -3
- package/src/session-runtime/runtime-bootstrap.mjs +5 -3
- package/src/session-runtime/runtime-paths.mjs +11 -5
- package/src/session-runtime/runtime-tunables.mjs +6 -0
- package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +11 -2
- package/src/session-runtime/services/agent-tool/close-flow.mjs +4 -2
- package/src/session-runtime/services/agent-tool/execute-send.mjs +1 -0
- package/src/session-runtime/services/agent-tool/execute-spawn.mjs +1 -0
- package/src/session-runtime/services/agent-tool/restart-notify.mjs +10 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +25 -21
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +4 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +6 -3
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +8 -5
- package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +22 -2
- package/src/session-runtime/services/agent-tool/worker-index.mjs +4 -6
- package/src/session-runtime/services/agent-tool.mjs +6 -0
- package/src/session-runtime/services/daemon-crash-capture/daemon-exit-record.mjs +1 -1
- package/src/session-runtime/services/daemon-crash-capture/retention.mjs +4 -3
- package/src/session-runtime/services/hook-bus/config-loader.mjs +14 -5
- package/src/session-runtime/services/hook-bus/rule-file.mjs +49 -11
- package/src/session-runtime/services/plugin-admin.mjs +26 -26
- package/src/session-runtime/services/provider-admin.mjs +14 -4
- package/src/session-runtime/services/schedule-access.mjs +33 -4
- package/src/session-runtime/services/seeds.mjs +4 -3
- package/src/session-runtime/services/usage-dashboard.mjs +1 -1
- package/src/session-runtime/services/usage-stats-model.mjs +2 -1
- package/src/session-runtime/session-create/materialize.mjs +2 -3
- package/src/session-runtime/session-create/session-options.mjs +15 -2
- package/src/session-runtime/settings-builtin-tools-api.mjs +63 -1
- package/src/session-runtime/settings-compaction-api.mjs +86 -39
- package/src/session-runtime/setup-tool/executor.mjs +8 -2
- package/src/session-runtime/setup-tool/settings-contract.mjs +31 -1
- package/src/session-runtime/setup-tool/tool-defs.mjs +20 -3
- package/src/session-runtime/skills-api.mjs +12 -5
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +265 -0
- package/src/session-runtime/tool-policy/mode-switch.mjs +54 -0
- package/src/session-runtime/tool-policy/pending-switches.mjs +59 -0
- package/src/session-runtime/tool-policy/policy-stage.mjs +165 -0
- package/src/session-runtime/tool-policy/session-switches.mjs +169 -0
- package/src/session-runtime/tool-policy/surface-helpers.mjs +114 -0
- package/src/session-runtime/tool-policy/workflow-overlay.mjs +145 -0
- package/src/session-runtime/tool-policy-refresh.mjs +47 -369
- package/src/session-runtime/tool-surface.mjs +5 -3
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +95 -88
- package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
- package/src/session-runtime/turn/turn-run.mjs +2 -1
- package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +54 -7
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +519 -333
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +46 -46
- package/src/session-runtime/workflow-agents-api/shared.mjs +5 -1
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +14 -1
- package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +6 -3
- package/src/session-runtime/workspace/workspace-state.mjs +7 -6
- package/src/standalone/daemon-agent-control.mjs +4 -1
- package/src/standalone/daemon-session-control.mjs +51 -10
- package/src/standalone/daemon.mjs +28 -10
- package/src/standalone/local-session-runtime.mjs +22 -14
- package/src/standalone/session-client.mjs +7 -2
- package/src/standalone/session-protocol.mjs +7 -0
- package/src/standalone/session-service.mjs +11 -0
- package/src/standalone/session-state-projection.mjs +19 -9
- package/src/standalone/session-tool-output.mjs +35 -9
- package/src/tui/app/maintenance-pickers/auto-clear-picker.mjs +19 -13
- package/src/tui/app/settings-picker/settings-rows.mjs +2 -2
- package/src/tui/app/slash-commands.mjs +1 -1
- package/src/tui/app/usage-context-panels/context-model.mjs +8 -2
- package/src/tui/dist/index.mjs +529 -333
- package/src/tui/prompt-history-store.mjs +16 -21
- package/src/tui/session/context-state.mjs +4 -0
- package/src/tui/session/session-api/intake/abort.mjs +19 -1
- package/src/tui/session/session-api/media.mjs +2 -1
- package/src/tui/session/session-api/routes-agent-definitions.mjs +75 -0
- package/src/tui/session/session-api/routes-write.mjs +203 -0
- package/src/tui/session/session-api/routes.mjs +23 -247
- package/src/tui/session/session-api/settings.mjs +14 -1
- package/src/tui/session/session-flow/drain.mjs +28 -3
- package/src/tui/session/session-flow/failed-turn-rewind.mjs +4 -2
- package/src/tui/session/session-flow/queue/take-entries.mjs +8 -0
- package/src/tui/session/session-flow/steering.mjs +8 -3
- package/src/tui/session/tool-approval.mjs +185 -20
- package/src/tui/session/transcript-intake.mjs +2 -0
- package/src/tui/session/turn.mjs +23 -14
- package/src/tui/transcript-tool-failures.mjs +8 -2
- package/src/vendor/statusline/src/gateway/route-meta.mjs +7 -8
- package/src/vendor/statusline/src/gateway/session-routes.mjs +6 -7
- package/src/rules/agent-mode/ROUTINE.md +0 -6
package/README.md
CHANGED
|
@@ -44,9 +44,13 @@ https://github.com/user-attachments/assets/af515dc9-b0fb-4b6a-aaa1-1d82db792ed0
|
|
|
44
44
|
- Use the **Claude, ChatGPT, Grok, or Muse Code** subscription you already have, API
|
|
45
45
|
keys, or local models on your own GPU.
|
|
46
46
|
- Mix models by role and scale from **Solo to Swarm** — a strong model leads
|
|
47
|
-
while cheaper ones search, edit, and review in parallel.
|
|
47
|
+
while cheaper ones search, edit, and review in parallel. Switch the workflow
|
|
48
|
+
or mode mid-conversation, and set fallback models for usage limits.
|
|
49
|
+
- **Bots and rooms** — your own bots with their own models, tools, and
|
|
50
|
+
permissions, group rooms where they talk together, and a representative bot
|
|
51
|
+
that sits above the composer on your desktop.
|
|
48
52
|
- A full workspace: editor, terminals, Git and GitHub, code graph, and
|
|
49
|
-
language servers.
|
|
53
|
+
language servers, with themes and photo skins.
|
|
50
54
|
- Keeps working on its own with **Goals, schedules, and webhooks** — and
|
|
51
55
|
continues from your phone, end-to-end encrypted.
|
|
52
56
|
- Goes beyond code with **browser and desktop control**, Office and PDF
|
|
@@ -71,8 +75,8 @@ Then sign in with a ChatGPT, Claude, Grok, or Muse Code account, or paste an API
|
|
|
71
75
|
five-step tutorial walks you through the rest.
|
|
72
76
|
|
|
73
77
|
> [!NOTE]
|
|
74
|
-
> The Windows installer
|
|
75
|
-
> choose **More info → Run anyway**.
|
|
78
|
+
> The Windows installer and app are code-signed, and the Mac app is signed and
|
|
79
|
+
> notarized. If SmartScreen still appears, choose **More info → Run anyway**.
|
|
76
80
|
|
|
77
81
|
Or run it in the terminal (Node.js 22.19+ or 24+):
|
|
78
82
|
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "mixdog",
|
|
3
|
-
"version": "1.3.
|
|
3
|
+
"version": "1.3.2",
|
|
4
4
|
"private": false,
|
|
5
5
|
"type": "module",
|
|
6
6
|
"description": "Open-source coding agent that matches Codex on Terminal-Bench 2.1 with 63% fewer tokens.",
|
|
@@ -98,7 +98,7 @@
|
|
|
98
98
|
"test:office:live:all": "node scripts/run-office-live-tests.mjs all",
|
|
99
99
|
"test:office:render": "node scripts/test-direct.mjs src/runtime/office/pptx-skill-kit.slow.test.mjs",
|
|
100
100
|
"office:icons": "node scripts/office/build-pptx-icons.mjs",
|
|
101
|
-
"test:media": "node scripts/test-direct.mjs src/runtime/media/catalog.test.mjs src/runtime/media/lanes.test.mjs src/runtime/media/tool.test.mjs src/runtime/media/defaults.test.mjs src/runtime/media/store.test.mjs src/runtime/media/renditions.test.mjs src/runtime/media/adapters/codex-image.test.mjs src/runtime/media/adapters/gemini-image.test.mjs",
|
|
101
|
+
"test:media": "node scripts/test-direct.mjs src/runtime/media/catalog.test.mjs src/runtime/media/lanes.test.mjs src/runtime/media/tool.test.mjs src/runtime/media/defaults.test.mjs src/runtime/media/store.test.mjs src/runtime/media/renditions.test.mjs src/runtime/media/adapters/codex-image.test.mjs src/runtime/media/adapters/gemini-image.test.mjs src/runtime/media/adapters/image-api.test.mjs src/tui/session/session-api/media-lanes.test.mjs",
|
|
102
102
|
"failures": "node scripts/tool-failures.mjs",
|
|
103
103
|
"trace:llm": "node scripts/llm-trace-summary.mjs",
|
|
104
104
|
"bench:office": "node src/runtime/office/bench/benchmark.mjs",
|
|
@@ -0,0 +1,238 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// Native tools (patch, graph, spawn) ship as their own immutable GitHub
|
|
3
|
+
// releases (`<kind>-v<version>`); the app pins one through
|
|
4
|
+
// src/runtime/agent/orchestrator/tools/<kind>-manifest.json and downloads that
|
|
5
|
+
// release's assets. A fix committed under native/<tool>/ therefore reaches
|
|
6
|
+
// users only when a new `<kind>-v*` release is published AND the manifest pin
|
|
7
|
+
// moves. This script answers, for every tool, "does the source differ from the
|
|
8
|
+
// release the app pins?" and is the single definition used by:
|
|
9
|
+
// - deploy.yml plan (refuses native=skip while a tool is unreleased)
|
|
10
|
+
// - release.yml validate (fails a release that would ship an unreleased tool)
|
|
11
|
+
// - the dev scripts (warn / rebuild a stale local target/release binary)
|
|
12
|
+
//
|
|
13
|
+
// node scripts/native-release-status.mjs table
|
|
14
|
+
// node scripts/native-release-status.mjs --json
|
|
15
|
+
// node scripts/native-release-status.mjs --check exit 1 when a tool is unreleased
|
|
16
|
+
// node scripts/native-release-status.mjs --warn-dev warnings for a dev build, exit 0
|
|
17
|
+
//
|
|
18
|
+
// native/mixdog-computer, native/mixdog-browser-import and native/gnome-extension
|
|
19
|
+
// have no release/manifest: the desktop package builds them from source, keyed
|
|
20
|
+
// on a hash of that source (desktop-package.yml), so they cannot go stale.
|
|
21
|
+
import { spawn, spawnSync } from 'node:child_process';
|
|
22
|
+
import { existsSync, readdirSync, readFileSync, statSync } from 'node:fs';
|
|
23
|
+
import { dirname, join } from 'node:path';
|
|
24
|
+
import { fileURLToPath, pathToFileURL } from 'node:url';
|
|
25
|
+
|
|
26
|
+
const TOOLS_DIR = 'src/runtime/agent/orchestrator/tools';
|
|
27
|
+
|
|
28
|
+
export const NATIVE_RELEASE_TOOLS = Object.freeze(
|
|
29
|
+
['patch', 'graph', 'spawn'].map((kind) =>
|
|
30
|
+
Object.freeze({
|
|
31
|
+
kind,
|
|
32
|
+
dir: `native/mixdog-${kind}`,
|
|
33
|
+
manifestPath: `${TOOLS_DIR}/${kind}-manifest.json`,
|
|
34
|
+
tagPrefix: `${kind}-v`,
|
|
35
|
+
binaryName: `mixdog-${kind}${process.platform === 'win32' ? '.exe' : ''}`,
|
|
36
|
+
})
|
|
37
|
+
)
|
|
38
|
+
);
|
|
39
|
+
|
|
40
|
+
const DEFAULT_ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
|
|
41
|
+
|
|
42
|
+
function git(root, args) {
|
|
43
|
+
const result = spawnSync('git', args, { cwd: root, encoding: 'utf8', maxBuffer: 64 * 1024 * 1024 });
|
|
44
|
+
if (result.error) throw result.error;
|
|
45
|
+
return result;
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
/** Newest mtime (ms) of the files that decide a cargo build of `toolDir`. */
|
|
49
|
+
export function newestSourceMtime(toolDir) {
|
|
50
|
+
let newest = 0;
|
|
51
|
+
const consider = (path) => {
|
|
52
|
+
try {
|
|
53
|
+
const stat = statSync(path);
|
|
54
|
+
if (stat.isFile() && stat.mtimeMs > newest) newest = stat.mtimeMs;
|
|
55
|
+
} catch {
|
|
56
|
+
/* absent */
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
for (const file of ['Cargo.toml', 'Cargo.lock', 'build.rs']) consider(join(toolDir, file));
|
|
60
|
+
const src = join(toolDir, 'src');
|
|
61
|
+
if (existsSync(src)) for (const entry of readdirSync(src, { recursive: true })) consider(join(src, entry));
|
|
62
|
+
return newest;
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/** The local `cargo build --release` binary the dev resolvers prefer over the
|
|
66
|
+
* pinned download, and whether the sources are newer than it. */
|
|
67
|
+
export function localBinaryState(tool, root = DEFAULT_ROOT) {
|
|
68
|
+
const path = join(root, tool.dir, 'target', 'release', tool.binaryName);
|
|
69
|
+
if (!existsSync(path)) return { path, exists: false, stale: false };
|
|
70
|
+
const builtMs = statSync(path).mtimeMs;
|
|
71
|
+
return { path, exists: true, builtMs, stale: newestSourceMtime(join(root, tool.dir)) > builtMs };
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
/** Release status of one tool at HEAD plus the working tree of `root`. */
|
|
75
|
+
export function nativeToolStatus(tool, root = DEFAULT_ROOT) {
|
|
76
|
+
const manifest = JSON.parse(readFileSync(join(root, tool.manifestPath), 'utf8'));
|
|
77
|
+
const version = String(manifest.version);
|
|
78
|
+
const tag = `${tool.tagPrefix}${version}`;
|
|
79
|
+
const tagCommit = git(root, ['rev-parse', '--verify', '--quiet', `refs/tags/${tag}^{commit}`]);
|
|
80
|
+
const tagMissing = tagCommit.status !== 0;
|
|
81
|
+
let changedFiles = [];
|
|
82
|
+
let commits = [];
|
|
83
|
+
let tagDate = '';
|
|
84
|
+
if (!tagMissing) {
|
|
85
|
+
const diff = git(root, ['diff', '--name-only', tag, 'HEAD', '--', tool.dir]);
|
|
86
|
+
if (diff.status !== 0) throw new Error(`git diff failed for ${tag}: ${diff.stderr}`);
|
|
87
|
+
changedFiles = diff.stdout.split('\n').filter(Boolean);
|
|
88
|
+
commits = git(root, ['log', '--format=%h %cs %s', `${tag}..HEAD`, '--', tool.dir])
|
|
89
|
+
.stdout.split('\n')
|
|
90
|
+
.filter(Boolean);
|
|
91
|
+
tagDate = git(root, ['log', '-1', '--format=%cs', tag]).stdout.trim();
|
|
92
|
+
}
|
|
93
|
+
const dirtyFiles = git(root, ['status', '--porcelain', '--', tool.dir]).stdout.split('\n').filter(Boolean);
|
|
94
|
+
const unreleased = tagMissing || changedFiles.length > 0 || dirtyFiles.length > 0;
|
|
95
|
+
return {
|
|
96
|
+
kind: tool.kind,
|
|
97
|
+
version,
|
|
98
|
+
tag,
|
|
99
|
+
tagMissing,
|
|
100
|
+
tagCommit: tagMissing ? '' : tagCommit.stdout.trim().slice(0, 9),
|
|
101
|
+
tagDate,
|
|
102
|
+
changedFiles,
|
|
103
|
+
commits,
|
|
104
|
+
dirtyFiles,
|
|
105
|
+
unreleased,
|
|
106
|
+
local: localBinaryState(tool, root),
|
|
107
|
+
};
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
export function nativeReleaseStatuses(root = DEFAULT_ROOT, tools = NATIVE_RELEASE_TOOLS) {
|
|
111
|
+
return tools.map((tool) => nativeToolStatus(tool, root));
|
|
112
|
+
}
|
|
113
|
+
|
|
114
|
+
/** Operator-facing explanation for every unreleased tool, or []. */
|
|
115
|
+
export function unreleasedProblems(statuses) {
|
|
116
|
+
return statuses
|
|
117
|
+
.filter((status) => status.unreleased)
|
|
118
|
+
.map((status) => {
|
|
119
|
+
if (status.tagMissing) {
|
|
120
|
+
return `${status.kind}: the pinned release tag ${status.tag} does not exist, so the source it ships cannot be compared.`;
|
|
121
|
+
}
|
|
122
|
+
const what = [
|
|
123
|
+
status.changedFiles.length &&
|
|
124
|
+
`${status.changedFiles.length} file(s) changed since ${status.tag} (${status.changedFiles.slice(0, 3).join(', ')}${status.changedFiles.length > 3 ? ', ...' : ''})`,
|
|
125
|
+
status.dirtyFiles.length && `${status.dirtyFiles.length} uncommitted file(s)`,
|
|
126
|
+
]
|
|
127
|
+
.filter(Boolean)
|
|
128
|
+
.join(' and ');
|
|
129
|
+
return (
|
|
130
|
+
`${status.kind}: ${what}, but users still get ${status.tag}. ` +
|
|
131
|
+
`Publish a new ${status.kind}-v release and bump ${TOOLS_DIR}/${status.kind}-manifest.json: ` +
|
|
132
|
+
`run Deploy with native=auto (or force); it bumps native/mixdog-${status.kind}/Cargo.toml, tags and syncs the manifest.`
|
|
133
|
+
);
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
/** Warnings for a local dev build, which ships the pinned download rather than the working tree. */
|
|
138
|
+
export function devWarnings(statuses) {
|
|
139
|
+
const warnings = [];
|
|
140
|
+
for (const status of statuses) {
|
|
141
|
+
if (status.unreleased && !status.tagMissing) {
|
|
142
|
+
warnings.push(
|
|
143
|
+
`native ${status.kind}: source differs from the pinned ${status.tag} ` +
|
|
144
|
+
`(${status.changedFiles.length} committed, ${status.dirtyFiles.length} uncommitted file(s)). ` +
|
|
145
|
+
`A packaged dev build downloads the released binary, so these changes are NOT in it until a ${status.kind}-v release is published.`
|
|
146
|
+
);
|
|
147
|
+
}
|
|
148
|
+
if (status.local.stale) {
|
|
149
|
+
warnings.push(
|
|
150
|
+
`native ${status.kind}: ${status.local.path} is older than its sources and is preferred by source checkouts. ` +
|
|
151
|
+
`Rebuild: cargo build --release --manifest-path native/mixdog-${status.kind}/Cargo.toml`
|
|
152
|
+
);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return warnings;
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
function cargoBuild(root, tool) {
|
|
159
|
+
return new Promise((resolve) => {
|
|
160
|
+
const child = spawn(
|
|
161
|
+
'cargo',
|
|
162
|
+
['build', '--locked', '--release', '--manifest-path', join(root, tool.dir, 'Cargo.toml')],
|
|
163
|
+
{ stdio: 'inherit' }
|
|
164
|
+
);
|
|
165
|
+
child.once('error', () => resolve(null));
|
|
166
|
+
child.once('exit', resolve);
|
|
167
|
+
});
|
|
168
|
+
}
|
|
169
|
+
|
|
170
|
+
/** Dev launch hook: rebuild every existing-but-stale local release binary.
|
|
171
|
+
* A tool with no local binary resolves to the pinned download instead, so it
|
|
172
|
+
* is left alone. Never throws: a failed build only warns. */
|
|
173
|
+
export async function refreshStaleLocalBinaries({
|
|
174
|
+
root = DEFAULT_ROOT,
|
|
175
|
+
tools = NATIVE_RELEASE_TOOLS,
|
|
176
|
+
build = cargoBuild,
|
|
177
|
+
log = console.log,
|
|
178
|
+
} = {}) {
|
|
179
|
+
const results = [];
|
|
180
|
+
for (const tool of tools) {
|
|
181
|
+
if (!localBinaryState(tool, root).stale) continue;
|
|
182
|
+
log(`native ${tool.kind}: local target/release binary is older than its sources; rebuilding.`);
|
|
183
|
+
const code = await build(root, tool);
|
|
184
|
+
const stale = code !== 0 || localBinaryState(tool, root).stale;
|
|
185
|
+
if (stale)
|
|
186
|
+
log(`native ${tool.kind}: rebuild failed (cargo missing or build error); the stale binary stays in use.`);
|
|
187
|
+
results.push({ kind: tool.kind, rebuilt: !stale });
|
|
188
|
+
}
|
|
189
|
+
return results;
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
function localBinState(local) {
|
|
193
|
+
if (!local.exists) return 'none';
|
|
194
|
+
return local.stale ? 'STALE' : 'fresh';
|
|
195
|
+
}
|
|
196
|
+
|
|
197
|
+
function formatTable(statuses) {
|
|
198
|
+
const rows = [['tool', 'pinned tag', 'tag commit', 'tag date', 'committed', 'uncommitted', 'local bin', 'state']];
|
|
199
|
+
for (const status of statuses) {
|
|
200
|
+
rows.push([
|
|
201
|
+
status.kind,
|
|
202
|
+
status.tag,
|
|
203
|
+
status.tagCommit || '(missing)',
|
|
204
|
+
status.tagDate || '-',
|
|
205
|
+
String(status.changedFiles.length),
|
|
206
|
+
String(status.dirtyFiles.length),
|
|
207
|
+
localBinState(status.local),
|
|
208
|
+
status.unreleased ? 'UNRELEASED' : 'released',
|
|
209
|
+
]);
|
|
210
|
+
}
|
|
211
|
+
const widths = rows[0].map((_, column) => Math.max(...rows.map((row) => row[column].length)));
|
|
212
|
+
return rows.map((row) => row.map((cell, column) => cell.padEnd(widths[column])).join(' ')).join('\n');
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
async function main(argv) {
|
|
216
|
+
const statuses = nativeReleaseStatuses();
|
|
217
|
+
if (argv.includes('--json')) {
|
|
218
|
+
console.log(JSON.stringify(statuses, null, 2));
|
|
219
|
+
return 0;
|
|
220
|
+
}
|
|
221
|
+
if (argv.includes('--warn-dev')) {
|
|
222
|
+
// stdout on purpose: PowerShell callers treat native stderr as an error.
|
|
223
|
+
for (const warning of devWarnings(statuses)) console.log(`WARNING: ${warning}`);
|
|
224
|
+
return 0;
|
|
225
|
+
}
|
|
226
|
+
console.log(formatTable(statuses));
|
|
227
|
+
const problems = unreleasedProblems(statuses);
|
|
228
|
+
for (const problem of problems) console.log(`\n${problem}`);
|
|
229
|
+
if (argv.includes('--check') && problems.length) {
|
|
230
|
+
console.error('\nNative release check failed: native sources differ from the releases the app pins.');
|
|
231
|
+
return 1;
|
|
232
|
+
}
|
|
233
|
+
return 0;
|
|
234
|
+
}
|
|
235
|
+
|
|
236
|
+
if (process.argv[1] && import.meta.url === pathToFileURL(process.argv[1]).href) {
|
|
237
|
+
process.exitCode = await main(process.argv.slice(2));
|
|
238
|
+
}
|
|
@@ -313,6 +313,7 @@
|
|
|
313
313
|
"48247c1645fd94aad7711082d4512c49",
|
|
314
314
|
"4f94016363acccd788a724a2d414744e",
|
|
315
315
|
"56e474f78faafae39aebe921ccff112d",
|
|
316
|
+
"60a1e22fd0c32aa283c64a2cc05b7889",
|
|
316
317
|
"6358ad25dd07a2f92ad65c249a4f360b",
|
|
317
318
|
"7fb12aeb07b79ae113c0deb0a90c6da7",
|
|
318
319
|
"804afd71ebc3f68614a4dc419af4b98e",
|
|
@@ -354,6 +355,7 @@
|
|
|
354
355
|
"50bdf35d06913236855080fdea6b50dc",
|
|
355
356
|
"5b4586a44104b26ae7dd45da101079bf",
|
|
356
357
|
"6101786127a1e68778eafcd2bf2c9ce0",
|
|
358
|
+
"64a85678fbe08d4653ab78c55ee22c7c",
|
|
357
359
|
"6711dbc9d84023b8eabfa928b8d33d18",
|
|
358
360
|
"6f9e9338f560fa9acd839a67b5e2d1cc",
|
|
359
361
|
"70c54f802c77b630863b9e17a16d8224",
|
|
@@ -377,7 +379,8 @@
|
|
|
377
379
|
],
|
|
378
380
|
"setup-guide": [
|
|
379
381
|
"633e15b84dbe22f2b578b67cc35853d4",
|
|
380
|
-
"920d5b29ccfe6c88f623cf0892b29285"
|
|
382
|
+
"920d5b29ccfe6c88f623cf0892b29285",
|
|
383
|
+
"ec88a82ab5e511c0afb1738162150648"
|
|
381
384
|
],
|
|
382
385
|
"skill-creator": [
|
|
383
386
|
"020817866da73a69544ba35086bdcd5f",
|
|
@@ -399,6 +402,7 @@
|
|
|
399
402
|
],
|
|
400
403
|
"visualize": [
|
|
401
404
|
"8320fedd9dd745a332621c325a8bf355",
|
|
405
|
+
"9c9fba19647b67d75a600137e38c02b8",
|
|
402
406
|
"aa3531bfc4fd6ec3820493d0c190cc75",
|
|
403
407
|
"f65924f0691284ad31000469a9855b62"
|
|
404
408
|
],
|
|
@@ -28,7 +28,8 @@ const number = (value) => (Number.isFinite(value) ? Number(value.toFixed(2)) : n
|
|
|
28
28
|
// pointed at a per-page working copy beside the deck.
|
|
29
29
|
export function workingCopyPath(deck, page) {
|
|
30
30
|
const extension = extname(deck);
|
|
31
|
-
|
|
31
|
+
// Not dot-prefixed: Windows cloud-sync drives refuse to create such names.
|
|
32
|
+
return join(dirname(deck), `${basename(deck, extension)}.qc-page-${page}${extension}`);
|
|
32
33
|
}
|
|
33
34
|
|
|
34
35
|
async function fileExists(path) {
|
|
@@ -202,7 +203,7 @@ async function defaultMeasure() {
|
|
|
202
203
|
// missing renderer leaves the page to the geometry read.
|
|
203
204
|
async function renderPage(office, deck, page) {
|
|
204
205
|
const cwd = dirname(deck);
|
|
205
|
-
const scratch = join(dirname(deck),
|
|
206
|
+
const scratch = join(dirname(deck), `${basename(deck, extname(deck))}.qc-render${extname(deck)}`);
|
|
206
207
|
const opened = await office(
|
|
207
208
|
{ action: 'open', path: deck, mode: 'portable', output: scratch, snapshotAfter: false },
|
|
208
209
|
cwd
|
|
@@ -74,10 +74,32 @@ that a call returned without transport error.
|
|
|
74
74
|
Computer Use actions require this conversation open in the local Desktop
|
|
75
75
|
window; voice runs on the runtime and needs no Desktop.
|
|
76
76
|
- Hook rules are before-tool policy, separate from MCP and plugins. Deleting a
|
|
77
|
-
rule is destructive; disabling preserves it.
|
|
77
|
+
rule is destructive; disabling preserves it. A rule change reaches open
|
|
78
|
+
sessions and their sub-agents on the next tool call.
|
|
79
|
+
- Auto-clear is per provider and can be `unlimited` (`never`). Built-in
|
|
80
|
+
windows: Codex/ChatGPT login unlimited, OpenAI API 30 min, Anthropic 1h.
|
|
81
|
+
Unlimited stops idle clearing only: compaction still runs at the context
|
|
82
|
+
limit, and finished sub-agent sessions are still released, never kept
|
|
83
|
+
forever: after the provider's own window (OpenAI API 30 min, Anthropic 1h,
|
|
84
|
+
DeepSeek 24h), or 1h for Codex/ChatGPT logins; an unlimited override does
|
|
85
|
+
not stop that.
|
|
78
86
|
- Desktop appearance changes affect the Desktop host, not a paired phone.
|
|
87
|
+
Fonts, imported color themes and skin transparency are saved per device.
|
|
79
88
|
Display language is independent of profile response language. A required
|
|
80
89
|
reload is reported, never performed automatically.
|
|
90
|
+
- A routine or webhook run has no user and no approval prompts: it may change
|
|
91
|
+
only its own bot's automations and route, and payment and permanent-delete
|
|
92
|
+
connectors are refused (trash moves are allowed). Bot permission "block"
|
|
93
|
+
still applies. In an attended bot conversation (home or direct chat, group
|
|
94
|
+
room, or a sub-agent/task session working for one) a payment or permanent
|
|
95
|
+
delete connector call always asks first: allow once or deny, never "항상
|
|
96
|
+
허용", whatever was stored before. Coding sessions are not asked.
|
|
97
|
+
- Prompt-affecting changes land without rewriting the cached prompt: a
|
|
98
|
+
workflow switch arrives as a reminder on the next turn; a bot's
|
|
99
|
+
instruction, persona or name applies on 적용 (one cache break); connector
|
|
100
|
+
and built-in feature changes take effect at once (tool availability and
|
|
101
|
+
call-time refusal), and only the prompt text about them waits for the cache
|
|
102
|
+
to expire.
|
|
81
103
|
- Read definitions before editing them; use skill-creator when authoring a
|
|
82
104
|
skill. Setup persists the supported definition fields. Workflow and agent
|
|
83
105
|
ids are stable identities, distinct from their display names.
|
|
@@ -28,12 +28,13 @@ Read this when choosing a `setup` mutation.
|
|
|
28
28
|
| Active workflow pack | `set_workflow` |
|
|
29
29
|
| Output style | `set_output_style` |
|
|
30
30
|
| User title, language, or experience level | `set_profile` |
|
|
31
|
-
| Idle session clearing | `set_autoclear` |
|
|
31
|
+
| Idle session clearing, per provider, including `unlimited` | `set_autoclear` |
|
|
32
32
|
| Automatic context compaction | `set_compaction` |
|
|
33
33
|
| Memory capability | `set_memory_enabled` |
|
|
34
34
|
| Background memory cycles | `set_recap_enabled` |
|
|
35
35
|
| Web Search tool exposure | `set_web_search_enabled` |
|
|
36
36
|
| Which user instruction files (AGENTS.md / CLAUDE.md) new sessions load: all, agents, claude, or off | `set_instruction_files` |
|
|
37
|
+
| The reasoning effort Auto works around: low, medium (default), or high | `set_auto_effort_base` |
|
|
37
38
|
| Git, Office, Code Tidy, Local Provider, Auto Effort, Browser, Computer, voice, or Visualize enabled state | `set_builtin_enabled` |
|
|
38
39
|
| Git, Memory, Office, Code Tidy, Local Provider, Auto Effort, Browser, Computer, or voice preparation | `install_builtin` |
|
|
39
40
|
| Managed local model installation | `install_local_model` |
|
|
@@ -78,7 +79,7 @@ Read this when choosing a `setup` mutation.
|
|
|
78
79
|
| Run a schedule once now, or re-run a webhook on its latest received payload; the result posts into the owning agent's thread | `run_automation` |
|
|
79
80
|
| Webhook listener enabled state, port, or domain | `set_webhook_config` |
|
|
80
81
|
| Desktop keep-awake, run in background after window close, turn-completion notifications, notification volume (Windows), usage pin, usage rail short + long bars, or Computer observe-only state | `set_desktop_settings` |
|
|
81
|
-
| Desktop theme, display language, side panels, markdown default view, link previews, or tool activity expansion | `set_appearance` |
|
|
82
|
+
| Desktop theme, imported color theme, UI/code font, skin transparency (outer or main panels), display language, side panels, markdown default view, link previews, or tool activity expansion | `set_appearance` |
|
|
82
83
|
| Add a before-tool hook rule | `add_hook_rule` |
|
|
83
84
|
| Enable or disable a hook rule by its `status hooks` index | `set_hook_rule_enabled` |
|
|
84
85
|
| Delete a hook rule by its `status hooks` index | `delete_hook_rule` |
|
|
@@ -109,13 +110,26 @@ workflow` before changing the corresponding domain.
|
|
|
109
110
|
- Definition actions use `definitionKind` (workflow, agent, skill).
|
|
110
111
|
Workflow/agent ids cannot be renamed through
|
|
111
112
|
a save; change their display name instead. User skills may be renamed with
|
|
112
|
-
`originalName` and `name`.
|
|
113
|
+
`originalName` and `name`. A user skill's trigger line (`when_to_use`) is
|
|
114
|
+
`definition.whenToUse` on create and save. Skill deletion is not exposed;
|
|
115
|
+
disable it instead.
|
|
113
116
|
Built-in and plugin skills accept only `toolDependencies` edits (`null`
|
|
114
117
|
restores their declared dependencies).
|
|
115
118
|
- A created agent is a bot (`definition.kind: "bot"`) or a workflow agent
|
|
116
119
|
(`"agent"`); omitted, the representative bot's chat creates a bot and any other chat a
|
|
117
120
|
workflow agent. The kind is fixed after creation.
|
|
118
121
|
- Changing orchestration does not rewrite workflow instructions or agents.
|
|
122
|
+
- `set_route` is the Lead default for new sessions. A model chosen in New Task
|
|
123
|
+
changes that default only when the user actually picks one there.
|
|
124
|
+
`route.fallbacks` (ordered models on other providers; `[]` clears) works the
|
|
125
|
+
same on `set_route` (Lead), `set_agent_route` (agents and bots, Mixy included).
|
|
126
|
+
- A workflow switch reaches a running conversation as a reminder on its next
|
|
127
|
+
turn (the cached prompt is not swapped). A bot definition's instruction,
|
|
128
|
+
persona or name applies when the user presses 적용, with one cache break.
|
|
129
|
+
Connector and built-in feature changes reach a bot's open chat at once for
|
|
130
|
+
availability: opened tools join the deferred catalog, removed ones are
|
|
131
|
+
refused at call time, and the next turn's notice names both. Only the prompt
|
|
132
|
+
text describing them waits until the cache next expires.
|
|
119
133
|
|
|
120
134
|
## Providers and authentication
|
|
121
135
|
|
|
@@ -126,6 +140,8 @@ key's source.
|
|
|
126
140
|
authentication in the visible UI.
|
|
127
141
|
- Custom providers are registered, tested, and removed in the Providers UI;
|
|
128
142
|
`status providers` with `detail: true` lists them as API rows with `custom: true`.
|
|
143
|
+
Their model list (Nano-GPT included) loads there with up to a 60 s wait; the
|
|
144
|
+
user can skip it and type model ids by hand.
|
|
129
145
|
- Local Provider is installed and enabled as a Built-in. Its endpoint is
|
|
130
146
|
Mixdog-managed and is never configured by the user.
|
|
131
147
|
Use the `local-provider` skill for hardware checks, model selection, downloads,
|
|
@@ -155,6 +171,18 @@ key's source.
|
|
|
155
171
|
duration; `provider: "default"` sets the fallback for providers without a
|
|
156
172
|
built-in window. A reset and a duration are mutually exclusive; provider
|
|
157
173
|
reset requires a provider.
|
|
174
|
+
- `duration: "unlimited"` (or `"never"`) stops idle clearing for a provider;
|
|
175
|
+
without `provider` it applies to the current route's provider. `status
|
|
176
|
+
autoclear` reports `unlimited`, `label` and per-provider `providerDefaults`
|
|
177
|
+
(`builtInUnlimited` marks a built-in unlimited window); a provider reset
|
|
178
|
+
restores its built-in window. Built-ins follow each provider's cache: Codex/
|
|
179
|
+
ChatGPT login unlimited, OpenAI API 30 min, Anthropic and Gemini 1h. The
|
|
180
|
+
OpenAI API caches a Lead-class session's stable prefix for 12h and its
|
|
181
|
+
moving tail for 30 min (Lead, bot chats, bot task sessions, routine and
|
|
182
|
+
webhook runs), so the 30 min window clears only a cold tail. Finished
|
|
183
|
+
sub-agent sessions are always released on a finite timer (the provider's
|
|
184
|
+
window, e.g. DeepSeek 24h; 1h for Codex/ChatGPT logins); unlimited does not
|
|
185
|
+
disable it.
|
|
158
186
|
- Compaction supports `enabled` and a `compaction` object with either
|
|
159
187
|
`mainBufferTokens` or `mainBufferPercent`. Changing representation replaces the previous budget.
|
|
160
188
|
- If no supported action exposes a requested Memory interval, report it as
|
|
@@ -207,6 +235,8 @@ markers are read with `status desktop`.
|
|
|
207
235
|
- `add_hook_rule` with modify/rewrite needs exactly one of `patch` or `args`.
|
|
208
236
|
- `delete_hook_rule` is destructive and requires explicit approval for the
|
|
209
237
|
named rule; disabling with `set_hook_rule_enabled` preserves it.
|
|
238
|
+
- Hook rule changes apply to open sessions and their sub-agents on the next
|
|
239
|
+
tool call; no new session or restart is needed.
|
|
210
240
|
- `status media` shows the remembered lane/model per kind. `set_media_default`
|
|
211
241
|
accepts only a signed-in lane that offers the kind (and the model, when
|
|
212
242
|
given) in the live media catalog; the media tool's `list` reads that catalog.
|
|
@@ -256,6 +286,15 @@ markers are read with `status desktop`.
|
|
|
256
286
|
- Desktop-only operations require the owning conversation visible in the local
|
|
257
287
|
Desktop app. Never claim a persisted change from merely delivering a request.
|
|
258
288
|
- A display-language change returns `requiresReload`.
|
|
289
|
+
- `set_appearance` also takes `uiFont` / `codeFont` (a family name, `""` =
|
|
290
|
+
built-in; text it lacks falls back to the built-in fonts), skin transparency
|
|
291
|
+
(0–100, defaults outer 20 / main 40; higher shows more of the skin picture):
|
|
292
|
+
`skinOuterTransparency` (window frame, titlebar, rail, sidebar, side dock),
|
|
293
|
+
`skinMainTransparency` (conversation area and its cards), or `skinTransparency`
|
|
294
|
+
to set both; and `colorTheme`
|
|
295
|
+
(an imported theme id from `status appearance` `colorThemes`, or `"builtin"`).
|
|
296
|
+
All are stored on that Desktop device only. Importing a theme file and
|
|
297
|
+
choosing a skin or custom picture stay in the UI.
|
|
259
298
|
- A Project removal unregisters it only.
|
|
260
299
|
- Inspect schedules/webhooks before editing. `overwrite:true` updates an
|
|
261
300
|
existing named entry and preserves omitted fields; a new schedule needs
|
|
@@ -264,6 +303,14 @@ markers are read with `status desktop`.
|
|
|
264
303
|
Omitted attachments and existing webhook secrets are preserved. A saved
|
|
265
304
|
secret is never shown again: tell the user to open the Webhooks panel, edit
|
|
266
305
|
the webhook, press Regenerate secret, copy the new value, and save.
|
|
306
|
+
- A routine run (schedule or webhook) is a turn in the owning bot's chat with
|
|
307
|
+
nobody to approve: it never prompts, refuses payment and permanent-delete
|
|
308
|
+
connectors (trash moves are allowed), and still honors bot permission
|
|
309
|
+
"block". It can change only its own bot's automations and route. A webhook
|
|
310
|
+
answers "accepted" at once and a delivery that arrives while its run is
|
|
311
|
+
active is skipped. In an attended bot conversation (chat, room, or work a
|
|
312
|
+
bot started) the same payment and permanent-delete connectors ask first,
|
|
313
|
+
allow once or deny only; a coding session is not asked.
|
|
267
314
|
- Enabling or creating automation may start its background worker. This is a
|
|
268
315
|
persisted automation change, not permission to run an unrelated task now.
|
|
269
316
|
|
|
@@ -33,14 +33,26 @@ An attached Desktop or TUI may navigate and return `opened:true`.
|
|
|
33
33
|
|
|
34
34
|
## Desktop map
|
|
35
35
|
|
|
36
|
-
- Settings → General: profile, Web Search exposure, display language,
|
|
36
|
+
- Settings → General: profile, Web Search exposure, display language,
|
|
37
37
|
side panels, and notifications.
|
|
38
38
|
- Settings → Context: auto-compact and auto-clear.
|
|
39
39
|
- Settings → Output style: output style selection, plus the desktop-only
|
|
40
40
|
"Expand tool activity" choice (collapsed / commands and edits / everything),
|
|
41
41
|
saved per device; Ctrl+O toggles everything open for the current window.
|
|
42
|
+
- Settings → Theme (one page): System / Dark / Light or a skin picture
|
|
43
|
+
(plate, accent, transparency), imported JSON color themes (about 26 color
|
|
44
|
+
roles), installed fonts, font sizes and chat text size. Saved on this device
|
|
45
|
+
only. First-run setup has a Theme step with the same System / Dark /
|
|
46
|
+
Light / skin choice.
|
|
47
|
+
- Settings → Bots (desktop only): the representative bot overlay, a small
|
|
48
|
+
window with the representative bot that opens a quick message to it. On
|
|
49
|
+
by default; options to pin it above the message box (default on), keep it
|
|
50
|
+
above other windows (default off: it follows the app window's layer),
|
|
51
|
+
collapse its bubble and reset its position. The overlay's right-click
|
|
52
|
+
menu has the same options. Saved on this PC.
|
|
42
53
|
- Settings → Providers: API-key, OAuth, custom provider registration, local
|
|
43
|
-
providers, and usage sign-in.
|
|
54
|
+
providers, and usage sign-in. A custom provider's model list waits up to
|
|
55
|
+
60 s, can be skipped, and then takes model ids typed by hand.
|
|
44
56
|
- Extensions → Plugin → Git & GitHub: Git/GitHub CLI installation and connection.
|
|
45
57
|
- Settings → Connection: web-app pairing and linked devices.
|
|
46
58
|
- Settings → System: update, keep-awake, run in background after the window
|
|
@@ -78,7 +90,15 @@ The setup tool does not mutate:
|
|
|
78
90
|
`/mcp login` and `/mcp logout`; remote windows paste the redirect address);
|
|
79
91
|
- notification permission and subscription on the receiving device;
|
|
80
92
|
- web-app pairing credentials and OS permission dialogs;
|
|
81
|
-
- TUI-local theme palettes (use `/theme`; Desktop themes are separate)
|
|
93
|
+
- TUI-local theme palettes (use `/theme`; Desktop themes are separate);
|
|
94
|
+
- importing or exporting a JSON color theme file, choosing a skin or custom
|
|
95
|
+
skin picture, and the Lead's pixel face (stored on the host as `leadAvatar`,
|
|
96
|
+
edited from the Desktop or a paired client, and shared by all of them; every
|
|
97
|
+
Lead-class row and agent wears it, and the agent edit dialog has no avatar);
|
|
98
|
+
- approval grants ("항상 허용" is per feature and per bot, never for payment,
|
|
99
|
+
permanent delete, Lead, workflow, Mixy link, group rooms or schedules) and
|
|
100
|
+
browser action confirmations (`MIXDOG_BROWSER_CONFIRM_ACTIONS`,
|
|
101
|
+
`MIXDOG_BROWSER_CONFIRM_SUBMIT`; see the browser-use skill).
|
|
82
102
|
|
|
83
103
|
Use `open` where a target exists, then let the user act.
|
|
84
104
|
|
|
@@ -126,10 +126,14 @@ done. Take the first open step, explain it in a sentence or two, ask, then act.
|
|
|
126
126
|
different model family at key decision points, not on every task. Say in
|
|
127
127
|
one line that more agents can be turned on later on the Workflows page.
|
|
128
128
|
Right after the models are picked, explain Auto reasoning: it adjusts
|
|
129
|
-
reasoning depth per message, so hard work may
|
|
130
|
-
quality but cost is much lower.
|
|
129
|
+
reasoning depth per message around a medium baseline, so hard work may
|
|
130
|
+
come out slightly lower in quality but cost is much lower. The Lead runs
|
|
131
|
+
the main coding work, where stability matters most, so also recommend
|
|
132
|
+
fixing the Lead's effort at High or above in the model picker (choosing an
|
|
133
|
+
effort there turns Auto off for that model). Ask whether to turn Auto on
|
|
131
134
|
(`install_builtin` `autoEffort`). If declined, say in one line that it can
|
|
132
|
-
be turned on later
|
|
135
|
+
be turned on later by choosing Auto at the top of the model picker's
|
|
136
|
+
reasoning effort list.
|
|
133
137
|
4. remote: done when a device is paired (`status connection`) or `remote` is
|
|
134
138
|
visited. Pairing is user-operated: `open connection`.
|
|
135
139
|
5. extensions: done when `extensions` is visited. Explain plugins and skills;
|
|
@@ -56,13 +56,16 @@ testing a page belong to `browser`.
|
|
|
56
56
|
missing assets, blocked network requests: the page must be self-contained)
|
|
57
57
|
in the file, then `check` again until it reports none; a
|
|
58
58
|
"Page problems" section on any `open`, `annotate`, or `capture` result counts
|
|
59
|
-
the same. Then run `visualize inspect` on the tab
|
|
60
|
-
|
|
61
|
-
`
|
|
59
|
+
the same. Then run `visualize inspect` on the tab twice, for every page
|
|
60
|
+
(fixed-size app frames included, not only responsive designs): once with
|
|
61
|
+
no `viewport` (the side panel's width) and once with `viewport`
|
|
62
|
+
`{width: 375, height: 812}`. Fix every finding it lists (overflow, clipped
|
|
62
63
|
text, tiny or overlapping targets, low contrast, missing alt or labels) in
|
|
63
|
-
the file before reporting.
|
|
64
|
-
|
|
65
|
-
|
|
64
|
+
the file before reporting. Two findings are not defects and may stay: text
|
|
65
|
+
caught mid fade-in, and targets shrunk only because a fixed frame is scaled
|
|
66
|
+
down to fit (craft.md §6); name each one left and why in the report. Then
|
|
67
|
+
`capture` the tab (or read it through `browser`) and check it against
|
|
68
|
+
`references/craft.md` §5; fix what fails before the user sees the report.
|
|
66
69
|
6. **Report** in chat: path, the states shown, what to confirm, and the open
|
|
67
70
|
questions. Then stop — implementation waits for approval.
|
|
68
71
|
7. **Iterate in place.** Feedback edits the same file; the tab reloads and the
|
|
@@ -78,7 +78,14 @@ not shown while it lists any.
|
|
|
78
78
|
- Readable contrast for text and controls; hit targets ≥ 44px on touch frames.
|
|
79
79
|
- Motion only when it shows what changed; respect `prefers-reduced-motion`.
|
|
80
80
|
- Fits the panel width without horizontal scroll; frames wider than the panel
|
|
81
|
-
scale down rather than clip.
|
|
81
|
+
scale down rather than clip. A fixed-size frame that reproduces an app
|
|
82
|
+
surface (a window, an overlay, a stage of set pixel size) sits in a wrapper
|
|
83
|
+
that scales it as a whole: the wrapper is `width: 100%; overflow: hidden`,
|
|
84
|
+
the frame gets `transform: scale(min(1, wrapperWidth / frameWidth))` from
|
|
85
|
+
`transform-origin: 0 0`, the wrapper's height is set to the scaled height,
|
|
86
|
+
and a `ResizeObserver` on the page re-runs this when the panel resizes.
|
|
87
|
+
Never give such a frame `max-width` alone: its contents keep their pixel
|
|
88
|
+
positions and spill out.
|
|
82
89
|
- Self-contained: no CDN, web font, API or other network request. The panel
|
|
83
90
|
blocks outside network unless the user allows it (a blocked request is a
|
|
84
91
|
`blocked-network` page problem), so inline or bundle every asset in the
|
package/src/help.mjs
CHANGED
|
@@ -31,7 +31,7 @@ const HELP_LINES = [
|
|
|
31
31
|
' /clear start a fresh chat (alias: /new)',
|
|
32
32
|
' /project [path] switch working directory (project)',
|
|
33
33
|
' /compact compact older conversation context',
|
|
34
|
-
' /autoclear [on|off|duration] reduce cache-miss cost after long idle gaps',
|
|
34
|
+
' /autoclear [on|off|duration|unlimited] reduce cache-miss cost after long idle gaps',
|
|
35
35
|
' /resume [id] resume a saved chat',
|
|
36
36
|
' /context show current context surface',
|
|
37
37
|
' /usage [refresh] show total provider quota / balance',
|
package/src/lib/keychain-cjs.cjs
CHANGED
|
@@ -221,7 +221,10 @@ function dpApiFile(account) {
|
|
|
221
221
|
function writeOwnerOnlyAtomicSync(file, text) {
|
|
222
222
|
const dir = path.dirname(file);
|
|
223
223
|
fs.mkdirSync(dir, { recursive: true, mode: 0o700 });
|
|
224
|
-
const temporary = path.join(
|
|
224
|
+
const temporary = path.join(
|
|
225
|
+
dir,
|
|
226
|
+
`${path.basename(file)}.mixdog-tmp-${process.pid}-${randomBytes(4).toString('hex')}`
|
|
227
|
+
);
|
|
225
228
|
let descriptor = null;
|
|
226
229
|
try {
|
|
227
230
|
descriptor = fs.openSync(temporary, 'wx', 0o600);
|