mixdog 1.4.1 → 1.4.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +4 -3
- package/scripts/build-shipped-history.mjs +125 -33
- package/scripts/gate-local.mjs +220 -63
- package/scripts/graph-parity.mjs +8 -3
- package/scripts/lib/gate-scheduler.mjs +139 -32
- package/scripts/lib/gate-timing-reporter.mjs +16 -0
- package/scripts/lib/run-node-tests.mjs +71 -34
- package/scripts/lib/scoped-temp.mjs +1 -0
- package/scripts/lib/test-failure-records.mjs +14 -1
- package/scripts/lib/test-failure-summary.mjs +9 -4
- package/scripts/lib/test-spawn-ledger.mjs +43 -3
- package/scripts/post-release-check.mjs +26 -16
- package/scripts/pptx-kit-index.mjs +5 -6
- package/scripts/provider-pingpong-live.mjs +1 -1
- package/scripts/prune-embedding-runtime.mjs +3 -1
- package/scripts/release-paths.mjs +7 -1
- package/scripts/suite-health.mjs +110 -28
- package/scripts/test.mjs +9 -14
- package/src/agents/advisor/AGENT.md +4 -4
- package/src/agents/advisor/agent.json +1 -1
- package/src/agents/explore/AGENT.md +22 -0
- package/src/agents/explore/agent.json +6 -0
- package/src/cli.mjs +7 -0
- package/src/defaults/agents.json +7 -0
- package/src/defaults/shipped-history.json +38 -2
- package/src/defaults/skills/browser-use/SKILL.md +4 -1
- package/src/defaults/skills/code-tidy/SKILL.md +71 -102
- package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
- package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
- package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
- package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
- package/src/defaults/skills/computer-use/SKILL.md +12 -2
- package/src/defaults/skills/setup/SKILL.md +2 -2
- package/src/defaults/skills/setup/references/actions.md +28 -9
- package/src/defaults/skills/setup/references/surfaces.md +5 -2
- package/src/defaults/skills/setup-guide/SKILL.md +11 -3
- package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
- package/src/defaults/skills/skill-creator/SKILL.md +85 -190
- package/src/defaults/skills/skill-creator/references/design.md +70 -162
- package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
- package/src/defaults/skills/test-suite/SKILL.md +194 -0
- package/src/defaults/skills/test-suite/references/case-management.md +51 -0
- package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
- package/src/defaults/skills/test-suite/references/reliability.md +49 -0
- package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
- package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
- package/src/defaults/skills/visualize/SKILL.md +6 -2
- package/src/lib/instruction-text.cjs +36 -0
- package/src/lib/rules-builder.cjs +40 -50
- package/src/orchestration/balanced.md +23 -0
- package/src/orchestration/focused.md +22 -0
- package/src/orchestration/none.md +5 -0
- package/src/orchestration/swarm.md +24 -0
- package/src/rules/agent-mode/AGENT_MODE.md +3 -1
- package/src/rules/agent-mode/MIXY.md +2 -2
- package/src/rules/lead/LEAD.md +3 -3
- package/src/rules/shared/20-research.md +3 -6
- package/src/rules/shared/40-editing.md +1 -0
- package/src/rules/shared/60-verification.md +10 -9
- package/src/rules/shared/70-delivery.md +4 -3
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +3 -3
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -2
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +132 -21
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -9
- package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +2 -2
- package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
- package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +67 -0
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
- package/src/runtime/agent/orchestrator/config.mjs +12 -7
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +7 -7
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -30
- package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +124 -12
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +204 -49
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +16 -7
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +157 -57
- package/src/runtime/agent/orchestrator/mcp/client.mjs +54 -23
- package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +1 -1
- package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +8 -2
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +83 -52
- package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +1 -1
- package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +14 -0
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +43 -27
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +43 -8
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +30 -28
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +3 -3
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
- package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +48 -31
- package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
- package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +4 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2784 -2872
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +5 -8
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +26 -28
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +288 -300
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/registry.mjs +33 -2
- package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +576 -0
- package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +10 -30
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +32 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +0 -11
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +8 -0
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +17 -3
- package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +47 -27
- package/src/runtime/agent/orchestrator/runtime-core/goal-deadlines.mjs +141 -10
- package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +26 -63
- package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +28 -3
- package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +36 -11
- package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +88 -56
- package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +51 -32
- package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +45 -145
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +15 -98
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +32 -99
- package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +23 -78
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +69 -47
- package/src/runtime/agent/orchestrator/runtime-core/todo-list.mjs +367 -0
- package/src/runtime/agent/orchestrator/runtime-core/todo-tool-defs.mjs +47 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-availability.mjs +155 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +12 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +119 -35
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +15 -6
- package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +28 -22
- package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +30 -0
- package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
- package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
- package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +94 -10
- package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -12
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +4 -4
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +11 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +6 -6
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +7 -3
- package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +11 -1
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
- package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +37 -8
- package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +11 -1
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +5 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/todo-check.mjs +196 -0
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +116 -50
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +5 -6
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +27 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +18 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
- package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
- package/src/runtime/agent/orchestrator/session/loop/turn-report.mjs +35 -0
- package/src/runtime/agent/orchestrator/session/loop/usage.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +103 -50
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +9 -7
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +21 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +27 -11
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-open.mjs +37 -34
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +25 -15
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +79 -24
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -1
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +9 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/prompt-settings.mjs +598 -0
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +20 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +22 -14
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +12 -0
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +56 -14
- package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +31 -0
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +59 -20
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
- package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +18 -4
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +8 -9
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +339 -88
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +135 -11
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +377 -104
- package/src/runtime/agent/orchestrator/session/manager/turn-durability.mjs +144 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +48 -30
- package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
- package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/mixy-name.mjs +12 -6
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/save-session-worker.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +23 -2
- package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/store/transcript-durability.mjs +88 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +243 -38
- package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +177 -8
- package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
- package/src/runtime/agent/orchestrator/session/store.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +7 -1
- package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +9 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +2 -2
- package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -5
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +21 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/worktree-add-guard.mjs +77 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +42 -28
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +30 -14
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
- package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
- package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +0 -10
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +95 -20
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -24
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary/child-kill.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/modes/symbols.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +4 -5
- package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +3 -4
- package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4 -22
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +105 -15
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +35 -11
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -6
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
- package/src/runtime/attachments/attachment-reference.mjs +1 -1
- package/src/runtime/attachments/pdf-extract.mjs +1 -1
- package/src/runtime/attachments/store.d.mts +1 -0
- package/src/runtime/attachments/store.mjs +2 -2
- package/src/runtime/channels/lib/config-reload-watch.mjs +42 -0
- package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +29 -9
- package/src/runtime/channels/lib/scheduler.mjs +33 -0
- package/src/runtime/channels/lib/schedules-db.mjs +11 -4
- package/src/runtime/channels/lib/webhook/session-dispatch.mjs +4 -1
- package/src/runtime/channels/lib/webhooks-db.mjs +9 -3
- package/src/runtime/channels/lib/whisper-port.mjs +19 -10
- package/src/runtime/channels/lib/whisper-server.mjs +22 -13
- package/src/runtime/channels/lib/worker-main.mjs +9 -31
- package/src/runtime/computer-bridge/linux-readiness.mjs +10 -14
- package/src/runtime/connectors/connector-accounts-mcp.mjs +372 -103
- package/src/runtime/connectors/gmail-app-password.mjs +4 -4
- package/src/runtime/connectors/google-mcp.mjs +1 -1
- package/src/runtime/effort-judge/judge-client.mjs +2 -2
- package/src/runtime/effort-judge/judge-input.mjs +4 -4
- package/src/runtime/explore/explorer.mjs +88 -0
- package/src/runtime/explore/tool-defs.mjs +35 -0
- package/src/runtime/explore/tool.mjs +123 -0
- package/src/runtime/local-provider/hardware.mjs +1 -1
- package/src/runtime/media/adapters/codex-image.mjs +3 -3
- package/src/runtime/media/adapters/gemini-video.mjs +1 -1
- package/src/runtime/media/media-usage.mjs +1 -1
- package/src/runtime/media/store.mjs +1 -1
- package/src/runtime/memory/index.mjs +15 -1
- package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
- package/src/runtime/memory/lib/embedding-reindex.mjs +27 -0
- package/src/runtime/memory/lib/embedding-worker.mjs +4 -0
- package/src/runtime/memory/lib/memory-embed.mjs +83 -14
- package/src/runtime/memory/lib/memory-process-lock.mjs +159 -36
- package/src/runtime/memory/lib/memory-text-utils.mjs +6 -1
- package/src/runtime/memory/lib/memory.mjs +17 -0
- package/src/runtime/memory/lib/pg/process.mjs +1 -1
- package/src/runtime/memory/lib/pg/supervisor.mjs +16 -96
- package/src/runtime/memory/lib/recall-hybrid/hybrid-sql.mjs +12 -3
- package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/pptx-author-action.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-build.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
- package/src/runtime/office/capabilities.mjs +1 -1
- package/src/runtime/office/core/office-core.mjs +1 -1
- package/src/runtime/office/design/content-model.mjs +3 -3
- package/src/runtime/office/design/docx/design-docx/section.mjs +6 -6
- package/src/runtime/office/design/xlsx/design-xlsx-components.mjs +1 -1
- package/src/runtime/office/design/xlsx/design-xlsx.mjs +1 -1
- package/src/runtime/office/pdf/ocr-engine.mjs +1 -1
- package/src/runtime/office/pdf/pdf-writer.mjs +4 -4
- package/src/runtime/office/portable/portable-docx-operations.mjs +2 -2
- package/src/runtime/office/portable/portable-soffice.mjs +8 -6
- package/src/runtime/office/portable/xlsx-contract.mjs +1 -1
- package/src/runtime/office/quality/assurance-structure-docx.mjs +1 -1
- package/src/runtime/shared/agent-route-config.mjs +17 -2
- package/src/runtime/shared/atomic-file.d.mts +8 -0
- package/src/runtime/shared/atomic-file.mjs +103 -2
- package/src/runtime/shared/background-tasks.mjs +37 -10
- package/src/runtime/shared/background-wait.mjs +66 -0
- package/src/runtime/shared/child-guardian.mjs +17 -7
- package/src/runtime/shared/config.mjs +313 -16
- package/src/runtime/shared/connector-accounts.mjs +5 -5
- package/src/runtime/shared/connector-catalog.d.mts +14 -8
- package/src/runtime/shared/connector-catalog.mjs +70 -52
- package/src/runtime/shared/custom-provider-keys.mjs +20 -0
- package/src/runtime/shared/file-has-data.mjs +26 -2
- package/src/runtime/shared/file-lock.mjs +21 -18
- package/src/runtime/shared/git-launch.d.mts +9 -0
- package/src/runtime/shared/git-launch.mjs +213 -0
- package/src/runtime/shared/git-runner-worker.mjs +2 -1
- package/src/runtime/shared/git-runner.mjs +7 -2
- package/src/runtime/shared/idle-gc.mjs +30 -7
- package/src/runtime/shared/llm/cost.mjs +6 -1
- package/src/runtime/shared/llm/http-agent.mjs +316 -29
- package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
- package/src/runtime/shared/llm/model-catalog.mjs +46 -6
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
- package/src/runtime/shared/llm/system-proxy.mjs +453 -0
- package/src/runtime/shared/llm/usage-ledger-quota.mjs +31 -12
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +84 -8
- package/src/runtime/shared/llm/usage-ledger.mjs +3 -0
- package/src/runtime/shared/llm/usage-rollup.mjs +48 -0
- package/src/runtime/shared/maintenance-schedule.mjs +109 -0
- package/src/runtime/shared/process-runner.mjs +8 -4
- package/src/runtime/shared/provider-accounts.mjs +52 -2
- package/src/runtime/shared/routine-trigger.d.mts +13 -0
- package/src/runtime/shared/routine-trigger.mjs +34 -0
- package/src/runtime/shared/run-child.d.mts +2 -1
- package/src/runtime/shared/run-child.mjs +70 -18
- package/src/runtime/shared/session-scratch.mjs +14 -2
- package/src/runtime/shared/shipped-definitions.mjs +7 -1
- package/src/runtime/shared/staged-install-worker.mjs +5 -0
- package/src/runtime/shared/staged-update.mjs +47 -2
- package/src/runtime/shared/tool-card-model.golden.json +3 -12
- package/src/runtime/shared/tool-execution-contract.mjs +2 -0
- package/src/runtime/shared/tool-surface.mjs +110 -36
- package/src/runtime/shared/tool-work-units.mjs +35 -6
- package/src/runtime/shared/turn-snapshot.mjs +26 -4
- package/src/runtime/shared/turn-worktree-snapshot.mjs +409 -54
- package/src/runtime/shared/worker-requests.mjs +17 -3
- package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
- package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
- package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
- package/src/runtime/shared/worktrees/branch-management.mjs +5 -3
- package/src/runtime/shared/worktrees/contract.mjs +16 -6
- package/src/runtime/shared/worktrees/dependencies.mjs +127 -89
- package/src/runtime/shared/worktrees/disk.mjs +79 -2
- package/src/runtime/shared/worktrees/git.mjs +97 -7
- package/src/runtime/shared/worktrees/include.mjs +6 -4
- package/src/runtime/shared/worktrees/maintenance.mjs +422 -30
- package/src/runtime/shared/worktrees/manager.mjs +962 -197
- package/src/runtime/shared/worktrees/settings.mjs +33 -7
- package/src/runtime/shared/worktrees/test-support.mjs +5 -1
- package/src/runtime/shared/worktrees/worker-snapshots.mjs +82 -0
- package/src/runtime/tidy/install.mjs +95 -15
- package/src/runtime/tidy/languages.mjs +17 -15
- package/src/runtime/tidy/process.mjs +9 -5
- package/src/runtime/tidy/resolve.mjs +19 -16
- package/src/runtime/tidy/runners/biome.mjs +3 -3
- package/src/runtime/tidy/tool.mjs +1 -1
- package/src/runtime/tidy/worktree.mjs +10 -6
- package/src/runtime/visualize-bridge/client.mjs +4 -1
- package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
- package/src/runtime/web-search/index.mjs +4 -23
- package/src/runtime/web-search/lib/web-tools.mjs +2 -2
- package/src/runtime/web-search/tool-defs.mjs +17 -26
- package/src/session-runtime/agent-profile-changes.mjs +55 -4
- package/src/session-runtime/agent-task-sessions.mjs +410 -353
- package/src/session-runtime/boot/apis.mjs +27 -4
- package/src/session-runtime/boot/begin.mjs +2 -0
- package/src/session-runtime/boot/config.mjs +10 -1
- package/src/session-runtime/boot/facade.mjs +1 -0
- package/src/session-runtime/boot/providers.mjs +70 -3
- package/src/session-runtime/boot/session.mjs +2 -0
- package/src/session-runtime/boot/tools.mjs +71 -25
- package/src/session-runtime/bot-status.mjs +103 -103
- package/src/session-runtime/channel-config-api.mjs +1 -0
- package/src/session-runtime/config-change-effects.mjs +179 -0
- package/src/session-runtime/config-lifecycle/config-writers.mjs +1 -0
- package/src/session-runtime/config-lifecycle.mjs +160 -24
- package/src/session-runtime/connector-merge-migration.mjs +18 -15
- package/src/session-runtime/conversation-import/discovery.mjs +245 -47
- package/src/session-runtime/conversation-import/service.mjs +12 -5
- package/src/session-runtime/goal-facade-api.mjs +49 -3
- package/src/session-runtime/handoff-attachments.mjs +1 -1
- package/src/session-runtime/held-requests.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +3 -0
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -2
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +5 -11
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +161 -120
- package/src/session-runtime/internal-tool-executor.mjs +12 -19
- package/src/session-runtime/lifecycle/cold-heir.mjs +7 -0
- package/src/session-runtime/lifecycle/memory-ingest.mjs +3 -3
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +53 -5
- package/src/session-runtime/lifecycle/session-switch.mjs +13 -2
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +10 -5
- package/src/session-runtime/lifecycle/teardown.mjs +1 -1
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/server-catalog.mjs +27 -10
- package/src/session-runtime/mcp-glue/server-connection.mjs +34 -8
- package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
- package/src/session-runtime/mixy-heartbeat.mjs +1 -1
- package/src/session-runtime/model-route/set-route.mjs +40 -7
- package/src/session-runtime/native-web-search/routes.mjs +3 -3
- package/src/session-runtime/provider-auth/login.mjs +2 -2
- package/src/session-runtime/provider-auth/refresh.mjs +6 -3
- package/src/session-runtime/provider-auth/setup.mjs +1 -1
- package/src/session-runtime/provider-readiness.mjs +53 -4
- package/src/session-runtime/resource-api.mjs +1 -1
- package/src/session-runtime/resource-extension-sync.mjs +4 -8
- package/src/session-runtime/resource-mcp-api.mjs +98 -35
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +49 -32
- package/src/session-runtime/resource-mcp-secrets.mjs +27 -10
- package/src/session-runtime/resource-mcp-servers.mjs +5 -4
- package/src/session-runtime/resource-plugins-api.mjs +4 -0
- package/src/session-runtime/routine-executor.mjs +152 -0
- package/src/session-runtime/routine-home-turn.mjs +46 -5
- package/src/session-runtime/runtime-facade.mjs +5 -0
- package/src/session-runtime/runtime-feature-gates.mjs +2 -11
- package/src/session-runtime/schedule-session-run.mjs +1 -0
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +6 -1
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +7 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +120 -8
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +12 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +5 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +28 -7
- package/src/session-runtime/services/agent-tool.mjs +51 -1
- package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
- package/src/session-runtime/services/channel-admin.mjs +18 -0
- package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
- package/src/session-runtime/services/daemon-candidate.mjs +4 -1
- package/src/session-runtime/services/hook-bus/command-handler.mjs +7 -11
- package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
- package/src/session-runtime/services/plugin-admin.mjs +14 -6
- package/src/session-runtime/services/provider-admin.mjs +281 -10
- package/src/session-runtime/services/seeds.mjs +7 -0
- package/src/session-runtime/services/usage-stats-model.mjs +32 -11
- package/src/session-runtime/session-create/materialize.mjs +4 -2
- package/src/session-runtime/session-create/session-options.mjs +2 -0
- package/src/session-runtime/session-turn-api.mjs +2 -0
- package/src/session-runtime/settings-builtin-tools-api.mjs +5 -10
- package/src/session-runtime/settings-system-api.mjs +1 -1
- package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
- package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
- package/src/session-runtime/setup-tool/executor.mjs +14 -3
- package/src/session-runtime/setup-tool/extended-actions.mjs +2 -0
- package/src/session-runtime/setup-tool/settings-contract.mjs +28 -0
- package/src/session-runtime/setup-tool/tool-defs.mjs +28 -2
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +40 -43
- package/src/session-runtime/tool-policy/mode-switch.mjs +1 -1
- package/src/session-runtime/tool-policy/policy-stage.mjs +106 -8
- package/src/session-runtime/tool-policy/workflow-overlay.mjs +2 -1
- package/src/session-runtime/tool-policy-refresh.mjs +182 -5
- package/src/session-runtime/tool-surface.mjs +38 -1
- package/src/session-runtime/turn/agent-ops.mjs +33 -2
- package/src/session-runtime/turn/session-ops.mjs +2 -0
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +5 -0
- package/src/session-runtime/turn/turn-run.mjs +1 -1
- package/src/session-runtime/webhook-session-run.mjs +2 -0
- package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +46 -11
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +2 -0
- package/src/session-runtime/workflow-agents-api/instruction-files.mjs +165 -0
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +5 -4
- package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +2 -3
- package/src/session-runtime/workflow-agents-api.mjs +2 -0
- package/src/session-runtime/workspace/activity-guards.mjs +176 -0
- package/src/session-runtime/workspace/project-branches.mjs +1 -1
- package/src/session-runtime/workspace/session-view.mjs +149 -0
- package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
- package/src/session-runtime/workspace/transition-runner.mjs +188 -0
- package/src/session-runtime/workspace/transitions.mjs +128 -1070
- package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
- package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
- package/src/session-runtime/workspace/worktree-maintenance.mjs +200 -0
- package/src/session-runtime/workspace/worktree-setup.mjs +97 -0
- package/src/session-runtime/workspace/worktree-tool.mjs +70 -54
- package/src/standalone/daemon-agent-control.mjs +25 -8
- package/src/standalone/daemon-desktop-runtime.mjs +8 -2
- package/src/standalone/daemon-lag-profiler.mjs +7 -7
- package/src/standalone/daemon-session-control.mjs +151 -136
- package/src/standalone/daemon.mjs +61 -2
- package/src/standalone/desktop-service-registry.mjs +9 -0
- package/src/standalone/local-session-runtime.mjs +21 -1
- package/src/standalone/session-client/daemon-unavailable.mjs +4 -1
- package/src/standalone/session-client.mjs +5 -1
- package/src/standalone/session-frame-stream.mjs +83 -11
- package/src/standalone/session-protocol.mjs +15 -0
- package/src/standalone/session-service/agent-route-follow.mjs +23 -20
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +18 -6
- package/src/standalone/session-service/agent-tree.mjs +45 -9
- package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
- package/src/standalone/session-service/quota-resume.mjs +9 -0
- package/src/standalone/session-service/session-calls/session-action.mjs +51 -1
- package/src/standalone/session-service/session-calls/session-turns.mjs +37 -18
- package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
- package/src/standalone/session-service/session-calls/turn-gate.mjs +34 -0
- package/src/standalone/session-service/session-calls.mjs +2 -1
- package/src/standalone/session-service/stored-reader.mjs +127 -40
- package/src/tui/App.jsx +162 -164
- package/src/tui/app/app-view/floating-panel.jsx +3 -0
- package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
- package/src/tui/app/clipboard.mjs +22 -11
- package/src/tui/app/create-app-pickers.mjs +2 -0
- package/src/tui/app/doctor.mjs +2 -2
- package/src/tui/app/panel-signature.mjs +1 -1
- package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
- package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
- package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
- package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
- package/src/tui/app/provider-setup/oauth-actions.mjs +25 -6
- package/src/tui/app/provider-setup-picker.mjs +20 -13
- package/src/tui/app/settings-picker.mjs +53 -8
- package/src/tui/app/shell-layout/row-budgets.mjs +14 -12
- package/src/tui/app/slash-commands.mjs +2 -1
- package/src/tui/app/slash-dispatch/route-commands.mjs +1 -1
- package/src/tui/app/slash-dispatch/session-commands.mjs +47 -1
- package/src/tui/app/slash-dispatch.mjs +1 -1
- package/src/tui/app/use-btw-panel.mjs +29 -0
- package/src/tui/app/use-context-panel-refresh.mjs +31 -0
- package/src/tui/app/use-model-catalog-cache.mjs +13 -10
- package/src/tui/app/use-mouse-input.mjs +11 -0
- package/src/tui/app/use-onboarding-start.mjs +8 -3
- package/src/tui/app/use-panel-transition.mjs +10 -1
- package/src/tui/app/use-pasted-buffers.mjs +28 -20
- package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
- package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
- package/src/tui/app/use-prompt-queue-history.mjs +5 -4
- package/src/tui/app/use-selection-focus.mjs +11 -2
- package/src/tui/app/use-selection-geometry.mjs +18 -9
- package/src/tui/app/use-selection-paint.mjs +4 -4
- package/src/tui/app/use-selection-stitch.mjs +3 -3
- package/src/tui/app/use-slash-palette.mjs +62 -0
- package/src/tui/app/use-terminal-chrome.mjs +2 -2
- package/src/tui/app/use-transcript-activity.mjs +48 -33
- package/src/tui/app/use-transcript-follow.mjs +12 -4
- package/src/tui/app/use-transcript-scroll.mjs +46 -17
- package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
- package/src/tui/app/use-transcript-window/geometry.mjs +20 -6
- package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
- package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
- package/src/tui/app/use-transcript-window.mjs +21 -11
- package/src/tui/app/use-tui-ready.mjs +18 -0
- package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
- package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
- package/src/tui/components/Picker.jsx +27 -3
- package/src/tui/components/SignInUrl.jsx +68 -0
- package/src/tui/components/TextEntryPanel.jsx +76 -46
- package/src/tui/components/prompt-input/escape-policy.d.mts +0 -1
- package/src/tui/components/prompt-input/escape-policy.mjs +1 -1
- package/src/tui/components/question-panel-model.mjs +4 -4
- package/src/tui/components/sign-in-url-layout.mjs +24 -0
- package/src/tui/components/tool-execution/standard-card.jsx +3 -4
- package/src/tui/components/user-message-skills.mjs +1 -1
- package/src/tui/dist/index.mjs +2205 -1371
- package/src/tui/markdown/render-ansi.mjs +1 -1
- package/src/tui/session/agent-job-feed/notification-router.mjs +10 -0
- package/src/tui/session/agent-job-feed.mjs +2 -0
- package/src/tui/session/context-state.mjs +3 -0
- package/src/tui/session/goal-turn-state.mjs +6 -2
- package/src/tui/session/quota-resume.mjs +1 -1
- package/src/tui/session/session-api/controls.mjs +4 -0
- package/src/tui/session/session-api/extensions.mjs +8 -0
- package/src/tui/session/session-api/intake/abort.mjs +2 -1
- package/src/tui/session/session-api/intake.mjs +2 -0
- package/src/tui/session/session-api/integrations.mjs +2 -2
- package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
- package/src/tui/session/session-api/lifecycle/session-reset.mjs +7 -0
- package/src/tui/session/session-api/routes-agent-definitions.mjs +6 -0
- package/src/tui/session/session-api/settings.mjs +2 -2
- package/src/tui/session/session-api/worktree.mjs +13 -1
- package/src/tui/session/session-flow/drain.mjs +11 -14
- package/src/tui/session/tool-card-results/grouped-result.mjs +2 -2
- package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
- package/src/tui/session/transcript-spill.mjs +92 -4
- package/src/tui/session/transcript-store.mjs +2 -0
- package/src/tui/session/turn-quiet.mjs +1 -1
- package/src/tui/session/turn.mjs +3 -0
- package/src/tui/session/worktree-setup-notice.mjs +1 -1
- package/src/tui/spinner-meta.mjs +3 -3
- package/src/tui/spinner-verbs.mjs +2 -2
- package/src/defaults/skills/goal-management/SKILL.md +0 -169
- package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
- package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +0 -156
- package/src/session-runtime/goal-tasks.mjs +0 -1
|
@@ -57,7 +57,7 @@ export function createSystemSettings({
|
|
|
57
57
|
},
|
|
58
58
|
getHeartbeatSettings() {
|
|
59
59
|
return {
|
|
60
|
-
heartbeat: getConfig()?.heartbeat
|
|
60
|
+
heartbeat: getConfig()?.heartbeat === true,
|
|
61
61
|
intervalMinutes: normalizeHeartbeatIntervalMinutes(getConfig()?.heartbeatIntervalMinutes),
|
|
62
62
|
};
|
|
63
63
|
},
|
|
@@ -3,8 +3,12 @@
|
|
|
3
3
|
* prompt-cache warming. Each goes through the runtime method its settings
|
|
4
4
|
* surface uses. Permission and connector writes are made as a remote client's
|
|
5
5
|
* are (`noWiden`): a chat may take authority away, never give an agent more
|
|
6
|
-
* without asking — that stays with the person in the desktop app
|
|
6
|
+
* without asking — that stays with the person: in the desktop app, or on
|
|
7
|
+
* the approval card a connector tool's widening raises
|
|
8
|
+
* (connector-widen-approval.mjs). */
|
|
9
|
+
import { CONNECTOR_POLICY_WIDENS } from '../../runtime/agent/orchestrator/mcp/agent-connectors.mjs';
|
|
7
10
|
import { agentPermissions, setAgentPermission } from '../../runtime/agent/orchestrator/session/human-gate/store.mjs';
|
|
11
|
+
import { askToWidenConnectorTool } from './connector-widen-approval.mjs';
|
|
8
12
|
import { clean } from '../../runtime/agent/orchestrator/runtime-core/session-text.mjs';
|
|
9
13
|
|
|
10
14
|
const NO_WIDEN = Object.freeze({ noWiden: true });
|
|
@@ -38,11 +42,17 @@ export const AGENT_SETTINGS_HANDLERS = {
|
|
|
38
42
|
const name = requireText(args.name, 'name');
|
|
39
43
|
return { agent, connectors: await rt.setAgentConnectorEnabled(agent, name, args.enabled, NO_WIDEN) };
|
|
40
44
|
},
|
|
41
|
-
|
|
45
|
+
// A narrowing applies at once; a widening waits on the person's card.
|
|
46
|
+
async set_agent_connector_tool(rt, args, context) {
|
|
42
47
|
const agent = requireText(args.agent, 'agent');
|
|
43
48
|
const name = requireText(args.name, 'name');
|
|
44
49
|
const tool = requireText(args.tool, 'tool');
|
|
45
|
-
|
|
50
|
+
try {
|
|
51
|
+
await rt.setAgentConnectorToolPermission(agent, name, tool, args.permission, NO_WIDEN);
|
|
52
|
+
} catch (error) {
|
|
53
|
+
if (error?.code !== CONNECTOR_POLICY_WIDENS) throw error;
|
|
54
|
+
return askToWidenConnectorTool(rt, { agent, server: name, tool, requested: args.permission }, context);
|
|
55
|
+
}
|
|
46
56
|
return { agent, connector: name, tool, permission: args.permission };
|
|
47
57
|
},
|
|
48
58
|
async set_project_connector(rt, args) {
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
/** A bot's request for more authority on one connector tool (setup
|
|
2
|
+
* set_agent_connector_tool toward auto or needs_approval): the model cannot
|
|
3
|
+
* tell the user's words from text it read, so the change waits on an
|
|
4
|
+
* approval card (human-gate/requests.mjs kind `connector`) that only a
|
|
5
|
+
* person answers. The card offers each level above the tool's current one
|
|
6
|
+
* (needs_approval, auto) and Deny; nothing is remembered, so every widening
|
|
7
|
+
* asks again. The picked level is applied to that one tool, re-judged on the
|
|
8
|
+
* stored policy inside its write (mcp/agent-connectors.mjs
|
|
9
|
+
* withApprovedConnectorToolChange): a restriction that landed meanwhile stays. */
|
|
10
|
+
import {
|
|
11
|
+
CONNECTOR_TOOL_ALREADY,
|
|
12
|
+
CONNECTOR_TOOL_NARROWED,
|
|
13
|
+
NO_WIDEN_MESSAGE,
|
|
14
|
+
PERMISSION_RANK,
|
|
15
|
+
agentConnectors,
|
|
16
|
+
connectorGroupId,
|
|
17
|
+
connectorToolPermission,
|
|
18
|
+
withApprovedConnectorToolChange,
|
|
19
|
+
} from '../../runtime/agent/orchestrator/mcp/agent-connectors.mjs';
|
|
20
|
+
import { recordHumanDecision } from '../../runtime/agent/orchestrator/session/human-gate/gate.mjs';
|
|
21
|
+
import { CONNECTOR_WIDEN_LEVELS } from '../../runtime/agent/orchestrator/session/human-gate/requests.mjs';
|
|
22
|
+
import { runAbortable } from '../../runtime/shared/abort-race.mjs';
|
|
23
|
+
|
|
24
|
+
const NO_WIDEN = Object.freeze({ noWiden: true });
|
|
25
|
+
|
|
26
|
+
/** The tool's effective level for `agent` now, as dispatch reads it. */
|
|
27
|
+
function currentLevel(agent, server, tool) {
|
|
28
|
+
return connectorToolPermission(agentConnectors(agent), {
|
|
29
|
+
name: `mcp__${server}__${tool}`,
|
|
30
|
+
mcpServerName: server,
|
|
31
|
+
mcpToolName: tool,
|
|
32
|
+
});
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/** Ask the person on a card, then apply the level they picked.
|
|
36
|
+
* `requestApproval` is the calling turn's approval hook. */
|
|
37
|
+
export async function askToWidenConnectorTool(
|
|
38
|
+
rt,
|
|
39
|
+
{ agent, server, tool, requested },
|
|
40
|
+
{ requestApproval, signal, sessionId, toolCallId } = {}
|
|
41
|
+
) {
|
|
42
|
+
const from = currentLevel(agent, server, tool);
|
|
43
|
+
const receipt = { agent, connector: server, tool, requested };
|
|
44
|
+
if (PERMISSION_RANK[from] >= PERMISSION_RANK[requested]) {
|
|
45
|
+
return { ...receipt, saved: false, permission: from, note: `The tool is already ${from}; nothing changed.` };
|
|
46
|
+
}
|
|
47
|
+
// Nobody can be shown a card here: the person makes it in the desktop app.
|
|
48
|
+
if (typeof requestApproval !== 'function') throw new Error(NO_WIDEN_MESSAGE);
|
|
49
|
+
const choices = CONNECTOR_WIDEN_LEVELS.filter((level) => PERMISSION_RANK[level] > PERMISSION_RANK[from]);
|
|
50
|
+
const answer = await runAbortable(signal, () =>
|
|
51
|
+
requestApproval({
|
|
52
|
+
name: 'setup',
|
|
53
|
+
kind: 'connector',
|
|
54
|
+
agentId: agent,
|
|
55
|
+
// The card names the connector, not one of its accounts.
|
|
56
|
+
connector: { server: connectorGroupId(server), tool, from, requested, choices },
|
|
57
|
+
args: { action: 'set_agent_connector_tool', agent, name: server, tool, permission: requested },
|
|
58
|
+
reason: `Bot "${agent}" asks to change the permission of ${tool} (${connectorGroupId(server)}) from ${from} to ${requested}.`,
|
|
59
|
+
remember: ['once'],
|
|
60
|
+
sessionId,
|
|
61
|
+
toolCallId,
|
|
62
|
+
})
|
|
63
|
+
);
|
|
64
|
+
const level = answer?.approved === true && choices.includes(answer.scope) ? answer.scope : '';
|
|
65
|
+
// Audited with the answering device; no grant is ever stored (no action kind).
|
|
66
|
+
await recordHumanDecision(
|
|
67
|
+
{ agentId: agent, kind: 'connector', tool: `${server}/${tool}`, target: `${from}>${level || requested}` },
|
|
68
|
+
answer
|
|
69
|
+
);
|
|
70
|
+
// A decision that settles after its turn was cancelled authorizes nothing.
|
|
71
|
+
signal?.throwIfAborted();
|
|
72
|
+
if (!level) {
|
|
73
|
+
const why = answer?.timedOut ? 'The approval card timed out' : 'The user did not approve this change';
|
|
74
|
+
return { ...receipt, saved: false, approved: false, permission: from, note: `${why}; nothing changed.` };
|
|
75
|
+
}
|
|
76
|
+
try {
|
|
77
|
+
await withApprovedConnectorToolChange({ server, tool, from, to: level }, () =>
|
|
78
|
+
rt.setAgentConnectorToolPermission(agent, server, tool, level, NO_WIDEN)
|
|
79
|
+
);
|
|
80
|
+
} catch (error) {
|
|
81
|
+
if (error?.code !== CONNECTOR_TOOL_NARROWED && error?.code !== CONNECTOR_TOOL_ALREADY) throw error;
|
|
82
|
+
return {
|
|
83
|
+
...receipt,
|
|
84
|
+
saved: false,
|
|
85
|
+
approved: true,
|
|
86
|
+
permission: currentLevel(agent, server, tool),
|
|
87
|
+
note: `The user approved ${level}, but it was not applied: ${error.message}`,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
...receipt,
|
|
92
|
+
approved: true,
|
|
93
|
+
permission: level,
|
|
94
|
+
note: `The user approved on the card; ${tool} is now ${level}.`,
|
|
95
|
+
};
|
|
96
|
+
}
|
|
@@ -92,7 +92,14 @@ const ACTION_APPLIES_TO = {
|
|
|
92
92
|
set_heartbeat_interval:
|
|
93
93
|
"Mixy's heartbeat from the next tick: the next check is due the new interval after the last one; no restart required",
|
|
94
94
|
set_reactions_enabled:
|
|
95
|
-
"bots' chats; while off a reaction is refused at once
|
|
95
|
+
"bots' chats, this conversation included, from their next turn; while off a reaction is refused at once; reactions already left stay visible",
|
|
96
|
+
set_profile: 'every conversation, this one included, from its next turn',
|
|
97
|
+
set_instruction_files: 'every conversation, this one included, from its next turn',
|
|
98
|
+
set_memory_enabled: 'every conversation, this one included, from its next turn',
|
|
99
|
+
set_web_search_enabled: 'every conversation, this one included, from its next turn',
|
|
100
|
+
set_builtin_enabled: 'every conversation, this one included, from its next turn',
|
|
101
|
+
install_builtin: 'every conversation, this one included, from its next turn',
|
|
102
|
+
set_output_style: 'every conversation, this one included, from its next turn',
|
|
96
103
|
set_worktree_settings: 'new tasks and worktrees created afterwards; existing worktrees are unchanged',
|
|
97
104
|
set_system_shell: 'subsequent shell calls',
|
|
98
105
|
save_automation: 'the automation worker; scheduled runs follow the saved timing',
|
|
@@ -364,7 +371,7 @@ async function featureStatus(rt, getConfig) {
|
|
|
364
371
|
computer: { active: builtinFeatureActive(config, 'computer') },
|
|
365
372
|
terminal: { active: builtinFeatureActive(config, 'terminal') },
|
|
366
373
|
heartbeat: {
|
|
367
|
-
enabled: config?.heartbeat
|
|
374
|
+
enabled: config?.heartbeat === true,
|
|
368
375
|
intervalMinutes: normalizeHeartbeatIntervalMinutes(config?.heartbeatIntervalMinutes),
|
|
369
376
|
},
|
|
370
377
|
reactions: { enabled: config?.reactions !== false },
|
|
@@ -909,7 +916,7 @@ export function createSetupToolExecutor({
|
|
|
909
916
|
};
|
|
910
917
|
}
|
|
911
918
|
|
|
912
|
-
async function execute(args, { signal, callerSessionId }) {
|
|
919
|
+
async function execute(args, { signal, callerSessionId, requestApproval = null, toolCallId = null }) {
|
|
913
920
|
signal?.throwIfAborted();
|
|
914
921
|
const requestDesktop = (request) => desktop.request(request, { signal });
|
|
915
922
|
const action = validateSetupInput(args);
|
|
@@ -948,6 +955,10 @@ export function createSetupToolExecutor({
|
|
|
948
955
|
getSession: getCallerSession,
|
|
949
956
|
getConfig: () => getConfig?.() || {},
|
|
950
957
|
executeSessionControl,
|
|
958
|
+
// The calling turn's approval card (a connector tool's widening asks the person).
|
|
959
|
+
requestApproval,
|
|
960
|
+
signal,
|
|
961
|
+
toolCallId,
|
|
951
962
|
});
|
|
952
963
|
}
|
|
953
964
|
|
|
@@ -307,6 +307,8 @@ export const EXTENDED_SETUP_HANDLERS = Object.freeze({
|
|
|
307
307
|
owner: input.owner,
|
|
308
308
|
});
|
|
309
309
|
const next = { ...pick(previous, entryKeys), ...input };
|
|
310
|
+
// Omitted keeps the saved executor without checking it again (channel-admin.mjs).
|
|
311
|
+
if (!own(input, 'executorAgentId')) delete next.executorAgentId;
|
|
310
312
|
if (kind === 'schedule') {
|
|
311
313
|
if (previous.whenAt && !own(input, 'time') && !own(input, 'at')) {
|
|
312
314
|
next.at = new Date(previous.whenAt).toISOString();
|
|
@@ -212,6 +212,11 @@ export const SETUP_EXTENDED_PROPERTIES = Object.freeze({
|
|
|
212
212
|
description:
|
|
213
213
|
"The bot id that owns the schedule or webhook; each run is a turn in that bot's chat, where it replies with the result. The bot must exist (no representative bot yet = refused). New entries default to the bot of the calling thread (the representative bot = lead); on overwrite, omission keeps the owner.",
|
|
214
214
|
},
|
|
215
|
+
executorAgentId: {
|
|
216
|
+
...removableText,
|
|
217
|
+
description:
|
|
218
|
+
'The workflow sub-agent id (Worker, …) that carries out each run first, on its own model; only its final report goes to the owner bot, which relays it in its own words. Must be an enabled workflow sub-agent: never a bot (the representative bot included); unknown or turned-off ids are refused. Set it for recurring work that suits a sub-agent; leave it unset for trivial chat-only routines (the owner bot then does the work itself). null or "" clears it; on overwrite, omission keeps it.',
|
|
219
|
+
},
|
|
215
220
|
overwrite: { ...boolean, description: 'Explicitly update an existing entry; omitted fields are preserved.' },
|
|
216
221
|
},
|
|
217
222
|
['name']
|
|
@@ -238,6 +243,16 @@ export const SETUP_EXTENDED_PROPERTIES = Object.freeze({
|
|
|
238
243
|
maximum: 400,
|
|
239
244
|
description: 'Windows only: notification sound volume percent.',
|
|
240
245
|
},
|
|
246
|
+
sessionAutoArchiveDays: {
|
|
247
|
+
type: 'integer',
|
|
248
|
+
enum: [0, 1, 7, 14, 30, 90],
|
|
249
|
+
description: 'Days without conversation before a session is archived; 0 = never (default 7).',
|
|
250
|
+
},
|
|
251
|
+
sessionAutoDeleteDays: {
|
|
252
|
+
type: 'integer',
|
|
253
|
+
enum: [0, 7, 30, 90],
|
|
254
|
+
description: 'Days archived before a session is deleted; 0 = never (default 90).',
|
|
255
|
+
},
|
|
241
256
|
botOverlay: object(
|
|
242
257
|
{
|
|
243
258
|
enabled: {
|
|
@@ -302,6 +317,17 @@ export const SETUP_EXTENDED_PROPERTIES = Object.freeze({
|
|
|
302
317
|
markdownDefaultView: { type: 'string', enum: ['preview', 'rich', 'source'] },
|
|
303
318
|
linkPreview: boolean,
|
|
304
319
|
toolActivityExpansion: { type: 'string', enum: ['collapsed', 'commands', 'all'] },
|
|
320
|
+
composerStyle: {
|
|
321
|
+
type: 'string',
|
|
322
|
+
enum: ['simple', 'basic', 'detail'],
|
|
323
|
+
description:
|
|
324
|
+
'How much the composer shows: simple = the model only; basic (UI label "Normal") = plus usage; detail = plus workflow and delegation (default detail).',
|
|
325
|
+
},
|
|
326
|
+
questionAnswerConfirm: {
|
|
327
|
+
...boolean,
|
|
328
|
+
description:
|
|
329
|
+
'On: picking a single-choice question option only selects it until Send/Next; off: the pick answers at once (default off).',
|
|
330
|
+
},
|
|
305
331
|
uiFont: { ...text, description: 'Installed font family for the UI; "" restores the built-in font.' },
|
|
306
332
|
codeFont: { ...text, description: 'Installed font family for code; "" restores the built-in font.' },
|
|
307
333
|
skinTransparency: {
|
|
@@ -377,4 +403,6 @@ export const SETUP_HANDOFFS = Object.freeze({
|
|
|
377
403
|
notifications: 'Notification permission/subscription requires a user gesture on the device receiving notifications.',
|
|
378
404
|
pairing: 'Pairing credentials and OS permission approvals remain in the visible UI.',
|
|
379
405
|
memoryContent: 'Use the memory tool for Core Memory, not setup.',
|
|
406
|
+
instructionTexts:
|
|
407
|
+
'The Delegation and Output style instruction texts are edited in Settings → Delegation / Output style (revision-checked free text); choose the active output style with set_output_style.',
|
|
380
408
|
});
|
|
@@ -447,13 +447,38 @@ export const SETUP_TOOL_DEFS = Object.freeze([
|
|
|
447
447
|
enum: [...WORKTREE_NEW_TASK_DEFAULTS],
|
|
448
448
|
description: 'branch = new tasks use the current branch (default); worktree = a new worktree.',
|
|
449
449
|
},
|
|
450
|
-
branchPrefix: {
|
|
450
|
+
branchPrefix: {
|
|
451
|
+
type: 'string',
|
|
452
|
+
description:
|
|
453
|
+
'Optional ref prefix ending with "/", e.g. "mixdog/"; "" (default) names branches after the task alone.',
|
|
454
|
+
},
|
|
451
455
|
sizeWarnBytes: {
|
|
452
456
|
type: 'integer',
|
|
453
457
|
minimum: 0,
|
|
454
458
|
description: 'Repository size that asks for confirmation first; 0 never asks.',
|
|
455
459
|
},
|
|
456
460
|
autoCleanup: { type: 'boolean', description: 'Remove clean, merged worktrees when their task ends.' },
|
|
461
|
+
maxWorktrees: {
|
|
462
|
+
type: 'integer',
|
|
463
|
+
minimum: 0,
|
|
464
|
+
maximum: 1000,
|
|
465
|
+
description:
|
|
466
|
+
'With autoCleanup: keep at most this many worktrees, least recently used cleaned first; 0 = no limit. Default 15.',
|
|
467
|
+
},
|
|
468
|
+
unusedDays: {
|
|
469
|
+
type: 'integer',
|
|
470
|
+
minimum: 0,
|
|
471
|
+
maximum: 3650,
|
|
472
|
+
description: 'With autoCleanup: clean up worktrees unused this many days; 0 = never. Default 30.',
|
|
473
|
+
},
|
|
474
|
+
cleanupArchived: {
|
|
475
|
+
type: 'boolean',
|
|
476
|
+
description: 'With autoCleanup: archiving a session cleans up its worktrees. Default true.',
|
|
477
|
+
},
|
|
478
|
+
deleteBranch: {
|
|
479
|
+
type: 'boolean',
|
|
480
|
+
description: 'Cleanup also deletes the branch (its tip stays under a recovery ref). Default false.',
|
|
481
|
+
},
|
|
457
482
|
},
|
|
458
483
|
description: 'set_worktree_settings: only the given fields change.',
|
|
459
484
|
},
|
|
@@ -477,7 +502,8 @@ export const SETUP_TOOL_DEFS = Object.freeze([
|
|
|
477
502
|
permission: {
|
|
478
503
|
type: 'string',
|
|
479
504
|
enum: [...CONNECTOR_PERMISSIONS],
|
|
480
|
-
description:
|
|
505
|
+
description:
|
|
506
|
+
'set_agent_connector_tool: a narrowing (toward disabled) applies at once; a widening (disabled → needs_approval/auto, needs_approval → auto) waits on an approval card the user answers (needs_approval, auto or deny, whatever was asked) and the result says what was applied.',
|
|
481
507
|
},
|
|
482
508
|
botOrder: {
|
|
483
509
|
type: 'array',
|
|
@@ -13,10 +13,7 @@ import {
|
|
|
13
13
|
} from '../../runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs';
|
|
14
14
|
import { sessionTailCacheExpired } from '../../runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs';
|
|
15
15
|
import { mergePendingDeferredToolDelta } from '../../runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs';
|
|
16
|
-
import {
|
|
17
|
-
agentMcpToolPermission,
|
|
18
|
-
connectorPolicyAgentOf,
|
|
19
|
-
} from '../../runtime/agent/orchestrator/mcp/agent-connectors.mjs';
|
|
16
|
+
import { foldLateDeferredTools } from '../../runtime/agent/orchestrator/runtime-core/tool-catalog.mjs';
|
|
20
17
|
import { agentListEntries } from '../../runtime/agent/orchestrator/session/manager/prompt-utils.mjs';
|
|
21
18
|
import { markToolSurfaceMigrated } from '../../runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs';
|
|
22
19
|
import { resetBp2StableContext } from '../../runtime/agent/orchestrator/context/collect.mjs';
|
|
@@ -92,24 +89,14 @@ function cacheCold(session) {
|
|
|
92
89
|
);
|
|
93
90
|
}
|
|
94
91
|
|
|
95
|
-
//
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
return [...names]
|
|
99
|
-
.filter((name) => name.startsWith('mcp__') && agentMcpToolPermission(agent, name) !== 'disabled')
|
|
100
|
-
.sort();
|
|
101
|
-
}
|
|
102
|
-
|
|
103
|
-
// A bot thread's tools that changed without its prompt: feature gates that
|
|
104
|
-
// opened (or closed) and connectors added or removed. Nothing in the request
|
|
105
|
-
// prefix moves. An opened tool joins the deferred catalog — reachable by
|
|
92
|
+
// A bot thread's tools that changed without its prompt: workflow and
|
|
93
|
+
// reaction gates that opened (or closed). Nothing in the request prefix
|
|
94
|
+
// moves. An opened tool joins the late deferred catalog — reachable by
|
|
106
95
|
// deferred loading, which brings its schema into the conversation — and a
|
|
107
96
|
// gone one is refused at call time; the next turn's deferred_tools_delta
|
|
108
97
|
// notice names both. Gate changes are folded into the prompt at the next
|
|
109
|
-
// cold point (promptFoldPending).
|
|
110
|
-
|
|
111
|
-
// Returns true when anything changed.
|
|
112
|
-
function stageLiveToolChanges({ liveDeniedTools, modelStandaloneTools }, session, workflow, { edited = false } = {}) {
|
|
98
|
+
// cold point (promptFoldPending). Returns true when anything changed.
|
|
99
|
+
function stageLiveToolChanges({ liveDeniedTools, modelStandaloneTools }, session, workflow) {
|
|
113
100
|
const added = [];
|
|
114
101
|
const removed = [];
|
|
115
102
|
const known = new Map(schemaTools(session).map((tool) => [toolName(tool), tool]));
|
|
@@ -121,24 +108,17 @@ function stageLiveToolChanges({ liveDeniedTools, modelStandaloneTools }, session
|
|
|
121
108
|
const fresh = modelStandaloneTools().filter(
|
|
122
109
|
(tool) => opened.includes(toolName(tool)) && !known.has(toolName(tool))
|
|
123
110
|
);
|
|
124
|
-
|
|
111
|
+
// The late pool, never the boot catalog a native request keeps byte-stable.
|
|
112
|
+
if (fresh.length) session.deferredLateToolCatalog = [...(session.deferredLateToolCatalog || []), ...fresh];
|
|
125
113
|
for (const tool of fresh) known.set(toolName(tool), tool);
|
|
126
114
|
session.disallowedTools = [...live];
|
|
127
115
|
added.push(...opened.filter((name) => known.has(name)));
|
|
128
116
|
removed.push(...closed);
|
|
129
117
|
session.promptFoldPending = true;
|
|
130
118
|
}
|
|
131
|
-
//
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
session.agentConnectorTools = permitted;
|
|
135
|
-
if (edited && Array.isArray(previous)) {
|
|
136
|
-
added.push(...permitted.filter((name) => !previous.includes(name)));
|
|
137
|
-
removed.push(...previous.filter((name) => !permitted.includes(name)));
|
|
138
|
-
}
|
|
139
|
-
if (!added.length && !removed.length) {
|
|
140
|
-
return opened.length + closed.length > 0 || !Array.isArray(previous);
|
|
141
|
-
}
|
|
119
|
+
// Connector moves are staged at every turn start, for every session kind
|
|
120
|
+
// (tool-availability.mjs stageConnectorAvailability).
|
|
121
|
+
if (!added.length && !removed.length) return opened.length + closed.length > 0;
|
|
142
122
|
mergePendingDeferredToolDelta(session, {
|
|
143
123
|
added: added.map((name) => ({ name, description: known.get(name)?.description || '' })),
|
|
144
124
|
removed,
|
|
@@ -162,7 +142,8 @@ function liftAgentDenial({ liveDeniedTools, modelStandaloneTools }, session) {
|
|
|
162
142
|
if (!known.has('agent')) {
|
|
163
143
|
const fresh = modelStandaloneTools().filter((tool) => toolName(tool) === 'agent');
|
|
164
144
|
if (!fresh.length) return false;
|
|
165
|
-
|
|
145
|
+
// The late pool, never the boot catalog a native request keeps byte-stable.
|
|
146
|
+
session.deferredLateToolCatalog = [...(session.deferredLateToolCatalog || []), ...fresh];
|
|
166
147
|
known.set('agent', fresh[0]);
|
|
167
148
|
}
|
|
168
149
|
session.disallowedTools = disallowed.filter((name) => name !== 'agent');
|
|
@@ -185,6 +166,7 @@ export function createAgentProfileFold({
|
|
|
185
166
|
liveDeniedTools,
|
|
186
167
|
stagePolicy,
|
|
187
168
|
applyPolicy,
|
|
169
|
+
presentPromptSettings = () => {},
|
|
188
170
|
turnInFlight,
|
|
189
171
|
}) {
|
|
190
172
|
// An agent profile edit that met a running turn: the next turn applies it.
|
|
@@ -206,7 +188,13 @@ export function createAgentProfileFold({
|
|
|
206
188
|
// re-appends its deferred manifest.
|
|
207
189
|
if (typeof staged.stableContext === 'string') resetBp2StableContext(session, staged.stableContext);
|
|
208
190
|
applyPolicy(session, staged);
|
|
191
|
+
// Late tools join the rebuilt manifest (MCP instructions return with the
|
|
192
|
+
// server's next tool load): no notice.
|
|
193
|
+
foldLateDeferredTools(session);
|
|
209
194
|
rewriteConversationBp3Core(session, staged.core);
|
|
195
|
+
// Every prompt setting as it stands — style, profile, language, core
|
|
196
|
+
// memory, instruction files — so no part of the prompt contradicts another.
|
|
197
|
+
presentPromptSettings(session, staged);
|
|
210
198
|
if (session.agentProfileRevision !== undefined) {
|
|
211
199
|
session.agentProfileRevision = agentProfileRevision(identity.agent, { mixy: agentMode });
|
|
212
200
|
const { leadPromptParts } = activeWorkflowContext(config, getDataDir());
|
|
@@ -231,7 +219,9 @@ export function createAgentProfileFold({
|
|
|
231
219
|
// prompt they were created with; they are task-scoped, and their skill
|
|
232
220
|
// bodies are still restored from current sources at Compact.
|
|
233
221
|
if (!session?.id || !session.promptIdentity || isAgentOwner(session)) return false;
|
|
234
|
-
|
|
222
|
+
// A compaction is a cold point: the prompt is rebuilt instead of the
|
|
223
|
+
// dropped notices being sent again (pre-send compaction marks it).
|
|
224
|
+
const compacted = COLD_INTENTS.has(session.pendingCacheBreakIntent) || session.compactionFoldPending === true;
|
|
235
225
|
if (!compacted && !(foldPending(session) && cacheCold(session))) return false;
|
|
236
226
|
return foldPrompt(session, PROMPT_FOLD_INTENT);
|
|
237
227
|
}
|
|
@@ -256,7 +246,7 @@ export function createAgentProfileFold({
|
|
|
256
246
|
* release changed wait silently; both are folded in at the next cold point
|
|
257
247
|
* (foldPromptIfCold). Returns true when the session changed (save it).
|
|
258
248
|
*/
|
|
259
|
-
async function refreshAgentProfile({ trigger = 'save' } = {}) {
|
|
249
|
+
async function refreshAgentProfile({ trigger = 'save', onlyIfEdited = false } = {}) {
|
|
260
250
|
const session = getSession?.();
|
|
261
251
|
const identity = session?.promptIdentity;
|
|
262
252
|
const agent = identity?.agent;
|
|
@@ -276,15 +266,14 @@ export function createAgentProfileFold({
|
|
|
276
266
|
const edited =
|
|
277
267
|
recoverMode || session.agentProfileRevision !== revision || (agentMode && session.agentRosterRevision !== roster);
|
|
278
268
|
// At a turn's start its own turn is the one counted; nothing runs yet.
|
|
269
|
+
if (onlyIfEdited && !edited) return false;
|
|
279
270
|
const busy = () => getSession?.() !== session || (trigger !== 'turn' && turnInFlight(session));
|
|
280
271
|
if (busy()) {
|
|
281
272
|
agentProfilePending = true;
|
|
282
273
|
return false;
|
|
283
274
|
}
|
|
284
275
|
const toolsChanged = agentMode
|
|
285
|
-
? stageLiveToolChanges({ liveDeniedTools, modelStandaloneTools }, session, workflow
|
|
286
|
-
edited: session.agentProfileRevision !== revision,
|
|
287
|
-
})
|
|
276
|
+
? stageLiveToolChanges({ liveDeniedTools, modelStandaloneTools }, session, workflow)
|
|
288
277
|
: trigger === 'resume' && syncAgentListing(session);
|
|
289
278
|
if (!edited) return (trigger === 'resume' && (await foldPromptIfCold())) || toolsChanged;
|
|
290
279
|
// A coding session from before profile stamps keeps its prompt when it
|
|
@@ -315,14 +304,22 @@ export function createAgentProfileFold({
|
|
|
315
304
|
* fold pending prompt changes if the cache is cold anyway. */
|
|
316
305
|
async function applyPendingAgentProfile() {
|
|
317
306
|
let changed = false;
|
|
318
|
-
// A bot thread's connector baseline, before any edit can be compared to it.
|
|
319
307
|
const session = getSession?.();
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
308
|
+
// A bot thread compares its profile and roster stamps every turn, so hand
|
|
309
|
+
// edits and other processes' saves of AGENT.md, PERSONA.md and the roster
|
|
310
|
+
// reach it too.
|
|
311
|
+
// A thread from before profile stamps keeps its prompt until a save.
|
|
312
|
+
const botThread = Boolean(
|
|
313
|
+
session?.id &&
|
|
314
|
+
session.promptIdentity?.agent &&
|
|
315
|
+
sessionModeOf(session) === AGENT_MODE &&
|
|
316
|
+
session.agentProfileRevision !== undefined
|
|
317
|
+
);
|
|
318
|
+
const pending = agentProfilePending || orchestrationRecoveryNeeded(session);
|
|
319
|
+
if (pending || botThread) {
|
|
324
320
|
agentProfilePending = false;
|
|
325
|
-
|
|
321
|
+
// A turn with nothing pending acts only on moved stamps.
|
|
322
|
+
changed = await refreshAgentProfile({ trigger: 'turn', onlyIfEdited: !pending });
|
|
326
323
|
}
|
|
327
324
|
changed = (await foldPromptIfCold()) || changed;
|
|
328
325
|
return syncAgentListing(session) || changed;
|
|
@@ -17,7 +17,7 @@ function modeLoadableTools(session, mode) {
|
|
|
17
17
|
...toolNames(session.deferredCallableTools),
|
|
18
18
|
...toolNames(session.deferredDiscoveredTools),
|
|
19
19
|
]);
|
|
20
|
-
const deferred = new Set(toolNames(session.deferredToolCatalog));
|
|
20
|
+
const deferred = new Set([...toolNames(session.deferredToolCatalog), ...toolNames(session.deferredLateToolCatalog)]);
|
|
21
21
|
const denied = new Set(
|
|
22
22
|
[...(session.disallowedTools || []), ...(session.workflowOverlay?.deniedTools || [])].map(String)
|
|
23
23
|
);
|