mixdog 1.4.0 → 1.4.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/package.json +3 -2
- package/scripts/build-shipped-history.mjs +115 -33
- package/scripts/check-voice-runtime-inputs.mjs +25 -0
- package/scripts/gate-local.mjs +183 -63
- package/scripts/latest-guard.mjs +21 -9
- package/scripts/lib/gate-scheduler.mjs +138 -32
- package/scripts/lib/gate-timing-reporter.mjs +16 -0
- package/scripts/lib/isolated-test-env.mjs +10 -5
- package/scripts/lib/run-node-tests.mjs +91 -66
- package/scripts/lib/scoped-temp.d.mts +16 -0
- package/scripts/lib/scoped-temp.mjs +124 -0
- package/scripts/lib/stale-temp.mjs +44 -0
- package/scripts/lib/test-failure-records.mjs +14 -1
- package/scripts/lib/test-failure-summary.mjs +16 -4
- package/scripts/lib/test-spawn-ledger.mjs +12 -3
- package/scripts/post-release-check.mjs +1 -6
- package/scripts/pptx-kit-index.mjs +17 -5
- package/scripts/suite-health.mjs +115 -24
- package/scripts/test-data-dir.mjs +10 -7
- 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/app.mjs +4 -0
- package/src/cli.mjs +7 -0
- package/src/defaults/agents.json +7 -0
- package/src/defaults/shipped-history.json +23 -2
- package/src/defaults/skills/browser-use/SKILL.md +10 -5
- 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 +16 -4
- package/src/defaults/skills/goal-management/SKILL.md +1 -1
- package/src/defaults/skills/setup/references/actions.md +12 -6
- package/src/defaults/skills/setup/references/surfaces.md +2 -2
- package/src/defaults/skills/setup-guide/SKILL.md +5 -2
- 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/rules-builder.cjs +35 -42
- package/src/output-styles/common.md +2 -2
- package/src/output-styles/simple.md +1 -1
- package/src/rules/agent/AGENT.md +5 -4
- package/src/rules/lead/LEAD.md +12 -7
- package/src/rules/shared/10-tool-workflow.md +3 -1
- package/src/rules/shared/20-research.md +3 -6
- package/src/rules/shared/40-editing.md +1 -0
- package/src/rules/shared/45-destructive.md +0 -2
- package/src/rules/shared/50-execution.md +2 -0
- package/src/rules/shared/60-verification.md +10 -9
- package/src/rules/shared/70-delivery.md +8 -9
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +156 -24
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -0
- package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
- package/src/runtime/agent/orchestrator/cache-break-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/config.mjs +12 -7
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +8 -8
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +5 -26
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +3 -1
- package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +122 -12
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +5 -3
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +13 -2
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +152 -58
- package/src/runtime/agent/orchestrator/mcp/client.mjs +51 -18
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +88 -54
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +42 -26
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +54 -8
- package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +37 -31
- package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +8 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +6 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -2
- 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-oauth-request/initial-status.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +14 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +6 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -2
- 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-login.mjs +1 -10
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +3 -0
- 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/devin.mjs +3 -0
- 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/grok-oauth-login.mjs +248 -41
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -11
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +45 -6
- package/src/runtime/agent/orchestrator/providers/lib/first-output-window.mjs +58 -0
- package/src/runtime/agent/orchestrator/providers/lib/listen-on.mjs +14 -0
- 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-login.mjs +1 -10
- 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-chat-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +14 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +5 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +16 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +13 -3
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +81 -42
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +8 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +160 -31
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +22 -12
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +49 -22
- 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 +45 -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 +567 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +41 -13
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +2 -0
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -6
- package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +7 -3
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +6 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +14 -5
- package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +5 -2
- 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/cache/scoped-cache.mjs +1 -3
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +102 -12
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -8
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +23 -0
- package/src/runtime/agent/orchestrator/session/compact/observation-supersession.mjs +103 -23
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +160 -36
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +164 -23
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +139 -19
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +38 -7
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +100 -22
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -6
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +33 -3
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +9 -2
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +13 -5
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +14 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +23 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +39 -21
- package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +50 -28
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-loop-options.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +30 -13
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +63 -6
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +7 -0
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +35 -13
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +24 -14
- 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 +10 -6
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +56 -29
- package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
- package/src/runtime/agent/orchestrator/session/mixy-name.mjs +11 -5
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +30 -7
- package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +154 -0
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +7 -0
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +37 -8
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +252 -39
- package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +164 -4
- package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +61 -2
- package/src/runtime/agent/orchestrator/stall-policy.mjs +23 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +46 -20
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +67 -31
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +25 -13
- package/src/runtime/agent/orchestrator/tools/builtin/lib/scoped-search-flight.mjs +9 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +23 -12
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +1 -8
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +96 -20
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/federation.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/isolated-test-env.mjs +4 -3
- 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 +103 -13
- 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 +34 -10
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +28 -4
- package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -2
- package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
- package/src/runtime/channels/lib/webhook/signature.mjs +4 -1
- package/src/runtime/channels/lib/whisper-port.mjs +29 -11
- package/src/runtime/channels/lib/whisper-server.mjs +10 -1
- package/src/runtime/computer-bridge/action-schema.mjs +2 -2
- package/src/runtime/computer-bridge/core-actions.mjs +2 -2
- package/src/runtime/computer-bridge/error-recovery.mjs +5 -4
- package/src/runtime/computer-bridge/linux-action-capabilities.mjs +24 -5
- package/src/runtime/computer-bridge/linux-readiness.d.mts +7 -2
- package/src/runtime/connectors/connector-accounts-mcp.mjs +236 -103
- package/src/runtime/connectors/gmail-app-password.mjs +3 -3
- package/src/runtime/explore/explorer.mjs +93 -0
- package/src/runtime/explore/tool-defs.mjs +35 -0
- package/src/runtime/explore/tool.mjs +123 -0
- package/src/runtime/local-provider/server-process.mjs +2 -1
- package/src/runtime/media/adapters/gemini-video.mjs +4 -1
- package/src/runtime/media/adapters/xai-media.mjs +2 -1
- package/src/runtime/memory/index.mjs +4 -0
- package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
- package/src/runtime/memory/lib/embedding-worker.mjs +10 -3
- package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +1 -7
- package/src/runtime/memory/lib/memory-chunk-quality.mjs +1 -6
- package/src/runtime/office/authoring/pdf-author-action.mjs +1 -6
- package/src/runtime/office/design/design-art-direction.mjs +29 -27
- package/src/runtime/office/pdf/pdf-writer.mjs +6 -1
- package/src/runtime/office/portable/portable-snapshot-docx.mjs +7 -1
- package/src/runtime/office/portable/portable-snapshot-shared.mjs +6 -1
- package/src/runtime/office/quality/assurance-rendered.mjs +9 -2
- package/src/runtime/office/quality/assurance-structure-docx.mjs +4 -2
- package/src/runtime/office/quality/design-review.mjs +1 -5
- package/src/runtime/office/quality/document-brief.mjs +1 -5
- package/src/runtime/office/quality/forced-break-pages.mjs +9 -6
- package/src/runtime/office/quality/quality-pipeline.mjs +1 -1
- package/src/runtime/shared/agent-route-config.mjs +17 -2
- package/src/runtime/shared/atomic-file.mjs +103 -2
- package/src/runtime/shared/background-tasks.mjs +15 -6
- package/src/runtime/shared/bot-owned-work.mjs +56 -0
- package/src/runtime/shared/connector-accounts.mjs +5 -5
- package/src/runtime/shared/connector-catalog.d.mts +11 -4
- package/src/runtime/shared/connector-catalog.mjs +60 -52
- package/src/runtime/shared/custom-provider-keys.mjs +20 -0
- package/src/runtime/shared/defaults-separation.mjs +1 -4
- package/src/runtime/shared/fetch-safe-listen.d.mts +16 -0
- package/src/runtime/shared/fetch-safe-listen.mjs +50 -0
- package/src/runtime/shared/file-has-data.mjs +26 -2
- package/src/runtime/shared/file-lock.mjs +13 -15
- 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/handoff-artifacts.d.mts +2 -1
- package/src/runtime/shared/handoff-artifacts.mjs +18 -8
- package/src/runtime/shared/idle-auto-clear-gate.mjs +29 -7
- package/src/runtime/shared/llm/cost.mjs +11 -2
- package/src/runtime/shared/llm/http-agent.mjs +313 -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 +452 -0
- package/src/runtime/shared/loopback-listener.mjs +25 -2
- package/src/runtime/shared/model-route-chain.d.mts +7 -2
- package/src/runtime/shared/model-route-chain.mjs +22 -4
- package/src/runtime/shared/open-url.mjs +10 -0
- package/src/runtime/shared/provider-accounts.mjs +52 -2
- package/src/runtime/shared/session-activity-signal.mjs +14 -0
- package/src/runtime/shared/session-scratch.mjs +37 -0
- 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/agent-surface.mjs +1 -3
- package/src/runtime/shared/tool-card-model/card-status.mjs +15 -2
- package/src/runtime/shared/tool-result-summary.mjs +1 -1
- package/src/runtime/shared/tool-surface.mjs +113 -36
- package/src/runtime/shared/tool-work-units.mjs +6 -0
- package/src/runtime/shared/turn-snapshot-store.mjs +13 -6
- package/src/runtime/shared/turn-worktree-snapshot.mjs +414 -54
- 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 +9 -3
- package/src/runtime/shared/worktrees/contract.mjs +4 -1
- package/src/runtime/shared/worktrees/git.mjs +72 -0
- package/src/runtime/shared/worktrees/manager.mjs +285 -168
- package/src/runtime/shared/worktrees/test-support.mjs +6 -10
- package/src/runtime/tidy/install.mjs +95 -15
- package/src/runtime/tidy/languages.mjs +17 -15
- package/src/runtime/tidy/process.mjs +7 -4
- 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 +6 -1
- package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
- package/src/runtime/web-search/index.mjs +1 -1
- package/src/session-runtime/agent-home-delivery.mjs +41 -0
- package/src/session-runtime/agent-task-sessions.mjs +458 -312
- package/src/session-runtime/agent-tool-routing.mjs +8 -41
- package/src/session-runtime/boot/tools.mjs +7 -1
- package/src/session-runtime/bot-status.mjs +107 -101
- package/src/session-runtime/bot-target.mjs +38 -0
- package/src/session-runtime/channel-config-api.mjs +6 -1
- package/src/session-runtime/connector-merge-migration.mjs +18 -15
- package/src/session-runtime/conversation-import/codex-titles.mjs +88 -0
- package/src/session-runtime/conversation-import/discovery.mjs +401 -36
- package/src/session-runtime/conversation-import/service.mjs +35 -8
- package/src/session-runtime/handoff-attachments.mjs +82 -31
- package/src/session-runtime/held-requests.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +12 -13
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +1 -0
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -0
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
- package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +4 -1
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +145 -112
- package/src/session-runtime/lifecycle/cold-heir.mjs +11 -6
- package/src/session-runtime/lifecycle/session-catalog.mjs +9 -1
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -1
- package/src/session-runtime/lifecycle/teardown.mjs +1 -1
- package/src/session-runtime/mcp-glue/server-catalog.mjs +16 -10
- 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 +11 -2
- package/src/session-runtime/provider-auth/login.mjs +2 -2
- package/src/session-runtime/provider-catalog-cache.mjs +82 -36
- package/src/session-runtime/provider-models/catalog-load.mjs +23 -6
- package/src/session-runtime/provider-models.mjs +4 -2
- package/src/session-runtime/resource-mcp-api.mjs +98 -35
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +44 -31
- package/src/session-runtime/resource-mcp-secrets.mjs +28 -11
- package/src/session-runtime/resource-mcp-servers.mjs +5 -4
- package/src/session-runtime/resource-recall-api.mjs +6 -1
- package/src/session-runtime/runtime-feature-gates.mjs +5 -1
- package/src/session-runtime/services/agent-tool/execute.mjs +14 -9
- package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +20 -4
- package/src/session-runtime/services/agent-tool/model-select.mjs +48 -7
- package/src/session-runtime/services/agent-tool/render.mjs +71 -17
- package/src/session-runtime/services/agent-tool/send-flow.mjs +10 -2
- 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 +4 -1
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +6 -2
- package/src/session-runtime/services/agent-tool/tool-def.mjs +9 -9
- package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
- 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/memory-runtime-proxy/daemon-spawn.mjs +4 -0
- package/src/session-runtime/services/plugin-admin.mjs +10 -6
- package/src/session-runtime/services/provider-admin.mjs +283 -11
- package/src/session-runtime/session-turn-api.mjs +2 -0
- package/src/session-runtime/settings-builtin-tools-api.mjs +4 -1
- 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 +6 -2
- package/src/session-runtime/setup-tool/tool-defs.mjs +2 -1
- package/src/session-runtime/tool-policy/policy-stage.mjs +1 -0
- package/src/session-runtime/turn/agent-ops.mjs +23 -0
- package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +49 -11
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +5 -1
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +25 -5
- package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -3
- package/src/session-runtime/workspace/activity-guards.mjs +176 -0
- 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 +108 -1041
- 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 +80 -0
- package/src/session-runtime/workspace/worktree-setup.mjs +85 -0
- package/src/session-runtime/workspace/worktree-tool.mjs +73 -56
- package/src/standalone/daemon-desktop-runtime.mjs +2 -0
- package/src/standalone/daemon-session-control.mjs +169 -138
- package/src/standalone/daemon.mjs +7 -0
- package/src/standalone/desktop-service-registry.mjs +9 -0
- package/src/standalone/local-session-runtime.mjs +5 -1
- package/src/standalone/session-client/daemon-unavailable.mjs +3 -0
- package/src/standalone/session-client.mjs +5 -1
- package/src/standalone/session-frame-stream.mjs +83 -11
- package/src/standalone/session-protocol.mjs +4 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +16 -12
- 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/session-calls/session-action.mjs +10 -3
- package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
- package/src/standalone/session-service/stored-reader.mjs +127 -40
- package/src/standalone/session-transport/client-registry/client-grace.mjs +12 -9
- package/src/tui/App.jsx +154 -164
- package/src/tui/app/app-view/floating-panel.jsx +10 -4
- package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
- package/src/tui/app/clipboard.mjs +21 -10
- package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +1 -3
- package/src/tui/app/model-picker/route-selection.mjs +5 -6
- 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 +58 -21
- package/src/tui/app/provider-setup/provider-items.mjs +8 -2
- package/src/tui/app/provider-setup-picker.mjs +29 -18
- package/src/tui/app/shell-layout/row-budgets.mjs +12 -10
- package/src/tui/app/slash-commands.mjs +1 -0
- package/src/tui/app/slash-dispatch/session-commands.mjs +46 -0
- 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 +3 -2
- 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 +47 -32
- 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 +19 -5
- 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/QuestionPanel.jsx +13 -4
- package/src/tui/components/SignInUrl.jsx +68 -0
- package/src/tui/components/TextEntryPanel.jsx +76 -46
- package/src/tui/components/sign-in-url-layout.mjs +24 -0
- package/src/tui/dist/index.mjs +1963 -1361
- package/src/tui/session/goal-turn-state.mjs +6 -2
- 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/routes-agent-definitions.mjs +1 -0
- package/src/tui/session/session-api/settings.mjs +2 -2
- package/src/tui/session/session-flow/queue/take-entries.mjs +11 -0
- 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/ui/statusline-agents.mjs +1 -3
- package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
|
@@ -1,16 +1,8 @@
|
|
|
1
|
-
import {
|
|
2
|
-
linkSync,
|
|
3
|
-
mkdirSync,
|
|
4
|
-
readdirSync,
|
|
5
|
-
readFileSync,
|
|
6
|
-
renameSync,
|
|
7
|
-
statSync,
|
|
8
|
-
unlinkSync,
|
|
9
|
-
writeFileSync,
|
|
10
|
-
} from 'node:fs';
|
|
1
|
+
import { linkSync, mkdirSync, readFileSync, renameSync, statSync, unlinkSync, writeFileSync } from 'node:fs';
|
|
11
2
|
import {
|
|
12
3
|
link as linkAsync,
|
|
13
4
|
mkdir as mkdirAsync,
|
|
5
|
+
readdir as readdirAsync,
|
|
14
6
|
readFile as readFileAsync,
|
|
15
7
|
stat as statAsync,
|
|
16
8
|
unlink as unlinkAsync,
|
|
@@ -384,10 +376,16 @@ function lockStaleMs(opts) {
|
|
|
384
376
|
// A staged owner record lives for one link call; a process killed between its
|
|
385
377
|
// create and unlink leaves `<lock>.<pid>.<hex>.tmp` behind. Each lock path is
|
|
386
378
|
// swept once per process for staged files older than this whose pid is dead.
|
|
379
|
+
// The sweep is cleanup only — no lock decision depends on it — so it runs
|
|
380
|
+
// beside the acquisition instead of in front of it: listing a crowded
|
|
381
|
+
// directory synchronously blocked every lock taker for seconds. A file it
|
|
382
|
+
// removes belongs to a dead pid and is past any link call, so it cannot race
|
|
383
|
+
// a live acquisition.
|
|
387
384
|
const STAGED_LOCK_FILE_STALE_MS = 60_000;
|
|
388
385
|
const sweptLockPaths = new Set();
|
|
389
386
|
|
|
390
|
-
|
|
387
|
+
/** Resolves with the number of staged files removed; 0 once the path was swept in this process. */
|
|
388
|
+
export async function sweepStagedLockFiles(lockPath, now = Date.now()) {
|
|
391
389
|
if (sweptLockPaths.has(lockPath)) return 0;
|
|
392
390
|
sweptLockPaths.add(lockPath);
|
|
393
391
|
const dir = dirname(lockPath);
|
|
@@ -395,7 +393,7 @@ export function sweepStagedLockFiles(lockPath, now = Date.now()) {
|
|
|
395
393
|
let removed = 0;
|
|
396
394
|
let names;
|
|
397
395
|
try {
|
|
398
|
-
names =
|
|
396
|
+
names = await readdirAsync(dir);
|
|
399
397
|
} catch {
|
|
400
398
|
return 0;
|
|
401
399
|
}
|
|
@@ -405,9 +403,9 @@ export function sweepStagedLockFiles(lockPath, now = Date.now()) {
|
|
|
405
403
|
if (!match) continue;
|
|
406
404
|
const path = join(dir, name);
|
|
407
405
|
try {
|
|
408
|
-
if (now -
|
|
406
|
+
if (now - (await statAsync(path)).mtimeMs < STAGED_LOCK_FILE_STALE_MS) continue;
|
|
409
407
|
if (ownerIsLive({ pid: Number(match[1]), token: null })) continue;
|
|
410
|
-
|
|
408
|
+
await unlinkAsync(path);
|
|
411
409
|
removed += 1;
|
|
412
410
|
} catch {
|
|
413
411
|
// Another sweeper or a late unlink got there first.
|
|
@@ -421,7 +419,7 @@ function* acquireLock(lockPath, opts, mode, markHeld, timing = null) {
|
|
|
421
419
|
const staleMs = lockStaleMs(opts);
|
|
422
420
|
const deadline = Date.now() + timeoutMs;
|
|
423
421
|
yield ['mkdirp', dirname(lockPath)];
|
|
424
|
-
sweepStagedLockFiles(lockPath);
|
|
422
|
+
void sweepStagedLockFiles(lockPath);
|
|
425
423
|
const waitStartedAt = Date.now();
|
|
426
424
|
let attempt = 0;
|
|
427
425
|
let lastError = null;
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export function gitCommand(env?: NodeJS.ProcessEnv | null): string;
|
|
2
|
+
export function gitChildEnv(env: NodeJS.ProcessEnv): NodeJS.ProcessEnv;
|
|
3
|
+
export function gitChildEnv(env?: null): NodeJS.ProcessEnv | null;
|
|
4
|
+
export function forgetMissingGit(command: string, error: unknown): boolean;
|
|
5
|
+
export function startGit<T>(
|
|
6
|
+
env: NodeJS.ProcessEnv,
|
|
7
|
+
start: (command: string, env: NodeJS.ProcessEnv) => Promise<T>,
|
|
8
|
+
spawnError?: (outcome: T) => unknown
|
|
9
|
+
): Promise<T>;
|
|
@@ -0,0 +1,213 @@
|
|
|
1
|
+
// The git executable product code starts, and the environment it starts with.
|
|
2
|
+
//
|
|
3
|
+
// On Windows `git` on PATH is usually Git for Windows' launcher,
|
|
4
|
+
// <root>\cmd\git.exe (or the identical <root>\bin\git.exe). It only prepares
|
|
5
|
+
// the environment and starts <root>\<msystem>\bin\git.exe as a second process,
|
|
6
|
+
// so every git child costs two process creations. When PATH's git is that
|
|
7
|
+
// launcher, children start the real binary directly with the environment the
|
|
8
|
+
// launcher would have built. The steps below follow git-wrapper.c
|
|
9
|
+
// (git-for-windows/MINGW-packages, mingw-w64-git/git-wrapper.c): main()'s
|
|
10
|
+
// `git.exe` branch and setup_environment(top_level_path, full_path=1) plus
|
|
11
|
+
// maybe_read_config(). Anything else — another platform, a scoop shim, MinGit,
|
|
12
|
+
// a git.exe outside such a layout, an ambiguous or incomplete install — keeps
|
|
13
|
+
// plain `git` and the caller's environment, exactly as before.
|
|
14
|
+
import { readFileSync, realpathSync, statSync } from 'node:fs';
|
|
15
|
+
import { basename, delimiter, dirname, isAbsolute, join } from 'node:path';
|
|
16
|
+
|
|
17
|
+
// The wrapper's compile-time MSYSTEM, lower-cased, names its binary directory.
|
|
18
|
+
const MSYSTEM_DIRECTORIES = ['mingw64', 'clangarm64', 'mingw32'];
|
|
19
|
+
|
|
20
|
+
function isFile(path) {
|
|
21
|
+
try {
|
|
22
|
+
return statSync(path).isFile();
|
|
23
|
+
} catch {
|
|
24
|
+
return false;
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
function isDirectory(path) {
|
|
29
|
+
try {
|
|
30
|
+
return statSync(path).isDirectory();
|
|
31
|
+
} catch {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Windows names are case-insensitive. Of several spellings in one object
|
|
37
|
+
// Node passes the first in sorted order to the child, so that one is read and
|
|
38
|
+
// written.
|
|
39
|
+
function envKey(env, name) {
|
|
40
|
+
const upper = name.toUpperCase();
|
|
41
|
+
return (
|
|
42
|
+
Object.keys(env)
|
|
43
|
+
.filter((key) => key.toUpperCase() === upper)
|
|
44
|
+
.sort()[0] ?? name
|
|
45
|
+
);
|
|
46
|
+
}
|
|
47
|
+
|
|
48
|
+
function envValue(env, name) {
|
|
49
|
+
const value = env[envKey(env, name)];
|
|
50
|
+
return value === undefined || value === null ? undefined : String(value);
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
// The wrapper's my_path_append: one backslash between the parts.
|
|
54
|
+
function appendPath(list, part) {
|
|
55
|
+
return list.endsWith('\\') ? `${list}${part}` : `${list}\\${part}`;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
// libuv's search for a bare `git` (no directory, no extension): each PATH
|
|
59
|
+
// entry in order, `git.com` before `git.exe`.
|
|
60
|
+
function launcherOnPath(pathValue) {
|
|
61
|
+
for (const raw of String(pathValue || '').split(delimiter)) {
|
|
62
|
+
const entry = raw.trim().replace(/^"(.*)"$/, '$1');
|
|
63
|
+
if (!entry) continue;
|
|
64
|
+
// A relative entry resolves against each child's cwd; not decidable once.
|
|
65
|
+
if (!isAbsolute(entry)) return null;
|
|
66
|
+
if (isFile(join(entry, 'git.com'))) return null;
|
|
67
|
+
const candidate = join(entry, 'git.exe');
|
|
68
|
+
if (isFile(candidate)) return candidate;
|
|
69
|
+
}
|
|
70
|
+
return null;
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// etc\git-bash.config `MSYS=` lines, each prepended to MSYS in file order.
|
|
74
|
+
function readMsysConfig(root) {
|
|
75
|
+
let text = '';
|
|
76
|
+
try {
|
|
77
|
+
text = readFileSync(join(root, 'etc', 'git-bash.config'), 'utf8');
|
|
78
|
+
} catch {
|
|
79
|
+
return [];
|
|
80
|
+
}
|
|
81
|
+
return text
|
|
82
|
+
.split('\n')
|
|
83
|
+
.map((line) => line.replace(/\r$/, ''))
|
|
84
|
+
.filter((line) => line.startsWith('MSYS='))
|
|
85
|
+
.map((line) => line.slice(5));
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* The Git for Windows layout behind PATH's `git`, or null when there is none
|
|
90
|
+
* to bypass. `{ command, root, msystem, msysConfig }`.
|
|
91
|
+
*/
|
|
92
|
+
export function resolveGitLaunch({ platform = process.platform, pathValue = process.env.PATH } = {}) {
|
|
93
|
+
if (platform !== 'win32') return null;
|
|
94
|
+
const found = launcherOnPath(pathValue);
|
|
95
|
+
if (!found) return null;
|
|
96
|
+
let launcher;
|
|
97
|
+
try {
|
|
98
|
+
// The wrapper locates its install from its own final path.
|
|
99
|
+
launcher = realpathSync.native(found);
|
|
100
|
+
} catch {
|
|
101
|
+
return null;
|
|
102
|
+
}
|
|
103
|
+
if (basename(launcher).toLowerCase() !== 'git.exe') return null;
|
|
104
|
+
const launcherDirectory = dirname(launcher);
|
|
105
|
+
if (!['cmd', 'bin'].includes(basename(launcherDirectory).toLowerCase())) return null;
|
|
106
|
+
const root = dirname(launcherDirectory);
|
|
107
|
+
// The installer and PortableGit ship git-bash.exe; MinGit and other layouts do not.
|
|
108
|
+
if (!isFile(join(root, 'git-bash.exe')) || !isDirectory(join(root, 'usr', 'bin'))) return null;
|
|
109
|
+
const installed = MSYSTEM_DIRECTORIES.filter((name) => isFile(join(root, name, 'bin', 'git.exe')));
|
|
110
|
+
if (installed.length !== 1) return null;
|
|
111
|
+
const [msystemDirectory] = installed;
|
|
112
|
+
return {
|
|
113
|
+
command: join(root, msystemDirectory, 'bin', 'git.exe'),
|
|
114
|
+
root,
|
|
115
|
+
msystem: msystemDirectory.toUpperCase(),
|
|
116
|
+
msysConfig: readMsysConfig(root),
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
function isSystemDirectory(path) {
|
|
121
|
+
const system = join(process.env.SystemRoot || process.env.windir || 'C:\\Windows', 'System32');
|
|
122
|
+
return path.toLowerCase() === system.toLowerCase();
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/** `base` as the launcher would hand it to the real git (setup_environment). */
|
|
126
|
+
export function gitLaunchEnvironment(launch, base) {
|
|
127
|
+
const env = { ...base };
|
|
128
|
+
const set = (name, value) => {
|
|
129
|
+
env[envKey(env, name)] = value;
|
|
130
|
+
};
|
|
131
|
+
set('MSYSTEM', launch.msystem);
|
|
132
|
+
if (envValue(env, 'PLINK_PROTOCOL') === undefined) set('PLINK_PROTOCOL', 'ssh');
|
|
133
|
+
if (envValue(env, 'HOME') === undefined) {
|
|
134
|
+
const homePath = envValue(env, 'HOMEPATH');
|
|
135
|
+
const drive = `${envValue(env, 'HOMEDRIVE') ?? ''}${homePath ?? ''}`;
|
|
136
|
+
if (homePath !== undefined && !isSystemDirectory(drive) && isDirectory(drive)) set('HOME', drive);
|
|
137
|
+
else if (envValue(env, 'USERPROFILE') !== undefined) set('HOME', envValue(env, 'USERPROFILE'));
|
|
138
|
+
}
|
|
139
|
+
// <root>\<msystem>\bin;<root>\usr\bin;<HOME>\bin; ahead of the inherited PATH.
|
|
140
|
+
const prefix =
|
|
141
|
+
`${appendPath(launch.root, `${launch.msystem.toLowerCase()}\\bin`)};` +
|
|
142
|
+
appendPath(launch.root, 'usr\\bin;') +
|
|
143
|
+
appendPath(envValue(env, 'HOME') ?? '', 'bin;');
|
|
144
|
+
set('PATH', `${prefix}${envValue(env, 'PATH') ?? ''}`);
|
|
145
|
+
for (const msys of launch.msysConfig) {
|
|
146
|
+
const current = envValue(env, 'MSYS');
|
|
147
|
+
set('MSYS', current === undefined ? msys : `${msys} ${current}`);
|
|
148
|
+
}
|
|
149
|
+
return env;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
// PATH value -> its launch (or null), resolved once per PATH: a child is
|
|
153
|
+
// started with the git its own environment's PATH names, as bare `git` is.
|
|
154
|
+
const resolved = new Map();
|
|
155
|
+
function gitLaunch(env) {
|
|
156
|
+
const pathValue = envValue(env ?? process.env, 'PATH') ?? '';
|
|
157
|
+
if (!resolved.has(pathValue)) resolved.set(pathValue, resolveGitLaunch({ pathValue }));
|
|
158
|
+
return resolved.get(pathValue);
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
/** The program to spawn for git with `env` (null: this process's environment). */
|
|
162
|
+
export function gitCommand(env = null) {
|
|
163
|
+
return gitLaunch(env)?.command ?? 'git';
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* The environment for a git child: `env` (null: this process's environment)
|
|
168
|
+
* with the launcher's additions when {@link gitCommand} bypasses it. Without a
|
|
169
|
+
* bypass `env` is returned unchanged, null included.
|
|
170
|
+
*/
|
|
171
|
+
export function gitChildEnv(env = null) {
|
|
172
|
+
const launch = gitLaunch(env);
|
|
173
|
+
return launch ? gitLaunchEnvironment(launch, env ?? process.env) : env;
|
|
174
|
+
}
|
|
175
|
+
|
|
176
|
+
/**
|
|
177
|
+
* Whether a spawn of `command` failed because that resolved binary is gone (an
|
|
178
|
+
* uninstalled or moved Git). Its resolutions are dropped then, so the next
|
|
179
|
+
* {@link gitCommand} resolves PATH afresh. ENOENT alone is not enough: a
|
|
180
|
+
* missing cwd reports it too, with the binary still in place.
|
|
181
|
+
*/
|
|
182
|
+
export function forgetMissingGit(command, error) {
|
|
183
|
+
if (error?.code !== 'ENOENT' || command === 'git' || isFile(command)) return false;
|
|
184
|
+
for (const [pathValue, launch] of resolved) if (launch?.command === command) resolved.delete(pathValue);
|
|
185
|
+
return true;
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
/**
|
|
189
|
+
* Starts git as `start(command, childEnv)` and, when that spawn failed only
|
|
190
|
+
* because the resolved binary is gone, once more with a fresh resolution —
|
|
191
|
+
* where bare `git` would have found whatever PATH holds now. `start` rejects
|
|
192
|
+
* with the spawn error, or settles an outcome `spawnError` reads it from.
|
|
193
|
+
*/
|
|
194
|
+
export async function startGit(env, start, spawnError = () => null) {
|
|
195
|
+
const command = gitCommand(env);
|
|
196
|
+
let outcome;
|
|
197
|
+
try {
|
|
198
|
+
outcome = await start(command, gitChildEnv(env));
|
|
199
|
+
} catch (error) {
|
|
200
|
+
if (!forgetMissingGit(command, error)) throw error;
|
|
201
|
+
return start(gitCommand(env), gitChildEnv(env));
|
|
202
|
+
}
|
|
203
|
+
if (!forgetMissingGit(command, spawnError(outcome))) return outcome;
|
|
204
|
+
return start(gitCommand(env), gitChildEnv(env));
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/** {@link startGit} for a synchronous `start` (spawnSync). */
|
|
208
|
+
export function startGitSync(env, start, spawnError = (result) => result?.error) {
|
|
209
|
+
const command = gitCommand(env);
|
|
210
|
+
const outcome = start(command, gitChildEnv(env));
|
|
211
|
+
if (!forgetMissingGit(command, spawnError(outcome))) return outcome;
|
|
212
|
+
return start(gitCommand(env), gitChildEnv(env));
|
|
213
|
+
}
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
// thread, never on the host event loop (run-child.mjs). Each request resolves
|
|
3
3
|
// to { code, stdout, stderr } or an error with the same codes the in-process
|
|
4
4
|
// runner used (ETIMEDOUT, EMAXBUFFER, spawn errors).
|
|
5
|
+
import { startGit } from './git-launch.mjs';
|
|
5
6
|
import { runChild } from './run-child.mjs';
|
|
6
7
|
import { serveWorkerRequests } from './worker-requests.mjs';
|
|
7
8
|
|
|
8
|
-
serveWorkerRequests((request) => runChild({ ...request, command
|
|
9
|
+
serveWorkerRequests((request) => startGit(request.env, (command, env) => runChild({ ...request, command, env })));
|
|
@@ -8,7 +8,8 @@ export interface HandoffFile {
|
|
|
8
8
|
id?: string;
|
|
9
9
|
}
|
|
10
10
|
export function normalizeHandoffFiles(files: unknown): HandoffFile[];
|
|
11
|
-
export function artifactLines(files: unknown, omitted?: number
|
|
11
|
+
export function artifactLines(files: unknown, omitted?: number): string[];
|
|
12
|
+
export function producedFileLines(files: unknown, omitted?: number): string[];
|
|
12
13
|
export interface HandoffRecord {
|
|
13
14
|
id: string;
|
|
14
15
|
attachmentRef: string;
|
|
@@ -31,20 +31,30 @@ export function normalizeHandoffFiles(files) {
|
|
|
31
31
|
}));
|
|
32
32
|
}
|
|
33
33
|
|
|
34
|
-
/**
|
|
35
|
-
*
|
|
36
|
-
|
|
37
|
-
* lists paths only — an id named in text is never trusted. */
|
|
38
|
-
export function artifactLines(files, omitted = 0, { ids = true } = {}) {
|
|
34
|
+
/** An agent completion's compact list of files it produced (name and path
|
|
35
|
+
* only; the Lead forwards or links by path), empty when there are none. */
|
|
36
|
+
export function producedFileLines(files, omitted = 0) {
|
|
39
37
|
const list = normalizeHandoffFiles(files);
|
|
40
38
|
if (!list.length) return [];
|
|
41
|
-
const attachable = (file) => (ids ? ` [attachment:${file.id}]` : ' (attachable: forward it by path)');
|
|
42
39
|
return [
|
|
43
|
-
|
|
40
|
+
'Files produced:',
|
|
41
|
+
...list.map((file) => `- ${oneLine(file.name)} — ${oneLine(file.path)}`),
|
|
42
|
+
...(omitted > 0 ? [`- …and ${omitted} more`] : []),
|
|
43
|
+
];
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
/** The model-facing list of a bot task report's `files`, empty when there are
|
|
47
|
+
* none; the row also records the stored files as its attachments, so their
|
|
48
|
+
* ids can be forwarded. */
|
|
49
|
+
export function artifactLines(files, omitted = 0) {
|
|
50
|
+
const list = normalizeHandoffFiles(files);
|
|
51
|
+
if (!list.length) return [];
|
|
52
|
+
return [
|
|
53
|
+
'Files from this turn (forward one with attachments: [id or path]; link a path to show it):',
|
|
44
54
|
...list.map(
|
|
45
55
|
(file) =>
|
|
46
56
|
`- ${oneLine(file.name)} (${oneLine(file.mimeType)}, ${sizeLabel(file.size)}) — ${oneLine(file.path)}${
|
|
47
|
-
file.id ?
|
|
57
|
+
file.id ? ` [attachment:${file.id}]` : ' (too large or unsupported to attach; link the path)'
|
|
48
58
|
}`
|
|
49
59
|
),
|
|
50
60
|
...(omitted > 0 ? [`- …and ${omitted} more file(s)`] : []),
|
|
@@ -44,15 +44,37 @@ function hasModelVisibleConversation(session) {
|
|
|
44
44
|
});
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
-
//
|
|
48
|
-
//
|
|
49
|
-
//
|
|
50
|
-
|
|
47
|
+
// A session's last successful cache-warm use (a read with no write),
|
|
48
|
+
// registered by the warmer (cache-warm.mjs, from its durable touch store):
|
|
49
|
+
// `{ at, provider, model, accountId }` — when, and the route and account whose
|
|
50
|
+
// cached prefix it read — or a bare epoch-ms time; null/0 when none.
|
|
51
|
+
let lastCacheWarmUse = () => null;
|
|
51
52
|
|
|
52
53
|
/** Register the source of a session's last successful cache-warm use
|
|
53
|
-
* (`(sessionId) => epoch ms |
|
|
54
|
+
* (`(sessionId) => { at, provider, model, accountId } | epoch ms | null`);
|
|
55
|
+
* null restores none. */
|
|
54
56
|
export function setCacheWarmUseSource(source) {
|
|
55
|
-
lastCacheWarmUse = typeof source === 'function' ? source : () =>
|
|
57
|
+
lastCacheWarmUse = typeof source === 'function' ? source : () => null;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/** When a successful cache warm last used the session's prompt cache (epoch
|
|
61
|
+
* ms), or 0: the warm read and refreshed the cached prefix without moving
|
|
62
|
+
* any of the session's own timestamps. */
|
|
63
|
+
export function lastCacheWarmUseAt(sessionId) {
|
|
64
|
+
const use = sessionId ? lastCacheWarmUse(sessionId) : null;
|
|
65
|
+
return timestampMs(use && typeof use === 'object' ? use.at : use);
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
/** When a successful cache warm last used the prefix a request on `provider`
|
|
69
|
+
* / `model` / `accountId` reads (epoch ms), or 0: a warm on another route or
|
|
70
|
+
* account refreshed an entry this request cannot read, and a use without a
|
|
71
|
+
* recorded identity matches nothing. */
|
|
72
|
+
export function cacheWarmUseFor(sessionId, { provider, model, accountId = '' } = {}) {
|
|
73
|
+
const use = sessionId ? lastCacheWarmUse(sessionId) : null;
|
|
74
|
+
if (!use || typeof use !== 'object' || !use.provider) return 0;
|
|
75
|
+
const matches =
|
|
76
|
+
use.provider === provider && use.model === model && String(use.accountId || '') === String(accountId || '');
|
|
77
|
+
return matches ? timestampMs(use.at) : 0;
|
|
56
78
|
}
|
|
57
79
|
|
|
58
80
|
/**
|
|
@@ -65,7 +87,7 @@ export function setCacheWarmUseSource(source) {
|
|
|
65
87
|
export function sessionActivityTimestamp(session, fallback = 0) {
|
|
66
88
|
if (!hasModelVisibleConversation(session)) return 0;
|
|
67
89
|
const own = timestampMs(session?.lastUsedAt) || timestampMs(session?.updatedAt) || timestampMs(fallback);
|
|
68
|
-
return Math.max(own,
|
|
90
|
+
return Math.max(own, lastCacheWarmUseAt(session?.id));
|
|
69
91
|
}
|
|
70
92
|
|
|
71
93
|
// A zero is often an unavailable/stale meter field, not an authoritative
|
|
@@ -100,7 +100,11 @@ export function priceUsage(args) {
|
|
|
100
100
|
// A provider-billed figure for a media request (e.g. xAI cost_in_usd_ticks)
|
|
101
101
|
// is the price, with or without a catalog row.
|
|
102
102
|
const media = args.media || null;
|
|
103
|
-
if (
|
|
103
|
+
if (
|
|
104
|
+
typeof media?.reportedCostUsd === 'number' &&
|
|
105
|
+
Number.isFinite(media.reportedCostUsd) &&
|
|
106
|
+
media.reportedCostUsd >= 0
|
|
107
|
+
)
|
|
104
108
|
return {
|
|
105
109
|
input,
|
|
106
110
|
costUsd: Number(media.reportedCostUsd.toFixed(6)),
|
|
@@ -129,7 +133,12 @@ export function priceUsage(args) {
|
|
|
129
133
|
// premium request needs the model's published Fast/Priority rates.
|
|
130
134
|
const anthropicFast = premium && sentTier === 'fast' && supportsAnthropicFastMode(identity.pricingModel);
|
|
131
135
|
const premiumPricing = sentTier === 'ultrafast' ? meta.ultrafastPricing : meta.fastPricing;
|
|
132
|
-
|
|
136
|
+
// A request the server reports as served on Flex (Vertex Flex PayGo can be
|
|
137
|
+
// served by Provisioned Throughput first) bills the catalog's flex columns.
|
|
138
|
+
const flex = args.serviceTier === 'flex';
|
|
139
|
+
let rateMeta = meta;
|
|
140
|
+
if (flex) rateMeta = meta.flexPricing || {};
|
|
141
|
+
else if (premium && !anthropicFast) rateMeta = premiumPricing || {};
|
|
133
142
|
if (args.historicalAggregate && rateMeta.pricingTiers?.some((tier) => promptTokens > tier.aboveInputTokens)) {
|
|
134
143
|
// A daily sum cannot establish which individual requests crossed a
|
|
135
144
|
// context boundary. Do not price the whole day as one huge prompt.
|