mixdog 1.3.0 → 1.3.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/NOTICE.md +52 -9
- package/README.md +8 -4
- package/package.json +2 -2
- package/scripts/native-release-status.mjs +238 -0
- package/src/defaults/shipped-history.json +8 -1
- package/src/defaults/skills/pptx/scripts/qc-pages.mjs +3 -2
- package/src/defaults/skills/setup/SKILL.md +23 -1
- package/src/defaults/skills/setup/references/actions.md +54 -4
- package/src/defaults/skills/setup/references/surfaces.md +23 -3
- package/src/defaults/skills/setup-guide/SKILL.md +17 -10
- package/src/defaults/skills/visualize/SKILL.md +9 -6
- package/src/defaults/skills/visualize/references/craft.md +8 -1
- package/src/help.mjs +1 -1
- package/src/lib/keychain-cjs.cjs +4 -1
- package/src/lib/rules-builder.cjs +14 -7
- package/src/output-styles/common.md +13 -8
- package/src/rules/agent-mode/AGENT_MODE.md +9 -6
- package/src/rules/agent-mode/MIXY.md +11 -6
- package/src/rules/lead/LEAD.md +2 -2
- package/src/rules/shared/10-tool-workflow.md +4 -0
- package/src/rules/shared/20-research.md +2 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +5 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +8 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +6 -1
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +114 -26
- package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +8 -0
- package/src/runtime/agent/orchestrator/agent-runtime/room-supervisor-completion.mjs +5 -4
- package/src/runtime/agent/orchestrator/agent-trace.mjs +3 -0
- package/src/runtime/agent/orchestrator/cache-break-trace.mjs +4 -0
- package/src/runtime/agent/orchestrator/config-presets.mjs +2 -0
- package/src/runtime/agent/orchestrator/config-storage.mjs +10 -3
- package/src/runtime/agent/orchestrator/config.mjs +11 -0
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +81 -16
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +97 -4
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +6 -10
- package/src/runtime/agent/orchestrator/mcp/client.mjs +7 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +80 -31
- package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +67 -38
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-catalog.mjs +7 -2
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +6 -2
- package/src/runtime/agent/orchestrator/providers/auto-effort.mjs +34 -16
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +31 -4
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +11 -8
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +19 -1
- package/src/runtime/agent/orchestrator/providers/lib/tail-reminder-split.mjs +13 -0
- package/src/runtime/agent/orchestrator/providers/lib/tool-call-wire-ids.mjs +65 -0
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -1
- package/src/runtime/agent/orchestrator/providers/mixdog-local.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +5 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +9 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-retry-profile.mjs +8 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +10 -2
- package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +30 -3
- package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-responses-input.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +61 -8
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +14 -2
- package/src/runtime/agent/orchestrator/providers/registry.mjs +9 -0
- package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +17 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +90 -24
- package/src/runtime/agent/orchestrator/runtime-core/fs-utils.mjs +8 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +68 -22
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +5 -5
- package/src/runtime/agent/orchestrator/runtime-core/route-context-state.mjs +81 -0
- package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +12 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +17 -6
- package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +41 -10
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +6 -4
- package/src/runtime/agent/orchestrator/runtime-core/workflow/packs.mjs +8 -4
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/agent-mode.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/agent-room-supervisor.d.mts +1 -1
- package/src/runtime/agent/orchestrator/session/agent-room-supervisor.mjs +22 -4
- package/src/runtime/agent/orchestrator/session/agent-room.d.mts +21 -2
- package/src/runtime/agent/orchestrator/session/agent-room.mjs +149 -45
- package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +80 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +14 -11
- package/src/runtime/agent/orchestrator/session/compact/forked-summary.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +68 -18
- package/src/runtime/agent/orchestrator/session/compact/summary-mode.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +87 -0
- package/src/runtime/agent/orchestrator/session/compact/summary.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +41 -10
- package/src/runtime/agent/orchestrator/session/human-gate/delegation.mjs +230 -0
- package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +156 -25
- package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +20 -0
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +21 -9
- package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +73 -0
- package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +55 -27
- package/src/runtime/agent/orchestrator/session/human-gate/unattended-port.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +189 -105
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +9 -0
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +6 -2
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +111 -9
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +11 -14
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +38 -5
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +21 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +12 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +11 -5
- package/src/runtime/agent/orchestrator/session/loop/usage.mjs +46 -4
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +13 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-commit.mjs +18 -8
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +44 -18
- package/src/runtime/agent/orchestrator/session/manager/orchestration-mode-switch-notice.mjs +99 -0
- package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +42 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +3 -9
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-file.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +5 -3
- package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +50 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +40 -1
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +12 -0
- package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +20 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +62 -47
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +6 -8
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +12 -1
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +6 -15
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +7 -1
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +24 -8
- package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs +94 -13
- package/src/runtime/agent/orchestrator/session/mixy-name.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +42 -10
- package/src/runtime/agent/orchestrator/session/provider-prefix-guard.mjs +21 -3
- package/src/runtime/agent/orchestrator/session/routine-result.d.mts +35 -4
- package/src/runtime/agent/orchestrator/session/routine-result.mjs +179 -16
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +41 -7
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +10 -2
- package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +14 -2
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +15 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +8 -3
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +36 -1
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +40 -5
- package/src/runtime/agent/orchestrator/session/store-summary-last-message.mjs +47 -2
- package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +125 -0
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +78 -43
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +49 -14
- package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +134 -17
- package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +35 -13
- package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +25 -5
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +13 -14
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/transport-artifacts.mjs +9 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +19 -14
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +6 -14
- package/src/runtime/agent/orchestrator/tools/builtin/pdf-test-fixtures.mjs +5 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-image.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-media.mjs +47 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +264 -87
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +10 -4
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +34 -21
- package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +8 -4
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +9 -30
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +24 -12
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +3 -2
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/patch/delete-quarantine.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/patch/replay-capture.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/patch/rollback-state.mjs +33 -2
- package/src/runtime/agent/orchestrator/tools/patch-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +5 -3
- package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +3 -1
- package/src/runtime/attachments/attachment-reference.mjs +155 -0
- package/src/runtime/attachments/limits.mjs +5 -1
- package/src/runtime/attachments/office-extract.mjs +3 -6
- package/src/runtime/attachments/pdf-extract.mjs +84 -10
- package/src/runtime/attachments/store.mjs +55 -30
- package/src/runtime/browser-bridge/client.mjs +73 -20
- package/src/runtime/channels/lib/runtime-paths.mjs +1 -1
- package/src/runtime/channels/lib/scheduler.mjs +14 -7
- package/src/runtime/channels/lib/state-file.mjs +15 -15
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +14 -13
- package/src/runtime/channels/lib/webhook/relay-tunnel.mjs +22 -18
- package/src/runtime/channels/lib/webhook/session-dispatch.mjs +14 -36
- package/src/runtime/channels/lib/worker-main.mjs +3 -2
- package/src/runtime/effort-judge/compact-tokenizer.mjs +8 -2
- package/src/runtime/effort-judge/judge-client.mjs +6 -3
- package/src/runtime/effort-judge/model-install.mjs +16 -8
- package/src/runtime/effort-judge/model-manifest.json +7 -7
- package/src/runtime/local-provider/asset-installer.mjs +10 -4
- package/src/runtime/local-provider/catalog.mjs +5 -2
- package/src/runtime/local-provider/registered-models.mjs +64 -27
- package/src/runtime/local-provider/server.mjs +2 -3
- package/src/runtime/media/adapters/image-api.mjs +89 -0
- package/src/runtime/media/auth.mjs +64 -1
- package/src/runtime/media/catalog.mjs +66 -4
- package/src/runtime/media/jobs.mjs +4 -0
- package/src/runtime/media/lanes.mjs +46 -5
- package/src/runtime/media/media-usage.mjs +17 -0
- package/src/runtime/media/renditions.mjs +15 -15
- package/src/runtime/media/store.mjs +36 -35
- package/src/runtime/media/tool.mjs +8 -1
- package/src/runtime/memory/lib/cycle-scheduler/health-ledger.mjs +8 -2
- package/src/runtime/memory/lib/embedding-model-files.mjs +30 -7
- package/src/runtime/memory/lib/ingest/transcript-tail.mjs +16 -7
- package/src/runtime/memory/lib/pg/process.mjs +8 -4
- package/src/runtime/memory/lib/project-id-resolver.mjs +5 -1
- package/src/runtime/memory/lib/runtime-fetcher.mjs +6 -1
- package/src/runtime/office/core/journal.mjs +7 -14
- package/src/runtime/office/design/library/design-library-core.mjs +4 -16
- package/src/runtime/office/pdf/ocr-engine-worker.mjs +37 -0
- package/src/runtime/office/pdf/ocr-engine.mjs +146 -0
- package/src/runtime/office/pdf/pdf-ocr.mjs +51 -21
- package/src/runtime/office/pdf/pdf-render.mjs +30 -18
- package/src/runtime/office/portable/ooxml-validator.mjs +2 -2
- package/src/runtime/office/portable/portable-soffice.mjs +4 -0
- package/src/runtime/shared/agent-kind-migration.mjs +200 -0
- package/src/runtime/shared/agent-kind.mjs +152 -0
- package/src/runtime/shared/agent-message-envelope.d.mts +6 -0
- package/src/runtime/shared/agent-message-envelope.mjs +44 -0
- package/src/runtime/shared/agent-reap-state.d.mts +4 -0
- package/src/runtime/shared/agent-route-config.d.mts +1 -0
- package/src/runtime/shared/agent-route-config.mjs +22 -8
- package/src/runtime/shared/agent-store.mjs +149 -0
- package/src/runtime/shared/agent-task-starts.mjs +27 -0
- package/src/runtime/shared/atomic-file.d.mts +50 -0
- package/src/runtime/shared/atomic-file.mjs +394 -132
- package/src/runtime/shared/background-tasks.mjs +7 -4
- package/src/runtime/shared/bot-hops.mjs +30 -0
- package/src/runtime/shared/bot-split-migration.mjs +457 -0
- package/src/runtime/shared/bounded-download.mjs +4 -2
- package/src/runtime/shared/config-patch.mjs +20 -1
- package/src/runtime/shared/config.mjs +39 -9
- package/src/runtime/shared/connector-catalog.d.mts +1 -2
- package/src/runtime/shared/connector-catalog.mjs +2 -4
- package/src/runtime/shared/connector-triggers.mjs +2 -0
- package/src/runtime/shared/defaults-separation.mjs +6 -2
- package/src/runtime/shared/delegated-approval-host.mjs +74 -0
- package/src/runtime/shared/err-text.mjs +7 -1
- package/src/runtime/shared/error-presentation.mjs +113 -10
- package/src/runtime/shared/file-has-data.mjs +28 -0
- package/src/runtime/shared/handoff-artifacts.d.mts +20 -0
- package/src/runtime/shared/handoff-artifacts.mjs +61 -0
- package/src/runtime/shared/llm/provider-model-identities.mjs +6 -1
- package/src/runtime/shared/llm/usage-accounting.mjs +7 -1
- package/src/runtime/shared/llm/usage-ledger-import.mjs +37 -18
- package/src/runtime/shared/model-route-fallback.mjs +79 -7
- package/src/runtime/shared/pending-agent-work.mjs +54 -0
- package/src/runtime/shared/plain-preview.mjs +22 -17
- package/src/runtime/shared/process-lifecycle.mjs +8 -12
- package/src/runtime/shared/projects.mjs +50 -41
- package/src/runtime/shared/provider-accounts.mjs +17 -12
- package/src/runtime/shared/routine-trigger.d.mts +6 -1
- package/src/runtime/shared/routine-trigger.mjs +14 -6
- package/src/runtime/shared/run-child.d.mts +3 -0
- package/src/runtime/shared/run-child.mjs +24 -3
- package/src/runtime/shared/sensitive-path-rules.d.mts +15 -0
- package/src/runtime/shared/sensitive-path-rules.mjs +256 -0
- package/src/runtime/shared/session-baseline-store.mjs +8 -2
- package/src/runtime/shared/singleton-owner.mjs +7 -6
- package/src/runtime/shared/skill-tool-dependencies.mjs +4 -10
- package/src/runtime/shared/staged-update.mjs +4 -2
- package/src/runtime/shared/statusline/statusline-segments.mjs +4 -15
- package/src/runtime/shared/tool-execution-contract.mjs +6 -0
- package/src/runtime/shared/transcript-metadata.mjs +28 -3
- package/src/runtime/shared/transcript-writer/session-record.mjs +7 -6
- package/src/runtime/shared/turn-snapshot-store.mjs +5 -4
- package/src/runtime/shared/turn-snapshot.mjs +44 -2
- package/src/runtime/shared/usage-readout-totals.mjs +15 -13
- package/src/runtime/shared/user-cwd.mjs +9 -4
- package/src/runtime/shared/user-data-guard.mjs +46 -44
- package/src/runtime/shared/utf8-cut.mjs +10 -0
- package/src/runtime/shared/worktrees/activity-gate.mjs +269 -61
- package/src/runtime/shared/worktrees/registry.mjs +26 -26
- package/src/runtime/tidy/core-install.mjs +26 -4
- package/src/runtime/tidy/install.mjs +91 -23
- package/src/runtime/web-search/lib/config.mjs +4 -16
- package/src/session-runtime/agent-home-delivery.mjs +859 -136
- package/src/session-runtime/agent-room-delivery.mjs +167 -19
- package/src/session-runtime/agent-task-sessions.mjs +831 -69
- package/src/session-runtime/agent-tool-routing.mjs +1 -0
- package/src/session-runtime/boot/apis.mjs +58 -24
- package/src/session-runtime/boot/config.mjs +1 -0
- package/src/session-runtime/boot/facade.mjs +11 -1
- package/src/session-runtime/boot/infrastructure.mjs +14 -2
- package/src/session-runtime/boot/providers.mjs +16 -6
- package/src/session-runtime/boot/shared.mjs +12 -6
- package/src/session-runtime/boot/tools.mjs +2 -2
- package/src/session-runtime/bot-status.mjs +432 -0
- package/src/session-runtime/config-lifecycle/lead-route-sync.mjs +29 -0
- package/src/session-runtime/config-lifecycle.mjs +78 -32
- package/src/session-runtime/cwd-plugins/core-memory-context.mjs +2 -4
- package/src/session-runtime/handoff-attachments.mjs +593 -0
- package/src/session-runtime/held-requests.mjs +36 -33
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +10 -1
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -2
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +45 -6
- package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
- package/src/session-runtime/lifecycle/teardown.mjs +11 -3
- package/src/session-runtime/mcp-glue/connect.mjs +100 -186
- package/src/session-runtime/mcp-glue/initial-connect-gate.mjs +57 -0
- package/src/session-runtime/mcp-glue/server-connection.mjs +71 -0
- package/src/session-runtime/media-api.mjs +5 -2
- package/src/session-runtime/model-route/route-persist.mjs +2 -2
- package/src/session-runtime/model-route/route-tuning.mjs +11 -2
- package/src/session-runtime/model-route/set-route.mjs +82 -2
- package/src/session-runtime/native-web-search.mjs +2 -2
- package/src/session-runtime/new-session-config.mjs +6 -1
- package/src/session-runtime/owned-automation-run.mjs +8 -1
- package/src/session-runtime/room-member-gate.mjs +16 -3
- package/src/session-runtime/route-resolution.mjs +21 -19
- package/src/session-runtime/route-state.mjs +1 -59
- package/src/session-runtime/routine-home-turn.mjs +5 -3
- package/src/session-runtime/runtime-bootstrap.mjs +5 -3
- package/src/session-runtime/runtime-paths.mjs +11 -5
- package/src/session-runtime/runtime-tunables.mjs +6 -0
- package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +11 -2
- package/src/session-runtime/services/agent-tool/close-flow.mjs +4 -2
- package/src/session-runtime/services/agent-tool/execute-send.mjs +1 -0
- package/src/session-runtime/services/agent-tool/execute-spawn.mjs +1 -0
- package/src/session-runtime/services/agent-tool/helpers.mjs +24 -5
- package/src/session-runtime/services/agent-tool/restart-notify.mjs +10 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +36 -24
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +4 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +6 -3
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +12 -6
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +5 -8
- package/src/session-runtime/services/agent-tool/tool-def.mjs +7 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +22 -2
- package/src/session-runtime/services/agent-tool/worker-index.mjs +4 -6
- package/src/session-runtime/services/agent-tool.mjs +6 -0
- package/src/session-runtime/services/daemon-crash-capture/daemon-exit-record.mjs +1 -1
- package/src/session-runtime/services/daemon-crash-capture/retention.mjs +4 -3
- package/src/session-runtime/services/hook-bus/config-loader.mjs +14 -5
- package/src/session-runtime/services/hook-bus/rule-file.mjs +49 -11
- package/src/session-runtime/services/plugin-admin.mjs +26 -26
- package/src/session-runtime/services/provider-admin.mjs +14 -4
- package/src/session-runtime/services/schedule-access.mjs +33 -4
- package/src/session-runtime/services/seeds.mjs +4 -3
- package/src/session-runtime/services/usage-dashboard.mjs +1 -1
- package/src/session-runtime/services/usage-stats-model.mjs +2 -1
- package/src/session-runtime/session-create/materialize.mjs +2 -3
- package/src/session-runtime/session-create/session-options.mjs +15 -2
- package/src/session-runtime/settings-builtin-tools-api.mjs +63 -1
- package/src/session-runtime/settings-compaction-api.mjs +86 -39
- package/src/session-runtime/setup-tool/executor.mjs +20 -3
- package/src/session-runtime/setup-tool/extended-actions.mjs +19 -7
- package/src/session-runtime/setup-tool/settings-contract.mjs +37 -1
- package/src/session-runtime/setup-tool/tool-defs.mjs +20 -3
- package/src/session-runtime/skills-api.mjs +12 -5
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +265 -0
- package/src/session-runtime/tool-policy/mode-switch.mjs +54 -0
- package/src/session-runtime/tool-policy/pending-switches.mjs +59 -0
- package/src/session-runtime/tool-policy/policy-stage.mjs +165 -0
- package/src/session-runtime/tool-policy/session-switches.mjs +169 -0
- package/src/session-runtime/tool-policy/surface-helpers.mjs +114 -0
- package/src/session-runtime/tool-policy/workflow-overlay.mjs +145 -0
- package/src/session-runtime/tool-policy-refresh.mjs +47 -358
- package/src/session-runtime/tool-surface.mjs +5 -3
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +99 -81
- package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
- package/src/session-runtime/turn/turn-run.mjs +2 -1
- package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +54 -7
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +578 -301
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +113 -53
- package/src/session-runtime/workflow-agents-api/onboarding.mjs +11 -4
- package/src/session-runtime/workflow-agents-api/shared.mjs +5 -1
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +14 -1
- package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +6 -3
- package/src/session-runtime/workspace/workspace-state.mjs +7 -6
- package/src/standalone/daemon-agent-control.mjs +4 -1
- package/src/standalone/daemon-session-control.mjs +60 -11
- package/src/standalone/daemon.mjs +34 -4
- package/src/standalone/local-session-runtime.mjs +22 -14
- package/src/standalone/session-client.mjs +7 -2
- package/src/standalone/session-protocol.mjs +7 -0
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +46 -3
- package/src/standalone/session-service/agent-tree.mjs +4 -3
- package/src/standalone/session-service/session-calls/session-turns.mjs +19 -0
- package/src/standalone/session-service.mjs +11 -0
- package/src/standalone/session-state-projection.mjs +19 -9
- package/src/standalone/session-tool-output.mjs +35 -9
- package/src/tui/app/maintenance-pickers/auto-clear-picker.mjs +19 -13
- package/src/tui/app/settings-picker/settings-rows.mjs +2 -2
- package/src/tui/app/slash-commands.mjs +1 -1
- package/src/tui/app/usage-context-panels/context-model.mjs +8 -2
- package/src/tui/dist/index.mjs +599 -342
- package/src/tui/prompt-history-store.mjs +16 -21
- package/src/tui/session/context-state.mjs +4 -0
- package/src/tui/session/notice-surface.mjs +3 -4
- package/src/tui/session/session-api/intake/abort.mjs +19 -1
- package/src/tui/session/session-api/media.mjs +2 -1
- package/src/tui/session/session-api/routes-agent-definitions.mjs +75 -0
- package/src/tui/session/session-api/routes-write.mjs +203 -0
- package/src/tui/session/session-api/routes.mjs +23 -236
- package/src/tui/session/session-api/settings.mjs +14 -1
- package/src/tui/session/session-flow/drain.mjs +28 -3
- package/src/tui/session/session-flow/failed-turn-rewind.mjs +4 -2
- package/src/tui/session/session-flow/queue/take-entries.mjs +8 -0
- package/src/tui/session/session-flow/steering.mjs +8 -3
- package/src/tui/session/tool-approval.mjs +185 -20
- package/src/tui/session/transcript-intake.mjs +4 -0
- package/src/tui/session/turn-live-call.mjs +11 -3
- package/src/tui/session/turn.mjs +36 -17
- package/src/tui/transcript-tool-failures.mjs +8 -2
- package/src/vendor/statusline/src/gateway/route-meta.mjs +7 -8
- package/src/vendor/statusline/src/gateway/session-routes.mjs +6 -7
- package/src/rules/agent-mode/ROUTINE.md +0 -6
|
@@ -1,125 +1,14 @@
|
|
|
1
1
|
// Refresh the empty Lead session's model-facing tool surface and BP1/BP3
|
|
2
2
|
// layers after workflow or search/memory settings change. Conversation
|
|
3
3
|
// sessions keep their frozen schema; the next new session picks up the
|
|
4
|
-
// updated policy. The
|
|
5
|
-
// itself (switchSessionWorkflow
|
|
4
|
+
// updated policy. The exceptions are a workflow or orchestration mode switch
|
|
5
|
+
// made in the session itself (switchSessionWorkflow,
|
|
6
|
+
// switchSessionOrchestrationMode), which that conversation takes as an overlay.
|
|
6
7
|
import { sessionHasConversationMessages } from '../runtime/agent/orchestrator/runtime-core/session-text.mjs';
|
|
7
|
-
import {
|
|
8
|
-
import {
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
} from '../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
|
|
12
|
-
import { deferredSurfaceModeForLead } from '../runtime/agent/orchestrator/runtime-core/effort.mjs';
|
|
13
|
-
import {
|
|
14
|
-
applyInitialDeferredToolManifestToBp2,
|
|
15
|
-
composeSystemPrompt,
|
|
16
|
-
} from '../runtime/agent/orchestrator/context/collect.mjs';
|
|
17
|
-
import { _buildBaseRules } from '../runtime/agent/orchestrator/session/manager/rules-cache.mjs';
|
|
18
|
-
import { sessionRolePromptFields } from '../runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs';
|
|
19
|
-
import {
|
|
20
|
-
delegationDisabled,
|
|
21
|
-
honoredSchemaAllowlist,
|
|
22
|
-
} from '../runtime/agent/orchestrator/session/manager/session-tool-surface.mjs';
|
|
23
|
-
import { finalizeSessionToolList } from '../runtime/agent/orchestrator/session/manager/tool-resolution.mjs';
|
|
24
|
-
import { isAgentOwner } from '../runtime/agent/orchestrator/agent-owner.mjs';
|
|
25
|
-
import {
|
|
26
|
-
AGENT_MODE,
|
|
27
|
-
isRoutineSource,
|
|
28
|
-
resolveSessionMode,
|
|
29
|
-
sessionModeOf,
|
|
30
|
-
} from '../runtime/agent/orchestrator/session/agent-mode.mjs';
|
|
31
|
-
import { unusedModelEditToolName } from '../runtime/shared/edit-tool-dialect.mjs';
|
|
32
|
-
import { MIXY_AGENT_ID } from '../runtime/agent/orchestrator/session/agent-home.mjs';
|
|
33
|
-
import {
|
|
34
|
-
refreshSessionBp3Environment,
|
|
35
|
-
withPresentedWorkspaceSlices,
|
|
36
|
-
} from '../runtime/agent/orchestrator/session/manager/prompt-utils.mjs';
|
|
37
|
-
import { stageWorkflowSwitchNotice } from '../runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs';
|
|
38
|
-
import { markToolSurfaceMigrated } from '../runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs';
|
|
39
|
-
import { agentProfileRevision, leadRosterRevision } from '../runtime/agent/orchestrator/context/role-instructions.mjs';
|
|
40
|
-
import { recordTranscriptBoundary } from './model-route/set-route.mjs';
|
|
41
|
-
|
|
42
|
-
const WORKFLOW_SWITCH_BUSY = 'The session is running a turn; wait for it to finish.';
|
|
43
|
-
const AGENT_PROFILE_INTENT = 'agent_profile';
|
|
44
|
-
|
|
45
|
-
function toolNames(list) {
|
|
46
|
-
return (Array.isArray(list) ? list : [])
|
|
47
|
-
.map((item) => (typeof item === 'string' ? item : item?.name))
|
|
48
|
-
.filter(Boolean);
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
function replaceMessageContent(messages, target, content) {
|
|
52
|
-
const index = messages.indexOf(target);
|
|
53
|
-
if (index < 0) return false;
|
|
54
|
-
messages[index] = { ...target, content };
|
|
55
|
-
return true;
|
|
56
|
-
}
|
|
57
|
-
|
|
58
|
-
function rewriteSystemHeading(session, heading, nextContent) {
|
|
59
|
-
if (!nextContent) return;
|
|
60
|
-
const messages = Array.isArray(session.messages) ? session.messages : [];
|
|
61
|
-
const target = messages.find(
|
|
62
|
-
(message) =>
|
|
63
|
-
message?.role === 'system' && typeof message.content === 'string' && message.content.startsWith(heading)
|
|
64
|
-
);
|
|
65
|
-
if (target) replaceMessageContent(messages, target, nextContent);
|
|
66
|
-
}
|
|
67
|
-
|
|
68
|
-
function bp3Message(session) {
|
|
69
|
-
const messages = Array.isArray(session.messages) ? session.messages : [];
|
|
70
|
-
return (
|
|
71
|
-
messages.find((message) => message?.role === 'system' && message.cacheTier === 'tier3') ||
|
|
72
|
-
messages.find(
|
|
73
|
-
(message) =>
|
|
74
|
-
message?.role === 'system' &&
|
|
75
|
-
typeof message.content === 'string' &&
|
|
76
|
-
message.content.startsWith('# Active Workflow:')
|
|
77
|
-
)
|
|
78
|
-
);
|
|
79
|
-
}
|
|
80
|
-
|
|
81
|
-
// The BP3 core the session's prompt carries now (split layout: the whole
|
|
82
|
-
// tier3 block; combined: the stored core beside the environment).
|
|
83
|
-
function presentedBp3Core(session) {
|
|
84
|
-
return session.bp3EnvSplit === true ? bp3Message(session)?.content : session.bp3CoreContext;
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function rewriteBp3Core(session, nextCore) {
|
|
88
|
-
const messages = Array.isArray(session.messages) ? session.messages : [];
|
|
89
|
-
const bp3 = bp3Message(session);
|
|
90
|
-
if (!bp3 || typeof bp3.content !== 'string') return;
|
|
91
|
-
if (session.bp3EnvSplit === true) {
|
|
92
|
-
// Split layout: the environment lives in its own cacheTier:'env' system
|
|
93
|
-
// block — the tier3 block carries the core only.
|
|
94
|
-
replaceMessageContent(messages, bp3, nextCore || '');
|
|
95
|
-
session.bp3CoreContext = nextCore || '';
|
|
96
|
-
return;
|
|
97
|
-
}
|
|
98
|
-
const env = session.bp3EnvironmentContext || '';
|
|
99
|
-
replaceMessageContent(messages, bp3, [nextCore, env].filter((part) => String(part || '').trim()).join('\n\n---\n\n'));
|
|
100
|
-
session.bp3CoreContext = nextCore || '';
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// A Lead's workflow slices (orchestration, agent and contact catalogs) for its
|
|
104
|
-
// mode, Mixy's with the contacts.
|
|
105
|
-
function leadPartsFor(session, leadPromptParts) {
|
|
106
|
-
return leadPromptParts({
|
|
107
|
-
agentMode: sessionModeOf(session) === AGENT_MODE,
|
|
108
|
-
mixy: resolveSessionMode({ session }).agentId === MIXY_AGENT_ID,
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
// A conversation keeps its `# Session` block: the legacy combined layout
|
|
113
|
-
// rebuilds the tier3 block from the new core (rooted where it was).
|
|
114
|
-
function rewriteConversationBp3Core(session, nextCore) {
|
|
115
|
-
if (session.bp3EnvSplit !== true && typeof session.bp3CoreContext === 'string') {
|
|
116
|
-
const previous = session.bp3CoreContext;
|
|
117
|
-
session.bp3CoreContext = nextCore;
|
|
118
|
-
if (refreshSessionBp3Environment(session, session.cwd)) return;
|
|
119
|
-
session.bp3CoreContext = previous;
|
|
120
|
-
}
|
|
121
|
-
rewriteBp3Core(session, nextCore);
|
|
122
|
-
}
|
|
8
|
+
import { createAgentProfileFold } from './tool-policy/agent-profile-fold.mjs';
|
|
9
|
+
import { createPolicyStage } from './tool-policy/policy-stage.mjs';
|
|
10
|
+
import { createSessionSwitches } from './tool-policy/session-switches.mjs';
|
|
11
|
+
import { rewriteBp3Core } from './tool-policy/surface-helpers.mjs';
|
|
123
12
|
|
|
124
13
|
export function createToolPolicyRefresh({
|
|
125
14
|
getSession,
|
|
@@ -134,41 +23,18 @@ export function createToolPolicyRefresh({
|
|
|
134
23
|
loadInstructionFilesContext,
|
|
135
24
|
activeWorkflowContext,
|
|
136
25
|
invalidatePreSessionToolSurface,
|
|
26
|
+
persistSession,
|
|
137
27
|
}) {
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
disallowedTools: denied,
|
|
149
|
-
ownerIsAgent,
|
|
150
|
-
});
|
|
151
|
-
session.tools = finalizeSessionToolList(session.tools, {
|
|
152
|
-
schemaAllowedTools,
|
|
153
|
-
disallowedTools: denied,
|
|
154
|
-
ownerIsAgent,
|
|
155
|
-
});
|
|
156
|
-
applyDeferredToolSurface(session, deferredSurfaceModeForLead(getMode()), catalogTools, {
|
|
157
|
-
provider: getRoute()?.provider,
|
|
158
|
-
});
|
|
159
|
-
const catalog = Array.isArray(session.deferredToolCatalog) ? session.deferredToolCatalog : [];
|
|
160
|
-
const active = new Set(toolNames(session.tools).concat(toolNames(session.deferredCallableTools)));
|
|
161
|
-
const pool = catalog.map((tool) => String(tool?.name || '')).filter((name) => name && !active.has(name));
|
|
162
|
-
applyInitialDeferredToolManifestToBp2(session, pool, { rebuild: true });
|
|
163
|
-
}
|
|
164
|
-
|
|
165
|
-
async function leadCoreMemoryContext() {
|
|
166
|
-
try {
|
|
167
|
-
return await loadCoreMemoryContext();
|
|
168
|
-
} catch {
|
|
169
|
-
return '';
|
|
170
|
-
}
|
|
171
|
-
}
|
|
28
|
+
const { liveDeniedTools, stagePolicy, applyPolicy } = createPolicyStage({
|
|
29
|
+
getRoute,
|
|
30
|
+
getMode,
|
|
31
|
+
getDataDir,
|
|
32
|
+
modelStandaloneTools,
|
|
33
|
+
featureDisallowedTools,
|
|
34
|
+
loadCoreMemoryContext,
|
|
35
|
+
loadInstructionFilesContext,
|
|
36
|
+
activeWorkflowContext,
|
|
37
|
+
});
|
|
172
38
|
|
|
173
39
|
// A turn is executing from the moment it opens until it settles, even when
|
|
174
40
|
// its transcript holds only notifications (which are not conversation
|
|
@@ -189,84 +55,6 @@ export function createToolPolicyRefresh({
|
|
|
189
55
|
);
|
|
190
56
|
}
|
|
191
57
|
|
|
192
|
-
// The policy `config` gives `session`, computed without touching the
|
|
193
|
-
// session, so a turn that starts during the async rebuild cannot lose tools
|
|
194
|
-
// to it. `conversation`: the rebuilt BP3 core keeps the instruction files
|
|
195
|
-
// and core memory the prompt presents now (withPresentedWorkspaceSlices).
|
|
196
|
-
async function stagePolicy(session, identity, config, { conversation = false } = {}) {
|
|
197
|
-
const ownerIsAgent = isAgentOwner(session);
|
|
198
|
-
const schemaAllowedTools = honoredSchemaAllowlist(session.schemaAllowedTools, {
|
|
199
|
-
ownerIsAgent,
|
|
200
|
-
agent: identity.agent,
|
|
201
|
-
});
|
|
202
|
-
const toolFreeRole = ownerIsAgent && schemaAllowedTools?.length === 0;
|
|
203
|
-
|
|
204
|
-
const {
|
|
205
|
-
summary: workflow,
|
|
206
|
-
leadPromptParts,
|
|
207
|
-
packContext: workflowContext,
|
|
208
|
-
orchestrationMode,
|
|
209
|
-
} = activeWorkflowContext(config, getDataDir());
|
|
210
|
-
const sessionMode = sessionModeOf(session);
|
|
211
|
-
const agentMode = sessionMode === AGENT_MODE;
|
|
212
|
-
const leadWorkflowParts = ownerIsAgent ? {} : leadPartsFor(session, leadPromptParts);
|
|
213
|
-
const denied = [
|
|
214
|
-
...session.callerDisallowedTools,
|
|
215
|
-
...featureDisallowedTools(),
|
|
216
|
-
...(workflow?.delegatesAgents === false ? ['agent'] : []),
|
|
217
|
-
]
|
|
218
|
-
.map((name) => String(name || ''))
|
|
219
|
-
.filter(Boolean);
|
|
220
|
-
|
|
221
|
-
const baseRules =
|
|
222
|
-
identity.skipAgentRules || toolFreeRole
|
|
223
|
-
? ''
|
|
224
|
-
: _buildBaseRules({
|
|
225
|
-
omitTools: [...denied, unusedModelEditToolName(getRoute()?.model)],
|
|
226
|
-
allowTools: schemaAllowedTools,
|
|
227
|
-
provider: getRoute()?.provider,
|
|
228
|
-
model: getRoute()?.model,
|
|
229
|
-
});
|
|
230
|
-
const coreMemoryContext = conversation ? '' : await leadCoreMemoryContext();
|
|
231
|
-
const { sessionMarkerCore } = composeSystemPrompt({
|
|
232
|
-
...sessionRolePromptFields(identity, {
|
|
233
|
-
ownerIsAgent,
|
|
234
|
-
toolFreeRole,
|
|
235
|
-
delegationFree: delegationDisabled(session, ownerIsAgent),
|
|
236
|
-
sessionMode,
|
|
237
|
-
routine: isRoutineSource(session.sourceType),
|
|
238
|
-
}),
|
|
239
|
-
provider: getRoute()?.provider,
|
|
240
|
-
workflowContext,
|
|
241
|
-
...leadWorkflowParts,
|
|
242
|
-
coreMemoryContext,
|
|
243
|
-
// The rebuilt core keeps (or newly applies) the instruction-files
|
|
244
|
-
// setting; agent mode carries none.
|
|
245
|
-
instructionFilesContext:
|
|
246
|
-
conversation || toolFreeRole || agentMode ? null : loadInstructionFilesContext?.(session) || null,
|
|
247
|
-
});
|
|
248
|
-
return {
|
|
249
|
-
workflow,
|
|
250
|
-
orchestrationMode,
|
|
251
|
-
sessionMode,
|
|
252
|
-
denied,
|
|
253
|
-
schemaAllowedTools,
|
|
254
|
-
ownerIsAgent,
|
|
255
|
-
baseRules,
|
|
256
|
-
core: conversation ? withPresentedWorkspaceSlices(session, sessionMarkerCore) : sessionMarkerCore,
|
|
257
|
-
};
|
|
258
|
-
}
|
|
259
|
-
|
|
260
|
-
// Apply a staged policy synchronously; the BP3 core is the caller's.
|
|
261
|
-
function applyPolicy(session, staged) {
|
|
262
|
-
session.workflow = toSessionWorkflowMeta(staged.workflow);
|
|
263
|
-
session.orchestrationMode = staged.orchestrationMode;
|
|
264
|
-
session.sessionMode = staged.sessionMode;
|
|
265
|
-
applyToolDenials(session, staged.denied, staged.schemaAllowedTools, staged.ownerIsAgent);
|
|
266
|
-
rewriteSystemHeading(session, '# Tool Use', staged.baseRules);
|
|
267
|
-
session.updatedAt = Date.now();
|
|
268
|
-
}
|
|
269
|
-
|
|
270
58
|
async function refreshEmptySessionToolPolicy() {
|
|
271
59
|
invalidatePreSessionToolSurface?.();
|
|
272
60
|
const session = getSession?.();
|
|
@@ -284,133 +72,34 @@ export function createToolPolicyRefresh({
|
|
|
284
72
|
return { appliedToCurrentSession: true };
|
|
285
73
|
}
|
|
286
74
|
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
async function switchSessionWorkflow(workflowId) {
|
|
309
|
-
const session = getSession?.();
|
|
310
|
-
if (!session?.id) return null;
|
|
311
|
-
const conversation = () =>
|
|
312
|
-
sessionHasConversationMessages(session) || sessionHasConversationMessages({ messages: session.liveTurnMessages });
|
|
313
|
-
if (!conversation()) return null;
|
|
314
|
-
if (isAgentOwner(session) || sessionModeOf(session) === AGENT_MODE) {
|
|
315
|
-
throw new Error('Only a coding session has a workflow.');
|
|
316
|
-
}
|
|
317
|
-
const identity = session.promptIdentity;
|
|
318
|
-
if (!identity) throw new Error('This session is too old to switch its workflow; start a new task.');
|
|
319
|
-
const busy = () => getSession?.() !== session || turnInFlight(session);
|
|
320
|
-
if (busy()) throw new Error(WORKFLOW_SWITCH_BUSY);
|
|
321
|
-
const config = getConfig();
|
|
322
|
-
const staged = await stagePolicy(
|
|
323
|
-
session,
|
|
324
|
-
identity,
|
|
325
|
-
{ ...config, workflow: { ...(config?.workflow || {}), active: workflowId } },
|
|
326
|
-
{ conversation: true }
|
|
327
|
-
);
|
|
328
|
-
if (busy()) throw new Error(WORKFLOW_SWITCH_BUSY);
|
|
329
|
-
const before = session.workflow;
|
|
330
|
-
const from = before?.id ? before : null;
|
|
331
|
-
applyPolicy(session, staged);
|
|
332
|
-
rewriteConversationBp3Core(session, staged.core);
|
|
333
|
-
// The request prefix changed: drop provider replay state and the context
|
|
334
|
-
// baseline, and tag the next send's expected cache break.
|
|
335
|
-
markToolSurfaceMigrated(session, 'workflow_switch');
|
|
336
|
-
stageWorkflowSwitchNotice(session, from, session.workflow);
|
|
337
|
-
let workflowSwitch = null;
|
|
338
|
-
if (from?.id !== session.workflow.id) {
|
|
339
|
-
workflowSwitch = {
|
|
340
|
-
fromId: from?.id || '',
|
|
341
|
-
from: from?.name || from?.id || '',
|
|
342
|
-
toId: session.workflow.id,
|
|
343
|
-
to: session.workflow.name,
|
|
344
|
-
at: Date.now(),
|
|
345
|
-
};
|
|
346
|
-
recordTranscriptBoundary(session, 'workflowSwitches', workflowSwitch, (entry) => entry?.at === workflowSwitch.at);
|
|
347
|
-
}
|
|
348
|
-
return { appliedToCurrentSession: true, workflow: session.workflow, workflowSwitch };
|
|
349
|
-
}
|
|
350
|
-
|
|
351
|
-
// An agent profile edit that met a running turn: the next turn applies it.
|
|
352
|
-
let agentProfilePending = false;
|
|
353
|
-
|
|
354
|
-
/**
|
|
355
|
-
* Bring a Lead session's prompt to the saved bots — its own agent's
|
|
356
|
-
* persona, AGENT.md and name, and the bot roster its catalogs list — after
|
|
357
|
-
* a bot was saved, created, renamed, archived or restored
|
|
358
|
-
* (agent-profile-changes.mjs), on resume, or at the start of the turn after
|
|
359
|
-
* one that ran through the change (`trigger`: 'save' | 'resume' | 'turn').
|
|
360
|
-
* Two stamps (agentProfileRevision, agentRosterRevision) tell whether
|
|
361
|
-
* anything it embeds changed; a delegated worker keeps its prompt. The core
|
|
362
|
-
* is rebuilt like a workflow switch's (the session's own workflow, the
|
|
363
|
-
* workspace slices the model was told) and replaces the stored one, so the
|
|
364
|
-
* next turn sends it with one provider cache break; nothing is re-read per
|
|
365
|
-
* turn. Tools are untouched. Returns true when the prompt changed.
|
|
366
|
-
*/
|
|
367
|
-
async function refreshAgentProfile({ trigger = 'save' } = {}) {
|
|
368
|
-
const session = getSession?.();
|
|
369
|
-
const identity = session?.promptIdentity;
|
|
370
|
-
const agent = identity?.agent;
|
|
371
|
-
if (!session?.id || !agent || isAgentOwner(session)) return false;
|
|
372
|
-
const revision = agentProfileRevision(agent);
|
|
373
|
-
const config = getConfig();
|
|
374
|
-
const workflowId = session.workflow?.id;
|
|
375
|
-
const workflowConfig = workflowId
|
|
376
|
-
? { ...config, workflow: { ...(config?.workflow || {}), active: workflowId } }
|
|
377
|
-
: config;
|
|
378
|
-
const roster = leadRosterRevision(
|
|
379
|
-
leadPartsFor(session, activeWorkflowContext(workflowConfig, getDataDir()).leadPromptParts)
|
|
380
|
-
);
|
|
381
|
-
if (session.agentProfileRevision === revision && session.agentRosterRevision === roster) return false;
|
|
382
|
-
// A coding session from before profile stamps keeps its prompt when it
|
|
383
|
-
// is reopened; a saved edit still reaches it.
|
|
384
|
-
if (session.agentProfileRevision === undefined && trigger === 'resume' && sessionModeOf(session) !== AGENT_MODE) {
|
|
385
|
-
return false;
|
|
386
|
-
}
|
|
387
|
-
// At a turn's start its own turn is the one counted; nothing runs yet.
|
|
388
|
-
const busy = () => getSession?.() !== session || (trigger !== 'turn' && turnInFlight(session));
|
|
389
|
-
if (busy()) {
|
|
390
|
-
agentProfilePending = true;
|
|
391
|
-
return false;
|
|
392
|
-
}
|
|
393
|
-
const staged = await stagePolicy(session, identity, workflowConfig, { conversation: true });
|
|
394
|
-
if (busy()) {
|
|
395
|
-
agentProfilePending = true;
|
|
396
|
-
return false;
|
|
397
|
-
}
|
|
398
|
-
session.agentProfileRevision = revision;
|
|
399
|
-
session.agentRosterRevision = roster;
|
|
400
|
-
session.updatedAt = Date.now();
|
|
401
|
-
if (staged.core === presentedBp3Core(session)) return false;
|
|
402
|
-
rewriteConversationBp3Core(session, staged.core);
|
|
403
|
-
// The request prefix changed: one cache break, tagged on the next send.
|
|
404
|
-
markToolSurfaceMigrated(session, AGENT_PROFILE_INTENT);
|
|
405
|
-
return true;
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
/** Turn start: apply an edit that arrived while the previous turn ran. */
|
|
409
|
-
async function applyPendingAgentProfile() {
|
|
410
|
-
if (!agentProfilePending) return false;
|
|
411
|
-
agentProfilePending = false;
|
|
412
|
-
return refreshAgentProfile({ trigger: 'turn' });
|
|
413
|
-
}
|
|
75
|
+
const switches = createSessionSwitches({
|
|
76
|
+
getSession,
|
|
77
|
+
getConfig,
|
|
78
|
+
getDataDir,
|
|
79
|
+
modelStandaloneTools,
|
|
80
|
+
activeWorkflowContext,
|
|
81
|
+
persistSession,
|
|
82
|
+
liveDeniedTools,
|
|
83
|
+
turnInFlight,
|
|
84
|
+
});
|
|
85
|
+
const profile = createAgentProfileFold({
|
|
86
|
+
getSession,
|
|
87
|
+
getConfig,
|
|
88
|
+
getDataDir,
|
|
89
|
+
modelStandaloneTools,
|
|
90
|
+
activeWorkflowContext,
|
|
91
|
+
liveDeniedTools,
|
|
92
|
+
stagePolicy,
|
|
93
|
+
applyPolicy,
|
|
94
|
+
turnInFlight,
|
|
95
|
+
});
|
|
414
96
|
|
|
415
|
-
return {
|
|
97
|
+
return {
|
|
98
|
+
refreshEmptySessionToolPolicy,
|
|
99
|
+
switchSessionWorkflow: switches.switchSessionWorkflow,
|
|
100
|
+
switchSessionOrchestrationMode: switches.switchSessionOrchestrationMode,
|
|
101
|
+
applyPendingSessionSwitches: switches.applyPendingSessionSwitches,
|
|
102
|
+
refreshAgentProfile: profile.refreshAgentProfile,
|
|
103
|
+
applyPendingAgentProfile: profile.applyPendingAgentProfile,
|
|
104
|
+
};
|
|
416
105
|
}
|
|
@@ -15,6 +15,7 @@ import {
|
|
|
15
15
|
filterModelToolsForProfile,
|
|
16
16
|
} from '../runtime/agent/orchestrator/runtime-core/tool-profile.mjs';
|
|
17
17
|
import { workflowDisallowsAgentTool } from '../runtime/agent/orchestrator/runtime-core/workflow.mjs';
|
|
18
|
+
import { promptWorkflowOf } from '../runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs';
|
|
18
19
|
import { configuredOrchestrationMode } from '../runtime/shared/orchestration.mjs';
|
|
19
20
|
|
|
20
21
|
export function createToolSurface({
|
|
@@ -35,12 +36,13 @@ export function createToolSurface({
|
|
|
35
36
|
}) {
|
|
36
37
|
let preSessionSurface = null;
|
|
37
38
|
|
|
38
|
-
// A live session keeps its frozen capability
|
|
39
|
-
//
|
|
39
|
+
// A live session keeps its frozen capability (the workflow its prompt was
|
|
40
|
+
// built with, even after a mid-conversation switch); a new session uses
|
|
41
|
+
// current agents. Solo still offers the tool (deferred) for explicit user requests.
|
|
40
42
|
function workflowAllowsAgents() {
|
|
41
43
|
const session = getSession();
|
|
42
44
|
if (session?.id || session?.workflow || session?.orchestrationMode) {
|
|
43
|
-
return !workflowDisallowsAgentTool(session
|
|
45
|
+
return !workflowDisallowsAgentTool(promptWorkflowOf(session));
|
|
44
46
|
}
|
|
45
47
|
return (delegatableAgentIds?.(getConfig(), cfgMod.getPluginData?.() || dataDir).length ?? 1) > 0;
|
|
46
48
|
}
|
|
@@ -5,11 +5,75 @@ import {
|
|
|
5
5
|
} from '../../../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
|
|
6
6
|
import { throwIfAborted } from '../../../runtime/shared/abort-race.mjs';
|
|
7
7
|
|
|
8
|
+
function scheduleFirstTitle(sessionTitles, session0, prompt) {
|
|
9
|
+
let resolve = null;
|
|
10
|
+
const after = new Promise((done) => {
|
|
11
|
+
resolve = done;
|
|
12
|
+
});
|
|
13
|
+
const release = () => {
|
|
14
|
+
if (!resolve) return;
|
|
15
|
+
const done = resolve;
|
|
16
|
+
resolve = null;
|
|
17
|
+
done();
|
|
18
|
+
};
|
|
19
|
+
try {
|
|
20
|
+
sessionTitles?.scheduleFirst(session0, prompt, { after });
|
|
21
|
+
} catch {
|
|
22
|
+
/* title fallback stays the preview */
|
|
23
|
+
}
|
|
24
|
+
return release;
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
async function foldMcpSurface(turn, session0, scopedMcpTools) {
|
|
28
|
+
// Slower servers remain available through the late-tool path; a reconnect
|
|
29
|
+
// in flight gets the same short TTFT grace BEFORE folding the catalog so it
|
|
30
|
+
// cannot hold the provider request. No reconnect in flight → no-op.
|
|
31
|
+
const awaitGrace = async (options) => {
|
|
32
|
+
try {
|
|
33
|
+
await turn.awaitTurn(() => turn.timing.awaitMcpGrace(options));
|
|
34
|
+
} catch {
|
|
35
|
+
/* gate must never break the turn */
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
if (session0.deferredInitialRefreshPending) {
|
|
39
|
+
// FIRST TURN of a FRESH session (session-local gate, NOT the process-wide
|
|
40
|
+
// firstTurnCompleted): an MCP server may have finished its handshake
|
|
41
|
+
// BETWEEN session-create and this first send. Re-fold the LIVE registry
|
|
42
|
+
// into the INITIAL provider-visible surface (sync, in-place, idempotent).
|
|
43
|
+
// One-shot: cleared before the fold so a throw still never re-runs it,
|
|
44
|
+
// and a resumed session (flag unset) skips straight to the late path.
|
|
45
|
+
session0.deferredInitialRefreshPending = false;
|
|
46
|
+
// A spawned agent runtime owns a fresh MCP scope whose connect starts at
|
|
47
|
+
// its boot, so the 0 ms default grace would hide every MCP tool from the
|
|
48
|
+
// agent's first (often only) turn. Agents are not on the user's TTFT
|
|
49
|
+
// path: wait for the initial connect within the server startup budget.
|
|
50
|
+
const agentOwned = session0.owner === 'agent' || session0.visibility === 'agent-only';
|
|
51
|
+
await awaitGrace({ untilConnected: agentOwned });
|
|
52
|
+
try {
|
|
53
|
+
refreshInitialDeferredMcpSurface(session0, scopedMcpTools(session0));
|
|
54
|
+
} catch {
|
|
55
|
+
/* first-turn MCP fold must never break the turn */
|
|
56
|
+
}
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
await awaitGrace();
|
|
60
|
+
try {
|
|
61
|
+
// Persist a typed world-state delta on the session. askSession attaches
|
|
62
|
+
// it to THIS real prompt; reconciliation itself never enqueues a
|
|
63
|
+
// follow-up turn.
|
|
64
|
+
reconcileDeferredMcpToolCatalog(session0, scopedMcpTools(session0));
|
|
65
|
+
} catch {
|
|
66
|
+
/* MCP delta must never break the turn */
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
8
70
|
// Session preparation before askSession: route readiness, session creation,
|
|
9
71
|
// transcript user row, first title, the MCP surface fold, and the
|
|
10
72
|
// UserPromptSubmit hook.
|
|
11
73
|
export function createTurnPreparation({
|
|
12
74
|
getSession,
|
|
75
|
+
setSession,
|
|
76
|
+
mgr,
|
|
13
77
|
getCurrentCwd,
|
|
14
78
|
awaitRoutePreparation,
|
|
15
79
|
createCurrentSession,
|
|
@@ -25,86 +89,9 @@ export function createTurnPreparation({
|
|
|
25
89
|
admitTurnWorkspace,
|
|
26
90
|
applyPendingRoute,
|
|
27
91
|
applyPendingAgentProfile,
|
|
92
|
+
applyPendingSessionSwitches,
|
|
28
93
|
}) {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
function scheduleFirstTitle(session0, prompt) {
|
|
32
|
-
let resolve = null;
|
|
33
|
-
const after = new Promise((done) => {
|
|
34
|
-
resolve = done;
|
|
35
|
-
});
|
|
36
|
-
const release = () => {
|
|
37
|
-
if (!resolve) return;
|
|
38
|
-
const done = resolve;
|
|
39
|
-
resolve = null;
|
|
40
|
-
done();
|
|
41
|
-
};
|
|
42
|
-
try {
|
|
43
|
-
sessionTitles?.scheduleFirst(session0, prompt, { after });
|
|
44
|
-
} catch {
|
|
45
|
-
/* title fallback stays the preview */
|
|
46
|
-
}
|
|
47
|
-
return release;
|
|
48
|
-
}
|
|
49
|
-
|
|
50
|
-
async function foldMcpSurface(turn, session0) {
|
|
51
|
-
// Slower servers remain available through the late-tool path; a reconnect
|
|
52
|
-
// in flight gets the same short TTFT grace BEFORE folding the catalog so it
|
|
53
|
-
// cannot hold the provider request. No reconnect in flight → no-op.
|
|
54
|
-
const awaitGrace = async (options) => {
|
|
55
|
-
try {
|
|
56
|
-
await turn.awaitTurn(() => turn.timing.awaitMcpGrace(options));
|
|
57
|
-
} catch {
|
|
58
|
-
/* gate must never break the turn */
|
|
59
|
-
}
|
|
60
|
-
};
|
|
61
|
-
if (session0.deferredInitialRefreshPending) {
|
|
62
|
-
// FIRST TURN of a FRESH session (session-local gate, NOT the process-wide
|
|
63
|
-
// firstTurnCompleted): an MCP server may have finished its handshake
|
|
64
|
-
// BETWEEN session-create and this first send. Re-fold the LIVE registry
|
|
65
|
-
// into the INITIAL provider-visible surface (sync, in-place, idempotent).
|
|
66
|
-
// One-shot: cleared before the fold so a throw still never re-runs it,
|
|
67
|
-
// and a resumed session (flag unset) skips straight to the late path.
|
|
68
|
-
session0.deferredInitialRefreshPending = false;
|
|
69
|
-
// A spawned agent runtime owns a fresh MCP scope whose connect starts at
|
|
70
|
-
// its boot, so the 0 ms default grace would hide every MCP tool from the
|
|
71
|
-
// agent's first (often only) turn. Agents are not on the user's TTFT
|
|
72
|
-
// path: wait for the initial connect within the server startup budget.
|
|
73
|
-
const agentOwned = session0.owner === 'agent' || session0.visibility === 'agent-only';
|
|
74
|
-
await awaitGrace({ untilConnected: agentOwned });
|
|
75
|
-
try {
|
|
76
|
-
refreshInitialDeferredMcpSurface(session0, scopedMcpTools(session0));
|
|
77
|
-
} catch {
|
|
78
|
-
/* first-turn MCP fold must never break the turn */
|
|
79
|
-
}
|
|
80
|
-
return;
|
|
81
|
-
}
|
|
82
|
-
await awaitGrace();
|
|
83
|
-
try {
|
|
84
|
-
// Persist a typed world-state delta on the session. askSession attaches
|
|
85
|
-
// it to THIS real prompt; reconciliation itself never enqueues a
|
|
86
|
-
// follow-up turn.
|
|
87
|
-
reconcileDeferredMcpToolCatalog(session0, scopedMcpTools(session0));
|
|
88
|
-
} catch {
|
|
89
|
-
/* MCP delta must never break the turn */
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
// Historical-session resume publishes its transcript immediately while
|
|
94
|
-
// provider/model metadata initializes in the background. Only the next
|
|
95
|
-
// actual turn waits, guaranteeing that it cannot run on a stale route.
|
|
96
|
-
async function prepareSession(turn, prompt, options = {}) {
|
|
97
|
-
// A closing/closed addressed runtime admits no turn (checked again after
|
|
98
|
-
// every await that could have outlived a close).
|
|
99
|
-
assertSessionAdmission?.();
|
|
100
|
-
await turn.awaitTurn(() => awaitRoutePreparation?.());
|
|
101
|
-
assertSessionAdmission?.();
|
|
102
|
-
turn.timing.routeWaitMs = performance.now() - turn.routeStartedAt;
|
|
103
|
-
if (!getSession()?.id) {
|
|
104
|
-
await turn.awaitTurn(() => createCurrentSession('turn', { signal: turn.signal }));
|
|
105
|
-
}
|
|
106
|
-
throwIfAborted(turn.signal);
|
|
107
|
-
assertSessionAdmission?.();
|
|
94
|
+
async function admitWorkspace(turn, prompt, options) {
|
|
108
95
|
// Turn admission: waits while this session's workspace transitions or
|
|
109
96
|
// another session changes the checkout this session works in, then holds
|
|
110
97
|
// the turn registered (released by settleTurn) so no checkout changes
|
|
@@ -131,11 +118,42 @@ export function createTurnPreparation({
|
|
|
131
118
|
throwIfAborted(turn.signal);
|
|
132
119
|
assertSessionAdmission?.();
|
|
133
120
|
}
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
// Historical-session resume publishes its transcript immediately while
|
|
124
|
+
// provider/model metadata initializes in the background. Only the next
|
|
125
|
+
// actual turn waits, guaranteeing that it cannot run on a stale route.
|
|
126
|
+
async function prepareSession(turn, prompt, options = {}) {
|
|
127
|
+
// A closing/closed addressed runtime admits no turn (checked again after
|
|
128
|
+
// every await that could have outlived a close).
|
|
129
|
+
assertSessionAdmission?.();
|
|
130
|
+
await turn.awaitTurn(() => awaitRoutePreparation?.());
|
|
131
|
+
assertSessionAdmission?.();
|
|
132
|
+
turn.timing.routeWaitMs = performance.now() - turn.routeStartedAt;
|
|
133
|
+
if (!getSession()?.id) {
|
|
134
|
+
await turn.awaitTurn(() => createCurrentSession('turn', { signal: turn.signal }));
|
|
135
|
+
}
|
|
136
|
+
throwIfAborted(turn.signal);
|
|
137
|
+
assertSessionAdmission?.();
|
|
138
|
+
// askSession runs the turn on the session the store serves for this id.
|
|
139
|
+
// While this runtime idled, the store's idle sweep may have released the
|
|
140
|
+
// snapshot it holds, and the store then serves a fresh parse of the file:
|
|
141
|
+
// preparing the turn on the held copy would leave its one-shot work (the
|
|
142
|
+
// first-turn MCP fold, its flag) undone on the turn's session, which then
|
|
143
|
+
// rewrites the prompt it already sent on the next turn. Prepare the turn
|
|
144
|
+
// on the session it runs on (as completeTurn adopts it afterwards).
|
|
145
|
+
const stored = mgr.getSession(getSession().id);
|
|
146
|
+
if (stored && stored !== getSession()) setSession(stored);
|
|
147
|
+
await admitWorkspace(turn, prompt, options);
|
|
134
148
|
const modelSwitch = applyPendingRoute?.();
|
|
149
|
+
// An orchestration mode or workflow chosen while the previous turn ran
|
|
150
|
+
// applies from this one (before a cold-cache fold can take it in).
|
|
151
|
+
const sessionSwitches = applyPendingSessionSwitches?.();
|
|
135
152
|
// An agent profile saved while the previous turn ran applies from this one.
|
|
136
153
|
await applyPendingAgentProfile?.();
|
|
137
154
|
options.onRouteApplied?.(getSession());
|
|
138
155
|
if (modelSwitch) options.onModelSwitch?.(modelSwitch);
|
|
156
|
+
if (sessionSwitches) options.onSessionSwitches?.(sessionSwitches);
|
|
139
157
|
ensureSessionTranscriptWriter?.();
|
|
140
158
|
transcript.appendUser(prompt);
|
|
141
159
|
const session0 = getSession();
|
|
@@ -144,8 +162,8 @@ export function createTurnPreparation({
|
|
|
144
162
|
// preparation. Worker apply_patch diffs bind to this generation and cannot
|
|
145
163
|
// leak into the next turn/session.
|
|
146
164
|
turn.snapshot.start(session0?.id);
|
|
147
|
-
turn.releaseFirstTitle = scheduleFirstTitle(session0, prompt);
|
|
148
|
-
await foldMcpSurface(turn, session0);
|
|
165
|
+
turn.releaseFirstTitle = scheduleFirstTitle(sessionTitles, session0, prompt);
|
|
166
|
+
await foldMcpSurface(turn, session0, (session) => scopedMcpToolsFor(session, getConfig()));
|
|
149
167
|
hooks.emit('turn:start', { sessionId: session0.id, prompt, cwd: getCurrentCwd() });
|
|
150
168
|
try {
|
|
151
169
|
agentTool?.upsertLeadSession?.(session0, {
|