mixdog 1.3.5 → 1.4.0
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 +2 -2
- package/README.md +2 -2
- package/package.json +2 -11
- package/scripts/daemon-stub.mjs +1 -1
- package/scripts/gate-local.mjs +4 -2
- package/scripts/native-release-status.mjs +2 -2
- package/scripts/recall-history-cases.json +1 -1
- package/scripts/suite-health.mjs +10 -1
- package/scripts/test.mjs +7 -11
- package/src/agents/reviewer/AGENT.md +7 -11
- package/src/agents/reviewer/agent.json +1 -1
- package/src/defaults/shipped-history.json +17 -1
- package/src/defaults/skills/browser-use/SKILL.md +59 -11
- package/src/defaults/skills/code-tidy/SKILL.md +142 -270
- package/src/defaults/skills/code-tidy/references/agent-cleanup.md +4 -4
- package/src/defaults/skills/code-tidy/references/cleanup-report.md +31 -76
- package/src/defaults/skills/code-tidy/references/dead-code.md +6 -12
- package/src/defaults/skills/computer-use/SKILL.md +33 -9
- package/src/defaults/skills/setup/SKILL.md +22 -0
- package/src/defaults/skills/setup/references/actions.md +39 -5
- package/src/defaults/skills/setup/references/surfaces.md +11 -2
- package/src/defaults/skills/visualize/SKILL.md +2 -1
- package/src/lib/rules-builder.cjs +10 -8
- package/src/rules/agent/AGENT.md +6 -6
- package/src/rules/lead/LEAD.md +18 -20
- package/src/rules/shared/05-tool-calls.md +5 -6
- package/src/rules/shared/10-tool-workflow.md +2 -0
- package/src/rules/shared/60-verification.md +7 -5
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +2 -3
- package/src/runtime/agent/orchestrator/agent-runtime/title-completion.mjs +3 -1
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +3 -1
- package/src/runtime/agent/orchestrator/config.mjs +17 -1
- package/src/runtime/agent/orchestrator/context/collect.mjs +3 -0
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +72 -67
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +54 -1
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -3
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +176 -72
- package/src/runtime/agent/orchestrator/mcp/client.mjs +19 -0
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +181 -133
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +42 -6
- package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +14 -14
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +145 -66
- package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +64 -33
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +135 -87
- package/src/runtime/agent/orchestrator/providers/antigravity-transport.mjs +123 -102
- package/src/runtime/agent/orchestrator/providers/cache-warm-admission.mjs +90 -0
- package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +22 -13
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.d.mts +8 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-channel.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/npm-cli-version.mjs +11 -3
- package/src/runtime/agent/orchestrator/providers/oauth-credential-probes.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/openai-oauth-tokens.mjs +10 -9
- package/src/runtime/agent/orchestrator/providers/openai-ws-send/send-context.mjs +22 -3
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/attempt-context.mjs +43 -5
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/handshake-failure.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-send-attempts/stream-failure.mjs +6 -3
- package/src/runtime/agent/orchestrator/providers/provider-error-kind.mjs +65 -1
- package/src/runtime/agent/orchestrator/providers/quota-reading.mjs +38 -12
- package/src/runtime/agent/orchestrator/providers/registry.mjs +26 -0
- package/src/runtime/agent/orchestrator/providers/retry-executor.mjs +39 -7
- package/src/runtime/agent/orchestrator/providers/statusline-route-meta.mjs +6 -0
- package/src/runtime/agent/orchestrator/runtime-core/ask-user-tool-defs.mjs +12 -7
- package/src/runtime/agent/orchestrator/runtime-core/compaction-config-keys.mjs +62 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +37 -16
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +100 -23
- package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-bridge.mjs +19 -4
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +125 -30
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +792 -0
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +133 -22
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +475 -58
- package/src/runtime/agent/orchestrator/session/compaction-archive.mjs +42 -17
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +11 -5
- package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +0 -2
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -4
- package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +18 -22
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +32 -3
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +17 -3
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +7 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/after-hook.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +3 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +16 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +3 -10
- package/src/runtime/agent/orchestrator/session/loop/tool-phase.mjs +12 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +12 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +19 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +133 -90
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +31 -4
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +30 -18
- package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +23 -13
- package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +11 -2
- package/src/runtime/agent/orchestrator/session/manager/provider-replay.mjs +13 -0
- package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +129 -0
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +20 -2
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +8 -0
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +7 -2
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +18 -5
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +19 -8
- package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
- package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +127 -0
- package/src/runtime/agent/orchestrator/session/routine-result.mjs +36 -9
- package/src/runtime/agent/orchestrator/session/sensitive-projection.mjs +100 -0
- package/src/runtime/agent/orchestrator/session/sensitive-values.mjs +257 -0
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +20 -7
- package/src/runtime/agent/orchestrator/session/side-question.mjs +18 -0
- package/src/runtime/agent/orchestrator/session/skill-update-notice.mjs +60 -0
- package/src/runtime/agent/orchestrator/session/store/live-state.mjs +6 -3
- package/src/runtime/agent/orchestrator/session/store/save-delta.mjs +9 -5
- package/src/runtime/agent/orchestrator/session/store/serialize.mjs +9 -8
- package/src/runtime/agent/orchestrator/session/store/session-persistence-events.mjs +29 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +8 -6
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +12 -2
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +44 -14
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +84 -3
- package/src/runtime/agent/orchestrator/session/stored-attachment-history.mjs +32 -0
- package/src/runtime/agent/orchestrator/session/thinking-binding.mjs +108 -0
- package/src/runtime/agent/orchestrator/session/tool-batch/pre-dispatch.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/tool-batch/record-outcome.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +18 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-status.mjs +9 -7
- package/src/runtime/agent/orchestrator/session/transcript-restore/tool-result-text.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/turn-failure.mjs +5 -1
- package/src/runtime/agent/orchestrator/tools/builtin/arg-guard.mjs +5 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +12 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +240 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/shell-cwd.mjs +38 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +25 -5
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +65 -7
- package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +36 -13
- package/src/runtime/browser-bridge/action-schema.mjs +13 -2
- package/src/runtime/browser-bridge/client.mjs +73 -8
- package/src/runtime/browser-bridge/input-fields.mjs +8 -9
- package/src/runtime/browser-bridge/mail-links.mjs +107 -0
- package/src/runtime/browser-bridge/tool-defs.mjs +1 -1
- package/src/runtime/channels/lib/config.mjs +6 -61
- package/src/runtime/channels/lib/crash-log.mjs +1 -1
- package/src/runtime/channels/lib/event-pipeline.mjs +4 -19
- package/src/runtime/channels/lib/event-queue.mjs +3 -18
- package/src/runtime/channels/lib/owned-runtime/automation-services.mjs +2 -2
- package/src/runtime/channels/lib/owned-runtime/automation-start.mjs +3 -4
- package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +4 -59
- package/src/runtime/channels/lib/owned-runtime/owned-start.mjs +33 -115
- package/src/runtime/channels/lib/owned-runtime/owned-stop.mjs +5 -22
- package/src/runtime/channels/lib/owned-runtime/state.mjs +2 -8
- package/src/runtime/channels/lib/owned-runtime.mjs +6 -23
- package/src/runtime/channels/lib/parent-bridge.mjs +2 -2
- package/src/runtime/channels/lib/runtime-paths.mjs +4 -43
- package/src/runtime/channels/lib/scheduler.mjs +33 -147
- package/src/runtime/channels/lib/schedules-db.mjs +34 -11
- package/src/runtime/channels/lib/status-snapshot.mjs +1 -1
- package/src/runtime/channels/lib/tool-dispatch.mjs +1 -2
- package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
- package/src/runtime/channels/lib/worker-bootstrap.mjs +0 -1
- package/src/runtime/channels/lib/worker-ipc.mjs +0 -1
- package/src/runtime/channels/lib/worker-main.mjs +10 -34
- package/src/runtime/computer-bridge/action-schema.mjs +42 -1
- package/src/runtime/computer-bridge/actions.mjs +9 -1
- package/src/runtime/computer-bridge/client.mjs +180 -8
- package/src/runtime/computer-bridge/core-actions.mjs +2 -2
- package/src/runtime/computer-bridge/error-recovery.mjs +27 -2
- package/src/runtime/computer-bridge/linux-readiness.mjs +65 -23
- package/src/runtime/computer-bridge/pending-continuation.mjs +1 -1
- package/src/runtime/connectors/connector-accounts-mcp.mjs +230 -0
- package/src/runtime/connectors/gmail-app-password.mjs +172 -39
- package/src/runtime/connectors/google-mcp.mjs +10 -12
- package/src/runtime/memory/lib/pg/adapter.mjs +77 -70
- package/src/runtime/memory/lib/pg/supervisor.mjs +24 -12
- package/src/runtime/memory/lib/runtime-fetcher.mjs +23 -5
- package/src/runtime/session-search/session-search-db.mjs +73 -9
- package/src/runtime/session-search/session-search-ingest.mjs +110 -20
- package/src/runtime/shared/abort-race.mjs +89 -0
- package/src/runtime/shared/agent-avatar.d.mts +0 -1
- package/src/runtime/shared/agent-kind.mjs +4 -3
- package/src/runtime/shared/bounded-download.mjs +8 -3
- package/src/runtime/shared/config.mjs +2 -13
- package/src/runtime/shared/connector-accounts.mjs +20 -10
- package/src/runtime/shared/connector-catalog.d.mts +29 -0
- package/src/runtime/shared/connector-catalog.mjs +150 -0
- package/src/runtime/shared/connector-triggers.mjs +22 -19
- package/src/runtime/shared/defaults-separation.mjs +2 -14
- package/src/runtime/shared/delegated-approval-host.mjs +103 -11
- package/src/runtime/shared/err-text.mjs +24 -15
- package/src/runtime/shared/file-permissions.d.mts +0 -8
- package/src/runtime/shared/file-permissions.mjs +0 -11
- package/src/runtime/shared/git-direct.test-support.mjs +19 -0
- package/src/runtime/shared/heartbeat-interval.d.mts +4 -0
- package/src/runtime/shared/heartbeat-interval.mjs +19 -0
- package/src/runtime/shared/idle-auto-clear-gate.mjs +104 -0
- package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
- package/src/runtime/shared/mixy-presence.mjs +22 -0
- package/src/runtime/shared/orchestration.d.mts +2 -0
- package/src/runtime/shared/pg-schema-db.mjs +27 -16
- package/src/runtime/shared/profile-config.cjs +1 -1
- package/src/runtime/shared/prompt-origin.d.mts +4 -0
- package/src/runtime/shared/prompt-origin.mjs +21 -0
- package/src/runtime/shared/provider-accounts.mjs +7 -1
- package/src/runtime/shared/provider-display-name.mjs +29 -0
- package/src/runtime/shared/provider-timeout-phase.mjs +2 -0
- package/src/runtime/shared/routine-trigger.d.mts +2 -0
- package/src/runtime/shared/routine-trigger.mjs +10 -0
- package/src/runtime/shared/sensitive-path-rules.d.mts +2 -10
- package/src/runtime/shared/sensitive-path-rules.mjs +19 -41
- package/src/runtime/shared/session-activity-signal.mjs +34 -1
- package/src/runtime/shared/session-sidebar-host.d.mts +1 -1
- package/src/runtime/shared/session-sidebar-host.mjs +7 -3
- package/src/runtime/shared/session-turn-prelude.mjs +18 -0
- package/src/runtime/shared/tool-result-summary.mjs +1 -14
- package/src/runtime/shared/worktrees/test-support.mjs +9 -4
- package/src/runtime/terminal-bridge/client.mjs +10 -1
- package/src/runtime/visualize-bridge/client.mjs +27 -8
- package/src/runtime/visualize-bridge/tool-defs.mjs +22 -8
- package/src/runtime/visualize-bridge/tool-meta.d.mts +5 -0
- package/src/runtime/visualize-bridge/tool-meta.mjs +22 -0
- package/src/runtime/web-search/lib/fetch-pipeline.mjs +2 -2
- package/src/session-runtime/agent-home-delivery.mjs +448 -185
- package/src/session-runtime/agent-task-sessions.mjs +329 -180
- package/src/session-runtime/boot/apis.mjs +9 -0
- package/src/session-runtime/boot/infrastructure.mjs +4 -0
- package/src/session-runtime/boot/providers.mjs +3 -0
- package/src/session-runtime/boot/tools.mjs +6 -1
- package/src/session-runtime/config-lifecycle.mjs +6 -0
- package/src/session-runtime/connector-merge-migration.mjs +305 -0
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +132 -28
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +2 -0
- package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
- package/src/session-runtime/lifecycle/session-catalog.mjs +3 -1
- package/src/session-runtime/lifecycle/teardown/runtime-stops.mjs +50 -4
- package/src/session-runtime/lifecycle/teardown.mjs +23 -5
- package/src/session-runtime/mcp-glue/server-catalog.mjs +55 -3
- package/src/session-runtime/mcp-oauth-login.mjs +5 -3
- package/src/session-runtime/mixy-heartbeat.mjs +153 -33
- package/src/session-runtime/notification-bus.mjs +31 -117
- package/src/session-runtime/notification-completion-queue.mjs +54 -0
- package/src/session-runtime/notification-listeners.mjs +76 -0
- package/src/session-runtime/owned-automation-run.mjs +2 -1
- package/src/session-runtime/prewarm/channel-start.mjs +3 -7
- package/src/session-runtime/resource-mcp-api.mjs +143 -224
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +163 -0
- package/src/session-runtime/resource-mcp-oauth-api.mjs +217 -0
- package/src/session-runtime/resource-mcp-secrets.mjs +82 -0
- package/src/session-runtime/resource-mcp-servers.mjs +78 -0
- package/src/session-runtime/resource-mcp-store.mjs +49 -0
- package/src/session-runtime/routine-owner.mjs +40 -9
- package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +7 -2
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
- package/src/session-runtime/services/agent-tool/worker-index/awaiting-user-sync.mjs +51 -0
- package/src/session-runtime/services/agent-tool/worker-index/disposal.mjs +55 -0
- package/src/session-runtime/services/agent-tool/worker-index/released-store.mjs +123 -0
- package/src/session-runtime/services/agent-tool/worker-index/restart-settlement.mjs +112 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-reads.mjs +36 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-shape.mjs +2 -0
- package/src/session-runtime/services/agent-tool/worker-index/row-store.mjs +17 -4
- package/src/session-runtime/services/agent-tool/worker-index/row-writes.mjs +58 -0
- package/src/session-runtime/services/agent-tool/worker-index.mjs +41 -241
- package/src/session-runtime/services/agent-tool/worker-rows.mjs +3 -0
- package/src/session-runtime/services/channel-admin.mjs +7 -13
- package/src/session-runtime/services/channel-session-router.mjs +4 -2
- package/src/session-runtime/services/seeds.mjs +0 -28
- package/src/session-runtime/session-compaction-sync.mjs +27 -0
- package/src/session-runtime/session-create/session-options.mjs +1 -0
- package/src/session-runtime/settings-builtin-tools-api.mjs +11 -0
- package/src/session-runtime/settings-compaction-api.mjs +2 -40
- package/src/session-runtime/settings-system-api.mjs +13 -1
- package/src/session-runtime/setup-tool/agent-settings-actions.mjs +65 -0
- package/src/session-runtime/setup-tool/executor.mjs +145 -22
- package/src/session-runtime/setup-tool/extended-actions.mjs +8 -3
- package/src/session-runtime/setup-tool/session-route-actions.mjs +152 -0
- package/src/session-runtime/setup-tool/settings-contract.mjs +4 -3
- package/src/session-runtime/setup-tool/tool-defs.mjs +64 -5
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +17 -13
- package/src/session-runtime/tool-policy/policy-stage.mjs +16 -2
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
- package/src/standalone/channel-transport/client-registry/client-records.mjs +65 -0
- package/src/standalone/channel-transport/client-registry/client-registration.mjs +118 -0
- package/src/standalone/channel-transport/client-registry.mjs +24 -163
- package/src/standalone/channel-transport.mjs +1 -1
- package/src/standalone/daemon-channels-loader.mjs +10 -8
- package/src/standalone/daemon-session-control/list-page.mjs +72 -0
- package/src/standalone/daemon-session-control/request.mjs +51 -0
- package/src/standalone/daemon-session-control/room-host.mjs +57 -0
- package/src/standalone/daemon-session-control/route-control.mjs +48 -0
- package/src/standalone/daemon-session-control/send-turn.mjs +60 -0
- package/src/standalone/daemon-session-control/worktree-control.mjs +40 -0
- package/src/standalone/daemon-session-control.mjs +124 -188
- package/src/standalone/daemon.mjs +26 -3
- package/src/standalone/session-client.mjs +7 -3
- package/src/standalone/session-protocol.mjs +5 -0
- package/src/standalone/session-service/agent-tree/agent-child.mjs +1 -0
- package/src/standalone/session-service/quota-resume.mjs +3 -0
- package/src/standalone/session-service/retention/busy.mjs +65 -1
- package/src/standalone/session-service/session-calls/session-action.mjs +23 -2
- package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
- package/src/standalone/session-tool-output.mjs +15 -7
- package/src/tui/app/model-options.mjs +3 -28
- package/src/tui/dist/index.mjs +58 -64
- package/src/tui/session/agent-job-feed/model-notification.mjs +3 -0
- package/src/tui/session/initial-state.mjs +3 -0
- package/src/tui/session/notice-surface.mjs +7 -1
- package/src/tui/session/queue-helpers.mjs +3 -42
- package/src/tui/session/session-api/routes-agent-definitions.mjs +14 -2
- package/src/tui/session/session-api/routes-write.mjs +5 -1
- package/src/tui/session/session-api/routes.mjs +1 -0
- package/src/tui/session/session-api/settings.mjs +17 -1
- package/src/tui/session/session-flow/auto-clear.mjs +4 -33
- package/src/tui/session/session-flow/drain-closed-queue.mjs +38 -0
- package/src/tui/session/session-flow/drain-enqueue.mjs +86 -0
- package/src/tui/session/session-flow/drain-retry.mjs +35 -0
- package/src/tui/session/session-flow/drain.mjs +118 -149
- package/src/tui/session/session-flow/queue/entry-shape.mjs +5 -0
- package/src/tui/session/session-flow/queue/take-entries.mjs +5 -2
- package/src/tui/session/tool-approval-delegation.mjs +64 -0
- package/src/tui/session/tool-approval-request.mjs +39 -0
- package/src/tui/session/tool-approval-settle.mjs +62 -0
- package/src/tui/session/tool-approval.mjs +69 -115
- package/src/tui/session/tui-steering-persist.mjs +8 -1
- package/src/tui/session/turn-stream.mjs +19 -2
- package/src/tui/session/turn.mjs +1 -0
- package/src/vendor/statusline/bin/statusline-route.mjs +1 -219
- package/src/vendor/statusline/src/gateway/route-meta.mjs +35 -13
- package/scripts/code-graph-description-contract.mjs +0 -188
- package/src/runtime/channels/lib/owned-runtime/ownership-refresh.mjs +0 -36
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// Rule-based Compact preserves conversation verbatim by default. A bounded
|
|
2
2
|
// cumulative handoff replaces only the conversation part when requested by
|
|
3
3
|
// its independent threshold policy.
|
|
4
|
+
import { createHash } from 'node:crypto';
|
|
4
5
|
import { estimateMessagesTokens, reconcileDedupStubs, sanitizeToolPairs } from '../context-utils.mjs';
|
|
5
6
|
import { HANDOFF_TIMEOUT_MAX_MS, SUMMARY_OUTPUT_TOKENS, compactDebugLog } from './constants.mjs';
|
|
6
7
|
import {
|
|
@@ -22,7 +23,7 @@ import {
|
|
|
22
23
|
} from './messages.mjs';
|
|
23
24
|
import { activeTurnContinuationMessage } from './continuation.mjs';
|
|
24
25
|
import { EXECUTION_RECOVERY_SOURCE, buildExecutionTail } from './execution-tail.mjs';
|
|
25
|
-
import { latestSkillBodies } from '../../context/skill-state.mjs';
|
|
26
|
+
import { latestSkillBodies, skillMessageText } from '../../context/skill-state.mjs';
|
|
26
27
|
import { effectiveBudget } from './budget.mjs';
|
|
27
28
|
import { stripRuntimeUserContext, withRuntimeUserContext } from '../runtime-user-context.mjs';
|
|
28
29
|
import { carryMessageId, messageIdOf } from '../message-ids.mjs';
|
|
@@ -413,6 +414,47 @@ function prependLatestUserContext(message, prefix) {
|
|
|
413
414
|
});
|
|
414
415
|
}
|
|
415
416
|
|
|
417
|
+
const LOADED_SKILL_RESULT_RE = /^Loaded (?:built-in )?skill: /;
|
|
418
|
+
|
|
419
|
+
// A Skill load the retained execution tail keeps states what the skill
|
|
420
|
+
// delivered then: its tool list (the native payload or the summary text). It
|
|
421
|
+
// is brought to what the skill delivers now, in place, so its call stays
|
|
422
|
+
// paired: a skill that no longer loads keeps a result saying so, with no tool
|
|
423
|
+
// payload; a skill whose dependencies changed carries its current payload.
|
|
424
|
+
// Failed loads (errors) are left as they are. `currentSkill` absent, or a
|
|
425
|
+
// skill's `native` undefined (a preview), keeps the result.
|
|
426
|
+
function reconcileRetainedSkillLoads(messages, currentSkill) {
|
|
427
|
+
if (!currentSkill) return messages;
|
|
428
|
+
const calls = new Map(
|
|
429
|
+
messages.flatMap((message) =>
|
|
430
|
+
message?.role === 'assistant' ? (message.toolCalls || []).map((call) => [call.id, call]) : []
|
|
431
|
+
)
|
|
432
|
+
);
|
|
433
|
+
const withoutPayload = ({ nativeToolSearch: _native, ...message }, content) => ({ ...message, content });
|
|
434
|
+
return messages.map((message) => {
|
|
435
|
+
if (message?.role !== 'tool') return message;
|
|
436
|
+
const call = calls.get(message.toolCallId);
|
|
437
|
+
const name = call?.name === 'Skill' ? String(call.arguments?.name || '').trim() : '';
|
|
438
|
+
if (!name) return message;
|
|
439
|
+
const text = contentText(message.content);
|
|
440
|
+
if (!message.nativeToolSearch && !LOADED_SKILL_RESULT_RE.test(text)) return message;
|
|
441
|
+
const skill = currentSkill(name);
|
|
442
|
+
if (skill === null) {
|
|
443
|
+
return withoutPayload(
|
|
444
|
+
message,
|
|
445
|
+
`Skill "${name}" is no longer available in this session (switched off, removed, or outside this project's scope); its instructions and tools are not active.`
|
|
446
|
+
);
|
|
447
|
+
}
|
|
448
|
+
if (skill?.native === undefined) return message;
|
|
449
|
+
if (skill.native) {
|
|
450
|
+
return nativeToolsKey(message.nativeToolSearch) === nativeToolsKey(skill.native)
|
|
451
|
+
? message
|
|
452
|
+
: { ...message, content: skill.native.summary, nativeToolSearch: skill.native };
|
|
453
|
+
}
|
|
454
|
+
return !message.nativeToolSearch && text === skill.summary ? message : withoutPayload(message, skill.summary);
|
|
455
|
+
});
|
|
456
|
+
}
|
|
457
|
+
|
|
416
458
|
// The retained execution tail plus the current-turn messages that must
|
|
417
459
|
// survive every compaction verbatim.
|
|
418
460
|
function freshContextTail(source, budgetTokens, preserveConversation, opts) {
|
|
@@ -423,10 +465,11 @@ function freshContextTail(source, budgetTokens, preserveConversation, opts) {
|
|
|
423
465
|
preview: opts.preview === true,
|
|
424
466
|
});
|
|
425
467
|
const latestUser = latestActualUserInstructionMessage(source.live);
|
|
426
|
-
const
|
|
468
|
+
const executed = reconcileRetainedSkillLoads(execution.messages, opts.currentSkill);
|
|
469
|
+
const latestIndex = executed.findLastIndex(
|
|
427
470
|
(message) => message.role === 'user' && message.content === latestUser?.content
|
|
428
471
|
);
|
|
429
|
-
const retainedTail =
|
|
472
|
+
const retainedTail = executed.map((message, index) =>
|
|
430
473
|
index === latestIndex ? prependLatestUserContext(message, opts.latestUserPrefix) : message
|
|
431
474
|
);
|
|
432
475
|
// The turn's input: the latest real request or an unanswered notification
|
|
@@ -459,11 +502,9 @@ function freshContextTail(source, budgetTokens, preserveConversation, opts) {
|
|
|
459
502
|
};
|
|
460
503
|
}
|
|
461
504
|
|
|
462
|
-
//
|
|
463
|
-
//
|
|
464
|
-
|
|
465
|
-
// without the tools they require.
|
|
466
|
-
function skillLoaderPair(live, bodyIndex, name, retainedCallIds) {
|
|
505
|
+
// The executed Skill call (its owner message, the call and its result) that
|
|
506
|
+
// delivered the body at `bodyIndex`, or null.
|
|
507
|
+
function skillLoader(live, bodyIndex, name) {
|
|
467
508
|
for (let index = bodyIndex - 1; index >= 0; index -= 1) {
|
|
468
509
|
const result = live[index];
|
|
469
510
|
if (result?.role !== 'tool') continue;
|
|
@@ -473,12 +514,52 @@ function skillLoaderPair(live, bodyIndex, name, retainedCallIds) {
|
|
|
473
514
|
(message) => message?.role === 'assistant' && message.toolCalls?.some((c) => c.id === result.toolCallId)
|
|
474
515
|
);
|
|
475
516
|
const call = owner?.toolCalls.find((entry) => entry.id === result.toolCallId);
|
|
476
|
-
if (call?.name
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
517
|
+
if (call?.name === 'Skill' && call.arguments?.name === name) return { owner, call, result };
|
|
518
|
+
}
|
|
519
|
+
return null;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
const nativeToolsKey = (native) =>
|
|
523
|
+
JSON.stringify([native?.provider || '', native?.toolReferences || [], native?.openaiTools || []]);
|
|
524
|
+
|
|
525
|
+
const SKILL_RESTORE_SOURCE = 'compact-skill-restore';
|
|
526
|
+
|
|
527
|
+
// Native tool search exposes a skill's linked tools only through the executed
|
|
528
|
+
// Skill result that referenced them. A restored body keeps that pair, unless
|
|
529
|
+
// the retained tail already carries it, so its instructions never return
|
|
530
|
+
// without the tools they require. `current.native` is the payload the skill's
|
|
531
|
+
// current dependencies produce (null: none to expose); the transcript pair is
|
|
532
|
+
// kept while it matches, otherwise rebuilt from it. `current` absent, or its
|
|
533
|
+
// `native` undefined, keeps the transcript pair as it is.
|
|
534
|
+
function skillLoaderPair(live, bodyIndex, name, retainedCallIds, current) {
|
|
535
|
+
const loader = skillLoader(live, bodyIndex, name);
|
|
536
|
+
if (loader && retainedCallIds.has(loader.result.toolCallId)) return [];
|
|
537
|
+
const native = current?.native === undefined ? loader?.result.nativeToolSearch : current.native;
|
|
538
|
+
if (!native) return [];
|
|
539
|
+
// The re-attached call is part of its owner message: it keeps that id.
|
|
540
|
+
const callMessage = (call) =>
|
|
541
|
+
loader
|
|
542
|
+
? carryMessageId({ role: 'assistant', content: '', toolCalls: [call] }, loader.owner)
|
|
543
|
+
: { role: 'assistant', content: '', toolCalls: [call], meta: { source: SKILL_RESTORE_SOURCE, synthetic: true } };
|
|
544
|
+
if (loader?.result.nativeToolSearch && nativeToolsKey(loader.result.nativeToolSearch) === nativeToolsKey(native)) {
|
|
545
|
+
return [callMessage(loader.call), loader.result];
|
|
480
546
|
}
|
|
481
|
-
|
|
547
|
+
// A body that arrived without a native pair still needs one now: a
|
|
548
|
+
// per-skill call id, stable across later Compacts that keep it.
|
|
549
|
+
const call = loader?.call || {
|
|
550
|
+
id: `skill-restore-${createHash('sha256').update(name).digest('hex').slice(0, 24)}`,
|
|
551
|
+
name: 'Skill',
|
|
552
|
+
arguments: { name },
|
|
553
|
+
};
|
|
554
|
+
const result = { role: 'tool', toolCallId: call.id, content: native.summary, nativeToolSearch: native };
|
|
555
|
+
return [callMessage(call), loader ? carryMessageId(result, loader.result) : result];
|
|
556
|
+
}
|
|
557
|
+
|
|
558
|
+
// The body to restore: the transcript copy while it is what the Skill tool
|
|
559
|
+
// delivers now, else the current body.
|
|
560
|
+
function currentSkillBodyMessage(message, current) {
|
|
561
|
+
if (!current || skillMessageText(message.content).trimStart() === current.body) return message;
|
|
562
|
+
return { role: 'user', content: current.body, meta: 'skill' };
|
|
482
563
|
}
|
|
483
564
|
|
|
484
565
|
const SKILL_RELOAD_SOURCE = 'compact-skill-reload';
|
|
@@ -491,26 +572,41 @@ function skillReloadReminder(name) {
|
|
|
491
572
|
};
|
|
492
573
|
}
|
|
493
574
|
|
|
494
|
-
//
|
|
575
|
+
// Restore the skills active in the transcript, each as the Skill tool would
|
|
576
|
+
// deliver it now. `currentSkill(name)` (the caller's resolver) answers
|
|
577
|
+
// `{ body, native, summary }` for a skill that still loads in the session, or null for
|
|
578
|
+
// one switched off, outside its scope or removed: such a skill is restored
|
|
579
|
+
// neither as a body nor as a reload reminder, since its instructions are no
|
|
580
|
+
// longer in force. Without a resolver the transcript copies are kept.
|
|
495
581
|
// Never summarize/truncate operating instructions or displace the handoff
|
|
496
582
|
// and current task. An omitted body leaves a one-line reload reminder, which
|
|
497
583
|
// stands through later Compacts until the skill is loaded again. Reminders
|
|
498
584
|
// are charged to the same budget: every skill's reminder is reserved before
|
|
499
585
|
// any body is restored, and restoring a body releases its own reminder.
|
|
500
|
-
function restoreSkillBodies(live, skillBudget, retainedTail) {
|
|
586
|
+
function restoreSkillBodies(live, skillBudget, retainedTail, currentSkill = null) {
|
|
501
587
|
const retainedCallIds = new Set(retainedTail.filter((m) => m?.role === 'tool').map((m) => m.toolCallId));
|
|
502
|
-
const
|
|
503
|
-
const
|
|
588
|
+
const current = (name) => (currentSkill ? currentSkill(name) : undefined);
|
|
589
|
+
const loads = (name) => current(name) !== null;
|
|
590
|
+
const transcriptBodies = latestSkillBodies(live);
|
|
591
|
+
const loaded = new Set(transcriptBodies.map((body) => body.name));
|
|
592
|
+
const bodies = transcriptBodies.filter((body) => loads(body.name));
|
|
504
593
|
const reload = live
|
|
505
|
-
.filter((m) => m?.meta?.source === SKILL_RELOAD_SOURCE && !loaded.has(m.meta.skill))
|
|
594
|
+
.filter((m) => m?.meta?.source === SKILL_RELOAD_SOURCE && !loaded.has(m.meta.skill) && loads(m.meta.skill))
|
|
506
595
|
.map((m) => m.meta.skill);
|
|
507
596
|
const reminderCost = (name) => estimateMessagesTokens([skillReloadReminder(name)]);
|
|
508
|
-
let reserved = [...new Set([...reload, ...
|
|
597
|
+
let reserved = [...new Set([...reload, ...bodies.map((body) => body.name)])].reduce(
|
|
598
|
+
(sum, name) => sum + reminderCost(name),
|
|
599
|
+
0
|
|
600
|
+
);
|
|
509
601
|
const dropped = [];
|
|
510
602
|
const restoredSkills = [];
|
|
511
603
|
let skillTokens = 0;
|
|
512
604
|
for (const { name, message } of bodies.reverse()) {
|
|
513
|
-
const
|
|
605
|
+
const skill = current(name);
|
|
606
|
+
const restored = [
|
|
607
|
+
...skillLoaderPair(live, live.lastIndexOf(message), name, retainedCallIds, skill),
|
|
608
|
+
currentSkillBodyMessage(message, skill),
|
|
609
|
+
];
|
|
514
610
|
const cost = estimateMessagesTokens(restored);
|
|
515
611
|
const own = reminderCost(name);
|
|
516
612
|
if (skillTokens + cost + reserved - own > skillBudget) {
|
|
@@ -716,7 +812,19 @@ function assertHandoffFits(summaryMessage, room) {
|
|
|
716
812
|
}
|
|
717
813
|
}
|
|
718
814
|
|
|
719
|
-
|
|
815
|
+
// One resolution per skill per Compact: the retained tail and the restored
|
|
816
|
+
// bodies read the same answer (the real pass re-arms dependencies once).
|
|
817
|
+
function memoizedSkillResolver(resolve) {
|
|
818
|
+
if (!resolve) return null;
|
|
819
|
+
const known = new Map();
|
|
820
|
+
return (name) => {
|
|
821
|
+
if (!known.has(name)) known.set(name, resolve(name));
|
|
822
|
+
return known.get(name);
|
|
823
|
+
};
|
|
824
|
+
}
|
|
825
|
+
|
|
826
|
+
export function freshContextCompactMessages(messages, budgetTokens, options = {}) {
|
|
827
|
+
const opts = { ...options, currentSkill: memoizedSkillResolver(options.currentSkill) };
|
|
720
828
|
const startedAt = Date.now();
|
|
721
829
|
const targetBudget = effectiveBudget(budgetTokens, opts);
|
|
722
830
|
const baseSanitized = reconcileDedupStubs(sanitizeToolPairs(messages));
|
|
@@ -756,7 +864,10 @@ export function freshContextCompactMessages(messages, budgetTokens, opts = {}) {
|
|
|
756
864
|
const summaryContent = String(summaryMessage?.content || '');
|
|
757
865
|
assertHandoffFits(summaryMessage, handoff.room);
|
|
758
866
|
const skillBudget = freshSkillBudget(targetBudget, budget, [...stableHead, ...tail.volatileTail]);
|
|
759
|
-
const skills = {
|
|
867
|
+
const skills = {
|
|
868
|
+
...restoreSkillBodies(source.live, skillBudget, tail.volatileTail, opts.currentSkill),
|
|
869
|
+
skillBudget,
|
|
870
|
+
};
|
|
760
871
|
const stablePrefixMessages = [...stableHead, ...skills.restoredSkills];
|
|
761
872
|
const result = rebaseCompactedEffortConfiguration(
|
|
762
873
|
baseSanitized,
|