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
|
@@ -14,20 +14,26 @@
|
|
|
14
14
|
*/
|
|
15
15
|
import { randomUUID } from 'node:crypto';
|
|
16
16
|
import { access, stat } from 'node:fs/promises';
|
|
17
|
+
import { basename } from 'node:path';
|
|
17
18
|
import {
|
|
18
19
|
buildImportOrigin,
|
|
19
20
|
createImportedSession,
|
|
20
21
|
importOriginKey,
|
|
21
22
|
} from '../../runtime/agent/orchestrator/session/conversation-import/imported-session.mjs';
|
|
22
|
-
import {
|
|
23
|
+
import {
|
|
24
|
+
IMPORT_ERROR_NEEDS_NEWER_NODE,
|
|
25
|
+
IMPORT_WARNING_CWD_MISSING,
|
|
26
|
+
} from '../../runtime/agent/orchestrator/session/conversation-import/turns.mjs';
|
|
23
27
|
import { sessionPath } from '../../runtime/agent/orchestrator/session/store/session-paths.mjs';
|
|
24
28
|
import {
|
|
25
29
|
cachedMeta,
|
|
26
30
|
convertCandidateFile,
|
|
31
|
+
displayTitle,
|
|
27
32
|
getCandidate,
|
|
28
33
|
importError,
|
|
29
34
|
importedKeyMap,
|
|
30
35
|
listConversations,
|
|
36
|
+
loadStoredTitles,
|
|
31
37
|
recordConversion,
|
|
32
38
|
registerFile,
|
|
33
39
|
resolveSourceCwd,
|
|
@@ -131,6 +137,17 @@ function touch(job, patch = {}) {
|
|
|
131
137
|
|
|
132
138
|
const COUNTER = { imported: 'imported', alreadyImported: 'skippedAlreadyImported', failed: 'failed' };
|
|
133
139
|
|
|
140
|
+
const titlesFor = (candidate, context) => (candidate.source === 'codex' ? context.titles : null);
|
|
141
|
+
|
|
142
|
+
/** Which record a result is about: its title and source file name, for the failure report. */
|
|
143
|
+
function describeCandidate(candidateId, context) {
|
|
144
|
+
const candidate = getCandidate(candidateId);
|
|
145
|
+
return {
|
|
146
|
+
title: candidate ? displayTitle(cachedMeta(candidate), titlesFor(candidate, context)) : null,
|
|
147
|
+
sourceName: candidate ? basename(candidate.path) : null,
|
|
148
|
+
};
|
|
149
|
+
}
|
|
150
|
+
|
|
134
151
|
function record(job, { projectPath = null, ...result }) {
|
|
135
152
|
const counter = COUNTER[result.status];
|
|
136
153
|
job[counter] += 1;
|
|
@@ -162,6 +179,7 @@ async function importOne(candidateId, context) {
|
|
|
162
179
|
if (!candidate) return failed(candidateId, 'unknownCandidate');
|
|
163
180
|
// The chat keeps the title the user picked it by: a long file's listing
|
|
164
181
|
// title comes from its prefix and can differ from the converted branch.
|
|
182
|
+
// Codex's own stored title, when it has one, names the chat first.
|
|
165
183
|
const listedTitle = cachedMeta(candidate)?.title ?? null;
|
|
166
184
|
let conversion;
|
|
167
185
|
try {
|
|
@@ -170,10 +188,17 @@ async function importOne(candidateId, context) {
|
|
|
170
188
|
candidate.size = info.size;
|
|
171
189
|
candidate.mtimeMs = info.mtimeMs;
|
|
172
190
|
conversion = await convertCandidateFile(candidate, context.limits);
|
|
173
|
-
} catch {
|
|
174
|
-
return failed(
|
|
191
|
+
} catch (error) {
|
|
192
|
+
return failed(
|
|
193
|
+
candidateId,
|
|
194
|
+
error?.code === IMPORT_ERROR_NEEDS_NEWER_NODE ? IMPORT_ERROR_NEEDS_NEWER_NODE : 'unreadable'
|
|
195
|
+
);
|
|
175
196
|
}
|
|
176
|
-
|
|
197
|
+
const title = displayTitle(
|
|
198
|
+
{ foreignSessionId: conversion.foreignSessionId, title: listedTitle || conversion.title },
|
|
199
|
+
titlesFor(candidate, context)
|
|
200
|
+
);
|
|
201
|
+
if (title) conversion = { ...conversion, title };
|
|
177
202
|
recordConversion(candidate, conversion);
|
|
178
203
|
const cwdInfo = await resolveSourceCwd(conversion.cwd);
|
|
179
204
|
const projectPath = cwdInfo.exists ? cwdInfo.path : null;
|
|
@@ -221,6 +246,7 @@ async function runJob(job, candidateIds, context) {
|
|
|
221
246
|
try {
|
|
222
247
|
// One catalog read per batch; later commits are seen through committedKeys.
|
|
223
248
|
context.imported = await context.importedLookup();
|
|
249
|
+
context.titles = await context.loadTitles();
|
|
224
250
|
for (const candidateId of candidateIds) {
|
|
225
251
|
if (job.cancelRequested) break;
|
|
226
252
|
let result;
|
|
@@ -228,8 +254,7 @@ async function runJob(job, candidateIds, context) {
|
|
|
228
254
|
result = await admit(async () => {
|
|
229
255
|
// A cancel that arrived while queued behind other jobs wins here.
|
|
230
256
|
if (job.cancelRequested) return null;
|
|
231
|
-
|
|
232
|
-
touch(job, { current: { candidateId, title: (candidate && cachedMeta(candidate)?.title) ?? null } });
|
|
257
|
+
touch(job, { current: { candidateId, title: describeCandidate(candidateId, context).title } });
|
|
233
258
|
try {
|
|
234
259
|
return await importOne(candidateId, context);
|
|
235
260
|
} finally {
|
|
@@ -241,7 +266,7 @@ async function runJob(job, candidateIds, context) {
|
|
|
241
266
|
result = failed(candidateId, 'importFailed');
|
|
242
267
|
}
|
|
243
268
|
if (result === null) break;
|
|
244
|
-
record(job, result);
|
|
269
|
+
record(job, { ...result, ...describeCandidate(candidateId, context) });
|
|
245
270
|
}
|
|
246
271
|
touch(job, { state: job.cancelRequested ? 'stopped' : 'completed' });
|
|
247
272
|
} catch (error) {
|
|
@@ -296,7 +321,7 @@ export function createConversationImportApi({
|
|
|
296
321
|
return listConversations(requireParams(params), { imported: await imported(), env });
|
|
297
322
|
},
|
|
298
323
|
async registerConversationImportFile(params) {
|
|
299
|
-
return registerFile(requireParams(params), { imported: await imported(), limits });
|
|
324
|
+
return registerFile(requireParams(params), { imported: await imported(), limits, env });
|
|
300
325
|
},
|
|
301
326
|
getConversationImportJobs(params = {}) {
|
|
302
327
|
const { jobId } = requireParams(params ?? {});
|
|
@@ -334,6 +359,8 @@ export function createConversationImportApi({
|
|
|
334
359
|
void runJob(job, candidateIds, {
|
|
335
360
|
importedLookup: imported,
|
|
336
361
|
imported: null,
|
|
362
|
+
titles: null,
|
|
363
|
+
loadTitles: () => loadStoredTitles('codex', env),
|
|
337
364
|
sessionExists,
|
|
338
365
|
limits,
|
|
339
366
|
prepareLeadOptions,
|
|
@@ -453,8 +453,9 @@ function callArgs(call) {
|
|
|
453
453
|
return args && typeof args === 'object' ? args : {};
|
|
454
454
|
}
|
|
455
455
|
|
|
456
|
-
/** The paths one tool call wrote or produced
|
|
457
|
-
|
|
456
|
+
/** The paths one tool call wrote or produced; `written`: only those it
|
|
457
|
+
* actually created or modified (opening a file in visualize does neither). */
|
|
458
|
+
function toolCallOutputs(call, written) {
|
|
458
459
|
const name = String(call?.function?.name || call?.name || '');
|
|
459
460
|
const args = callArgs(call);
|
|
460
461
|
const text = (value) => (typeof value === 'string' && value.trim() ? [value.trim()] : []);
|
|
@@ -464,7 +465,7 @@ function toolCallOutputs(call) {
|
|
|
464
465
|
if (name === 'office') return OFFICE_WRITE_ACTIONS.has(args.action) ? [...text(args.output), ...text(args.path)] : [];
|
|
465
466
|
if (name === 'visualize') {
|
|
466
467
|
const input = args.input && typeof args.input === 'object' ? args.input : {};
|
|
467
|
-
const targets = args.action === 'open' && Array.isArray(input.targets) ? input.targets : [];
|
|
468
|
+
const targets = !written && args.action === 'open' && Array.isArray(input.targets) ? input.targets : [];
|
|
468
469
|
return [
|
|
469
470
|
...text(input.output),
|
|
470
471
|
...targets.filter((target) => typeof target === 'string' && !/^[a-z][a-z0-9+.-]*:\/\//i.test(target)),
|
|
@@ -520,8 +521,9 @@ export function turnSlice(messages, { runId = '', since = 0 } = {}) {
|
|
|
520
521
|
|
|
521
522
|
/** The candidate artifact paths of a turn's messages, most relevant first:
|
|
522
523
|
* what its final reply names, then media/office/visualize outputs, then the
|
|
523
|
-
* files it edited.
|
|
524
|
-
|
|
524
|
+
* files it edited. `written`: only the files it created or modified (no
|
|
525
|
+
* reply paths, no visualize open targets). */
|
|
526
|
+
function turnArtifactCandidates(messages, { written = false } = {}) {
|
|
525
527
|
const list = Array.isArray(messages) ? messages : [];
|
|
526
528
|
const reply = list.findLast((message) => message?.role === 'assistant' && textOf(message.content).trim());
|
|
527
529
|
const produced = [];
|
|
@@ -535,10 +537,10 @@ export function turnArtifactCandidates(messages) {
|
|
|
535
537
|
: [];
|
|
536
538
|
for (const call of calls) {
|
|
537
539
|
const name = String(call?.function?.name || call?.name || '');
|
|
538
|
-
(name === 'edit' || name === 'apply_patch' ? edited : produced).push(...toolCallOutputs(call));
|
|
540
|
+
(name === 'edit' || name === 'apply_patch' ? edited : produced).push(...toolCallOutputs(call, written));
|
|
539
541
|
}
|
|
540
542
|
}
|
|
541
|
-
return [...(reply ? replyPaths(textOf(reply.content)) : []), ...produced, ...edited];
|
|
543
|
+
return [...(!written && reply ? replyPaths(textOf(reply.content)) : []), ...produced, ...edited];
|
|
542
544
|
}
|
|
543
545
|
|
|
544
546
|
/**
|
|
@@ -549,38 +551,16 @@ export function turnArtifactCandidates(messages) {
|
|
|
549
551
|
* the roots are left out silently; at most HANDOFF_LIMITS.count are kept.
|
|
550
552
|
*/
|
|
551
553
|
export function collectTurnArtifacts(messages, { cwd = '', roots = [] } = {}) {
|
|
552
|
-
const seen = new Set();
|
|
553
554
|
const files = [];
|
|
554
555
|
let omitted = 0;
|
|
555
556
|
const budget = createBudget();
|
|
556
|
-
for (const
|
|
557
|
-
// A candidate is a lexical path; its canonical form dedupes after the read.
|
|
558
|
-
const lexical = samePlatformPath(
|
|
559
|
-
isAbsolute(candidate) ? resolve(candidate) : resolve(cwd || process.cwd(), candidate)
|
|
560
|
-
);
|
|
561
|
-
if (seen.has(lexical)) continue;
|
|
562
|
-
seen.add(lexical);
|
|
563
|
-
let file;
|
|
564
|
-
try {
|
|
565
|
-
file = readContained(candidate, { cwd, roots, surface: 'artifact' });
|
|
566
|
-
} catch {
|
|
567
|
-
continue;
|
|
568
|
-
}
|
|
569
|
-
const key = samePlatformPath(file.path);
|
|
570
|
-
if (key !== lexical && seen.has(key)) continue;
|
|
571
|
-
seen.add(key);
|
|
557
|
+
for (const { file } of readableCandidates(turnArtifactCandidates(messages), { cwd, roots })) {
|
|
572
558
|
if (files.length >= HANDOFF_LIMITS.count) {
|
|
573
559
|
omitted += 1;
|
|
574
560
|
continue;
|
|
575
561
|
}
|
|
576
562
|
const { type, bytes } = file;
|
|
577
|
-
const entry =
|
|
578
|
-
path: file.path,
|
|
579
|
-
name: file.name,
|
|
580
|
-
kind: type?.kind || 'file',
|
|
581
|
-
mimeType: type?.mimeType || 'application/octet-stream',
|
|
582
|
-
size: file.size,
|
|
583
|
-
};
|
|
563
|
+
const entry = pathEntry(file);
|
|
584
564
|
const storable = bytes && (type.kind !== 'image' || SUPPORTED_IMAGE_MIME_TYPES.has(type.mimeType));
|
|
585
565
|
if (storable && budget.take(type.kind, bytes.length)) {
|
|
586
566
|
try {
|
|
@@ -591,3 +571,74 @@ export function collectTurnArtifacts(messages, { cwd = '', roots = [] } = {}) {
|
|
|
591
571
|
}
|
|
592
572
|
return { files, omitted };
|
|
593
573
|
}
|
|
574
|
+
|
|
575
|
+
/**
|
|
576
|
+
* The files `messages` (one turn) created or modified, inside `roots`, that
|
|
577
|
+
* `report` (the text handed to the Lead) does not name: `{ files, omitted }`
|
|
578
|
+
* as path-only entries, which the Lead forwards by path. Nothing is stored.
|
|
579
|
+
*/
|
|
580
|
+
export function collectUnreportedWrites(messages, { cwd = '', roots = [], report }) {
|
|
581
|
+
const found = [...readableCandidates(turnArtifactCandidates(messages, { written: true }), { cwd, roots })];
|
|
582
|
+
const unnamed = found.filter((item) => !reportNames(report, item, found, cwd));
|
|
583
|
+
return {
|
|
584
|
+
files: unnamed.slice(0, HANDOFF_LIMITS.count).map(({ file }) => pathEntry(file)),
|
|
585
|
+
omitted: Math.max(0, unnamed.length - HANDOFF_LIMITS.count),
|
|
586
|
+
};
|
|
587
|
+
}
|
|
588
|
+
|
|
589
|
+
const lexicalKey = (path, cwd) => samePlatformPath(resolve(cwd || process.cwd(), path));
|
|
590
|
+
|
|
591
|
+
const pathEntry = (file) => ({
|
|
592
|
+
path: file.path,
|
|
593
|
+
name: file.name,
|
|
594
|
+
kind: file.type?.kind || 'file',
|
|
595
|
+
mimeType: file.type?.mimeType || 'application/octet-stream',
|
|
596
|
+
size: file.size,
|
|
597
|
+
});
|
|
598
|
+
|
|
599
|
+
/** The distinct files among `candidates` that can be read inside `roots`, with
|
|
600
|
+
* their lexical and canonical keys. A candidate is a lexical path; its
|
|
601
|
+
* canonical form dedupes after the read. */
|
|
602
|
+
function* readableCandidates(candidates, { cwd, roots }) {
|
|
603
|
+
const seen = new Set();
|
|
604
|
+
for (const candidate of candidates) {
|
|
605
|
+
const lexical = lexicalKey(candidate, cwd);
|
|
606
|
+
if (seen.has(lexical)) continue;
|
|
607
|
+
seen.add(lexical);
|
|
608
|
+
let file;
|
|
609
|
+
try {
|
|
610
|
+
file = readContained(candidate, { cwd, roots, surface: 'artifact' });
|
|
611
|
+
} catch {
|
|
612
|
+
continue;
|
|
613
|
+
}
|
|
614
|
+
const key = samePlatformPath(file.path);
|
|
615
|
+
if (key !== lexical && seen.has(key)) continue;
|
|
616
|
+
seen.add(key);
|
|
617
|
+
yield { file, lexical, key };
|
|
618
|
+
}
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
/** Whether `report` names the produced file `item` among `found`: by its full
|
|
622
|
+
* path or a cwd-relative path resolving to it exactly, or by its bare file name
|
|
623
|
+
* when no other produced file shares that name. */
|
|
624
|
+
function reportNames(report, { file, lexical, key }, found, cwd) {
|
|
625
|
+
const flat = (value) => String(value).replaceAll('\\', '/');
|
|
626
|
+
const filePath = flat(file.path);
|
|
627
|
+
if (flat(report).includes(filePath)) return true;
|
|
628
|
+
const plain = report
|
|
629
|
+
.split(/[\s`"'<>()[\],;|]+/)
|
|
630
|
+
.map((token) => token.replace(/:\d+(?::\d+)?$/, '').replace(/[.:!?]+$/, ''))
|
|
631
|
+
.filter((token) => /\.[A-Za-z0-9]{1,8}$/.test(token) && !/^[a-z][a-z0-9+.-]*:\/\//i.test(token));
|
|
632
|
+
const refs = new Set([...replyPaths(report), ...plain]);
|
|
633
|
+
const unique = found.filter((other) => other.file.name === file.name).length === 1;
|
|
634
|
+
for (const ref of refs) {
|
|
635
|
+
const normalized = flat(ref).replace(/^(?:\.\/)+/, '');
|
|
636
|
+
if (!normalized.includes('/')) {
|
|
637
|
+
if (unique && normalized === file.name) return true;
|
|
638
|
+
continue;
|
|
639
|
+
}
|
|
640
|
+
const refKey = lexicalKey(ref, cwd);
|
|
641
|
+
if (refKey === lexical || refKey === key) return true;
|
|
642
|
+
}
|
|
643
|
+
return false;
|
|
644
|
+
}
|
|
@@ -139,11 +139,13 @@ export function createHeldRequests({
|
|
|
139
139
|
tool: request.name,
|
|
140
140
|
target: request.outbound?.target || '',
|
|
141
141
|
reason: request.reason || '',
|
|
142
|
+
// The connector account the call is bound to (tool-exec.mjs).
|
|
143
|
+
account: request.account,
|
|
142
144
|
...(request.kind === 'outbound'
|
|
143
145
|
? {
|
|
144
146
|
payload: request.outbound?.payload || '',
|
|
145
147
|
action: request.outbound?.category,
|
|
146
|
-
account: request.outbound?.account,
|
|
148
|
+
account: request.outbound?.account || request.account,
|
|
147
149
|
editable: request.outbound?.editable,
|
|
148
150
|
details: request.outbound?.details,
|
|
149
151
|
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// ask_user: put 1-4 multiple-choice questions to the user through the session's
|
|
2
2
|
// tool-approval hook (kind: 'question') and report the answers to the model.
|
|
3
|
+
// handoff_user (the secret / takeover handoff) shares this module's human-gate code.
|
|
3
4
|
import { randomUUID } from 'node:crypto';
|
|
4
5
|
import {
|
|
5
|
-
|
|
6
|
+
validateUserHandoff,
|
|
6
7
|
validateAskUserQuestions,
|
|
7
8
|
ASK_USER_MAX_TEXT,
|
|
8
9
|
} from '../../runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs';
|
|
@@ -78,7 +79,7 @@ export async function runAskUserHandoff(handoff, { hook, sessionId, toolCallId,
|
|
|
78
79
|
const gate = {
|
|
79
80
|
agentId: agentIdForSession(sessionId),
|
|
80
81
|
kind: handoff.kind,
|
|
81
|
-
tool: `
|
|
82
|
+
tool: `handoff_user:${handoff.surface}`,
|
|
82
83
|
target: handoff.target || handoff.field || '',
|
|
83
84
|
};
|
|
84
85
|
// A schedule or webhook run has nobody to take over: the step ends it now,
|
|
@@ -133,7 +134,7 @@ export async function runAskUserHandoff(handoff, { hook, sessionId, toolCallId,
|
|
|
133
134
|
}
|
|
134
135
|
const result = await runAbortable(signal, () =>
|
|
135
136
|
hook({
|
|
136
|
-
name: '
|
|
137
|
+
name: 'handoff_user',
|
|
137
138
|
kind: 'secret',
|
|
138
139
|
secret: { requestId, surface: handoff.surface, target: handoff.target, field: handoff.field, ...bound },
|
|
139
140
|
reason: '',
|
|
@@ -171,7 +172,7 @@ export async function runAskUserHandoff(handoff, { hook, sessionId, toolCallId,
|
|
|
171
172
|
: null;
|
|
172
173
|
const result = await runAbortable(signal, () =>
|
|
173
174
|
hook({
|
|
174
|
-
name: '
|
|
175
|
+
name: 'handoff_user',
|
|
175
176
|
kind: 'takeover',
|
|
176
177
|
takeover: {
|
|
177
178
|
surface: handoff.surface,
|
|
@@ -278,16 +279,14 @@ function formatAskUserResult(questions, answers, reply) {
|
|
|
278
279
|
export function createAskUserToolHandlers({ rt }) {
|
|
279
280
|
const { sessionIdFor, signalFor } = createCallerContextResolvers(rt);
|
|
280
281
|
return {
|
|
282
|
+
handoff_user: async (args, { callerCtx }) =>
|
|
283
|
+
runAskUserHandoff(validateUserHandoff(args), {
|
|
284
|
+
hook: callerCtx?.toolApprovalHook,
|
|
285
|
+
sessionId: sessionIdFor(callerCtx),
|
|
286
|
+
toolCallId: callerCtx?.toolCallId || null,
|
|
287
|
+
signal: signalFor(callerCtx),
|
|
288
|
+
}),
|
|
281
289
|
ask_user: async (args, { callerCtx }) => {
|
|
282
|
-
const handoff = validateAskUserHandoff(args);
|
|
283
|
-
if (handoff) {
|
|
284
|
-
return runAskUserHandoff(handoff, {
|
|
285
|
-
hook: callerCtx?.toolApprovalHook,
|
|
286
|
-
sessionId: sessionIdFor(callerCtx),
|
|
287
|
-
toolCallId: callerCtx?.toolCallId || null,
|
|
288
|
-
signal: signalFor(callerCtx),
|
|
289
|
-
});
|
|
290
|
-
}
|
|
291
290
|
const questions = validateAskUserQuestions(args);
|
|
292
291
|
const hook = callerCtx?.toolApprovalHook;
|
|
293
292
|
if (typeof hook !== 'function') return NO_USER;
|
|
@@ -50,6 +50,8 @@ export function createFeatureToolHandlers({ rt, setupTool, officeToolsEnabled, m
|
|
|
50
50
|
await setupTool.execute(args || {}, {
|
|
51
51
|
signal: signalFor(callerCtx),
|
|
52
52
|
callerSessionId: callerCtx?.callerSessionId || null,
|
|
53
|
+
requestApproval: callerCtx?.toolApprovalHook || null,
|
|
54
|
+
toolCallId: callerCtx?.toolCallId || null,
|
|
53
55
|
}),
|
|
54
56
|
};
|
|
55
57
|
}
|
|
@@ -88,6 +88,14 @@ export function createKnowledgeToolHandlers({
|
|
|
88
88
|
if (!codeGraphMod?.executeCodeGraphTool) throw new Error('code_graph runtime is not available');
|
|
89
89
|
return await codeGraphMod.executeCodeGraphTool(name, args || {}, args?.cwd || callerCwd);
|
|
90
90
|
},
|
|
91
|
+
explore: async (args, { callerCtx, callerCwd }) => {
|
|
92
|
+
const { runExplore } = await import('../../runtime/explore/tool.mjs');
|
|
93
|
+
return await runExplore(args || {}, {
|
|
94
|
+
cwd: callerCwd,
|
|
95
|
+
signal: signalFor(callerCtx),
|
|
96
|
+
callerSessionId: callerCtx?.callerSessionId || callerCtx?.sessionId || rt.session?.id || null,
|
|
97
|
+
});
|
|
98
|
+
},
|
|
91
99
|
load_tool: toolSearch,
|
|
92
100
|
Skill: (args) => skillToolContent(args?.name, activeToolSurface(), rt.mode),
|
|
93
101
|
};
|
|
@@ -4,7 +4,10 @@
|
|
|
4
4
|
// the message is the user's row in the room's log. Never a coding session, a
|
|
5
5
|
// delegated worker, or a run nobody attends.
|
|
6
6
|
import { isAgentOwner } from '../../runtime/agent/orchestrator/agent-owner.mjs';
|
|
7
|
-
import {
|
|
7
|
+
import {
|
|
8
|
+
noteReactionTarget,
|
|
9
|
+
validateReactionArgs,
|
|
10
|
+
} from '../../runtime/agent/orchestrator/runtime-core/reaction-tool-defs.mjs';
|
|
8
11
|
import { agentIdOfHomeSession } from '../../runtime/agent/orchestrator/session/agent-home.mjs';
|
|
9
12
|
import { roomMemberOfSession, roomSessionId } from '../../runtime/agent/orchestrator/session/agent-room.mjs';
|
|
10
13
|
import { reactInSession } from '../../runtime/agent/orchestrator/session/message-reactions.mjs';
|