mixdog 1.4.1 → 1.4.3
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/package.json +4 -3
- package/scripts/build-shipped-history.mjs +125 -33
- package/scripts/gate-local.mjs +220 -63
- package/scripts/graph-parity.mjs +8 -3
- package/scripts/lib/gate-scheduler.mjs +139 -32
- package/scripts/lib/gate-timing-reporter.mjs +16 -0
- package/scripts/lib/run-node-tests.mjs +71 -34
- package/scripts/lib/scoped-temp.mjs +1 -0
- package/scripts/lib/test-failure-records.mjs +14 -1
- package/scripts/lib/test-failure-summary.mjs +9 -4
- package/scripts/lib/test-spawn-ledger.mjs +43 -3
- package/scripts/post-release-check.mjs +26 -16
- package/scripts/pptx-kit-index.mjs +5 -6
- package/scripts/provider-pingpong-live.mjs +1 -1
- package/scripts/prune-embedding-runtime.mjs +3 -1
- package/scripts/release-paths.mjs +7 -1
- package/scripts/suite-health.mjs +110 -28
- package/scripts/test.mjs +9 -14
- package/src/agents/advisor/AGENT.md +4 -4
- package/src/agents/advisor/agent.json +1 -1
- package/src/agents/explore/AGENT.md +22 -0
- package/src/agents/explore/agent.json +6 -0
- package/src/cli.mjs +7 -0
- package/src/defaults/agents.json +7 -0
- package/src/defaults/shipped-history.json +38 -2
- package/src/defaults/skills/browser-use/SKILL.md +4 -1
- package/src/defaults/skills/code-tidy/SKILL.md +71 -102
- package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
- package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
- package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
- package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
- package/src/defaults/skills/computer-use/SKILL.md +12 -2
- package/src/defaults/skills/setup/SKILL.md +2 -2
- package/src/defaults/skills/setup/references/actions.md +28 -9
- package/src/defaults/skills/setup/references/surfaces.md +5 -2
- package/src/defaults/skills/setup-guide/SKILL.md +11 -3
- package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
- package/src/defaults/skills/skill-creator/SKILL.md +85 -190
- package/src/defaults/skills/skill-creator/references/design.md +70 -162
- package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
- package/src/defaults/skills/test-suite/SKILL.md +194 -0
- package/src/defaults/skills/test-suite/references/case-management.md +51 -0
- package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
- package/src/defaults/skills/test-suite/references/reliability.md +49 -0
- package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
- package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
- package/src/defaults/skills/visualize/SKILL.md +6 -2
- package/src/lib/instruction-text.cjs +36 -0
- package/src/lib/rules-builder.cjs +40 -50
- package/src/orchestration/balanced.md +23 -0
- package/src/orchestration/focused.md +22 -0
- package/src/orchestration/none.md +5 -0
- package/src/orchestration/swarm.md +24 -0
- package/src/rules/agent-mode/AGENT_MODE.md +3 -1
- package/src/rules/agent-mode/MIXY.md +2 -2
- package/src/rules/lead/LEAD.md +3 -3
- package/src/rules/shared/20-research.md +3 -6
- package/src/rules/shared/40-editing.md +1 -0
- package/src/rules/shared/60-verification.md +10 -9
- package/src/rules/shared/70-delivery.md +4 -3
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +3 -3
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -2
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +132 -21
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -9
- package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +2 -2
- package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
- package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +67 -0
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
- package/src/runtime/agent/orchestrator/config.mjs +12 -7
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +7 -7
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -30
- package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +124 -12
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +204 -49
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +16 -7
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +157 -57
- package/src/runtime/agent/orchestrator/mcp/client.mjs +54 -23
- package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +1 -1
- package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +8 -2
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +83 -52
- package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +1 -1
- package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +14 -0
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +43 -27
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +43 -8
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +30 -28
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +3 -3
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
- package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +48 -31
- package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
- package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +4 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2784 -2872
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +5 -8
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +26 -28
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +288 -300
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/registry.mjs +33 -2
- package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +576 -0
- package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +10 -30
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +32 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +0 -11
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +8 -0
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +17 -3
- package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +47 -27
- package/src/runtime/agent/orchestrator/runtime-core/goal-deadlines.mjs +141 -10
- package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +26 -63
- package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +28 -3
- package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +36 -11
- package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +88 -56
- package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +51 -32
- package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +45 -145
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +15 -98
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +32 -99
- package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +23 -78
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +69 -47
- package/src/runtime/agent/orchestrator/runtime-core/todo-list.mjs +367 -0
- package/src/runtime/agent/orchestrator/runtime-core/todo-tool-defs.mjs +47 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-availability.mjs +155 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +12 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +119 -35
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +15 -6
- package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +28 -22
- package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +30 -0
- package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
- package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
- package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +94 -10
- package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -12
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +4 -4
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +11 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +6 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +7 -3
- package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +11 -1
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
- package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +37 -8
- package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +11 -1
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +5 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/todo-check.mjs +196 -0
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +116 -50
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +5 -6
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +27 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +18 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
- package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
- package/src/runtime/agent/orchestrator/session/loop/turn-report.mjs +35 -0
- package/src/runtime/agent/orchestrator/session/loop/usage.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +103 -50
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +9 -7
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +21 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +27 -11
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-open.mjs +37 -34
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +25 -15
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +79 -24
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -1
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +9 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/prompt-settings.mjs +598 -0
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +20 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +22 -14
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +12 -0
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +56 -14
- package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +31 -0
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +59 -20
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
- package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +18 -4
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +8 -9
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +339 -88
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +135 -11
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +377 -104
- package/src/runtime/agent/orchestrator/session/manager/turn-durability.mjs +144 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +48 -30
- package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
- package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/mixy-name.mjs +12 -6
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/save-session-worker.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +23 -2
- package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/store/transcript-durability.mjs +88 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +243 -38
- package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +177 -8
- package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
- package/src/runtime/agent/orchestrator/session/store.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +7 -1
- package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +9 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +2 -2
- package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -5
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +21 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/worktree-add-guard.mjs +77 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +42 -28
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +30 -14
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
- package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
- package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +0 -10
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +95 -20
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -24
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary/child-kill.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/modes/symbols.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +4 -5
- package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +3 -4
- package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4 -22
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +105 -15
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +35 -11
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -6
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
- package/src/runtime/attachments/attachment-reference.mjs +1 -1
- package/src/runtime/attachments/pdf-extract.mjs +1 -1
- package/src/runtime/attachments/store.d.mts +1 -0
- package/src/runtime/attachments/store.mjs +2 -2
- package/src/runtime/channels/lib/config-reload-watch.mjs +42 -0
- package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +29 -9
- package/src/runtime/channels/lib/scheduler.mjs +33 -0
- package/src/runtime/channels/lib/schedules-db.mjs +11 -4
- package/src/runtime/channels/lib/webhook/session-dispatch.mjs +4 -1
- package/src/runtime/channels/lib/webhooks-db.mjs +9 -3
- package/src/runtime/channels/lib/whisper-port.mjs +19 -10
- package/src/runtime/channels/lib/whisper-server.mjs +22 -13
- package/src/runtime/channels/lib/worker-main.mjs +9 -31
- package/src/runtime/computer-bridge/linux-readiness.mjs +10 -14
- package/src/runtime/connectors/connector-accounts-mcp.mjs +372 -103
- package/src/runtime/connectors/gmail-app-password.mjs +4 -4
- package/src/runtime/connectors/google-mcp.mjs +1 -1
- package/src/runtime/effort-judge/judge-client.mjs +2 -2
- package/src/runtime/effort-judge/judge-input.mjs +4 -4
- package/src/runtime/explore/explorer.mjs +88 -0
- package/src/runtime/explore/tool-defs.mjs +35 -0
- package/src/runtime/explore/tool.mjs +123 -0
- package/src/runtime/local-provider/hardware.mjs +1 -1
- package/src/runtime/media/adapters/codex-image.mjs +3 -3
- package/src/runtime/media/adapters/gemini-video.mjs +1 -1
- package/src/runtime/media/media-usage.mjs +1 -1
- package/src/runtime/media/store.mjs +1 -1
- package/src/runtime/memory/index.mjs +15 -1
- package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
- package/src/runtime/memory/lib/embedding-reindex.mjs +27 -0
- package/src/runtime/memory/lib/embedding-worker.mjs +4 -0
- package/src/runtime/memory/lib/memory-embed.mjs +83 -14
- package/src/runtime/memory/lib/memory-process-lock.mjs +159 -36
- package/src/runtime/memory/lib/memory-text-utils.mjs +6 -1
- package/src/runtime/memory/lib/memory.mjs +17 -0
- package/src/runtime/memory/lib/pg/process.mjs +1 -1
- package/src/runtime/memory/lib/pg/supervisor.mjs +16 -96
- package/src/runtime/memory/lib/recall-hybrid/hybrid-sql.mjs +12 -3
- package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/pptx-author-action.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-build.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
- package/src/runtime/office/capabilities.mjs +1 -1
- package/src/runtime/office/core/office-core.mjs +1 -1
- package/src/runtime/office/design/content-model.mjs +3 -3
- package/src/runtime/office/design/docx/design-docx/section.mjs +6 -6
- package/src/runtime/office/design/xlsx/design-xlsx-components.mjs +1 -1
- package/src/runtime/office/design/xlsx/design-xlsx.mjs +1 -1
- package/src/runtime/office/pdf/ocr-engine.mjs +1 -1
- package/src/runtime/office/pdf/pdf-writer.mjs +4 -4
- package/src/runtime/office/portable/portable-docx-operations.mjs +2 -2
- package/src/runtime/office/portable/portable-soffice.mjs +8 -6
- package/src/runtime/office/portable/xlsx-contract.mjs +1 -1
- package/src/runtime/office/quality/assurance-structure-docx.mjs +1 -1
- package/src/runtime/shared/agent-route-config.mjs +17 -2
- package/src/runtime/shared/atomic-file.d.mts +8 -0
- package/src/runtime/shared/atomic-file.mjs +103 -2
- package/src/runtime/shared/background-tasks.mjs +37 -10
- package/src/runtime/shared/background-wait.mjs +66 -0
- package/src/runtime/shared/child-guardian.mjs +17 -7
- package/src/runtime/shared/config.mjs +313 -16
- package/src/runtime/shared/connector-accounts.mjs +5 -5
- package/src/runtime/shared/connector-catalog.d.mts +14 -8
- package/src/runtime/shared/connector-catalog.mjs +70 -52
- package/src/runtime/shared/custom-provider-keys.mjs +20 -0
- package/src/runtime/shared/file-has-data.mjs +26 -2
- package/src/runtime/shared/file-lock.mjs +21 -18
- package/src/runtime/shared/git-launch.d.mts +9 -0
- package/src/runtime/shared/git-launch.mjs +213 -0
- package/src/runtime/shared/git-runner-worker.mjs +2 -1
- package/src/runtime/shared/git-runner.mjs +7 -2
- package/src/runtime/shared/idle-gc.mjs +30 -7
- package/src/runtime/shared/llm/cost.mjs +6 -1
- package/src/runtime/shared/llm/http-agent.mjs +316 -29
- package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
- package/src/runtime/shared/llm/model-catalog.mjs +46 -6
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
- package/src/runtime/shared/llm/system-proxy.mjs +453 -0
- package/src/runtime/shared/llm/usage-ledger-quota.mjs +31 -12
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +84 -8
- package/src/runtime/shared/llm/usage-ledger.mjs +3 -0
- package/src/runtime/shared/llm/usage-rollup.mjs +48 -0
- package/src/runtime/shared/maintenance-schedule.mjs +109 -0
- package/src/runtime/shared/process-runner.mjs +8 -4
- package/src/runtime/shared/provider-accounts.mjs +52 -2
- package/src/runtime/shared/routine-trigger.d.mts +13 -0
- package/src/runtime/shared/routine-trigger.mjs +34 -0
- package/src/runtime/shared/run-child.d.mts +2 -1
- package/src/runtime/shared/run-child.mjs +70 -18
- package/src/runtime/shared/session-scratch.mjs +14 -2
- package/src/runtime/shared/shipped-definitions.mjs +7 -1
- package/src/runtime/shared/staged-install-worker.mjs +5 -0
- package/src/runtime/shared/staged-update.mjs +47 -2
- package/src/runtime/shared/tool-card-model.golden.json +3 -12
- package/src/runtime/shared/tool-execution-contract.mjs +2 -0
- package/src/runtime/shared/tool-surface.mjs +110 -36
- package/src/runtime/shared/tool-work-units.mjs +35 -6
- package/src/runtime/shared/turn-snapshot.mjs +26 -4
- package/src/runtime/shared/turn-worktree-snapshot.mjs +409 -54
- package/src/runtime/shared/worker-requests.mjs +17 -3
- package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
- package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
- package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
- package/src/runtime/shared/worktrees/branch-management.mjs +5 -3
- package/src/runtime/shared/worktrees/contract.mjs +16 -6
- package/src/runtime/shared/worktrees/dependencies.mjs +127 -89
- package/src/runtime/shared/worktrees/disk.mjs +79 -2
- package/src/runtime/shared/worktrees/git.mjs +97 -7
- package/src/runtime/shared/worktrees/include.mjs +6 -4
- package/src/runtime/shared/worktrees/maintenance.mjs +422 -30
- package/src/runtime/shared/worktrees/manager.mjs +962 -197
- package/src/runtime/shared/worktrees/settings.mjs +33 -7
- package/src/runtime/shared/worktrees/test-support.mjs +5 -1
- package/src/runtime/shared/worktrees/worker-snapshots.mjs +82 -0
- package/src/runtime/tidy/install.mjs +95 -15
- package/src/runtime/tidy/languages.mjs +17 -15
- package/src/runtime/tidy/process.mjs +9 -5
- package/src/runtime/tidy/resolve.mjs +19 -16
- package/src/runtime/tidy/runners/biome.mjs +3 -3
- package/src/runtime/tidy/tool.mjs +1 -1
- package/src/runtime/tidy/worktree.mjs +10 -6
- package/src/runtime/visualize-bridge/client.mjs +4 -1
- package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
- package/src/runtime/web-search/index.mjs +4 -23
- package/src/runtime/web-search/lib/web-tools.mjs +2 -2
- package/src/runtime/web-search/tool-defs.mjs +17 -26
- package/src/session-runtime/agent-profile-changes.mjs +55 -4
- package/src/session-runtime/agent-task-sessions.mjs +410 -353
- package/src/session-runtime/boot/apis.mjs +27 -4
- package/src/session-runtime/boot/begin.mjs +2 -0
- package/src/session-runtime/boot/config.mjs +10 -1
- package/src/session-runtime/boot/facade.mjs +1 -0
- package/src/session-runtime/boot/providers.mjs +70 -3
- package/src/session-runtime/boot/session.mjs +2 -0
- package/src/session-runtime/boot/tools.mjs +71 -25
- package/src/session-runtime/bot-status.mjs +103 -103
- package/src/session-runtime/channel-config-api.mjs +1 -0
- package/src/session-runtime/config-change-effects.mjs +179 -0
- package/src/session-runtime/config-lifecycle/config-writers.mjs +1 -0
- package/src/session-runtime/config-lifecycle.mjs +160 -24
- package/src/session-runtime/connector-merge-migration.mjs +18 -15
- package/src/session-runtime/conversation-import/discovery.mjs +245 -47
- package/src/session-runtime/conversation-import/service.mjs +12 -5
- package/src/session-runtime/goal-facade-api.mjs +49 -3
- package/src/session-runtime/handoff-attachments.mjs +1 -1
- package/src/session-runtime/held-requests.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +3 -0
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -2
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +5 -11
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +161 -120
- package/src/session-runtime/internal-tool-executor.mjs +12 -19
- package/src/session-runtime/lifecycle/cold-heir.mjs +7 -0
- package/src/session-runtime/lifecycle/memory-ingest.mjs +3 -3
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +53 -5
- package/src/session-runtime/lifecycle/session-switch.mjs +13 -2
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +10 -5
- package/src/session-runtime/lifecycle/teardown.mjs +1 -1
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/server-catalog.mjs +27 -10
- package/src/session-runtime/mcp-glue/server-connection.mjs +34 -8
- package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
- package/src/session-runtime/mixy-heartbeat.mjs +1 -1
- package/src/session-runtime/model-route/set-route.mjs +40 -7
- package/src/session-runtime/native-web-search/routes.mjs +3 -3
- package/src/session-runtime/provider-auth/login.mjs +2 -2
- package/src/session-runtime/provider-auth/refresh.mjs +6 -3
- package/src/session-runtime/provider-auth/setup.mjs +1 -1
- package/src/session-runtime/provider-readiness.mjs +53 -4
- package/src/session-runtime/resource-api.mjs +1 -1
- package/src/session-runtime/resource-extension-sync.mjs +4 -8
- package/src/session-runtime/resource-mcp-api.mjs +98 -35
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +49 -32
- package/src/session-runtime/resource-mcp-secrets.mjs +27 -10
- package/src/session-runtime/resource-mcp-servers.mjs +5 -4
- package/src/session-runtime/resource-plugins-api.mjs +4 -0
- package/src/session-runtime/routine-executor.mjs +152 -0
- package/src/session-runtime/routine-home-turn.mjs +46 -5
- package/src/session-runtime/runtime-facade.mjs +5 -0
- package/src/session-runtime/runtime-feature-gates.mjs +2 -11
- package/src/session-runtime/schedule-session-run.mjs +1 -0
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +6 -1
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +7 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +120 -8
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +12 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +5 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +28 -7
- package/src/session-runtime/services/agent-tool.mjs +51 -1
- package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
- package/src/session-runtime/services/channel-admin.mjs +18 -0
- package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
- package/src/session-runtime/services/daemon-candidate.mjs +4 -1
- package/src/session-runtime/services/hook-bus/command-handler.mjs +7 -11
- package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
- package/src/session-runtime/services/plugin-admin.mjs +14 -6
- package/src/session-runtime/services/provider-admin.mjs +281 -10
- package/src/session-runtime/services/seeds.mjs +7 -0
- package/src/session-runtime/services/usage-stats-model.mjs +32 -11
- package/src/session-runtime/session-create/materialize.mjs +4 -2
- package/src/session-runtime/session-create/session-options.mjs +2 -0
- package/src/session-runtime/session-turn-api.mjs +2 -0
- package/src/session-runtime/settings-builtin-tools-api.mjs +5 -10
- package/src/session-runtime/settings-system-api.mjs +1 -1
- package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
- package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
- package/src/session-runtime/setup-tool/executor.mjs +14 -3
- package/src/session-runtime/setup-tool/extended-actions.mjs +2 -0
- package/src/session-runtime/setup-tool/settings-contract.mjs +28 -0
- package/src/session-runtime/setup-tool/tool-defs.mjs +28 -2
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +40 -43
- package/src/session-runtime/tool-policy/mode-switch.mjs +1 -1
- package/src/session-runtime/tool-policy/policy-stage.mjs +106 -8
- package/src/session-runtime/tool-policy/workflow-overlay.mjs +2 -1
- package/src/session-runtime/tool-policy-refresh.mjs +182 -5
- package/src/session-runtime/tool-surface.mjs +38 -1
- package/src/session-runtime/turn/agent-ops.mjs +33 -2
- package/src/session-runtime/turn/session-ops.mjs +2 -0
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +5 -0
- package/src/session-runtime/turn/turn-run.mjs +1 -1
- package/src/session-runtime/webhook-session-run.mjs +2 -0
- package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +46 -11
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +2 -0
- package/src/session-runtime/workflow-agents-api/instruction-files.mjs +165 -0
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +5 -4
- package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +2 -3
- package/src/session-runtime/workflow-agents-api.mjs +2 -0
- package/src/session-runtime/workspace/activity-guards.mjs +176 -0
- package/src/session-runtime/workspace/project-branches.mjs +1 -1
- package/src/session-runtime/workspace/session-view.mjs +149 -0
- package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
- package/src/session-runtime/workspace/transition-runner.mjs +188 -0
- package/src/session-runtime/workspace/transitions.mjs +128 -1070
- package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
- package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
- package/src/session-runtime/workspace/worktree-maintenance.mjs +200 -0
- package/src/session-runtime/workspace/worktree-setup.mjs +97 -0
- package/src/session-runtime/workspace/worktree-tool.mjs +70 -54
- package/src/standalone/daemon-agent-control.mjs +25 -8
- package/src/standalone/daemon-desktop-runtime.mjs +8 -2
- package/src/standalone/daemon-lag-profiler.mjs +7 -7
- package/src/standalone/daemon-session-control.mjs +151 -136
- package/src/standalone/daemon.mjs +61 -2
- package/src/standalone/desktop-service-registry.mjs +9 -0
- package/src/standalone/local-session-runtime.mjs +21 -1
- package/src/standalone/session-client/daemon-unavailable.mjs +4 -1
- package/src/standalone/session-client.mjs +5 -1
- package/src/standalone/session-frame-stream.mjs +83 -11
- package/src/standalone/session-protocol.mjs +15 -0
- package/src/standalone/session-service/agent-route-follow.mjs +23 -20
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +18 -6
- package/src/standalone/session-service/agent-tree.mjs +45 -9
- package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
- package/src/standalone/session-service/quota-resume.mjs +9 -0
- package/src/standalone/session-service/session-calls/session-action.mjs +51 -1
- package/src/standalone/session-service/session-calls/session-turns.mjs +37 -18
- package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
- package/src/standalone/session-service/session-calls/turn-gate.mjs +34 -0
- package/src/standalone/session-service/session-calls.mjs +2 -1
- package/src/standalone/session-service/stored-reader.mjs +127 -40
- package/src/tui/App.jsx +162 -164
- package/src/tui/app/app-view/floating-panel.jsx +3 -0
- package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
- package/src/tui/app/clipboard.mjs +22 -11
- package/src/tui/app/create-app-pickers.mjs +2 -0
- package/src/tui/app/doctor.mjs +2 -2
- package/src/tui/app/panel-signature.mjs +1 -1
- package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
- package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
- package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
- package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
- package/src/tui/app/provider-setup/oauth-actions.mjs +25 -6
- package/src/tui/app/provider-setup-picker.mjs +20 -13
- package/src/tui/app/settings-picker.mjs +53 -8
- package/src/tui/app/shell-layout/row-budgets.mjs +14 -12
- package/src/tui/app/slash-commands.mjs +2 -1
- package/src/tui/app/slash-dispatch/route-commands.mjs +1 -1
- package/src/tui/app/slash-dispatch/session-commands.mjs +47 -1
- package/src/tui/app/slash-dispatch.mjs +1 -1
- package/src/tui/app/use-btw-panel.mjs +29 -0
- package/src/tui/app/use-context-panel-refresh.mjs +31 -0
- package/src/tui/app/use-model-catalog-cache.mjs +13 -10
- package/src/tui/app/use-mouse-input.mjs +11 -0
- package/src/tui/app/use-onboarding-start.mjs +8 -3
- package/src/tui/app/use-panel-transition.mjs +10 -1
- package/src/tui/app/use-pasted-buffers.mjs +28 -20
- package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
- package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
- package/src/tui/app/use-prompt-queue-history.mjs +5 -4
- package/src/tui/app/use-selection-focus.mjs +11 -2
- package/src/tui/app/use-selection-geometry.mjs +18 -9
- package/src/tui/app/use-selection-paint.mjs +4 -4
- package/src/tui/app/use-selection-stitch.mjs +3 -3
- package/src/tui/app/use-slash-palette.mjs +62 -0
- package/src/tui/app/use-terminal-chrome.mjs +2 -2
- package/src/tui/app/use-transcript-activity.mjs +48 -33
- package/src/tui/app/use-transcript-follow.mjs +12 -4
- package/src/tui/app/use-transcript-scroll.mjs +46 -17
- package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
- package/src/tui/app/use-transcript-window/geometry.mjs +20 -6
- package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
- package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
- package/src/tui/app/use-transcript-window.mjs +21 -11
- package/src/tui/app/use-tui-ready.mjs +18 -0
- package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
- package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
- package/src/tui/components/Picker.jsx +27 -3
- package/src/tui/components/SignInUrl.jsx +68 -0
- package/src/tui/components/TextEntryPanel.jsx +76 -46
- package/src/tui/components/prompt-input/escape-policy.d.mts +0 -1
- package/src/tui/components/prompt-input/escape-policy.mjs +1 -1
- package/src/tui/components/question-panel-model.mjs +4 -4
- package/src/tui/components/sign-in-url-layout.mjs +24 -0
- package/src/tui/components/tool-execution/standard-card.jsx +3 -4
- package/src/tui/components/user-message-skills.mjs +1 -1
- package/src/tui/dist/index.mjs +2205 -1371
- package/src/tui/markdown/render-ansi.mjs +1 -1
- package/src/tui/session/agent-job-feed/notification-router.mjs +10 -0
- package/src/tui/session/agent-job-feed.mjs +2 -0
- package/src/tui/session/context-state.mjs +3 -0
- package/src/tui/session/goal-turn-state.mjs +6 -2
- package/src/tui/session/quota-resume.mjs +1 -1
- package/src/tui/session/session-api/controls.mjs +4 -0
- package/src/tui/session/session-api/extensions.mjs +8 -0
- package/src/tui/session/session-api/intake/abort.mjs +2 -1
- package/src/tui/session/session-api/intake.mjs +2 -0
- package/src/tui/session/session-api/integrations.mjs +2 -2
- package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
- package/src/tui/session/session-api/lifecycle/session-reset.mjs +7 -0
- package/src/tui/session/session-api/routes-agent-definitions.mjs +6 -0
- package/src/tui/session/session-api/settings.mjs +2 -2
- package/src/tui/session/session-api/worktree.mjs +13 -1
- package/src/tui/session/session-flow/drain.mjs +11 -14
- package/src/tui/session/tool-card-results/grouped-result.mjs +2 -2
- package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
- package/src/tui/session/transcript-spill.mjs +92 -4
- package/src/tui/session/transcript-store.mjs +2 -0
- package/src/tui/session/turn-quiet.mjs +1 -1
- package/src/tui/session/turn.mjs +3 -0
- package/src/tui/session/worktree-setup-notice.mjs +1 -1
- package/src/tui/spinner-meta.mjs +3 -3
- package/src/tui/spinner-verbs.mjs +2 -2
- package/src/defaults/skills/goal-management/SKILL.md +0 -169
- package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
- package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +0 -156
- package/src/session-runtime/goal-tasks.mjs +0 -1
|
@@ -0,0 +1,453 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The OS proxy for Mixdog's own network stack, which Node does not make follow
|
|
3
|
+
* it by itself, decided per origin.
|
|
4
|
+
*
|
|
5
|
+
* While a desktop app is attached (attachSystemProxyResolver, from the desktop
|
|
6
|
+
* service this daemon hosts), each origin is routed by Chromium's answer for
|
|
7
|
+
* it — PAC, WPAD, OS exceptions and DIRECT alike — asked once per origin,
|
|
8
|
+
* cached, and bounded: a lookup that fails or is slow goes DIRECT. Without one
|
|
9
|
+
* the fallback decision applies: the OS static proxy (the one Clash or Windows
|
|
10
|
+
* Settings writes) with its exact bypass rules, or DIRECT.
|
|
11
|
+
*
|
|
12
|
+
* A proxy that came from the OS is Mixdog's private state, never environment:
|
|
13
|
+
* no HTTPS_PROXY / HTTP_PROXY / NO_PROXY / NODE_USE_ENV_PROXY is written, so the
|
|
14
|
+
* shells, tools and CLIs Mixdog spawns do not inherit it. It is applied to the
|
|
15
|
+
* global fetch dispatcher (http-agent.mjs adoptPrivateProxy), and the fallback
|
|
16
|
+
* decision reaches Mixdog's own daemon and workers through one explicit
|
|
17
|
+
* handoff variable that the receiver reads and removes at startup. Proxy
|
|
18
|
+
* variables the user set keep their usual behaviour and win outright.
|
|
19
|
+
*
|
|
20
|
+
* Windows discovery reads the registry once at startup. The proxy is used only
|
|
21
|
+
* when the registry answer is exactly representable: a PAC script
|
|
22
|
+
* (AutoConfigURL), SOCKS-only entries and exceptions that have no exact rule
|
|
23
|
+
* leave routing untouched. "Automatically detect settings" (WPAD) is on by
|
|
24
|
+
* default in Windows and is not consulted: an enabled static proxy is used.
|
|
25
|
+
* Any read failure means no system proxy.
|
|
26
|
+
*/
|
|
27
|
+
|
|
28
|
+
import { execFileSync } from 'node:child_process';
|
|
29
|
+
import { isIP } from 'node:net';
|
|
30
|
+
import { join } from 'node:path';
|
|
31
|
+
import { adoptPrivateProxy, isLocalHost, normalizeHost } from './http-agent.mjs';
|
|
32
|
+
|
|
33
|
+
const INTERNET_SETTINGS_KEY = 'HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Internet Settings';
|
|
34
|
+
const USER_PROXY_VARS = [
|
|
35
|
+
'HTTPS_PROXY',
|
|
36
|
+
'https_proxy',
|
|
37
|
+
'HTTP_PROXY',
|
|
38
|
+
'http_proxy',
|
|
39
|
+
'ALL_PROXY',
|
|
40
|
+
'all_proxy',
|
|
41
|
+
'NODE_USE_ENV_PROXY',
|
|
42
|
+
];
|
|
43
|
+
/**
|
|
44
|
+
* The handoff to a Mixdog process this one starts: JSON `{ proxy, bypass }`,
|
|
45
|
+
* `proxy` null for "decided: direct". Consumed (and removed from the env) by
|
|
46
|
+
* adoptSystemProxy, so nothing downstream of that process ever sees it.
|
|
47
|
+
*/
|
|
48
|
+
export const HANDOFF_VAR = 'MIXDOG_SYSTEM_PROXY_HANDOFF';
|
|
49
|
+
/** Must match SYSTEM_PROXY_REQUEST_EVENT in apps/desktop/src/main/system-proxy.ts. */
|
|
50
|
+
export const SYSTEM_PROXY_REQUEST_EVENT = 'system-proxy-request';
|
|
51
|
+
const RESOLVE_TIMEOUT_MS = 3_000;
|
|
52
|
+
const ROUTE_TTL_MS = 5 * 60_000;
|
|
53
|
+
// A failed lookup is asked again sooner, but not on every request of a burst.
|
|
54
|
+
const FAILED_ROUTE_TTL_MS = 30_000;
|
|
55
|
+
const DIRECT = Object.freeze({ proxy: null });
|
|
56
|
+
|
|
57
|
+
/** The fallback decision this process holds, or null when it made none. */
|
|
58
|
+
let active = null;
|
|
59
|
+
/** Installs this process's router; null when the user's variables or MIXDOG_SYSTEM_PROXY=0 decide. */
|
|
60
|
+
let installRouting = null;
|
|
61
|
+
let routingInstalled = false;
|
|
62
|
+
let log = (line) => process.stderr.write(`${line}\n`);
|
|
63
|
+
/** Attached resolvers, newest last; the newest answers. */
|
|
64
|
+
const resolvers = [];
|
|
65
|
+
/** origin → { route, expiresAt } */
|
|
66
|
+
const routes = new Map();
|
|
67
|
+
/** origin → the in-flight lookup */
|
|
68
|
+
const lookups = new Map();
|
|
69
|
+
let socksReported = false;
|
|
70
|
+
let failureReported = false;
|
|
71
|
+
|
|
72
|
+
/** The rows of `reg query <key>` output as a name → data map; null when the query failed. */
|
|
73
|
+
function queryRegistryKey(key) {
|
|
74
|
+
try {
|
|
75
|
+
const exe = join(process.env.SystemRoot || 'C:\\Windows', 'System32', 'reg.exe');
|
|
76
|
+
const out = execFileSync(exe, ['query', key], {
|
|
77
|
+
encoding: 'utf8',
|
|
78
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
79
|
+
timeout: 2000,
|
|
80
|
+
maxBuffer: 256 * 1024,
|
|
81
|
+
windowsHide: true,
|
|
82
|
+
});
|
|
83
|
+
const values = new Map();
|
|
84
|
+
for (const row of out.split(/\r?\n/)) {
|
|
85
|
+
// " Name REG_TYPE data" (data is absent for an empty string)
|
|
86
|
+
const match = row.match(/^ {4}(\S.*?) {4}(REG_[A-Z_]+)(?: {4}(.*))?$/);
|
|
87
|
+
if (match) values.set(match[1].toLowerCase(), (match[3] ?? '').trim());
|
|
88
|
+
}
|
|
89
|
+
return values;
|
|
90
|
+
} catch {
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
/**
|
|
96
|
+
* Raw registry values: `{ proxyEnable, proxyServer, proxyOverride, autoConfigUrl }`
|
|
97
|
+
* (strings as `reg query` prints them, null when absent), or null when the
|
|
98
|
+
* Internet Settings key cannot be read.
|
|
99
|
+
*/
|
|
100
|
+
function readWindowsProxyRegistry() {
|
|
101
|
+
const settings = queryRegistryKey(INTERNET_SETTINGS_KEY);
|
|
102
|
+
if (!settings) return null;
|
|
103
|
+
return {
|
|
104
|
+
proxyEnable: settings.get('proxyenable') ?? null,
|
|
105
|
+
proxyServer: settings.get('proxyserver') ?? null,
|
|
106
|
+
proxyOverride: settings.get('proxyoverride') ?? null,
|
|
107
|
+
autoConfigUrl: settings.get('autoconfigurl') ?? null,
|
|
108
|
+
};
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
const PROXY_ADDRESS = /^(https?:\/\/)?((?:[a-z0-9_-]+\.)*[a-z0-9_-]+|\[[0-9a-f:]+\]):(\d{1,5})$/i;
|
|
112
|
+
|
|
113
|
+
function proxyUrl(address) {
|
|
114
|
+
const match = PROXY_ADDRESS.exec(address.trim());
|
|
115
|
+
if (!match || Number(match[3]) > 65535) return null;
|
|
116
|
+
return `${(match[1] ?? 'http://').toLowerCase()}${match[2]}:${match[3]}`;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* `ProxyServer` is a bare `host:port` (every scheme) or `scheme=host:port;...`.
|
|
121
|
+
* Returns `{ https, http }` proxy URLs, or `{ reason }`. HTTPS is required:
|
|
122
|
+
* Mixdog's traffic is https, and an http-only entry does not say how it goes.
|
|
123
|
+
*/
|
|
124
|
+
export function parseProxyServer(value) {
|
|
125
|
+
const text = String(value ?? '').trim();
|
|
126
|
+
if (!text) return { reason: 'no proxy server' };
|
|
127
|
+
if (!text.includes('=')) {
|
|
128
|
+
const url = proxyUrl(text);
|
|
129
|
+
return url ? { https: url, http: url } : { reason: 'unsupported proxy server' };
|
|
130
|
+
}
|
|
131
|
+
const entries = new Map();
|
|
132
|
+
for (const part of text.split(';')) {
|
|
133
|
+
if (!part.trim()) continue;
|
|
134
|
+
const eq = part.indexOf('=');
|
|
135
|
+
if (eq <= 0) return { reason: 'unsupported proxy server' };
|
|
136
|
+
entries.set(part.slice(0, eq).trim().toLowerCase(), part.slice(eq + 1).trim());
|
|
137
|
+
}
|
|
138
|
+
const https = entries.has('https') ? proxyUrl(entries.get('https')) : null;
|
|
139
|
+
const http = entries.has('http') ? proxyUrl(entries.get('http')) : null;
|
|
140
|
+
if (entries.has('https') && !https) return { reason: 'unsupported proxy server' };
|
|
141
|
+
if (entries.has('http') && !http) return { reason: 'unsupported proxy server' };
|
|
142
|
+
if (!https) return { reason: 'no HTTPS proxy (HTTP-only, SOCKS-only or other entries)' };
|
|
143
|
+
return { https, ...(http && { http }) };
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
function ipv4Wildcard(entry) {
|
|
147
|
+
const match = /^(\d{1,3}(?:\.\d{1,3}){0,2})\.\*$/.exec(entry);
|
|
148
|
+
if (!match) return null;
|
|
149
|
+
const octets = match[1].split('.').map(Number);
|
|
150
|
+
if (octets.some((octet) => octet > 255)) return null;
|
|
151
|
+
const pad = (fill) => [...octets, ...Array(4 - octets.length).fill(fill)].join('.');
|
|
152
|
+
return { start: pad(0), end: pad(255) };
|
|
153
|
+
}
|
|
154
|
+
|
|
155
|
+
/** The form a URL hostname takes for an IP literal (IPv6 compressed, no brackets). */
|
|
156
|
+
function canonicalIp(address, family) {
|
|
157
|
+
return new URL(`http://${family === 6 ? `[${address}]` : address}`).hostname.replace(/^\[(.*)\]$/, '$1');
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
/**
|
|
161
|
+
* `ProxyOverride` as bypass rules `{ hosts, suffixes }` (exact hosts and IP
|
|
162
|
+
* literals; `*.domain` as the bare domain, subdomains only), or null when any
|
|
163
|
+
* entry has no exact rule. `<local>` (dotless names) and IPv4 wildcards inside
|
|
164
|
+
* the loopback / private ranges need no rule: the dispatcher already connects
|
|
165
|
+
* to every local host directly (isLocalHost).
|
|
166
|
+
*/
|
|
167
|
+
export function translateProxyOverride(value) {
|
|
168
|
+
const hosts = [];
|
|
169
|
+
const suffixes = [];
|
|
170
|
+
for (const raw of String(value ?? '').split(';')) {
|
|
171
|
+
const entry = raw.trim().toLowerCase();
|
|
172
|
+
if (!entry || entry === '<local>') continue;
|
|
173
|
+
const bare = entry.replace(/^\[(.*)\]$/, '$1');
|
|
174
|
+
const family = isIP(bare);
|
|
175
|
+
if (family) {
|
|
176
|
+
hosts.push(canonicalIp(bare, family));
|
|
177
|
+
continue;
|
|
178
|
+
}
|
|
179
|
+
const range = ipv4Wildcard(entry);
|
|
180
|
+
if (range) {
|
|
181
|
+
if (isLocalHost(range.start) && isLocalHost(range.end)) continue;
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
const wildcard = /^\*\.((?:[a-z0-9_-]+\.)*[a-z0-9_-]+)$/.exec(entry);
|
|
185
|
+
if (wildcard) suffixes.push(wildcard[1]);
|
|
186
|
+
else if (/^(?:[a-z0-9_-]+\.)*[a-z0-9_-]+$/.test(entry) && !/^[\d.]+$/.test(entry)) hosts.push(entry);
|
|
187
|
+
else return null;
|
|
188
|
+
}
|
|
189
|
+
return { hosts, suffixes };
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
/**
|
|
193
|
+
* The decision for registry `values`: `{ proxy, bypass }`, or `{ reason }` when
|
|
194
|
+
* the system proxy must not be used. `silent` marks reasons that are the
|
|
195
|
+
* user's plain "no proxy" rather than a proxy we declined.
|
|
196
|
+
*/
|
|
197
|
+
export function systemProxyFromRegistry(values) {
|
|
198
|
+
if (!values) return { reason: 'registry unreadable', silent: true };
|
|
199
|
+
if (!/^(0x)?0*1$/i.test((values.proxyEnable ?? '').trim()) || !values.proxyServer) {
|
|
200
|
+
return { reason: 'disabled', silent: true };
|
|
201
|
+
}
|
|
202
|
+
if (values.autoConfigUrl) return { reason: 'a PAC script is configured' };
|
|
203
|
+
const server = parseProxyServer(values.proxyServer);
|
|
204
|
+
if (server.reason) return { reason: server.reason };
|
|
205
|
+
const bypass = translateProxyOverride(values.proxyOverride);
|
|
206
|
+
if (!bypass) return { reason: 'proxy exceptions cannot be translated exactly' };
|
|
207
|
+
return { proxy: { https: server.https, ...(server.http && { http: server.http }) }, bypass };
|
|
208
|
+
}
|
|
209
|
+
|
|
210
|
+
/**
|
|
211
|
+
* `value` when it is an http(s) proxy URL the dispatcher can be built from:
|
|
212
|
+
* parsable, with a host, and credentials that decode (the dispatcher decodes
|
|
213
|
+
* them and throws on a malformed escape). null otherwise.
|
|
214
|
+
*/
|
|
215
|
+
function usableProxyUrl(value) {
|
|
216
|
+
try {
|
|
217
|
+
const { protocol, hostname, username, password } = new URL(value);
|
|
218
|
+
decodeURIComponent(username);
|
|
219
|
+
decodeURIComponent(password);
|
|
220
|
+
return (protocol === 'http:' || protocol === 'https:') && hostname ? value : null;
|
|
221
|
+
} catch {
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
function stringList(value) {
|
|
227
|
+
return Array.isArray(value) ? value.filter((item) => typeof item === 'string') : [];
|
|
228
|
+
}
|
|
229
|
+
|
|
230
|
+
/**
|
|
231
|
+
* A handoff value as a decision `{ proxy, bypass }`; null when there is none;
|
|
232
|
+
* `{ invalid: true }` when it is malformed (any proxy URL that does not fully
|
|
233
|
+
* validate included).
|
|
234
|
+
*/
|
|
235
|
+
function parseHandoff(text) {
|
|
236
|
+
if (text === undefined) return null;
|
|
237
|
+
try {
|
|
238
|
+
const { proxy, bypass } = JSON.parse(text);
|
|
239
|
+
if (proxy === null) return { proxy: null };
|
|
240
|
+
const https = usableProxyUrl(proxy?.https);
|
|
241
|
+
const http = proxy.http === undefined ? null : usableProxyUrl(proxy.http);
|
|
242
|
+
if (!https || (proxy.http !== undefined && !http)) return { invalid: true };
|
|
243
|
+
return {
|
|
244
|
+
proxy: { https, ...(http && { http }) },
|
|
245
|
+
bypass: { hosts: stringList(bypass?.hosts), suffixes: stringList(bypass?.suffixes) },
|
|
246
|
+
};
|
|
247
|
+
} catch {
|
|
248
|
+
return { invalid: true };
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
function discover(reader, log) {
|
|
253
|
+
let found;
|
|
254
|
+
try {
|
|
255
|
+
found = systemProxyFromRegistry(reader());
|
|
256
|
+
} catch {
|
|
257
|
+
return { proxy: null };
|
|
258
|
+
}
|
|
259
|
+
if (!found.proxy) {
|
|
260
|
+
if (!found.silent) log(`[mixdog] system proxy not used: ${found.reason}`);
|
|
261
|
+
return { proxy: null };
|
|
262
|
+
}
|
|
263
|
+
return found;
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
/**
|
|
267
|
+
* Chromium's proxy answer for one URL, such as
|
|
268
|
+
* `PROXY 127.0.0.1:7890; SOCKS5 127.0.0.1:7891; DIRECT`, read in fallback
|
|
269
|
+
* order: the first HTTP(S) proxy wins and DIRECT ends the list. `{ proxy }`
|
|
270
|
+
* with a proxy URL or null; `socks` when only SOCKS entries were skipped
|
|
271
|
+
* (fetch here cannot use them, so that origin goes direct).
|
|
272
|
+
*/
|
|
273
|
+
export function routeFromChromium(answer) {
|
|
274
|
+
let socks = false;
|
|
275
|
+
for (const entry of String(answer ?? '').split(';')) {
|
|
276
|
+
const [scheme = '', hostPort = ''] = entry.trim().split(/\s+/);
|
|
277
|
+
const kind = scheme.toUpperCase();
|
|
278
|
+
if (kind === 'DIRECT') break;
|
|
279
|
+
if (kind.startsWith('SOCKS')) {
|
|
280
|
+
socks = true;
|
|
281
|
+
continue;
|
|
282
|
+
}
|
|
283
|
+
const url =
|
|
284
|
+
(kind === 'PROXY' || kind === 'HTTPS') && proxyUrl(`${kind === 'HTTPS' ? 'https' : 'http'}://${hostPort}`);
|
|
285
|
+
if (url) return { proxy: url, socks: false };
|
|
286
|
+
}
|
|
287
|
+
return { proxy: null, socks };
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
/** The fallback decision's route for `origin`: its proxy for the scheme unless the host is excepted. */
|
|
291
|
+
function fallbackRoute(origin) {
|
|
292
|
+
const proxy = active?.proxy;
|
|
293
|
+
if (!proxy) return DIRECT;
|
|
294
|
+
const { protocol, hostname } = new URL(origin);
|
|
295
|
+
const host = normalizeHost(hostname);
|
|
296
|
+
const { hosts, suffixes } = active.bypass;
|
|
297
|
+
if (hosts.includes(host) || suffixes.some((suffix) => host.endsWith(`.${suffix}`))) return DIRECT;
|
|
298
|
+
return { proxy: (protocol === 'https:' ? proxy.https : proxy.http) ?? null };
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
function resetRoutes() {
|
|
302
|
+
routes.clear();
|
|
303
|
+
lookups.clear();
|
|
304
|
+
}
|
|
305
|
+
|
|
306
|
+
/** Logs never quote the answer, a URL or an error: any of them may carry credentials. */
|
|
307
|
+
function reportLookup(found) {
|
|
308
|
+
if (!found && !failureReported) {
|
|
309
|
+
failureReported = true;
|
|
310
|
+
log('[mixdog] system proxy lookup failed or timed out; connecting directly');
|
|
311
|
+
} else if (found?.socks && !found.proxy && !socksReported) {
|
|
312
|
+
socksReported = true;
|
|
313
|
+
log('[mixdog] system proxy is SOCKS only for a host; connecting to it directly');
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
function lookup(origin, entry) {
|
|
318
|
+
let timer;
|
|
319
|
+
const pending = Promise.race([
|
|
320
|
+
Promise.resolve()
|
|
321
|
+
.then(() => entry.resolve(origin))
|
|
322
|
+
.then(routeFromChromium),
|
|
323
|
+
new Promise((resolve) => {
|
|
324
|
+
timer = setTimeout(() => resolve(null), RESOLVE_TIMEOUT_MS);
|
|
325
|
+
timer.unref?.();
|
|
326
|
+
}),
|
|
327
|
+
])
|
|
328
|
+
.catch(() => null)
|
|
329
|
+
.then((found) => {
|
|
330
|
+
clearTimeout(timer);
|
|
331
|
+
const route = found ? { proxy: found.proxy } : DIRECT;
|
|
332
|
+
// Not ours any more when the resolver changed meanwhile: not cached.
|
|
333
|
+
if (lookups.get(origin) === pending) {
|
|
334
|
+
lookups.delete(origin);
|
|
335
|
+
routes.set(origin, { route, expiresAt: Date.now() + (found ? ROUTE_TTL_MS : FAILED_ROUTE_TTL_MS) });
|
|
336
|
+
}
|
|
337
|
+
reportLookup(found);
|
|
338
|
+
return route;
|
|
339
|
+
});
|
|
340
|
+
lookups.set(origin, pending);
|
|
341
|
+
return pending;
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/**
|
|
345
|
+
* The route for `origin` (`scheme://host[:port]`): `{ proxy }`, a proxy URL or
|
|
346
|
+
* null for DIRECT. From the attached resolver's cached answer, or a promise
|
|
347
|
+
* while it is asked (one lookup per origin at a time); from the fallback
|
|
348
|
+
* decision when none is attached.
|
|
349
|
+
*/
|
|
350
|
+
export function systemProxyRoute(origin) {
|
|
351
|
+
const entry = resolvers.at(-1);
|
|
352
|
+
if (!entry) return fallbackRoute(origin);
|
|
353
|
+
const cached = routes.get(origin);
|
|
354
|
+
if (cached && cached.expiresAt > Date.now()) return cached.route;
|
|
355
|
+
return lookups.get(origin) ?? lookup(origin, entry);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
function ensureRouting() {
|
|
359
|
+
if (routingInstalled) return true;
|
|
360
|
+
try {
|
|
361
|
+
installRouting();
|
|
362
|
+
} catch {
|
|
363
|
+
// The dispatcher is built before anything is installed, so nothing is half-applied.
|
|
364
|
+
log('[mixdog] system proxy not used: could not be applied');
|
|
365
|
+
active = { proxy: null };
|
|
366
|
+
installRouting = null;
|
|
367
|
+
return false;
|
|
368
|
+
}
|
|
369
|
+
routingInstalled = true;
|
|
370
|
+
return true;
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
/**
|
|
374
|
+
* Settle this process's fallback system-proxy decision and route its own fetch
|
|
375
|
+
* by it. A handoff from the launching Mixdog process (always removed from
|
|
376
|
+
* `env`) is the decision; without one, Windows reads the registry. Nothing
|
|
377
|
+
* happens, nothing is handed on and no resolver is ever used when the user set
|
|
378
|
+
* a proxy variable or MIXDOG_SYSTEM_PROXY=0 (which also disables discovery).
|
|
379
|
+
* Returns true when a proxy was applied.
|
|
380
|
+
*/
|
|
381
|
+
export function adoptSystemProxy(
|
|
382
|
+
env = process.env,
|
|
383
|
+
{
|
|
384
|
+
platform = process.platform,
|
|
385
|
+
reader = readWindowsProxyRegistry,
|
|
386
|
+
log: logLine = (line) => process.stderr.write(`${line}\n`),
|
|
387
|
+
apply = adoptPrivateProxy,
|
|
388
|
+
} = {}
|
|
389
|
+
) {
|
|
390
|
+
const handoff = parseHandoff(env[HANDOFF_VAR]);
|
|
391
|
+
delete env[HANDOFF_VAR];
|
|
392
|
+
active = null;
|
|
393
|
+
installRouting = null;
|
|
394
|
+
routingInstalled = false;
|
|
395
|
+
log = logLine;
|
|
396
|
+
resolvers.length = 0;
|
|
397
|
+
resetRoutes();
|
|
398
|
+
if (env.MIXDOG_SYSTEM_PROXY === '0' || USER_PROXY_VARS.some((name) => env[name] !== undefined)) return false;
|
|
399
|
+
installRouting = () => apply(systemProxyRoute);
|
|
400
|
+
if (handoff?.invalid) {
|
|
401
|
+
log('[mixdog] system proxy not used: invalid handoff');
|
|
402
|
+
active = { proxy: null };
|
|
403
|
+
return false;
|
|
404
|
+
}
|
|
405
|
+
active = handoff ?? (platform === 'win32' ? discover(reader, log) : null);
|
|
406
|
+
if (!active?.proxy) return false;
|
|
407
|
+
return ensureRouting();
|
|
408
|
+
}
|
|
409
|
+
|
|
410
|
+
/**
|
|
411
|
+
* Route this process by `resolve(origin)` — a promise of Chromium's proxy
|
|
412
|
+
* answer for that origin — until the returned detach is called. The newest
|
|
413
|
+
* attached resolver answers; every attach and detach drops the cached routes.
|
|
414
|
+
* A no-op when this process routes nothing (the user's variables or
|
|
415
|
+
* MIXDOG_SYSTEM_PROXY=0 decide).
|
|
416
|
+
*/
|
|
417
|
+
export function attachSystemProxyResolver(resolve) {
|
|
418
|
+
if (!installRouting || !ensureRouting()) return () => {};
|
|
419
|
+
const entry = { resolve };
|
|
420
|
+
resolvers.push(entry);
|
|
421
|
+
failureReported = false;
|
|
422
|
+
resetRoutes();
|
|
423
|
+
return () => {
|
|
424
|
+
const index = resolvers.indexOf(entry);
|
|
425
|
+
if (index < 0) return;
|
|
426
|
+
resolvers.splice(index, 1);
|
|
427
|
+
resetRoutes();
|
|
428
|
+
};
|
|
429
|
+
}
|
|
430
|
+
|
|
431
|
+
/**
|
|
432
|
+
* npm's own proxy settings for the one Mixdog-owned npm spawn (the self-update
|
|
433
|
+
* install): the route of the registry npm uses (`registry()`, asked only when
|
|
434
|
+
* this process routes at all); empty for DIRECT or without a decision. Meant
|
|
435
|
+
* for that spawn's env only, never for the process env.
|
|
436
|
+
*/
|
|
437
|
+
export async function systemProxyNpmEnv(registry) {
|
|
438
|
+
if (!installRouting) return {};
|
|
439
|
+
const { origin, hostname } = new URL(await registry());
|
|
440
|
+
if (isLocalHost(hostname)) return {};
|
|
441
|
+
const { proxy } = await systemProxyRoute(origin);
|
|
442
|
+
if (!proxy) return {};
|
|
443
|
+
return {
|
|
444
|
+
npm_config_proxy: proxy,
|
|
445
|
+
npm_config_https_proxy: proxy,
|
|
446
|
+
npm_config_noproxy: 'localhost,127.0.0.1,::1,.local',
|
|
447
|
+
};
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
/** The handoff for a Mixdog process this one starts; empty when no decision was made. */
|
|
451
|
+
export function systemProxyHandoffEnv() {
|
|
452
|
+
return active ? { [HANDOFF_VAR]: JSON.stringify(active) } : {};
|
|
453
|
+
}
|
|
@@ -13,7 +13,7 @@
|
|
|
13
13
|
* is an estimate: providers do not publish what a request costs the meter.
|
|
14
14
|
*/
|
|
15
15
|
import { normalizeUsageMeasurement } from './usage-measurement.mjs';
|
|
16
|
-
import { usageRollupDayKey } from './usage-rollup.mjs';
|
|
16
|
+
import { FAST_KEY, fastRouteSql, sortFastBesideModel, usageRollupDayKey } from './usage-rollup.mjs';
|
|
17
17
|
import { estimateOutsideQuota, estimateQuotaValue, outsideSpans } from './quota-value-estimate.mjs';
|
|
18
18
|
|
|
19
19
|
export const QUOTA_SCHEMA = `
|
|
@@ -397,7 +397,8 @@ function readQuotaEvents(db, { provider, account, label = '', fromMs, toMs }) {
|
|
|
397
397
|
const rows = db
|
|
398
398
|
.prepare(`
|
|
399
399
|
WITH routes AS (
|
|
400
|
-
SELECT id,json_extract(signature,'$[1]') AS model,json_extract(signature,'$[7]') AS rank
|
|
400
|
+
SELECT id,json_extract(signature,'$[1]') AS model,json_extract(signature,'$[7]') AS rank,
|
|
401
|
+
${fastRouteSql('signature')} AS fast
|
|
401
402
|
FROM usage_routes
|
|
402
403
|
WHERE json_extract(signature,'$[0]')=? AND COALESCE(json_extract(signature,'$[8]'),'') IN (?,?)
|
|
403
404
|
)
|
|
@@ -405,10 +406,11 @@ function readQuotaEvents(db, { provider, account, label = '', fromMs, toMs }) {
|
|
|
405
406
|
SUM(e.input) AS input,SUM(e.output) AS output,SUM(e.cache_read) AS cacheRead,
|
|
406
407
|
SUM(e.cache_write) AS cacheWrite,SUM(e.cost_usd) AS costUsd,COUNT(e.cost_usd) AS priced,
|
|
407
408
|
SUM(CASE WHEN e.duration_ms>0 AND e.output>0 THEN e.output ELSE 0 END) AS speedOutput,
|
|
408
|
-
SUM(CASE WHEN e.duration_ms>0 AND e.output>0 THEN e.duration_ms ELSE 0 END) AS speedMs
|
|
409
|
+
SUM(CASE WHEN e.duration_ms>0 AND e.output>0 THEN e.duration_ms ELSE 0 END) AS speedMs,
|
|
410
|
+
r.fast
|
|
409
411
|
FROM usage_events e JOIN routes r ON r.id=e.route
|
|
410
412
|
WHERE e.ts>=? AND e.ts<=?
|
|
411
|
-
GROUP BY e.ts,e.day,r.model,r.rank
|
|
413
|
+
GROUP BY e.ts,e.day,r.model,r.rank,r.fast
|
|
412
414
|
ORDER BY e.ts`)
|
|
413
415
|
.all(provider, account, unlabeled, fromMs, toMs);
|
|
414
416
|
const best = new Map();
|
|
@@ -433,7 +435,8 @@ function readQuotaEvents(db, { provider, account, label = '', fromMs, toMs }) {
|
|
|
433
435
|
});
|
|
434
436
|
const event = {
|
|
435
437
|
ts: row.ts,
|
|
436
|
-
model
|
|
438
|
+
// A model's Fast calls are keyed apart from its normal ones.
|
|
439
|
+
model: row.fast ? row.model + FAST_KEY : row.model,
|
|
437
440
|
turns: row.turns,
|
|
438
441
|
input: usage.input || 0,
|
|
439
442
|
output: usage.output || 0,
|
|
@@ -686,7 +689,6 @@ function addUsage(target, event, share) {
|
|
|
686
689
|
}
|
|
687
690
|
|
|
688
691
|
const tokensOf = (usage) => usage.input + usage.output + usage.cacheRead + usage.cacheWrite;
|
|
689
|
-
const byConsumption = (a, b) => b.consumed - a.consumed || b.tokens - a.tokens;
|
|
690
692
|
|
|
691
693
|
/** Route-shaped totals, so the token table's cells render them unchanged. */
|
|
692
694
|
function exportUsage(usage) {
|
|
@@ -708,6 +710,16 @@ function exportUsage(usage) {
|
|
|
708
710
|
};
|
|
709
711
|
}
|
|
710
712
|
|
|
713
|
+
/** What a Fast key stands for: `modelId` is the model itself, never the internal key. */
|
|
714
|
+
const modelIdentity = (key) => (key.endsWith(FAST_KEY) ? { fast: true, modelId: key.slice(0, -FAST_KEY.length) } : {});
|
|
715
|
+
|
|
716
|
+
/** A model row: its key is unique per mode. */
|
|
717
|
+
function exportModel(key, usage) {
|
|
718
|
+
return { model: key, ...modelIdentity(key), ...exportUsage(usage) };
|
|
719
|
+
}
|
|
720
|
+
|
|
721
|
+
const modelOfRow = (row) => row.modelId ?? row.model;
|
|
722
|
+
|
|
711
723
|
function windowPeriod(listed, anchor) {
|
|
712
724
|
if (!listed.length) return null;
|
|
713
725
|
let index = listed.findIndex((instance) => instance.key === anchor);
|
|
@@ -750,7 +762,7 @@ function forecastFor(instance, points) {
|
|
|
750
762
|
/** Each model's running share of its window, sampled at slot ends; the slot
|
|
751
763
|
* running now is sampled at now, as far as it has run. */
|
|
752
764
|
function modelSeries(slots, instances, keys, now) {
|
|
753
|
-
const series = keys.map((key) => ({ key, points: [] }));
|
|
765
|
+
const series = keys.map((key) => ({ key, ...modelIdentity(key), points: [] }));
|
|
754
766
|
const running = new Map();
|
|
755
767
|
let owner;
|
|
756
768
|
for (const slot of slots) {
|
|
@@ -933,7 +945,11 @@ export function readQuotaHistory(
|
|
|
933
945
|
? null
|
|
934
946
|
: slots.reduce((sum, slot) => sum + slot.outsideCostUsd, 0);
|
|
935
947
|
|
|
936
|
-
const exportedModels =
|
|
948
|
+
const exportedModels = sortFastBesideModel(
|
|
949
|
+
[...models].map(([key, usage]) => exportModel(key, usage)),
|
|
950
|
+
modelOfRow,
|
|
951
|
+
['consumed', 'tokens']
|
|
952
|
+
);
|
|
937
953
|
const seriesKeys = exportedModels
|
|
938
954
|
.filter((model) => model.consumed > 0)
|
|
939
955
|
.slice(0, SERIES_LIMIT)
|
|
@@ -995,14 +1011,17 @@ export function readQuotaHistory(
|
|
|
995
1011
|
: slot.outsideCostUsd,
|
|
996
1012
|
slot.usage.costKnownTurns < slot.usage.turns
|
|
997
1013
|
),
|
|
998
|
-
models:
|
|
999
|
-
.map(([model, usage]) => ({
|
|
1014
|
+
models: sortFastBesideModel(
|
|
1015
|
+
[...slot.models].map(([model, usage]) => ({
|
|
1000
1016
|
model,
|
|
1017
|
+
...modelIdentity(model),
|
|
1001
1018
|
consumed: round(usage.consumed),
|
|
1002
1019
|
tokens: tokensOf(usage),
|
|
1003
1020
|
costUsd: round(usage.costUsd, 6),
|
|
1004
|
-
}))
|
|
1005
|
-
|
|
1021
|
+
})),
|
|
1022
|
+
modelOfRow,
|
|
1023
|
+
['consumed', 'tokens']
|
|
1024
|
+
),
|
|
1006
1025
|
})),
|
|
1007
1026
|
modelSeries: modelSeries(slots, shown, seriesKeys, now),
|
|
1008
1027
|
// A period over several windows marks where each of them peaked.
|