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
|
@@ -0,0 +1,169 @@
|
|
|
1
|
+
// Mid-conversation workflow and orchestration-mode switches of a coding
|
|
2
|
+
// session (see createToolPolicyRefresh for the cache contract they share).
|
|
3
|
+
import { sessionHasConversationMessages } from '../../runtime/agent/orchestrator/runtime-core/session-text.mjs';
|
|
4
|
+
import { toSessionWorkflowMeta } from '../../runtime/agent/orchestrator/runtime-core/workflow.mjs';
|
|
5
|
+
import { isAgentOwner } from '../../runtime/agent/orchestrator/agent-owner.mjs';
|
|
6
|
+
import { AGENT_MODE, sessionModeOf } from '../../runtime/agent/orchestrator/session/agent-mode.mjs';
|
|
7
|
+
import { applyOrchestrationModeSwitch } from './mode-switch.mjs';
|
|
8
|
+
import { createPendingSwitchApplier } from './pending-switches.mjs';
|
|
9
|
+
import { configForSession, configForWorkflow, currentMode, leadPartsFor } from './surface-helpers.mjs';
|
|
10
|
+
import { createWorkflowOverlay } from './workflow-overlay.mjs';
|
|
11
|
+
|
|
12
|
+
// The session a mid-conversation switch applies to: a coding session with a
|
|
13
|
+
// conversation (null: none, the caller's empty-session path applies);
|
|
14
|
+
// anything else cannot switch.
|
|
15
|
+
function switchableConversation(session, what) {
|
|
16
|
+
if (!session?.id) return false;
|
|
17
|
+
if (
|
|
18
|
+
!sessionHasConversationMessages(session) &&
|
|
19
|
+
!sessionHasConversationMessages({ messages: session.liveTurnMessages })
|
|
20
|
+
) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
if (isAgentOwner(session) || sessionModeOf(session) === AGENT_MODE) {
|
|
24
|
+
throw new Error(`Only a coding session has a ${what}.`);
|
|
25
|
+
}
|
|
26
|
+
if (!session.promptIdentity) throw new Error(`This session is too old to switch its ${what}; start a new task.`);
|
|
27
|
+
return true;
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
// A choice made while a turn runs waits for the next turn: the latest one
|
|
31
|
+
// wins and a choice of what the session already runs cancels it.
|
|
32
|
+
function stagePendingSwitch(session, field, value, current) {
|
|
33
|
+
if (value === current) delete session[field];
|
|
34
|
+
else session[field] = value;
|
|
35
|
+
session.updatedAt = Date.now();
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
export function createSessionSwitches({
|
|
39
|
+
getSession,
|
|
40
|
+
getConfig,
|
|
41
|
+
getDataDir,
|
|
42
|
+
modelStandaloneTools,
|
|
43
|
+
activeWorkflowContext,
|
|
44
|
+
persistSession,
|
|
45
|
+
liveDeniedTools,
|
|
46
|
+
turnInFlight,
|
|
47
|
+
}) {
|
|
48
|
+
const { applyWorkflowSwitch } = createWorkflowOverlay({
|
|
49
|
+
liveDeniedTools,
|
|
50
|
+
modelStandaloneTools,
|
|
51
|
+
});
|
|
52
|
+
|
|
53
|
+
// The workflow `workflowId` names with orchestration mode `mode`, and its
|
|
54
|
+
// Lead prompt parts, read before anything changes. The pack loader falls
|
|
55
|
+
// back to the default pack for a missing id, so a different id is a gone one.
|
|
56
|
+
function resolveWorkflow(session, workflowId, mode) {
|
|
57
|
+
const target = activeWorkflowContext(configForSession(getConfig(), workflowId, mode), getDataDir());
|
|
58
|
+
if (target.summary?.id !== workflowId) throw new Error(`workflow "${workflowId}" not found`);
|
|
59
|
+
return { target, parts: leadPartsFor(session, target.leadPromptParts) };
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
// The shared flow of a mid-conversation switch: null without a conversation;
|
|
63
|
+
// while a turn runs the choice is staged, else applied; saved either way.
|
|
64
|
+
async function switchConversation(what, { pendingField, value, current, deferredResult, apply }) {
|
|
65
|
+
const session = getSession?.();
|
|
66
|
+
if (!switchableConversation(session, what)) return null;
|
|
67
|
+
let result;
|
|
68
|
+
if (turnInFlight(session)) {
|
|
69
|
+
stagePendingSwitch(session, pendingField, value, current(session));
|
|
70
|
+
result = deferredResult(session);
|
|
71
|
+
} else {
|
|
72
|
+
result = apply(session);
|
|
73
|
+
}
|
|
74
|
+
await persistSession(session);
|
|
75
|
+
return result;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
/**
|
|
79
|
+
* Switch the current coding session's workflow mid-conversation (the
|
|
80
|
+
* composer's workflow selector). The request prefix — BP1, BP2, BP3 and the
|
|
81
|
+
* tool schemas — stays byte-identical, so the provider cache survives: the
|
|
82
|
+
* session's workflow metadata changes now, and the next turn carries a
|
|
83
|
+
* self-contained reminder with the new workflow's rules, orchestration,
|
|
84
|
+
* agents and tool changes (manager/workflow-switch-notice.mjs). Tools the new
|
|
85
|
+
* workflow denies keep their schema and are refused at call time; tools it
|
|
86
|
+
* allows that the schema lacks stay unavailable until a new session. The
|
|
87
|
+
* prompt takes the new workflow at the next point where the cache is cold
|
|
88
|
+
* anyway (foldPromptIfCold). Never refused while a turn runs: the choice is
|
|
89
|
+
* staged (`pendingWorkflowId`, the last one wins, a pick of the current
|
|
90
|
+
* workflow cancels it) and applied when the next turn starts
|
|
91
|
+
* (applyPendingSessionSwitches). Either way the session is saved before
|
|
92
|
+
* this returns, so an acknowledged choice outlives a daemon restart. The
|
|
93
|
+
* configured workflow (the default for new sessions) is the caller's and
|
|
94
|
+
* stays as it is; the session keeps its own orchestration mode.
|
|
95
|
+
*
|
|
96
|
+
* Running work is untouched: agents and workers the session started under
|
|
97
|
+
* the old workflow are separate sessions with their own prompts and tools,
|
|
98
|
+
* so they keep running as they are (unlike a working-folder change, running
|
|
99
|
+
* agents never refuse this); only delegation made from the next turn on
|
|
100
|
+
* uses the new surface.
|
|
101
|
+
*
|
|
102
|
+
* Returns null when the session has no conversation (the caller applies the
|
|
103
|
+
* configured workflow to an empty session as before), else
|
|
104
|
+
* `{ appliedToCurrentSession: true, workflow, workflowSwitch }` where
|
|
105
|
+
* `workflowSwitch` is the transcript boundary (null when unchanged or
|
|
106
|
+
* deferred; a deferred switch answers `deferred: true` and the workflow
|
|
107
|
+
* the session will run).
|
|
108
|
+
*/
|
|
109
|
+
async function switchSessionWorkflow(workflowId) {
|
|
110
|
+
return switchConversation('workflow', {
|
|
111
|
+
pendingField: 'pendingWorkflowId',
|
|
112
|
+
value: workflowId,
|
|
113
|
+
current: (session) => session.workflow?.id,
|
|
114
|
+
deferredResult: (session) => {
|
|
115
|
+
const shown = session.pendingWorkflowId
|
|
116
|
+
? toSessionWorkflowMeta(
|
|
117
|
+
activeWorkflowContext(configForWorkflow(getConfig(), session.pendingWorkflowId), getDataDir()).summary
|
|
118
|
+
)
|
|
119
|
+
: session.workflow;
|
|
120
|
+
return { appliedToCurrentSession: true, deferred: true, workflow: shown, workflowSwitch: null };
|
|
121
|
+
},
|
|
122
|
+
apply: (session) => {
|
|
123
|
+
const resolved = resolveWorkflow(session, workflowId, currentMode(session));
|
|
124
|
+
delete session.pendingWorkflowId;
|
|
125
|
+
return applyWorkflowSwitch(session, resolved);
|
|
126
|
+
},
|
|
127
|
+
});
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
/**
|
|
131
|
+
* Switch the current coding session's orchestration (delegation) mode
|
|
132
|
+
* mid-conversation, on the workflow switch's pattern: the request prefix
|
|
133
|
+
* stays byte-identical, the session's mode changes now, and the next turn
|
|
134
|
+
* carries a reminder with the new mode's rules (the block BP3 carries;
|
|
135
|
+
* manager/orchestration-mode-switch-notice.mjs). The mode never changes
|
|
136
|
+
* which tools may run — Solo still lets the Lead load `agent` when the user
|
|
137
|
+
* asks — only how eagerly delegation is offered: the eager/deferred split
|
|
138
|
+
* stays the prompt's (tool-catalog.mjs), so a mode that delegates while the
|
|
139
|
+
* schema holds `agent` only as a deferred tool tells the model to load it.
|
|
140
|
+
* Back on the prompt's mode the overlay is dropped; the prompt takes the
|
|
141
|
+
* new mode at the next cold point (foldPromptIfCold). While a turn runs the
|
|
142
|
+
* choice waits for the next turn (stagePendingSwitch). Either way the
|
|
143
|
+
* session is saved before this returns. The configured mode (the default
|
|
144
|
+
* for new sessions) is the caller's and stays as it is.
|
|
145
|
+
* Returns null without a conversation (the caller's empty-session path),
|
|
146
|
+
* else `{ appliedToCurrentSession: true, mode, orchestrationModeSwitch }`.
|
|
147
|
+
*/
|
|
148
|
+
async function switchSessionOrchestrationMode(mode) {
|
|
149
|
+
return switchConversation('orchestration mode', {
|
|
150
|
+
pendingField: 'pendingOrchestrationMode',
|
|
151
|
+
value: mode,
|
|
152
|
+
current: currentMode,
|
|
153
|
+
deferredResult: (session) => ({
|
|
154
|
+
appliedToCurrentSession: true,
|
|
155
|
+
deferred: true,
|
|
156
|
+
mode: session.pendingOrchestrationMode ?? currentMode(session),
|
|
157
|
+
orchestrationModeSwitch: null,
|
|
158
|
+
}),
|
|
159
|
+
apply: (session) => {
|
|
160
|
+
delete session.pendingOrchestrationMode;
|
|
161
|
+
return applyOrchestrationModeSwitch(session, mode);
|
|
162
|
+
},
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
const applyPendingSessionSwitches = createPendingSwitchApplier({ getSession, resolveWorkflow, applyWorkflowSwitch });
|
|
167
|
+
|
|
168
|
+
return { switchSessionWorkflow, switchSessionOrchestrationMode, applyPendingSessionSwitches };
|
|
169
|
+
}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
// Pure helpers of the tool-policy refresh: reading a session's tool surface,
|
|
2
|
+
// rewriting its system blocks (BP1 heading, BP3 core), and the configs a
|
|
3
|
+
// session's workflow and orchestration mode give.
|
|
4
|
+
import { AGENT_MODE, resolveSessionMode, sessionModeOf } from '../../runtime/agent/orchestrator/session/agent-mode.mjs';
|
|
5
|
+
import { MIXY_AGENT_ID } from '../../runtime/agent/orchestrator/session/agent-home.mjs';
|
|
6
|
+
import { refreshSessionBp3Environment } from '../../runtime/agent/orchestrator/session/manager/prompt-utils.mjs';
|
|
7
|
+
import { promptOrchestrationModeOf } from '../../runtime/agent/orchestrator/session/manager/orchestration-mode-switch-notice.mjs';
|
|
8
|
+
import { sessionOrchestrationMode } from '../../runtime/shared/orchestration.mjs';
|
|
9
|
+
|
|
10
|
+
export const toolName = (tool) => String(tool?.name || '');
|
|
11
|
+
|
|
12
|
+
// Every tool definition the session's schema or deferred catalogs hold.
|
|
13
|
+
export function schemaTools(session) {
|
|
14
|
+
return [
|
|
15
|
+
...(Array.isArray(session.tools) ? session.tools : []),
|
|
16
|
+
...(Array.isArray(session.deferredToolCatalog) ? session.deferredToolCatalog : []),
|
|
17
|
+
...(Array.isArray(session.deferredLateToolCatalog) ? session.deferredLateToolCatalog : []),
|
|
18
|
+
];
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function toolNames(list) {
|
|
22
|
+
return (Array.isArray(list) ? list : [])
|
|
23
|
+
.map((item) => (typeof item === 'string' ? item : item?.name))
|
|
24
|
+
.filter(Boolean);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function replaceMessageContent(messages, target, content) {
|
|
28
|
+
const index = messages.indexOf(target);
|
|
29
|
+
if (index < 0) return false;
|
|
30
|
+
messages[index] = { ...target, content };
|
|
31
|
+
return true;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export function rewriteSystemHeading(session, heading, nextContent) {
|
|
35
|
+
if (!nextContent) return;
|
|
36
|
+
const messages = Array.isArray(session.messages) ? session.messages : [];
|
|
37
|
+
const target = messages.find(
|
|
38
|
+
(message) =>
|
|
39
|
+
message?.role === 'system' && typeof message.content === 'string' && message.content.startsWith(heading)
|
|
40
|
+
);
|
|
41
|
+
if (target) replaceMessageContent(messages, target, nextContent);
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
function bp3Message(session) {
|
|
45
|
+
const messages = Array.isArray(session.messages) ? session.messages : [];
|
|
46
|
+
return (
|
|
47
|
+
messages.find((message) => message?.role === 'system' && message.cacheTier === 'tier3') ||
|
|
48
|
+
messages.find(
|
|
49
|
+
(message) =>
|
|
50
|
+
message?.role === 'system' &&
|
|
51
|
+
typeof message.content === 'string' &&
|
|
52
|
+
message.content.startsWith('# Active Workflow:')
|
|
53
|
+
)
|
|
54
|
+
);
|
|
55
|
+
}
|
|
56
|
+
|
|
57
|
+
// The BP3 core the session's prompt carries now (split layout: the whole
|
|
58
|
+
// tier3 block; combined: the stored core beside the environment).
|
|
59
|
+
export function presentedBp3Core(session) {
|
|
60
|
+
return session.bp3EnvSplit === true ? bp3Message(session)?.content : session.bp3CoreContext;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
export function rewriteBp3Core(session, nextCore) {
|
|
64
|
+
const messages = Array.isArray(session.messages) ? session.messages : [];
|
|
65
|
+
const bp3 = bp3Message(session);
|
|
66
|
+
if (!bp3 || typeof bp3.content !== 'string') return;
|
|
67
|
+
if (session.bp3EnvSplit === true) {
|
|
68
|
+
// Split layout: the environment lives in its own cacheTier:'env' system
|
|
69
|
+
// block — the tier3 block carries the core only.
|
|
70
|
+
replaceMessageContent(messages, bp3, nextCore || '');
|
|
71
|
+
session.bp3CoreContext = nextCore || '';
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
const env = session.bp3EnvironmentContext || '';
|
|
75
|
+
replaceMessageContent(messages, bp3, [nextCore, env].filter((part) => String(part || '').trim()).join('\n\n---\n\n'));
|
|
76
|
+
session.bp3CoreContext = nextCore || '';
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
// A Lead's workflow slices (orchestration, agent and contact catalogs) for its
|
|
80
|
+
// mode, Mixy's with the contacts.
|
|
81
|
+
export function leadPartsFor(session, leadPromptParts) {
|
|
82
|
+
return leadPromptParts({
|
|
83
|
+
agentMode: sessionModeOf(session) === AGENT_MODE,
|
|
84
|
+
mixy: resolveSessionMode({ session }).agentId === MIXY_AGENT_ID,
|
|
85
|
+
});
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// A conversation keeps its `# Session` block: the legacy combined layout
|
|
89
|
+
// rebuilds the tier3 block from the new core (rooted where it was).
|
|
90
|
+
export function rewriteConversationBp3Core(session, nextCore) {
|
|
91
|
+
if (session.bp3EnvSplit !== true && typeof session.bp3CoreContext === 'string') {
|
|
92
|
+
const previous = session.bp3CoreContext;
|
|
93
|
+
session.bp3CoreContext = nextCore;
|
|
94
|
+
if (refreshSessionBp3Environment(session, session.cwd)) return;
|
|
95
|
+
session.bp3CoreContext = previous;
|
|
96
|
+
}
|
|
97
|
+
rewriteBp3Core(session, nextCore);
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// `config` with `workflowId` as the active workflow (itself when absent).
|
|
101
|
+
export function configForWorkflow(config, workflowId) {
|
|
102
|
+
return workflowId ? { ...config, workflow: { ...(config?.workflow || {}), active: workflowId } } : config;
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
// A conversation's config: its workflow and its own orchestration mode
|
|
106
|
+
// (`mode`), never the configured default for new sessions.
|
|
107
|
+
export function configForSession(config, workflowId, mode) {
|
|
108
|
+
return { ...configForWorkflow(config, workflowId), orchestrationMode: mode };
|
|
109
|
+
}
|
|
110
|
+
|
|
111
|
+
// The session's orchestration mode now (a legacy record derives it).
|
|
112
|
+
export const currentMode = (session) => sessionOrchestrationMode(session);
|
|
113
|
+
// The mode its prompt was built with.
|
|
114
|
+
export const promptMode = (session) => promptOrchestrationModeOf(session) ?? currentMode(session);
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
// Applying a mid-conversation workflow switch: the overlay it lays over the
|
|
2
|
+
// session's prompt, and the tool changes it makes reachable without touching
|
|
3
|
+
// the prefix.
|
|
4
|
+
import { toSessionWorkflowMeta } from '../../runtime/agent/orchestrator/runtime-core/workflow.mjs';
|
|
5
|
+
import {
|
|
6
|
+
promptWorkflowOf,
|
|
7
|
+
stageWorkflowSwitchNotice,
|
|
8
|
+
workflowOverlayContent,
|
|
9
|
+
} from '../../runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs';
|
|
10
|
+
import { mergePendingDeferredToolDelta } from '../../runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs';
|
|
11
|
+
import { recordTranscriptBoundary } from '../model-route/set-route.mjs';
|
|
12
|
+
import { promptMode, schemaTools, toolName } from './surface-helpers.mjs';
|
|
13
|
+
|
|
14
|
+
export function createWorkflowOverlay({ liveDeniedTools, modelStandaloneTools }) {
|
|
15
|
+
// The overlay of a switch to `target` while the prompt carries `prompt`
|
|
16
|
+
// (manager/workflow-switch-notice.mjs): what the reminder tells the Lead and
|
|
17
|
+
// which calls are refused. Nothing in the request prefix moves.
|
|
18
|
+
function workflowOverlay(session, { target, parts }, { prompt, promptOrchestrationMode }) {
|
|
19
|
+
const denied = new Set(liveDeniedTools(session, target.summary).map((name) => name.toLowerCase()));
|
|
20
|
+
const disallowed = new Set((session.disallowedTools || []).map((name) => String(name).toLowerCase()));
|
|
21
|
+
const deniedTools = [
|
|
22
|
+
...new Set(
|
|
23
|
+
schemaTools(session)
|
|
24
|
+
.map(toolName)
|
|
25
|
+
.filter((name) => name && denied.has(name.toLowerCase()) && !disallowed.has(name.toLowerCase()))
|
|
26
|
+
),
|
|
27
|
+
];
|
|
28
|
+
// Tools the new workflow allows that the session's policy denied (`agent`
|
|
29
|
+
// after a switch to a workflow with agents): reachable by deferred loading.
|
|
30
|
+
// `modelStandaloneTools` follows the session's workflow here (the caller
|
|
31
|
+
// drops the old overlay first), so their definitions are current.
|
|
32
|
+
// An earlier switch may have opened one already (workflowOpenedTools).
|
|
33
|
+
const reopened = [
|
|
34
|
+
...new Set([...(session.disallowedTools || []), ...(session.workflowOpenedTools || [])].map(String)),
|
|
35
|
+
].filter((name) => !denied.has(name.toLowerCase()));
|
|
36
|
+
const known = new Set(schemaTools(session).map(toolName));
|
|
37
|
+
const fresh = modelStandaloneTools().filter(
|
|
38
|
+
(tool) => reopened.includes(toolName(tool)) && !known.has(toolName(tool))
|
|
39
|
+
);
|
|
40
|
+
for (const tool of fresh) known.add(toolName(tool));
|
|
41
|
+
const loadableTools = reopened.filter((name) => known.has(name));
|
|
42
|
+
const unavailableTools = reopened.filter((name) => !known.has(name));
|
|
43
|
+
const workflow = { id: target.summary.id, name: target.summary.name || target.summary.id };
|
|
44
|
+
const instructions = [
|
|
45
|
+
target.packContext,
|
|
46
|
+
parts.orchestrationContext ||
|
|
47
|
+
`# Delegation\n\n${workflow.name} has no agents to delegate to: do the work yourself.`,
|
|
48
|
+
parts.agentCatalogContext,
|
|
49
|
+
]
|
|
50
|
+
.map((part) => String(part || '').trim())
|
|
51
|
+
.filter(Boolean)
|
|
52
|
+
.join('\n\n');
|
|
53
|
+
const overlay = {
|
|
54
|
+
prompt,
|
|
55
|
+
promptOrchestrationMode,
|
|
56
|
+
workflow,
|
|
57
|
+
orchestrationMode: target.orchestrationMode,
|
|
58
|
+
deniedTools,
|
|
59
|
+
loadableTools,
|
|
60
|
+
unavailableTools,
|
|
61
|
+
content: workflowOverlayContent({
|
|
62
|
+
promptName: prompt?.name || prompt?.id || 'the previous workflow',
|
|
63
|
+
workflow,
|
|
64
|
+
instructions,
|
|
65
|
+
deniedTools,
|
|
66
|
+
loadableTools,
|
|
67
|
+
unavailableTools,
|
|
68
|
+
}),
|
|
69
|
+
};
|
|
70
|
+
return { overlay, fresh };
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Make a switch's loadable tools reachable without touching the prefix: their
|
|
74
|
+
// definitions join the deferred catalog, the policy stops denying them, and
|
|
75
|
+
// the next turn's deferred_tools_delta names them. Switching back refuses
|
|
76
|
+
// them again (the overlay's deniedTools, or the policy's deny list below).
|
|
77
|
+
function openLoadableTools(session, { loadableTools, fresh }) {
|
|
78
|
+
if (!loadableTools.length) return;
|
|
79
|
+
const opened = session.workflowOpenedTools || [];
|
|
80
|
+
session.workflowOpenedTools = [...new Set([...opened, ...loadableTools])];
|
|
81
|
+
if (fresh.length) session.deferredToolCatalog = [...(session.deferredToolCatalog || []), ...fresh];
|
|
82
|
+
session.disallowedTools = (session.disallowedTools || []).filter((name) => !loadableTools.includes(String(name)));
|
|
83
|
+
const byName = new Map(schemaTools(session).map((tool) => [toolName(tool), tool]));
|
|
84
|
+
// Announced on every switch that opens them: a pending removal (a switch
|
|
85
|
+
// back in between) cancels against it rather than lingering.
|
|
86
|
+
mergePendingDeferredToolDelta(session, {
|
|
87
|
+
added: loadableTools.map((name) => ({ name, description: byName.get(name)?.description || '' })),
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
// Back on the workflow the prompt carries: tools an earlier switch opened
|
|
92
|
+
// that it denies are denied again (call-time refusal; the schema stays).
|
|
93
|
+
function closeReopenedTools(session, target) {
|
|
94
|
+
const denied = new Set(liveDeniedTools(session, target.summary));
|
|
95
|
+
const disallowed = new Set((session.disallowedTools || []).map(String));
|
|
96
|
+
const known = new Set(schemaTools(session).map(toolName));
|
|
97
|
+
const closed = [...denied].filter((name) => known.has(name) && !disallowed.has(name));
|
|
98
|
+
if (!closed.length) return;
|
|
99
|
+
session.disallowedTools = [...disallowed, ...closed];
|
|
100
|
+
mergePendingDeferredToolDelta(session, { removed: closed });
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
function applyWorkflowSwitch(session, resolved) {
|
|
104
|
+
const { target } = resolved;
|
|
105
|
+
const before = session.workflow;
|
|
106
|
+
const from = before?.id ? before : null;
|
|
107
|
+
const prompt = promptWorkflowOf(session);
|
|
108
|
+
const promptOrchestrationMode = promptMode(session);
|
|
109
|
+
session.workflow = toSessionWorkflowMeta(target.summary);
|
|
110
|
+
session.orchestrationMode = target.orchestrationMode;
|
|
111
|
+
delete session.workflowOverlay;
|
|
112
|
+
if (session.workflow.id === prompt?.id) closeReopenedTools(session, target);
|
|
113
|
+
else {
|
|
114
|
+
const { overlay, fresh } = workflowOverlay(session, resolved, { prompt, promptOrchestrationMode });
|
|
115
|
+
openLoadableTools(session, { loadableTools: overlay.loadableTools, fresh });
|
|
116
|
+
session.workflowOverlay = overlay;
|
|
117
|
+
}
|
|
118
|
+
session.updatedAt = Date.now();
|
|
119
|
+
stageWorkflowSwitchNotice(session, from, session.workflow);
|
|
120
|
+
let workflowSwitch = null;
|
|
121
|
+
if (from?.id !== session.workflow.id) {
|
|
122
|
+
workflowSwitch = {
|
|
123
|
+
fromId: from?.id || '',
|
|
124
|
+
from: from?.name || from?.id || '',
|
|
125
|
+
toId: session.workflow.id,
|
|
126
|
+
to: session.workflow.name,
|
|
127
|
+
at: Date.now(),
|
|
128
|
+
};
|
|
129
|
+
// Two switches can land in the same millisecond (A→B→A): the same
|
|
130
|
+
// switch is a repeat only when its direction matches too.
|
|
131
|
+
recordTranscriptBoundary(
|
|
132
|
+
session,
|
|
133
|
+
'workflowSwitches',
|
|
134
|
+
workflowSwitch,
|
|
135
|
+
(entry) =>
|
|
136
|
+
entry?.at === workflowSwitch.at &&
|
|
137
|
+
entry?.fromId === workflowSwitch.fromId &&
|
|
138
|
+
entry?.toId === workflowSwitch.toId
|
|
139
|
+
);
|
|
140
|
+
}
|
|
141
|
+
return { appliedToCurrentSession: true, workflow: session.workflow, workflowSwitch };
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return { applyWorkflowSwitch };
|
|
145
|
+
}
|