mixdog 1.2.3 → 1.2.5
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 +1 -1
- package/scripts/gate-local.mjs +6 -4
- package/scripts/lib/gate-scheduler.mjs +29 -11
- package/scripts/mobile-release.mjs +5 -4
- package/scripts/probe-provider-catalog.mjs +31 -0
- package/scripts/provider-pingpong-live.mjs +128 -38
- package/scripts/session-sweep.mjs +5 -25
- package/src/agents/maintainer/AGENT.md +1 -1
- package/src/agents/maintainer/agent.json +1 -1
- package/src/agents/reviewer/AGENT.md +2 -4
- package/src/agents/security/AGENT.md +1 -2
- package/src/agents/writer/AGENT.md +2 -3
- package/src/defaults/shipped-history.json +7 -1
- package/src/defaults/skills/image/SKILL.md +21 -23
- package/src/lib/keychain-cjs.cjs +13 -11
- package/src/output-styles/common.md +2 -1
- package/src/rules/agent/AGENT.md +7 -5
- package/src/rules/lead/LEAD.md +13 -13
- package/src/rules/shared/45-destructive.md +4 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +1 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +28 -7
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -11
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +101 -23
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-api-key-fetch.mjs +36 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-error-contract.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +26 -44
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +2 -5
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +4 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +41 -12
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth.mjs +13 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +81 -10
- package/src/runtime/agent/orchestrator/providers/antigravity-retry-policy.mjs +109 -5
- package/src/runtime/agent/orchestrator/providers/antigravity-stream.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +107 -37
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/cursor-auth.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-native-context.mjs +48 -0
- package/src/runtime/agent/orchestrator/providers/cursor-wire-exec.mjs +144 -34
- package/src/runtime/agent/orchestrator/providers/cursor-wire-protobuf.mjs +28 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-request.mjs +8 -4
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-bridge.mjs +41 -11
- package/src/runtime/agent/orchestrator/providers/cursor-wire-stream-messages.mjs +67 -5
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +14 -4
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +14 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +9 -6
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +7 -2
- package/src/runtime/agent/orchestrator/providers/effort-configuration.mjs +26 -4
- package/src/runtime/agent/orchestrator/providers/gemini-cache.mjs +12 -6
- package/src/runtime/agent/orchestrator/providers/gemini-error-contract.mjs +14 -6
- package/src/runtime/agent/orchestrator/providers/gemini-request-body.mjs +4 -4
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/gemini-rest-stream/watchdogs.mjs +16 -5
- package/src/runtime/agent/orchestrator/providers/gemini-retry-policy.mjs +6 -1
- package/src/runtime/agent/orchestrator/providers/gemini-schema.mjs +22 -10
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +33 -7
- package/src/runtime/agent/orchestrator/providers/gemini.mjs +11 -2
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/lib/claude-bridge-schema.mjs +9 -5
- package/src/runtime/agent/orchestrator/providers/lib/request-compression.mjs +86 -0
- package/src/runtime/agent/orchestrator/providers/lib/wire-pairing.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -5
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +60 -16
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +11 -13
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-send.mjs +30 -19
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +5 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +42 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-reasoning-field.mjs +13 -9
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +1 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-parity.fixtures.mjs +18 -7
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +36 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +51 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat.mjs +11 -1
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-request.mjs +64 -52
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/terminal-frames.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-delta.mjs +1 -4
- package/src/runtime/agent/orchestrator/providers/openai-ws-response-state/tool-calls.mjs +0 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +7 -6
- package/src/runtime/agent/orchestrator/providers/opencode-go-gemini.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/openrouter.mjs +1 -2
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +5 -4
- package/src/runtime/agent/orchestrator/providers/registry.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/retry-classification.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +11 -4
- package/src/runtime/agent/orchestrator/providers/wire-route.mjs +14 -4
- package/src/runtime/agent/orchestrator/providers/xai-tool-search.fixtures.mjs +15 -3
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +6 -2
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +8 -6
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +30 -2
- package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +3 -2
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -3
- package/src/runtime/agent/orchestrator/runtime-core/skill-tool-loading.mjs +3 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge-contract.mjs +6 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +10 -10
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +3 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +46 -8
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +10 -8
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -2
- package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +24 -0
- package/src/runtime/agent/orchestrator/session/cache/tool-result-reuse.mjs +10 -2
- package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -3
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +3 -11
- package/src/runtime/agent/orchestrator/session/catalog-db/worker.mjs +6 -22
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +28 -0
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/eager-dispatch/admission.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/historical-session-closure.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/loop/assistant-commit.mjs +2 -5
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +2 -4
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +0 -27
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/segments.mjs +4 -10
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +2 -9
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/loop/request-boundary.mjs +1 -4
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +76 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/loop/step-auto-effort.mjs +8 -9
- package/src/runtime/agent/orchestrator/session/loop/tool-classify.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +15 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +1 -4
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +3 -4
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +33 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-support.mjs +0 -4
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +21 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +38 -13
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +33 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +19 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +57 -13
- package/src/runtime/agent/orchestrator/session/manager/failed-turn-rewind.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +6 -120
- package/src/runtime/agent/orchestrator/session/manager/pending-persist-queue.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +29 -8
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +42 -49
- package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +50 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +32 -14
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +17 -33
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +29 -13
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +45 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +2 -9
- package/src/runtime/agent/orchestrator/session/send-instrumentation.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/side-question.mjs +12 -7
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +5 -12
- package/src/runtime/agent/orchestrator/session/store/lifecycle-read.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/listing.mjs +2 -6
- package/src/runtime/agent/orchestrator/session/store/live-cache-eviction.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +46 -37
- package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/load-session.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +5 -11
- package/src/runtime/agent/orchestrator/session/store/session-paths.mjs +59 -0
- package/src/runtime/agent/orchestrator/session/store/summary-cache.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-finish.mjs +27 -32
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +0 -8
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +6 -18
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +33 -106
- package/src/runtime/agent/orchestrator/session/store/write-admission.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-agent-worker-pool.mjs +5 -8
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +160 -212
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +50 -116
- package/src/runtime/agent/orchestrator/session/store-summary-locations.mjs +3 -29
- package/src/runtime/agent/orchestrator/session/store-summary-reader-catalog-fixture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +7 -8
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +9 -20
- package/src/runtime/agent/orchestrator/session/store.mjs +3 -16
- package/src/runtime/agent/orchestrator/session/tool-batch/execute-call.mjs +11 -12
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +37 -13
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +15 -4
- package/src/runtime/agent/orchestrator/session/tool-schema-rejection.mjs +4 -2
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +72 -15
- package/src/runtime/agent/orchestrator/session/turn-failure.mjs +45 -0
- package/src/runtime/agent/orchestrator/stall-policy.mjs +50 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +5 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/inline-hoist.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/external-tool-adapters.mjs +204 -10
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +160 -39
- package/src/runtime/agent/orchestrator/tools/builtin/git-partial-stage.mjs +7 -5
- package/src/runtime/agent/orchestrator/tools/builtin/grep-formatting.mjs +14 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-context-expander.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-output.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/builtin/lib/grep-path-fanout.mjs +48 -44
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +10 -3
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +200 -17
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-task-output.mjs +5 -4
- package/src/runtime/agent/orchestrator/tools/builtin/read-formatting.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +20 -0
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +101 -2
- package/src/runtime/agent/orchestrator/tools/code-graph-prewarm-worker.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +67 -0
- package/src/runtime/agent/orchestrator/tools/lib/process-table-fixture.mjs +50 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +303 -63
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +108 -18
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +77 -11
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +81 -5
- package/src/runtime/attachments/store.d.mts +9 -0
- package/src/runtime/attachments/store.mjs +80 -9
- package/src/runtime/browser-bridge/browser-action-contract.d.mts +0 -1
- package/src/runtime/browser-bridge/browser-action-contract.mjs +0 -2
- package/src/runtime/computer-bridge/action-schema.mjs +178 -178
- package/src/runtime/computer-bridge/linux-readiness.d.mts +0 -2
- package/src/runtime/computer-bridge/linux-readiness.mjs +0 -16
- package/src/runtime/effort-judge/judge-client.mjs +21 -4
- package/src/runtime/effort-judge/judge-worker.mjs +4 -1
- package/src/runtime/github/tool.mjs +118 -17
- package/src/runtime/media/adapters/codex-image.mjs +140 -21
- package/src/runtime/media/catalog.mjs +4 -4
- package/src/runtime/media/chatgpt-usage.mjs +55 -0
- package/src/runtime/media/defaults.mjs +37 -0
- package/src/runtime/media/jobs.mjs +12 -2
- package/src/runtime/media/lanes.mjs +12 -0
- package/src/runtime/media/tool-defs.mjs +15 -4
- package/src/runtime/media/tool.mjs +41 -12
- package/src/runtime/media/upstream-error.mjs +72 -6
- package/src/runtime/memory/lib/ingest/transcript-rows.mjs +1 -0
- package/src/runtime/memory/lib/pg/process.mjs +5 -7
- package/src/runtime/memory/lib/pg/supervisor.mjs +4 -1
- package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/html-browser.mjs +18 -8
- package/src/runtime/office/authoring/pdf-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/pptx-html-measure.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
- package/src/runtime/office/core/office-write-ledger.mjs +1 -5
- package/src/runtime/office/index.mjs +2 -3
- package/src/runtime/office/pdf/pdf-analysis.mjs +0 -68
- package/src/runtime/session-search/session-search-ingest.mjs +1 -1
- package/src/runtime/shared/agent-reap-state.mjs +13 -0
- package/src/runtime/shared/atomic-file.d.mts +1 -1
- package/src/runtime/shared/background-tasks.mjs +6 -1
- package/src/runtime/shared/bounded-line-diff.mjs +11 -2
- package/src/runtime/shared/browser-launch.mjs +15 -0
- package/src/runtime/shared/err-text.mjs +42 -4
- package/src/runtime/shared/file-lock.mjs +6 -5
- package/src/runtime/shared/llm/anthropic-betas.mjs +1 -2
- package/src/runtime/shared/llm/provider-model-identities.mjs +1 -0
- package/src/runtime/shared/model-route-chain.d.mts +8 -0
- package/src/runtime/shared/model-route-chain.mjs +48 -0
- package/src/runtime/shared/model-route-fallback.mjs +22 -0
- package/src/runtime/shared/pid-liveness.mjs +12 -0
- package/src/runtime/shared/provider-api-key.mjs +6 -0
- package/src/runtime/shared/provider-timeout-phase.mjs +17 -0
- package/src/runtime/shared/quiet-progress.d.mts +35 -0
- package/src/runtime/shared/quiet-progress.mjs +101 -0
- package/src/runtime/shared/quota-resume-store.mjs +32 -1
- package/src/runtime/shared/read-row-numbers.mjs +44 -0
- package/src/runtime/shared/remote-intent.mjs +2 -42
- package/src/runtime/shared/slow-span.mjs +8 -1
- package/src/runtime/shared/statusline/statusline-segments.mjs +24 -2
- package/src/runtime/shared/tool-card-model/card-header.mjs +2 -1
- package/src/runtime/shared/tool-output-budget.mjs +2 -0
- package/src/runtime/shared/tool-result-summary.mjs +16 -2
- package/src/runtime/shared/tool-status.mjs +3 -2
- package/src/runtime/shared/tool-surface.mjs +2 -3
- package/src/runtime/shared/tool-work-units.mjs +22 -15
- package/src/runtime/shared/transcript-metadata.mjs +49 -1
- package/src/runtime/shared/transcript-turn-keys.mjs +33 -0
- package/src/runtime/shared/transcript-writer/transcript-file.mjs +10 -1
- package/src/runtime/shared/transcript-writer.mjs +14 -4
- package/src/runtime/shared/turn-changes.mjs +2 -1
- package/src/runtime/shared/turn-snapshot.mjs +11 -3
- package/src/runtime/shared/worktrees/activity-gate.mjs +175 -0
- package/src/runtime/shared/worktrees/branch-management.mjs +179 -0
- package/src/runtime/shared/worktrees/carry.mjs +6 -4
- package/src/runtime/shared/worktrees/contract.mjs +27 -1
- package/src/runtime/shared/worktrees/dependencies.mjs +456 -0
- package/src/runtime/shared/worktrees/file-recovery.mjs +29 -13
- package/src/runtime/shared/worktrees/git-head.mjs +22 -13
- package/src/runtime/shared/worktrees/include.mjs +125 -7
- package/src/runtime/shared/worktrees/lock.mjs +1 -1
- package/src/runtime/shared/worktrees/maintenance.mjs +20 -2
- package/src/runtime/shared/worktrees/manager.mjs +378 -32
- package/src/runtime/shared/worktrees/owner.mjs +2 -1
- package/src/runtime/shared/worktrees/preparation-report.mjs +79 -0
- package/src/runtime/shared/worktrees/setup-commands.mjs +232 -0
- package/src/runtime/shared/worktrees/workspace-visibility.mjs +17 -0
- package/src/runtime/terminal-bridge/client.mjs +14 -10
- package/src/session-runtime/boot/apis.mjs +7 -1
- package/src/session-runtime/boot/config.mjs +2 -0
- package/src/session-runtime/boot/facade.mjs +3 -0
- package/src/session-runtime/boot/session.mjs +3 -2
- package/src/session-runtime/boot/tools.mjs +3 -0
- package/src/session-runtime/conversation-import/service.mjs +1 -1
- package/src/session-runtime/goal-facade-api.mjs +2 -2
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +44 -18
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +4 -1
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +22 -8
- package/src/session-runtime/internal-tool-executor.mjs +2 -0
- package/src/session-runtime/lifecycle/cold-heir.mjs +0 -1
- package/src/session-runtime/lifecycle/session-catalog.mjs +14 -16
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +18 -53
- package/src/session-runtime/lifecycle/session-switch.mjs +1 -1
- package/src/session-runtime/lifecycle/shared.mjs +5 -6
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -5
- package/src/session-runtime/lifecycle/teardown.mjs +7 -16
- package/src/session-runtime/media-api.mjs +8 -0
- package/src/session-runtime/model-route/route-ownership.mjs +60 -0
- package/src/session-runtime/model-route/route-persist.mjs +3 -2
- package/src/session-runtime/model-route/set-route.mjs +114 -34
- package/src/session-runtime/model-route/web-search-route.mjs +7 -2
- package/src/session-runtime/model-route-api.mjs +4 -2
- package/src/session-runtime/native-web-search/routes.mjs +37 -24
- package/src/session-runtime/native-web-search.mjs +9 -8
- package/src/session-runtime/provider-auth/setup.mjs +4 -0
- package/src/session-runtime/provider-models/catalog-load.mjs +9 -0
- package/src/session-runtime/provider-models/web-search-catalog.mjs +23 -3
- package/src/session-runtime/provider-models.mjs +1 -0
- package/src/session-runtime/provider-usage.mjs +4 -0
- package/src/session-runtime/route-resolution.mjs +3 -1
- package/src/session-runtime/runtime-core.mjs +4 -0
- package/src/session-runtime/runtime-facade.mjs +6 -0
- package/src/session-runtime/services/agent-task-status.mjs +2 -0
- package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +0 -3
- package/src/session-runtime/services/agent-tool/close-flow.mjs +6 -7
- package/src/session-runtime/services/agent-tool/execute-send.mjs +2 -2
- package/src/session-runtime/services/agent-tool/execute-spawn.mjs +36 -3
- package/src/session-runtime/services/agent-tool/execute.mjs +9 -1
- package/src/session-runtime/services/agent-tool/helpers.mjs +30 -7
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +7 -2
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +6 -3
- package/src/session-runtime/services/agent-tool/lead-worker-index/lead-rows.mjs +3 -4
- package/src/session-runtime/services/agent-tool/lead-worker-index/reap-timers.mjs +9 -3
- package/src/session-runtime/services/agent-tool/lead-worker-index/row-settlement.mjs +7 -18
- package/src/session-runtime/services/agent-tool/lead-worker-index.mjs +9 -6
- package/src/session-runtime/services/agent-tool/model-select.mjs +82 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +24 -6
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +3 -1
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +19 -5
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +5 -4
- package/src/session-runtime/services/agent-tool/spawn-flow.mjs +2 -1
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +3 -0
- package/src/session-runtime/services/agent-tool/tag-registry/tag-lookup.mjs +1 -3
- package/src/session-runtime/services/agent-tool/tag-registry/tag-refresh.mjs +1 -3
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +3 -9
- package/src/session-runtime/services/agent-tool/terminal-reaper/scan-admission.mjs +8 -41
- package/src/session-runtime/services/agent-tool/terminal-reaper/stale-rows.mjs +3 -3
- package/src/session-runtime/services/agent-tool/terminal-reaper.mjs +6 -23
- package/src/session-runtime/services/agent-tool/terminal-trace.mjs +0 -1
- package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +32 -20
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +5 -2
- package/src/session-runtime/services/agent-tool/worker-index.mjs +28 -8
- package/src/session-runtime/services/agent-tool.mjs +4 -0
- package/src/session-runtime/services/agent-watchdog-registry.mjs +2 -0
- package/src/session-runtime/services/provider-admin.mjs +77 -0
- package/src/session-runtime/session-create/session-options.mjs +7 -5
- package/src/session-runtime/session-create/session-start-hook.mjs +2 -1
- package/src/session-runtime/session-transcript.mjs +4 -5
- package/src/session-runtime/session-turn-api.mjs +3 -9
- package/src/session-runtime/settings-builtin-tools-api.mjs +9 -6
- package/src/session-runtime/setup-tool/executor.mjs +23 -5
- package/src/session-runtime/setup-tool/extended-actions.mjs +6 -6
- package/src/session-runtime/setup-tool/settings-contract.mjs +7 -2
- package/src/session-runtime/setup-tool/tool-defs.mjs +13 -1
- package/src/session-runtime/tool-policy-refresh.mjs +83 -32
- package/src/session-runtime/turn/agent-ops.mjs +49 -2
- package/src/session-runtime/turn/side-question-ops.mjs +1 -4
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +2 -0
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +4 -0
- package/src/session-runtime/turn/turn-run/turn-settle.mjs +8 -2
- package/src/session-runtime/turn/turn-run.mjs +1 -36
- package/src/session-runtime/usage-stats-api.mjs +4 -1
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +16 -1
- package/src/session-runtime/workspace/admission-gate.mjs +44 -15
- package/src/session-runtime/workspace/project-branches.mjs +28 -36
- package/src/session-runtime/workspace/transition-steps.mjs +96 -95
- package/src/session-runtime/workspace/transitions.mjs +248 -68
- package/src/standalone/channel-transport.mjs +3 -4
- package/src/standalone/daemon-desktop-runtime.mjs +32 -1
- package/src/standalone/daemon-pg-stop.mjs +1 -3
- package/src/standalone/daemon-session-control.mjs +88 -0
- package/src/standalone/daemon-stored-session-views.mjs +23 -3
- package/src/standalone/daemon.mjs +2 -0
- package/src/standalone/desktop-service-registry.mjs +32 -5
- package/src/standalone/local-session-runtime.mjs +11 -12
- package/src/standalone/session-protocol.mjs +7 -0
- package/src/standalone/session-runtime-inline-host.mjs +2 -0
- package/src/standalone/session-service/agent-tree/agent-cancel.mjs +91 -49
- package/src/standalone/session-service/agent-tree/agent-child.mjs +19 -1
- package/src/standalone/session-service/agent-tree/agent-registry.mjs +25 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +9 -1
- package/src/standalone/session-service/agent-tree.mjs +28 -2
- package/src/standalone/session-service/entries/session-loads.mjs +16 -5
- package/src/standalone/session-service/entries.mjs +1 -0
- package/src/standalone/session-service/projection/transcript-window.mjs +39 -0
- package/src/standalone/session-service/quota-resume.mjs +28 -13
- package/src/standalone/session-service/session-calls/session-turns.mjs +17 -6
- package/src/standalone/session-service/session-calls/session-views.mjs +6 -0
- package/src/standalone/session-tool-output.mjs +82 -0
- package/src/tui/app/app-view.jsx +2 -1
- package/src/tui/app/provider-setup/provider-items.mjs +8 -0
- package/src/tui/app/provider-setup-picker.mjs +15 -3
- package/src/tui/app/slash-commands.mjs +6 -0
- package/src/tui/app/slash-dispatch/session-commands.mjs +49 -0
- package/src/tui/components/Spinner.jsx +4 -0
- package/src/tui/components/SpinnerByline.jsx +21 -2
- package/src/tui/components/status-line/local-line.mjs +10 -2
- package/src/tui/dist/index.mjs +529 -270
- package/src/tui/session/active-tool-summary.mjs +1 -1
- package/src/tui/session/context-state.mjs +0 -3
- package/src/tui/session/goal-continuation/continuation-queue.mjs +2 -3
- package/src/tui/session/goal-continuation/deadline-delivery.mjs +4 -2
- package/src/tui/session/goal-continuation/session-boundary.mjs +21 -0
- package/src/tui/session/quota-resume.mjs +140 -61
- package/src/tui/session/session-api/commands.mjs +4 -10
- package/src/tui/session/session-api/controls.mjs +12 -0
- package/src/tui/session/session-api/lifecycle/dispose.mjs +2 -9
- package/src/tui/session/session-api/lifecycle/resume.mjs +2 -7
- package/src/tui/session/session-api/lifecycle.mjs +13 -11
- package/src/tui/session/session-api/media.mjs +2 -0
- package/src/tui/session/session-api/routes.mjs +81 -57
- package/src/tui/session/session-api/settings.mjs +3 -3
- package/src/tui/session/session-api/worktree.mjs +3 -2
- package/src/tui/session/session-flow/auto-clear.mjs +1 -3
- package/src/tui/session/session-flow/drain.mjs +6 -4
- package/src/tui/session/session-flow/queue/entry-shape.mjs +2 -0
- package/src/tui/session/session-flow/queue/take-entries.mjs +2 -1
- package/src/tui/session/session-flow/queue.mjs +1 -1
- package/src/tui/session/tool-approval.mjs +17 -8
- package/src/tui/session/transcript-store/streaming-tail.mjs +1 -1
- package/src/tui/session/tui-steering-persist.mjs +3 -5
- package/src/tui/session/turn-quiet.mjs +53 -0
- package/src/tui/session/turn-stream.mjs +5 -1
- package/src/tui/session/turn.mjs +38 -31
- package/src/tui/session/worktree-setup-notice.mjs +38 -0
- package/src/tui/spinner-meta.mjs +10 -0
- package/src/tui/spinner-verbs.mjs +3 -0
- package/src/ui/statusline.mjs +13 -3
- package/src/ui/streaming-markdown-heal.mjs +70 -18
- package/src/runtime/agent/orchestrator/providers/model-pricing-rates.mjs +0 -1
- package/src/runtime/agent/orchestrator/session/manager/foreign-pending-messages.mjs +0 -346
- package/src/runtime/agent/orchestrator/session/manager/session-owner-liveness.mjs +0 -117
- package/src/runtime/agent/orchestrator/session/store/paths-heartbeat.mjs +0 -302
- package/src/session-runtime/services/agent-tool/terminal-reaper/reap-timers.mjs +0 -142
- package/src/session-runtime/turn/share-ops.mjs +0 -77
- package/src/tui/session/cross-surface-share.mjs +0 -406
- package/src/tui/session/live-share/delta.mjs +0 -153
- package/src/tui/session/live-share/mirror.mjs +0 -106
- package/src/tui/session/live-share/owner.mjs +0 -254
- package/src/tui/session/live-share/retry.mjs +0 -54
- package/src/tui/session/live-share/viewer/frame-router.mjs +0 -32
- package/src/tui/session/live-share/viewer/pipe-client.mjs +0 -108
- package/src/tui/session/live-share/viewer/submit-acks.mjs +0 -65
- package/src/tui/session/live-share/viewer/sync-waiters.mjs +0 -53
- package/src/tui/session/live-share/viewer.mjs +0 -99
- package/src/tui/session/live-share/wire.mjs +0 -44
- package/src/tui/session/live-share.mjs +0 -154
- package/src/tui/session/shared-dir-watch.mjs +0 -69
|
@@ -12,27 +12,25 @@ dependencies:
|
|
|
12
12
|
|
|
13
13
|
# Image generation and editing (media tool · Media Studio)
|
|
14
14
|
|
|
15
|
-
Use `media` for still-image generation and editing
|
|
16
|
-
the first image-generation or editing call.
|
|
15
|
+
Use `media` for still-image generation and editing; read this guide before the first call.
|
|
17
16
|
|
|
18
|
-
This file owns the judgement around one tool for still images: how a picture is asked for, checked, and saved.
|
|
17
|
+
This file owns the judgement around one tool for still images: how a picture is asked for, checked, and saved. Any deliverable that needs a picture loads it and keeps only its own placement rules. The lane catalog (providers, models, controls, sign-in state) lives in the runtime and is read with `list`, so this file stays true when providers change.
|
|
19
18
|
|
|
20
19
|
## 1. Which kind of job
|
|
21
20
|
**Hard rule — generate or edit, decided first**:
|
|
22
|
-
- *Generate* — the user wants a new image (product shot, hero, social card, illustration, icon, texture, concept) or a deliverable needs one. Images
|
|
21
|
+
- *Generate* — the user wants a new image (product shot, hero, social card, illustration, icon, texture, concept) or a deliverable needs one. Images attached only as style, mood, or composition guidance still make this a generate with references.
|
|
23
22
|
- *Edit* — the user wants an existing image kept and part of it changed: background swap, object removal, lighting or weather, text replacement, style transfer, compositing, cutout. The source image goes in `references` as the edit target; §3 edit brief applies.
|
|
24
|
-
**Hard rule — not this tool**:
|
|
23
|
+
**Hard rule — not this tool**: a repository's own SVG, icon, or logo system; simple shapes, wireframes, and diagrams better drawn in SVG, HTML/CSS, or a chart library; charts, tables, and the user's own photographs.
|
|
25
24
|
**Hard rule — no signed-in lane, no picture**: when `list` (or a failed `generate`) reports no image lane, continue without and say so; never substitute a placeholder, a stock-photo URL, or an emoji.
|
|
26
|
-
**Default — one generation per job, one corrected retry**: a result that misses the brief is retried once with a single targeted change (§2 step 3); a second miss is reported as "not achieved"
|
|
27
|
-
|
|
25
|
+
**Default — one generation per job, one corrected retry**: a result that misses the brief is retried once with a single targeted change (§2 step 3); a second miss is reported as "not achieved".
|
|
28
26
|
## 2. Call order
|
|
29
|
-
1. `media action:'list' kind:'image'` once per session before the first generate: signed-in lanes, their models, and `remembered` — the lane/model a generate runs on when none is passed (
|
|
30
|
-
2. `media action:'generate' kind:'image', prompt, path, + controls` — **lane and model are omitted by default**
|
|
31
|
-
3. **Hard rule — look before using**: open the file with `read` and check subject, style, composition, the exclusions, any in-image text, and — for an edit — every item in the preserve list. A miss is fixed by changing one variable in the prompt and restating every invariant; never rewrite the whole prompt
|
|
27
|
+
1. `media action:'list' kind:'image'` once per session before the first generate: signed-in lanes, their models, and `remembered` — the lane/model a generate runs on when none is passed (Studio selection, else last generation of this kind). Add `model:` for that model's controls (`aspectRatio` / `size`, `resolution`, `quality`, `background`, `maxReferences`).
|
|
28
|
+
2. `media action:'generate' kind:'image', prompt, path, + controls` — **lane and model are omitted by default** (the user's remembered choice, else the signed-in ChatGPT lane); controls only from that model's list — one listing none gets none. **Hard rule — a named source is passed**: GPT / ChatGPT / Codex / OpenAI → the OpenAI lane; Grok, Gemini, Antigravity → theirs, from `list`; if it is not signed in, say so rather than swap. Otherwise pass `lane`/`model` only when the job needs a capability the model lacks (reference count, exact text, a listed resolution). The result reports lane, model, `laneSource` (`requested` / `remembered` / `first`), and options used.
|
|
29
|
+
3. **Hard rule — look before using**: open the file with `read` and check subject, style, composition, the exclusions, any in-image text, and — for an edit — every item in the preserve list. A miss is fixed by changing one variable in the prompt and restating every invariant; never rewrite the whole prompt.
|
|
32
30
|
4. The result is also a Studio asset (`assetId`); the file at `path` is the copy the work uses.
|
|
33
31
|
|
|
34
32
|
## 3. Prompt form
|
|
35
|
-
**Hard rule — labeled lines, in priority order**: the model reads order as priority; scene first by default, subject first when identity or product fidelity dominates. Use only the lines that change pixels
|
|
33
|
+
**Hard rule — labeled lines, in priority order**: the model reads order as priority; scene first by default, subject first when identity or product fidelity dominates. Use only the lines that change pixels. Never wrap the prompt in JSON.
|
|
36
34
|
```
|
|
37
35
|
Use: photorealistic | product-mockup | ui-mockup | infographic | logo-brand | illustration | stylized-concept | historical-scene (edit: text-replace | identity-preserve | object-edit | lighting-weather | cutout | style-transfer | compositing | sketch-to-render)
|
|
38
36
|
Asset: where it will be used — hero, OG card, figure, avatar, sprite, texture, cover
|
|
@@ -45,8 +43,8 @@ Text: "exact words" · script · font style · size · placement (onl
|
|
|
45
43
|
Keep: invariants that must not change (edits; see the edit brief)
|
|
46
44
|
Avoid: no logos, no watermarks; plus no text / no faces when the use calls for it
|
|
47
45
|
```
|
|
48
|
-
**Default — specificity policy**: a detailed user prompt is normalized into this form and nothing is added; a generic one gets composition, intended use, and scene concreteness — never extra characters, props,
|
|
49
|
-
**Default — exclusions follow the use**: a field for copy (hero, cover, OG, background) excludes text, logos, watermarks, and faces unless asked; an illustration or a scene with people excludes only logos and watermarks; a portrait keeps its face.
|
|
46
|
+
**Default — specificity policy**: a detailed user prompt is normalized into this form and nothing is added; a generic one gets composition, intended use, and scene concreteness — never extra characters, props, brands, palettes, story beats, or placement the layout does not call for.
|
|
47
|
+
**Default — exclusions follow the use**: a field for copy (hero, cover, OG, background) excludes text, logos, watermarks, and faces unless asked; an illustration or a scene with people excludes only logos and watermarks; a portrait keeps its face.
|
|
50
48
|
**Hard rule — anti-patterns**:
|
|
51
49
|
| Pattern | Why it fails | Instead |
|
|
52
50
|
|---|---|---|
|
|
@@ -62,13 +60,13 @@ Change only: the specific modification
|
|
|
62
60
|
Preserve exactly: named locks — face structure, pose, product silhouette, logo geometry, text spelling, framing, perspective, palette, lighting, shadows
|
|
63
61
|
Do not add or remove: protected elements
|
|
64
62
|
```
|
|
65
|
-
"Keep everything else the same" alone is weak: name the fragile properties, and repeat the same lock list on every retry. A removal is written as what replaces it ("show the continuous desk grain where the note was,
|
|
63
|
+
"Keep everything else the same" alone is weak: name the fragile properties, and repeat the same lock list on every retry. A removal is written as what replaces it ("show the continuous desk grain where the note was, no residue or outline"), never as "remove X" alone. A source carrying drawn markup (arrows, boxes, notes) is sent clean, with the markup translated into instructions — the model reproduces marks it sees.
|
|
66
64
|
|
|
67
65
|
## 4. Text inside the image
|
|
68
66
|
**Default — text only when wanted**: a field for copy gets no text; the deliverable or the page sets its own type over it.
|
|
69
67
|
**Hard rule — when text is wanted, it is exact**: the words in quotes, the language and script, the font style, the approximate size, the placement, and "once, with no other readable text". Uncommon words are spelled letter by letter. Korean: write the prompt in English and quote only the Hangul string; start with short label-length strings.
|
|
70
68
|
**Hard rule — copy that must be exact is composited, not generated**: packaging, UI, legal, or brand copy is generated as an empty reserved area (`no text` in that region) and set afterwards with a real font by the deliverable or an image tool.
|
|
71
|
-
**Default — always inspect rendered text** (§2 step 3); garbled
|
|
69
|
+
**Default — always inspect rendered text** (§2 step 3); garbled glyphs are common. One targeted text-only edit pass may follow; if spelling still drifts, stop and composite.
|
|
72
70
|
|
|
73
71
|
## 5. Reference images
|
|
74
72
|
`references:` takes file paths; the model's `maxReferences` caps them. A reference is the user's own file or one this session generated — never a downloaded third-party image.
|
|
@@ -87,15 +85,15 @@ Do not add or remove: protected elements
|
|
|
87
85
|
| icon, avatar, texture, tile | `1:1` |
|
|
88
86
|
| a still for a video clip | the clip's aspect |
|
|
89
87
|
|
|
90
|
-
|
|
91
|
-
**Default — resolution**: the highest the model lists for a hero, print, or full-bleed frame; the default for drafts, thumbnails, and icons.
|
|
92
|
-
**Default — cutouts**:
|
|
88
|
+
Pass only a listed value (closest size when sizes are listed); a model listing none gets none, so put the ratio in the prompt's Composition line.
|
|
89
|
+
**Default — resolution**: the highest the model lists for a hero, print, or full-bleed frame; the default for drafts, thumbnails, and icons.
|
|
90
|
+
**Default — cutouts and transparency**: when the model lists `background`, pass `background: transparent` for cutouts, stickers, icons, logos, background removal, and edits of an image that must stay transparent (`auto` drops alpha on edits). Otherwise generate on a stated solid background (`pure solid white #FFFFFF`, or black for reflective subjects; "no gradient, no floor, no shadow, no vignette") and remove it afterwards; never put "transparent background" in the prompt — it burns a fake checkerboard into the image.
|
|
93
91
|
|
|
94
92
|
## 7. Saving, reporting, provenance
|
|
95
93
|
**Hard rule — never overwrite**: an existing file gets a sibling (`hero-v2.png`, `photo-edited.png`) unless the user asked for replacement. Output goes beside the work that uses it or where the user named; nothing lives only in a temp folder.
|
|
96
|
-
**Hard rule — the report names what was made**: final path, lane/model, options, and the final prompt (
|
|
97
|
-
**Hard rule — generated media is declared where it lands**: the deliverable that places it records it as generated with lane/model and prompt (
|
|
94
|
+
**Hard rule — the report names what was made**: final path, the lane/model that produced it (said to the user in plain words), options, and the final prompt (edit: the change and locks).
|
|
95
|
+
**Hard rule — generated media is declared where it lands**: the deliverable that places it records it as generated with lane/model and prompt (notes, caption, alt text, or message). A generated picture is never presented as a photograph of a real event, place, or person.
|
|
98
96
|
## 8. Failure and cost
|
|
99
|
-
- A `generate` error carries `lanes` (what is signed in for images) or `available` (models); choose from it and call again, or continue without.
|
|
100
|
-
- Generation costs the user credits or quota
|
|
101
|
-
-
|
|
97
|
+
- A `generate` error carries `lanes` (what is signed in for images) or `available` (models); choose from it and call again, or continue without. `MEDIA_USAGE_LIMIT`: limit reached — tell the user the reset time. `MEDIA_PARTIAL_ONLY`: no final image, nothing saved.
|
|
98
|
+
- Generation costs the user credits or quota: one call per job, no speculative variants or "another option" regenerations unless asked.
|
|
99
|
+
- On a retry, re-edit only the residual region with the same locks rather than enlarging the prompt.
|
package/src/lib/keychain-cjs.cjs
CHANGED
|
@@ -353,7 +353,9 @@ function secretToolCheck(r) {
|
|
|
353
353
|
}
|
|
354
354
|
if (r.error) {
|
|
355
355
|
keychainDebug('secret-tool failed to start', r.error.message);
|
|
356
|
-
throw new Error(
|
|
356
|
+
throw new Error(
|
|
357
|
+
'[keychain] secret-tool could not be started — check that libsecret-tools is installed and a Secret Service is running'
|
|
358
|
+
);
|
|
357
359
|
}
|
|
358
360
|
return r;
|
|
359
361
|
}
|
|
@@ -495,7 +497,10 @@ function onKeychainRecovered(listener) {
|
|
|
495
497
|
// secret-tool cannot fix itself and is not retried.
|
|
496
498
|
function _scheduleLinuxBackgroundRetry() {
|
|
497
499
|
if (_linuxBgTimer || _keychainStatus.state === 'missing' || _gdbusMissing) return;
|
|
498
|
-
const delay = Math.min(
|
|
500
|
+
const delay = Math.min(
|
|
501
|
+
LINUX_PREWARM_RETRY_MS * 2,
|
|
502
|
+
LINUX_PREWARM_RETRY_MS + _linuxBgAttempt * (LINUX_PREWARM_RETRY_MS / 2)
|
|
503
|
+
);
|
|
499
504
|
_linuxBgAttempt++;
|
|
500
505
|
_linuxBgTimer = setTimeout(async () => {
|
|
501
506
|
_linuxBgTimer = null;
|
|
@@ -592,14 +597,10 @@ const LINUX_UNREACHABLE_MESSAGE =
|
|
|
592
597
|
'[keychain] the keyring is not reachable — make sure it is running, then use Unlock keyring / Retry';
|
|
593
598
|
function _noteKeychainFailure(error) {
|
|
594
599
|
const message = String(error?.message || error);
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
? 'missing'
|
|
600
|
-
: /locked|timed out/.test(message)
|
|
601
|
-
? 'locked'
|
|
602
|
-
: 'error';
|
|
600
|
+
let state = 'error';
|
|
601
|
+
if (error?.code === 'KEYRING_UNREACHABLE') state = 'unreachable';
|
|
602
|
+
else if (/not installed/.test(message)) state = 'missing';
|
|
603
|
+
else if (/locked|timed out/.test(message)) state = 'locked';
|
|
603
604
|
_keychainStatus = { state, message };
|
|
604
605
|
}
|
|
605
606
|
|
|
@@ -718,7 +719,8 @@ async function _prewarmLinuxOnce() {
|
|
|
718
719
|
for (const account of accounts) {
|
|
719
720
|
const value = await linuxGetAsync(account, remaining());
|
|
720
721
|
if (value !== null) values.push([account, value]);
|
|
721
|
-
}
|
|
722
|
+
}
|
|
723
|
+
if (_cacheEpoch !== epoch) return;
|
|
722
724
|
// Replace, not merge: values the keyring now holds overwrite the cache and
|
|
723
725
|
// cached accounts the keyring no longer has are dropped, so external CLI /
|
|
724
726
|
// other-process add, replace and delete are picked up. A same-process
|
|
@@ -15,6 +15,7 @@ partial: true
|
|
|
15
15
|
- Distinguish facts, inference, and uncertainty; keep exact literals and
|
|
16
16
|
material risks. Caveats only when they change the reader's next step.
|
|
17
17
|
- Never pad: no tangents, unsolicited offers, raw dumps, or process recaps.
|
|
18
|
-
Explicit depth requests win; depth applies to substantive answers
|
|
18
|
+
Explicit depth requests win; depth applies to substantive answers, not the
|
|
19
|
+
one-line pre-tool briefing.
|
|
19
20
|
- At every depth keep decision-relevant failures, security warnings, and
|
|
20
21
|
destructive-action confirmations; quote needed error text exactly.
|
package/src/rules/agent/AGENT.md
CHANGED
|
@@ -6,8 +6,10 @@
|
|
|
6
6
|
unapproved destructive action, or a blocker.
|
|
7
7
|
- Communicate in English. Call tools immediately, with no preamble or
|
|
8
8
|
progress text.
|
|
9
|
-
- Reporting:
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
9
|
+
- Reporting: send one final message, then stop; never ask whether to
|
|
10
|
+
continue. Start with `Status: done|partial|blocked`, then:
|
|
11
|
+
Result: the answer or outcome, mapped to the brief's done-when.
|
|
12
|
+
Evidence: path+symbol and checks run (failures: decisive error only).
|
|
13
|
+
Open: risks, gaps, or the blocker. Omit empty fields; no logs, narration,
|
|
14
|
+
or restated brief. Role contracts only add fields.
|
|
15
|
+
Lead owns the independent review.
|
package/src/rules/lead/LEAD.md
CHANGED
|
@@ -4,10 +4,12 @@
|
|
|
4
4
|
- The user's latest explicit request overrides any internal rule; drive it to
|
|
5
5
|
completion.
|
|
6
6
|
- The user sees your text, and tool calls only as activity cards, never your
|
|
7
|
-
thinking. Before
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
7
|
+
thinking. Before your first tool call, briefly state what you are about to
|
|
8
|
+
do. While working, give short updates at key moments: when you find
|
|
9
|
+
something, change direction, or make progress without an update for a
|
|
10
|
+
while. Otherwise bring the user only material findings, direction or scope
|
|
11
|
+
changes, unapproved destructive actions, blockers or meaningful delays — never per-call
|
|
12
|
+
narration or plan repeats.
|
|
11
13
|
- Mid-task: a replacement supersedes, an addition folds in, a status question
|
|
12
14
|
gets a brief answer while work continues.
|
|
13
15
|
- Context is managed automatically: never stop or propose stopping because of
|
|
@@ -15,15 +17,13 @@
|
|
|
15
17
|
- Be a grounded, candid, and attentive collaborator: natural and respectful,
|
|
16
18
|
without flattery, forced humor, mimicry, or stereotyping.
|
|
17
19
|
<!-- tools: agent -->
|
|
18
|
-
- Briefing an agent: it sees only the brief
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
continuing agent gets only what changed. Never assign the same work twice;
|
|
26
|
-
interrupt only to cancel.
|
|
20
|
+
- Briefing an agent: it starts blank and sees only the brief. Write it in
|
|
21
|
+
English, self-contained: goal and its use; owned scope and non-goals;
|
|
22
|
+
targets by path plus symbol or quoted line; done-when as an observable,
|
|
23
|
+
checkable end state; any return need beyond the role. Pass only what
|
|
24
|
+
cannot be rediscovered; large evidence by path. A fresh agent gets the
|
|
25
|
+
whole brief, a continuing one only what changed. Never assign the same
|
|
26
|
+
work twice.
|
|
27
27
|
<!-- tools: agent -->
|
|
28
28
|
- Receiving an agent's report: it arrives as a `<task-notification>` block, a
|
|
29
29
|
runtime message rather than the user speaking. Do not wait for it in-turn —
|
|
@@ -3,6 +3,10 @@
|
|
|
3
3
|
- Commit, push, release, deployment and any irreversible action only on the
|
|
4
4
|
user's explicit request. Validate exact targets first: never roots, `~` or
|
|
5
5
|
unresolved variables/globs.
|
|
6
|
+
- Never stash, reset, checkout, restore or clean the working tree, or delete
|
|
7
|
+
files you did not create: it may hold other agents' or the user's
|
|
8
|
+
uncommitted work. Use a separate worktree or copy for before/after
|
|
9
|
+
comparisons.
|
|
6
10
|
- Back up only when changes risk irreversible loss, not for routine code edits;
|
|
7
11
|
keep backups unless the user requests removal. Report what is recoverable.
|
|
8
12
|
- Temp workspaces come from a unique-directory allocator, never by clearing
|
|
@@ -30,6 +30,7 @@ function maintenanceRouteToPreset(routeOrName, agent) {
|
|
|
30
30
|
type: 'agent',
|
|
31
31
|
provider,
|
|
32
32
|
model,
|
|
33
|
+
...(routeOrName.fallbacks?.length ? { fallbacks: routeOrName.fallbacks } : {}),
|
|
33
34
|
tools: 'full',
|
|
34
35
|
};
|
|
35
36
|
const effort = String(routeOrName.effort || '').trim();
|
|
@@ -11,6 +11,7 @@ import { appendAgentTrace } from '../agent-trace-io.mjs';
|
|
|
11
11
|
import { getHiddenAgent } from '../internal-agents.mjs';
|
|
12
12
|
import { envNonNegativeInt, envPresent } from '../../../shared/env.mjs';
|
|
13
13
|
import {
|
|
14
|
+
PROVIDER_FIRST_BYTE_TIMEOUT_MS,
|
|
14
15
|
PROVIDER_SEMANTIC_IDLE_TIMEOUT_MS,
|
|
15
16
|
PROVIDER_WS_SEMANTIC_IDLE_TIMEOUT_MS,
|
|
16
17
|
STALL_TICK_MS,
|
|
@@ -45,7 +46,7 @@ export class AgentStallAbortError extends Error {
|
|
|
45
46
|
}
|
|
46
47
|
}
|
|
47
48
|
|
|
48
|
-
function isAgentProgressWatchdogAbortError(err) {
|
|
49
|
+
export function isAgentProgressWatchdogAbortError(err) {
|
|
49
50
|
const msg = err?.message;
|
|
50
51
|
return typeof msg === 'string' && WATCHDOG_ABORT_RE.test(msg);
|
|
51
52
|
}
|
|
@@ -203,14 +204,34 @@ function resolveExplicitMs(value, fallback) {
|
|
|
203
204
|
return fallback;
|
|
204
205
|
}
|
|
205
206
|
|
|
207
|
+
// One deadline floored one watchdog tick above the provider's own budget for
|
|
208
|
+
// that phase (none when the provider names none); 0 stays disabled.
|
|
209
|
+
function aboveProviderBudget(requestedMs, providerBudgetMs) {
|
|
210
|
+
if (!(requestedMs > 0) || !(providerBudgetMs > 0)) return requestedMs;
|
|
211
|
+
return Math.max(requestedMs, providerBudgetMs + STALL_TICK_MS);
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
// `providerFirstByteTimeoutMs` is how long the session's provider itself may
|
|
215
|
+
// wait for response headers, and `providerFirstOutputTimeoutMs` for its first
|
|
216
|
+
// output (headers plus first chunk), its own retries included
|
|
217
|
+
// (providerFirstResponseBudget). Provider retries keep the request clock
|
|
218
|
+
// running, so each first-response deadline sits one watchdog tick above that
|
|
219
|
+
// budget: the provider's timeout and retry decide first, and a provider that
|
|
220
|
+
// gives up is reported as the provider's failure.
|
|
206
221
|
export function resolveAgentWatchdogPolicy(agent, overrides = {}) {
|
|
207
|
-
const firstTransportMs =
|
|
208
|
-
|
|
209
|
-
|
|
222
|
+
const firstTransportMs = aboveProviderBudget(
|
|
223
|
+
resolveExplicitMs(
|
|
224
|
+
overrides.firstTransportTimeoutMs ?? overrides.firstResponseTimeoutMs,
|
|
225
|
+
DEFAULT_FIRST_RESPONSE_TIMEOUT_MS
|
|
226
|
+
),
|
|
227
|
+
resolveExplicitMs(overrides.providerFirstByteTimeoutMs, PROVIDER_FIRST_BYTE_TIMEOUT_MS)
|
|
210
228
|
);
|
|
211
|
-
const firstSemanticMs =
|
|
212
|
-
|
|
213
|
-
|
|
229
|
+
const firstSemanticMs = aboveProviderBudget(
|
|
230
|
+
resolveExplicitMs(
|
|
231
|
+
overrides.firstSemanticTimeoutMs ?? overrides.firstVisibleTimeoutMs,
|
|
232
|
+
DEFAULT_FIRST_VISIBLE_CEILING_MS
|
|
233
|
+
),
|
|
234
|
+
resolveExplicitMs(overrides.providerFirstOutputTimeoutMs, 0)
|
|
214
235
|
);
|
|
215
236
|
|
|
216
237
|
let idleStaleMs;
|
|
@@ -493,19 +493,10 @@ export function buildProviderCacheOpts(provider, _sessionId, agent, options = {}
|
|
|
493
493
|
const ttls = resolveCacheStrategy(agent, options);
|
|
494
494
|
const capability = cacheCapabilityForProvider(provider);
|
|
495
495
|
if (capability === 'explicit-breakpoint') {
|
|
496
|
-
// 2026-03-06 Anthropic dropped default TTL 1h→5m. We
|
|
497
|
-
//
|
|
496
|
+
// 2026-03-06 Anthropic dropped default TTL 1h→5m. We request 1h via
|
|
497
|
+
// cache_control ttl:"1h"; no beta header is required.
|
|
498
498
|
// Verified 2026-04-17 (ephemeral_1h_input_tokens=4722).
|
|
499
499
|
return { cacheStrategy: ttls, ...oneShotPromptCacheOpts(agent) };
|
|
500
500
|
}
|
|
501
|
-
// NOTE: createSession's direct-call site (manager.mjs) only invokes this
|
|
502
|
-
// for explicit-breakpoint (Anthropic-family) providers, so this branch
|
|
503
|
-
// stays reachable only from other callers (none in-tree today) — keeping
|
|
504
|
-
// it here preserves the documented public API/behavior of this function.
|
|
505
|
-
if (provider === 'openai') {
|
|
506
|
-
// Public OpenAI API: prompt_cache_retention extends prefix retention.
|
|
507
|
-
// openai-oauth rejects the header — falls through to default.
|
|
508
|
-
return { cacheRetention: '24h' };
|
|
509
|
-
}
|
|
510
501
|
return {};
|
|
511
502
|
}
|
|
@@ -35,52 +35,124 @@ function transportPid(transport) {
|
|
|
35
35
|
return (typeof transport?.pid === 'number' ? transport.pid : null) ?? transport?._process?.pid ?? null;
|
|
36
36
|
}
|
|
37
37
|
|
|
38
|
+
/** Deadline of one process-table enumeration subprocess. A healthy CIM query
|
|
39
|
+
* takes ~1-3 s but exceeds 8 s under heavy load, and a timed-out strict read
|
|
40
|
+
* leaves the finished command's workspace held, so the deadline only cuts
|
|
41
|
+
* off a query that is genuinely stuck. A query that has not answered by then
|
|
42
|
+
* is killed and its snapshot rejected (strict) or empty (best-effort). A
|
|
43
|
+
* termination watch schedules its next pass only after the previous read
|
|
44
|
+
* settled, so enumerators never pile up whatever this value is. */
|
|
45
|
+
export const ENUMERATION_DEADLINE_MS = 20_000;
|
|
46
|
+
|
|
38
47
|
// Spawn a helper command and resolve its stdout (empty string on any error).
|
|
39
|
-
|
|
40
|
-
|
|
48
|
+
// `timeoutMs` > 0: past the deadline the helper is killed (Node reaps it on
|
|
49
|
+
// exit) and the call settles at once instead of waiting for it.
|
|
50
|
+
function run(cmd, args, { strict = false, timeoutMs = 0 } = {}) {
|
|
51
|
+
return new Promise((resolve, reject) => {
|
|
41
52
|
let out = '';
|
|
42
53
|
let cp;
|
|
54
|
+
let timer = null;
|
|
55
|
+
let settled = false;
|
|
56
|
+
const settle = (finish) => {
|
|
57
|
+
if (settled) return;
|
|
58
|
+
settled = true;
|
|
59
|
+
if (timer) clearTimeout(timer);
|
|
60
|
+
finish();
|
|
61
|
+
};
|
|
43
62
|
try {
|
|
44
63
|
cp = spawn(cmd, args, { windowsHide: true });
|
|
45
|
-
} catch {
|
|
64
|
+
} catch (error) {
|
|
65
|
+
if (strict) {
|
|
66
|
+
reject(error);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
46
69
|
resolve('');
|
|
47
70
|
return;
|
|
48
71
|
}
|
|
49
72
|
cp.stdout?.on('data', (d) => {
|
|
50
73
|
out += String(d);
|
|
51
74
|
});
|
|
52
|
-
cp.on('error', () => resolve(out));
|
|
53
|
-
cp.on('close', () =>
|
|
75
|
+
cp.on('error', (error) => settle(() => (strict ? reject(error) : resolve(out))));
|
|
76
|
+
cp.on('close', (code) =>
|
|
77
|
+
settle(() => (strict && code !== 0 ? reject(new Error(`Process enumeration failed (${code}).`)) : resolve(out)))
|
|
78
|
+
);
|
|
79
|
+
if (timeoutMs > 0) {
|
|
80
|
+
timer = setTimeout(() => {
|
|
81
|
+
try {
|
|
82
|
+
cp.kill('SIGKILL');
|
|
83
|
+
} catch {
|
|
84
|
+
/* already gone */
|
|
85
|
+
}
|
|
86
|
+
cp.stdout?.destroy?.();
|
|
87
|
+
cp.stderr?.destroy?.();
|
|
88
|
+
settle(() =>
|
|
89
|
+
strict ? reject(new Error(`Process enumeration timed out after ${timeoutMs} ms.`)) : resolve('')
|
|
90
|
+
);
|
|
91
|
+
}, timeoutMs);
|
|
92
|
+
timer.unref?.();
|
|
93
|
+
}
|
|
54
94
|
});
|
|
55
95
|
}
|
|
56
96
|
|
|
57
97
|
// Snapshot the whole process table once: parent map + a per-pid identity
|
|
58
98
|
// token (Windows CreationDate, POSIX lstart) so a later kill can prove a pid
|
|
59
99
|
// number was not recycled onto a different process before signalling it.
|
|
60
|
-
|
|
100
|
+
// POSIX rows also carry the process group id (Windows has none).
|
|
101
|
+
async function enumerate({ strict = false } = {}) {
|
|
61
102
|
const childrenOf = new Map();
|
|
62
103
|
const tokenOf = new Map();
|
|
63
104
|
const nameOf = new Map();
|
|
105
|
+
const pgidOf = new Map();
|
|
64
106
|
const out = isWin
|
|
65
|
-
? await run(
|
|
66
|
-
'
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
107
|
+
? await run(
|
|
108
|
+
'powershell.exe',
|
|
109
|
+
[
|
|
110
|
+
'-NoProfile',
|
|
111
|
+
'-NonInteractive',
|
|
112
|
+
'-Command',
|
|
113
|
+
`${strict ? "$ErrorActionPreference = 'Stop'; " : ''}Get-CimInstance Win32_Process | ForEach-Object { $created = if ($_.CreationDate) { $_.CreationDate.ToString('o') } else { '' }; "$($_.ProcessId) $($_.ParentProcessId) $($_.Name) $created" }`,
|
|
114
|
+
],
|
|
115
|
+
{ strict, timeoutMs: ENUMERATION_DEADLINE_MS }
|
|
116
|
+
)
|
|
117
|
+
: await run('ps', ['-A', '-o', 'pid=,ppid=,pgid=,comm=,lstart='], {
|
|
118
|
+
strict,
|
|
119
|
+
timeoutMs: ENUMERATION_DEADLINE_MS,
|
|
120
|
+
});
|
|
121
|
+
const row = isWin ? /^(\d+)\s+(\d+)\s+()(\S+)(?:\s+(.+))?$/ : /^(\d+)\s+(\d+)\s+(\d+)\s+(\S+)(?:\s+(.+))?$/;
|
|
72
122
|
for (const line of out.split(/\r?\n/)) {
|
|
73
|
-
const m = line.trim().match(
|
|
123
|
+
const m = line.trim().match(row);
|
|
74
124
|
if (!m) continue;
|
|
75
125
|
const pid = Number(m[1]);
|
|
76
126
|
const ppid = Number(m[2]);
|
|
77
|
-
const token = (m[
|
|
127
|
+
const token = (m[5] || '').trim() || null;
|
|
78
128
|
if (!childrenOf.has(ppid)) childrenOf.set(ppid, []);
|
|
79
129
|
childrenOf.get(ppid).push(pid);
|
|
80
130
|
tokenOf.set(pid, token);
|
|
81
|
-
nameOf.set(pid, m[
|
|
131
|
+
nameOf.set(pid, m[4]);
|
|
132
|
+
if (m[3]) pgidOf.set(pid, Number(m[3]));
|
|
133
|
+
}
|
|
134
|
+
if (strict && !nameOf.has(process.pid)) throw new Error('The process snapshot could not be verified.');
|
|
135
|
+
return { childrenOf, tokenOf, nameOf, pgidOf };
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/** One strict process-table snapshot: parent links, identity tokens, image
|
|
139
|
+
* names and (POSIX) process groups. Rejects instead of returning a partial
|
|
140
|
+
* table, so callers can tell "nothing found" from "could not look".
|
|
141
|
+
*
|
|
142
|
+
* `shared: true` (pre-kill captures) joins a read already in flight, so many
|
|
143
|
+
* jobs promoted together do not each spawn an enumerator; a capture taken
|
|
144
|
+
* while its root runs is valid whenever that read began. An observation after
|
|
145
|
+
* a kill never shares: a read that began before the kill would report the
|
|
146
|
+
* killed tree alive and defer the confirmation by a whole re-check. */
|
|
147
|
+
let tableInFlight = null;
|
|
148
|
+
export function readProcessTable({ shared = false } = {}) {
|
|
149
|
+
if (!shared) return enumerate({ strict: true });
|
|
150
|
+
if (!tableInFlight) {
|
|
151
|
+
tableInFlight = enumerate({ strict: true }).finally(() => {
|
|
152
|
+
tableInFlight = null;
|
|
153
|
+
});
|
|
82
154
|
}
|
|
83
|
-
return
|
|
155
|
+
return tableInFlight;
|
|
84
156
|
}
|
|
85
157
|
|
|
86
158
|
// Walk every descendant pid of rootPid (excludes rootPid).
|
|
@@ -106,12 +178,18 @@ async function collectDescendants(rootPid) {
|
|
|
106
178
|
return descendantsOf(childrenOf, rootPid);
|
|
107
179
|
}
|
|
108
180
|
|
|
109
|
-
/** Descendant pids WITH their image names
|
|
110
|
-
*
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
const { childrenOf, nameOf } =
|
|
114
|
-
|
|
181
|
+
/** Descendant pids WITH their image names and identity tokens (creation
|
|
182
|
+
* time), from one batched process-table read. */
|
|
183
|
+
export async function collectDescendantProcesses(rootPid, { strict = false } = {}) {
|
|
184
|
+
const snapshot = enumerate({ strict });
|
|
185
|
+
const { childrenOf, nameOf, tokenOf } = strict
|
|
186
|
+
? await snapshot
|
|
187
|
+
: await snapshot.catch(() => ({ childrenOf: new Map(), nameOf: new Map(), tokenOf: new Map() }));
|
|
188
|
+
return descendantsOf(childrenOf, rootPid).map((pid) => ({
|
|
189
|
+
pid,
|
|
190
|
+
name: nameOf.get(pid) || '',
|
|
191
|
+
token: tokenOf.get(pid) ?? null,
|
|
192
|
+
}));
|
|
115
193
|
}
|
|
116
194
|
|
|
117
195
|
/** Force-kill whole process trees by pid. Windows batches one taskkill /T /F
|
|
@@ -165,6 +165,8 @@ function boundAccountSend(providerName, row, messages, options) {
|
|
|
165
165
|
};
|
|
166
166
|
}
|
|
167
167
|
if (options.sessionId) {
|
|
168
|
+
// An explicit empty executor (model-proxy host) must stay empty.
|
|
169
|
+
opts.toolExecutionSessionId = options.toolExecutionSessionId ?? options.sessionId;
|
|
168
170
|
opts.sessionId = accountScopedSessionId(providerName, row.id, options.sessionId);
|
|
169
171
|
// The spend still belongs to the visible session (usage-accounting.mjs).
|
|
170
172
|
opts.usageSessionId = options.usageSessionId || options.sessionId;
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
// Custom `fetch` for the Anthropic SDK client (API-key path): gzips
|
|
2
|
+
// /v1/messages bodies on the libuv threadpool, but ONLY when the effective
|
|
3
|
+
// request origin is exactly https://api.anthropic.com. The decision is made on
|
|
4
|
+
// the final request URL, so a custom baseURL, ANTHROPIC_BASE_URL, proxy or
|
|
5
|
+
// gateway never gets a compressed body. Policy shared with the OAuth path.
|
|
6
|
+
import { sendGzipCompressed } from './lib/request-compression.mjs';
|
|
7
|
+
|
|
8
|
+
const OFFICIAL_ORIGIN = 'https://api.anthropic.com';
|
|
9
|
+
|
|
10
|
+
function officialMessagesUrl(input) {
|
|
11
|
+
try {
|
|
12
|
+
const url = new URL(typeof input === 'string' || input instanceof URL ? input : input.url);
|
|
13
|
+
return url.origin === OFFICIAL_ORIGIN && url.pathname === '/v1/messages';
|
|
14
|
+
} catch {
|
|
15
|
+
return false;
|
|
16
|
+
}
|
|
17
|
+
}
|
|
18
|
+
|
|
19
|
+
function bodyBytes(body) {
|
|
20
|
+
if (typeof body === 'string') return Buffer.from(body);
|
|
21
|
+
if (ArrayBuffer.isView(body)) return Buffer.from(body.buffer, body.byteOffset, body.byteLength);
|
|
22
|
+
return null;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
export function createAnthropicApiKeyFetch({ baseFetch = (...args) => globalThis.fetch(...args), compress } = {}) {
|
|
26
|
+
return async (input, init) => {
|
|
27
|
+
const raw = init?.method?.toUpperCase() === 'POST' && officialMessagesUrl(input) ? bodyBytes(init.body) : null;
|
|
28
|
+
if (!raw) return baseFetch(input, init);
|
|
29
|
+
return sendGzipCompressed({
|
|
30
|
+
raw,
|
|
31
|
+
headers: init.headers,
|
|
32
|
+
compress,
|
|
33
|
+
send: (body, headers) => baseFetch(input, { ...init, headers, body: body === raw ? init.body : body }),
|
|
34
|
+
});
|
|
35
|
+
};
|
|
36
|
+
}
|
|
@@ -45,7 +45,7 @@ function lowered(value) {
|
|
|
45
45
|
|
|
46
46
|
/** The lowercased error type named by an Anthropic error body (JSON text or parsed object). */
|
|
47
47
|
export function anthropicErrorTypeFromBody(body) {
|
|
48
|
-
if (body && typeof body === 'object') return lowered(
|
|
48
|
+
if (body && typeof body === 'object') return lowered(body.error?.type || body.type);
|
|
49
49
|
const match = BODY_TYPE_RE.exec(String(body || ''));
|
|
50
50
|
return match ? lowered(match[1]) : '';
|
|
51
51
|
}
|
|
@@ -28,9 +28,8 @@ export function loadAnthropic() {
|
|
|
28
28
|
|
|
29
29
|
// 4-BP cache policy aligned with anthropic-oauth — system + tier3 +
|
|
30
30
|
// messages-tail. Tool schemas sit before system and are covered by the system
|
|
31
|
-
// breakpoint, so they do not spend a separate cache_control slot. 1h TTL
|
|
32
|
-
//
|
|
33
|
-
// defaultHeaders below.
|
|
31
|
+
// breakpoint, so they do not spend a separate cache_control slot. The 1h TTL
|
|
32
|
+
// is requested with cache_control ttl:"1h"; no beta header is needed.
|
|
34
33
|
|
|
35
34
|
// BP3 (tier3) rides its own `system` role block (the 3rd system block, tagged
|
|
36
35
|
// cacheTier:'tier3'). buildSystemBlocks applies the tier3 1h cache_control to
|
|
@@ -10,7 +10,7 @@ import { createNpmVersionSource, maxSemver } from './npm-cli-version.mjs';
|
|
|
10
10
|
// source release just to advance the user-agent version.
|
|
11
11
|
// Claude Opus 5.5 requires 2.1.280 or newer. The release workflow raises this
|
|
12
12
|
// to the published CLI version (scripts/sync-client-version-floors.mjs).
|
|
13
|
-
export const DEFAULT_CLI_VERSION = '2.1.
|
|
13
|
+
export const DEFAULT_CLI_VERSION = '2.1.302';
|
|
14
14
|
export const CLAUDE_CLI_NPM_PACKAGE = '@anthropic-ai/claude-code';
|
|
15
15
|
|
|
16
16
|
const CACHE_SCHEMA_VERSION = 1;
|