mixdog 1.3.5 → 1.4.1
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/check-voice-runtime-inputs.mjs +25 -0
- package/scripts/daemon-stub.mjs +1 -1
- package/scripts/gate-local.mjs +16 -5
- package/scripts/latest-guard.mjs +21 -9
- package/scripts/lib/isolated-test-env.mjs +10 -5
- package/scripts/lib/run-node-tests.mjs +37 -37
- package/scripts/lib/scoped-temp.d.mts +16 -0
- package/scripts/lib/scoped-temp.mjs +123 -0
- package/scripts/lib/stale-temp.mjs +44 -0
- package/scripts/native-release-status.mjs +2 -2
- package/scripts/post-release-check.mjs +1 -6
- package/scripts/pptx-kit-index.mjs +17 -4
- package/scripts/recall-history-cases.json +1 -1
- package/scripts/suite-health.mjs +20 -2
- package/scripts/test-data-dir.mjs +10 -7
- package/scripts/test.mjs +7 -11
- package/src/agents/reviewer/AGENT.md +7 -11
- package/src/agents/reviewer/agent.json +1 -1
- package/src/app.mjs +4 -0
- package/src/defaults/shipped-history.json +22 -1
- package/src/defaults/skills/browser-use/SKILL.md +62 -12
- 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 +35 -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 +39 -20
- package/src/output-styles/common.md +2 -2
- package/src/output-styles/simple.md +1 -1
- package/src/rules/agent/AGENT.md +11 -10
- package/src/rules/lead/LEAD.md +23 -20
- package/src/rules/shared/05-tool-calls.md +5 -6
- package/src/rules/shared/10-tool-workflow.md +4 -0
- package/src/rules/shared/45-destructive.md +0 -2
- package/src/rules/shared/50-execution.md +2 -0
- package/src/rules/shared/60-verification.md +7 -5
- package/src/rules/shared/70-delivery.md +7 -9
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +29 -6
- 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/cache-break-trace.mjs +2 -0
- 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 +73 -68
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +57 -2
- 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/mcp/oauth-login.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +192 -133
- package/src/runtime/agent/orchestrator/providers/admission-scheduler.mjs +42 -6
- package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +7 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +8 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-cache-warm.mjs +165 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens-recovery.mjs +6 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/gzip-post.mjs +14 -14
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +159 -69
- package/src/runtime/agent/orchestrator/providers/anthropic-overload-fallback.mjs +25 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +70 -33
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -2
- 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/command-code-oauth-login.mjs +1 -10
- package/src/runtime/agent/orchestrator/providers/cursor-wire-transport.mjs +25 -9
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +25 -13
- package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/devin.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +210 -20
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -11
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +45 -6
- package/src/runtime/agent/orchestrator/providers/lib/first-output-window.mjs +58 -0
- package/src/runtime/agent/orchestrator/providers/lib/listen-on.mjs +14 -0
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +17 -3
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +52 -10
- package/src/runtime/agent/orchestrator/providers/mimo-oauth-login.mjs +1 -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-compat-chat-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/chunk-events.mjs +9 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream/stream-state.mjs +7 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-chat-stream.mjs +14 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-events.mjs +4 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream-common.mjs +5 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-stream.mjs +16 -3
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai-send.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events/output-items.mjs +5 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state/response-events.mjs +13 -3
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-response-state.mjs +13 -2
- package/src/runtime/agent/orchestrator/providers/openai-http-sse-watchdogs.mjs +81 -42
- package/src/runtime/agent/orchestrator/providers/openai-oauth-http-sse.mjs +8 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +136 -5
- 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/openai-ws-stream/event-switch.mjs +20 -12
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +48 -22
- 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 +38 -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 +49 -16
- 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/orchestration.mjs +7 -6
- package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +9 -3
- 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/runtime-core/tool-defs.mjs +3 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +5 -2
- package/src/runtime/agent/orchestrator/session/cache/scoped-cache.mjs +1 -3
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +798 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -8
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +23 -0
- package/src/runtime/agent/orchestrator/session/compact/observation-supersession.mjs +103 -23
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +280 -45
- 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/context-utils.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +163 -22
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +132 -17
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +38 -7
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +90 -22
- 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 +51 -25
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +37 -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/pre-dispatch-deny.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +13 -5
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +31 -3
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +20 -3
- 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 +5 -4
- 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 +49 -21
- 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-loop-options.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/manager/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 +24 -14
- 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 +130 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +27 -9
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +81 -8
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +27 -8
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +12 -5
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +9 -4
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +102 -15
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +21 -5
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +9 -0
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +24 -9
- package/src/runtime/agent/orchestrator/session/prompt-cache-idle-gaps.mjs +113 -0
- package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +150 -0
- package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +154 -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-delete.mjs +7 -0
- 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 +16 -2
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +81 -22
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +92 -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 +79 -3
- 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/stall-policy.mjs +23 -0
- 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/invocation-plan.mjs +2 -2
- 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/spawn-env.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +31 -6
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +110 -26
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +31 -5
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +22 -8
- package/src/runtime/agent/orchestrator/tools/builtin/lib/scoped-search-flight.mjs +9 -5
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-streaming.mjs +6 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-dispatch.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-publication.mjs +23 -12
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool/batch-snapshot.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-tool.mjs +1 -8
- package/src/runtime/agent/orchestrator/tools/builtin/shell-runtime.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/dispatch/federation.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/code-graph-tool-defs.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/isolated-test-env.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +26 -4
- 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/webhook/signature.mjs +4 -1
- package/src/runtime/channels/lib/webhooks-db.mjs +5 -9
- package/src/runtime/channels/lib/whisper-port.mjs +10 -1
- 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 +28 -2
- package/src/runtime/computer-bridge/linux-action-capabilities.mjs +24 -5
- package/src/runtime/computer-bridge/linux-readiness.d.mts +7 -2
- package/src/runtime/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/local-provider/server-process.mjs +2 -1
- package/src/runtime/media/adapters/gemini-video.mjs +4 -1
- package/src/runtime/media/adapters/xai-media.mjs +2 -1
- package/src/runtime/memory/lib/embedding-worker.mjs +6 -3
- package/src/runtime/memory/lib/memory-action-handlers/cycle-backfill-action.mjs +1 -7
- package/src/runtime/memory/lib/memory-chunk-quality.mjs +1 -6
- package/src/runtime/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/office/authoring/pdf-author-action.mjs +1 -6
- package/src/runtime/office/design/design-art-direction.mjs +29 -27
- package/src/runtime/office/pdf/pdf-writer.mjs +6 -1
- package/src/runtime/office/portable/portable-snapshot-docx.mjs +7 -1
- package/src/runtime/office/portable/portable-snapshot-shared.mjs +6 -1
- package/src/runtime/office/quality/assurance-rendered.mjs +9 -2
- package/src/runtime/office/quality/assurance-structure-docx.mjs +3 -1
- package/src/runtime/office/quality/design-review.mjs +1 -5
- package/src/runtime/office/quality/document-brief.mjs +1 -5
- package/src/runtime/office/quality/forced-break-pages.mjs +9 -6
- package/src/runtime/office/quality/quality-pipeline.mjs +1 -1
- package/src/runtime/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/bot-owned-work.mjs +56 -0
- 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 -17
- package/src/runtime/shared/delegated-approval-host.mjs +103 -11
- package/src/runtime/shared/err-text.mjs +24 -15
- package/src/runtime/shared/fetch-safe-listen.d.mts +16 -0
- package/src/runtime/shared/fetch-safe-listen.mjs +50 -0
- package/src/runtime/shared/file-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/handoff-artifacts.d.mts +2 -1
- package/src/runtime/shared/handoff-artifacts.mjs +18 -8
- 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 +126 -0
- package/src/runtime/shared/llm/cost.mjs +5 -1
- package/src/runtime/shared/llm/usage-rollup.mjs +1 -1
- package/src/runtime/shared/loopback-listener.mjs +25 -2
- package/src/runtime/shared/mixy-presence.mjs +22 -0
- package/src/runtime/shared/model-route-chain.d.mts +7 -2
- package/src/runtime/shared/model-route-chain.mjs +22 -4
- package/src/runtime/shared/open-url.mjs +10 -0
- package/src/runtime/shared/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 +48 -1
- package/src/runtime/shared/session-scratch.mjs +37 -0
- 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-card-model/agent-surface.mjs +1 -3
- package/src/runtime/shared/tool-card-model/card-status.mjs +15 -2
- package/src/runtime/shared/tool-result-summary.mjs +2 -15
- package/src/runtime/shared/tool-surface.mjs +3 -0
- package/src/runtime/shared/tool-work-units.mjs +2 -0
- package/src/runtime/shared/turn-snapshot-store.mjs +13 -6
- package/src/runtime/shared/worktrees/contract.mjs +4 -1
- package/src/runtime/shared/worktrees/git.mjs +15 -0
- package/src/runtime/shared/worktrees/manager.mjs +87 -38
- package/src/runtime/shared/worktrees/test-support.mjs +14 -13
- package/src/runtime/terminal-bridge/client.mjs +10 -1
- package/src/runtime/visualize-bridge/client.mjs +29 -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 +489 -185
- package/src/session-runtime/agent-task-sessions.mjs +467 -229
- package/src/session-runtime/agent-tool-routing.mjs +8 -41
- 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 +11 -2
- package/src/session-runtime/bot-status.mjs +12 -6
- package/src/session-runtime/bot-target.mjs +38 -0
- package/src/session-runtime/channel-config-api.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/conversation-import/codex-titles.mjs +88 -0
- package/src/session-runtime/conversation-import/discovery.mjs +271 -25
- package/src/session-runtime/conversation-import/service.mjs +26 -5
- package/src/session-runtime/handoff-attachments.mjs +82 -31
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +144 -41
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -0
- package/src/session-runtime/internal-tool-executor/reaction-tool.mjs +4 -1
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +8 -2
- package/src/session-runtime/lifecycle/cold-heir.mjs +11 -6
- package/src/session-runtime/lifecycle/inheritance.mjs +16 -3
- package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
- 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/model-route/set-route.mjs +11 -2
- 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/provider-catalog-cache.mjs +82 -36
- package/src/session-runtime/provider-models/catalog-load.mjs +23 -6
- package/src/session-runtime/provider-models.mjs +4 -2
- package/src/session-runtime/resource-mcp-api.mjs +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/resource-recall-api.mjs +6 -1
- package/src/session-runtime/routine-owner.mjs +40 -9
- package/src/session-runtime/runtime-feature-gates.mjs +5 -1
- package/src/session-runtime/services/agent-tool/close-flow.mjs +3 -0
- package/src/session-runtime/services/agent-tool/execute.mjs +14 -9
- package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +20 -4
- package/src/session-runtime/services/agent-tool/model-select.mjs +48 -7
- package/src/session-runtime/services/agent-tool/render.mjs +71 -17
- package/src/session-runtime/services/agent-tool/spawn-preset.mjs +13 -4
- package/src/session-runtime/services/agent-tool/tag-registry.mjs +1 -0
- package/src/session-runtime/services/agent-tool/tool-def.mjs +9 -9
- 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/provider-admin.mjs +2 -1
- 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 +17 -2
- package/src/session-runtime/turn/turn-run/ask-callbacks.mjs +1 -0
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +5 -1
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +15 -4
- package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -3
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +4 -0
- package/src/session-runtime/workspace/transitions.mjs +25 -0
- package/src/session-runtime/workspace/worktree-tool.mjs +26 -9
- 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 +142 -190
- 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/agent-tree/agent-turns.mjs +16 -12
- 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 +30 -2
- package/src/standalone/session-service/session-calls/session-views.mjs +8 -0
- package/src/standalone/session-tool-output.mjs +15 -7
- package/src/standalone/session-transport/client-registry/client-grace.mjs +12 -9
- package/src/tui/app/app-view/floating-panel.jsx +7 -4
- package/src/tui/app/model-options.mjs +3 -28
- package/src/tui/app/model-picker/route-selection/fast-parameters.mjs +1 -3
- package/src/tui/app/model-picker/route-selection.mjs +5 -6
- package/src/tui/app/provider-setup/oauth-actions.mjs +38 -20
- package/src/tui/app/provider-setup/provider-items.mjs +8 -2
- package/src/tui/app/provider-setup-picker.mjs +9 -5
- package/src/tui/components/QuestionPanel.jsx +13 -4
- package/src/tui/dist/index.mjs +133 -92
- 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 +16 -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/ui/statusline-agents.mjs +1 -3
- 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
|
@@ -23,8 +23,7 @@ export const WINDOW_HELPER_ENABLE_HINT =
|
|
|
23
23
|
'wayland_window_control_unavailable: the Mixdog Windows GNOME extension is not enabled; it could not be enabled automatically (run gnome-extensions enable mixdog-windows@mixdog.io)';
|
|
24
24
|
export const WINDOW_CONTROL_UNSUPPORTED_HINT =
|
|
25
25
|
'wayland_window_control_unavailable: this desktop offers no window control to other programs (supported: GNOME with the Mixdog Windows extension, sway, Hyprland, or an X11 session); screen, pointer, keyboard and clipboard still work';
|
|
26
|
-
export const ACCESSIBILITY_HINT =
|
|
27
|
-
'accessibility_unavailable: the AT-SPI bus is not running; install at-spi2-core';
|
|
26
|
+
export const ACCESSIBILITY_HINT = 'accessibility_unavailable: the AT-SPI bus is not running; install at-spi2-core';
|
|
28
27
|
export const TESSERACT_HINT =
|
|
29
28
|
'ocr_unavailable: install Tesseract (for example `sudo apt install tesseract-ocr tesseract-ocr-kor`) to read text from pixels';
|
|
30
29
|
export const CLIPBOARD_HINT =
|
|
@@ -56,7 +55,12 @@ function gdbusOutput(env, args, timeoutMs = 2000) {
|
|
|
56
55
|
return new Promise((resolve) => {
|
|
57
56
|
let child;
|
|
58
57
|
try {
|
|
59
|
-
child = spawn('gdbus', ['call', '--session', ...args], {
|
|
58
|
+
child = spawn('gdbus', ['call', '--session', ...args], {
|
|
59
|
+
env,
|
|
60
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
61
|
+
shell: false,
|
|
62
|
+
windowsHide: true,
|
|
63
|
+
});
|
|
60
64
|
} catch {
|
|
61
65
|
resolve(null);
|
|
62
66
|
return;
|
|
@@ -88,10 +92,14 @@ const gdbusSucceeds = async (env, args, timeoutMs) => (await gdbusOutput(env, ar
|
|
|
88
92
|
// The version the shell actually loaded, or null when nothing answers.
|
|
89
93
|
async function gnomeWindowHelperVersion(env) {
|
|
90
94
|
const out = await gdbusOutput(env, [
|
|
91
|
-
'--dest',
|
|
92
|
-
'
|
|
93
|
-
'--
|
|
94
|
-
'io
|
|
95
|
+
'--dest',
|
|
96
|
+
'org.gnome.Shell',
|
|
97
|
+
'--object-path',
|
|
98
|
+
'/io/mixdog/Windows',
|
|
99
|
+
'--method',
|
|
100
|
+
'org.freedesktop.DBus.Properties.Get',
|
|
101
|
+
'io.mixdog.Windows',
|
|
102
|
+
'Version',
|
|
95
103
|
]);
|
|
96
104
|
const version = /uint32 (\d+)/.exec(out ?? '');
|
|
97
105
|
return version ? Number(version[1]) : null;
|
|
@@ -148,9 +156,12 @@ async function gnomeWindowHelperStatus(env) {
|
|
|
148
156
|
|
|
149
157
|
function accessibilityBusReachable(env) {
|
|
150
158
|
return gdbusSucceeds(env, [
|
|
151
|
-
'--dest',
|
|
152
|
-
'
|
|
153
|
-
'--
|
|
159
|
+
'--dest',
|
|
160
|
+
'org.a11y.Bus',
|
|
161
|
+
'--object-path',
|
|
162
|
+
'/org/a11y/bus',
|
|
163
|
+
'--method',
|
|
164
|
+
'org.a11y.Bus.GetAddress',
|
|
154
165
|
]);
|
|
155
166
|
}
|
|
156
167
|
|
|
@@ -167,7 +178,8 @@ function sessionBusPresent(env) {
|
|
|
167
178
|
|
|
168
179
|
/** Same rule as native platform::linux::wayland_session(). */
|
|
169
180
|
export function detectSession(env) {
|
|
170
|
-
const wayland =
|
|
181
|
+
const wayland =
|
|
182
|
+
env.WAYLAND_DISPLAY !== undefined && (env.XDG_SESSION_TYPE === undefined || env.XDG_SESSION_TYPE === 'wayland');
|
|
171
183
|
return wayland ? 'wayland' : 'x11';
|
|
172
184
|
}
|
|
173
185
|
|
|
@@ -206,7 +218,7 @@ async function windowsCapability({ env, session, hasCommand, windowHelperVersion
|
|
|
206
218
|
return { state: 'unsupported' };
|
|
207
219
|
}
|
|
208
220
|
|
|
209
|
-
async function accessibilityCapability({
|
|
221
|
+
async function accessibilityCapability({ hasCommand, hasSessionBus, accessibilityReachable }) {
|
|
210
222
|
if (!hasSessionBus() || !hasCommand('gdbus')) return { state: 'unknown' };
|
|
211
223
|
return (await accessibilityReachable()) ? READY : needsPackage('at-spi2-core');
|
|
212
224
|
}
|
|
@@ -246,8 +258,14 @@ export async function checkLinuxComputerReadiness({
|
|
|
246
258
|
session,
|
|
247
259
|
desktop,
|
|
248
260
|
capabilities: {
|
|
249
|
-
capture: none,
|
|
250
|
-
|
|
261
|
+
capture: none,
|
|
262
|
+
windows: none,
|
|
263
|
+
accessibility: none,
|
|
264
|
+
semanticActions: none,
|
|
265
|
+
pointer: none,
|
|
266
|
+
keyboard: none,
|
|
267
|
+
clipboard: optional(none),
|
|
268
|
+
ocr: optional(none),
|
|
251
269
|
},
|
|
252
270
|
};
|
|
253
271
|
}
|
|
@@ -255,7 +273,8 @@ export async function checkLinuxComputerReadiness({
|
|
|
255
273
|
const windows = await windowsCapability({ env, session, hasCommand, windowHelperVersion, windowHelperStatus });
|
|
256
274
|
const accessibility = await accessibilityCapability({ env, hasCommand, hasSessionBus, accessibilityReachable });
|
|
257
275
|
const input = !wayland || canWrite('/dev/uinput') ? READY : { state: 'needs_setup', fix: 'allow_input' };
|
|
258
|
-
const clipboard =
|
|
276
|
+
const clipboard =
|
|
277
|
+
!wayland || (hasCommand('wl-copy') && hasCommand('wl-paste')) ? READY : needsPackage('wl-clipboard');
|
|
259
278
|
return {
|
|
260
279
|
session,
|
|
261
280
|
desktop,
|
|
@@ -278,15 +297,25 @@ export async function checkLinuxComputerReadiness({
|
|
|
278
297
|
}
|
|
279
298
|
|
|
280
299
|
function capabilityIssue(name, readiness) {
|
|
281
|
-
if (readiness.capabilities.capture.state === 'unsupported')
|
|
300
|
+
if (readiness.capabilities.capture.state === 'unsupported')
|
|
301
|
+
return { code: 'display_unavailable', message: DISPLAY_HINT };
|
|
282
302
|
// Semantic actions fail on whichever of their two prerequisites is missing.
|
|
283
303
|
const gnomeWayland = readiness.session === 'wayland' && readiness.desktop === 'gnome';
|
|
284
|
-
const target =
|
|
304
|
+
const target =
|
|
305
|
+
name === 'semanticActions'
|
|
306
|
+
? readiness.capabilities.windows.state === 'ready'
|
|
307
|
+
? 'accessibility'
|
|
308
|
+
: 'windows'
|
|
309
|
+
: name === 'capture' && gnomeWayland
|
|
310
|
+
? 'windows'
|
|
311
|
+
: name;
|
|
285
312
|
const capability = readiness.capabilities[target];
|
|
286
313
|
switch (target) {
|
|
287
314
|
case 'windows':
|
|
288
|
-
if (capability.fix === 'relogin')
|
|
289
|
-
|
|
315
|
+
if (capability.fix === 'relogin')
|
|
316
|
+
return { code: 'wayland_window_control_unavailable', message: WINDOW_HELPER_RELOGIN_HINT };
|
|
317
|
+
if (capability.fix === 'enable_window_helper')
|
|
318
|
+
return { code: 'wayland_window_control_unavailable', message: WINDOW_HELPER_ENABLE_HINT };
|
|
290
319
|
if (capability.fix === 'install_package') {
|
|
291
320
|
return {
|
|
292
321
|
code: 'wayland_window_control_unavailable',
|
|
@@ -304,7 +333,10 @@ function capabilityIssue(name, readiness) {
|
|
|
304
333
|
case 'ocr':
|
|
305
334
|
return { code: 'ocr_unavailable', message: TESSERACT_HINT };
|
|
306
335
|
default:
|
|
307
|
-
return {
|
|
336
|
+
return {
|
|
337
|
+
code: `${target}_unavailable`,
|
|
338
|
+
message: `${target}_unavailable: ${target} is not available on this session`,
|
|
339
|
+
};
|
|
308
340
|
}
|
|
309
341
|
}
|
|
310
342
|
|
|
@@ -357,7 +389,11 @@ export async function linuxComputerPreflight({ command, platform = process.platf
|
|
|
357
389
|
details.set(item.message, entry);
|
|
358
390
|
}
|
|
359
391
|
const lines = [...details.values()].map((entry) => `- ${entry.message} [${entry.capabilities.join(', ')}]`);
|
|
360
|
-
if (
|
|
392
|
+
if (
|
|
393
|
+
String(command?.action) === 'capture' &&
|
|
394
|
+
missing.some((item) => item.capability === 'windows') &&
|
|
395
|
+
!missing.some((item) => item.capability === 'capture')
|
|
396
|
+
) {
|
|
361
397
|
lines.push('Screenshots that need no window still work: capture with mode="vision" and a screen index (screen=0).');
|
|
362
398
|
}
|
|
363
399
|
return {
|
|
@@ -383,11 +419,17 @@ export async function linuxCaptureFallback({ command, platform = process.platfor
|
|
|
383
419
|
if (capabilities.capture.state === 'needs_setup' || capabilities.capture.state === 'unsupported') return null;
|
|
384
420
|
const { action, session_id, include_ocr } = command;
|
|
385
421
|
return {
|
|
386
|
-
command: {
|
|
422
|
+
command: {
|
|
423
|
+
action,
|
|
424
|
+
mode: 'vision',
|
|
425
|
+
screen: 0,
|
|
426
|
+
...(session_id ? { session_id } : {}),
|
|
427
|
+
...(include_ocr ? { include_ocr } : {}),
|
|
428
|
+
},
|
|
387
429
|
note: CAPTURE_FALLBACK_NOTE,
|
|
388
430
|
};
|
|
389
431
|
}
|
|
390
432
|
|
|
391
433
|
export function resetLinuxComputerPreflightCache() {
|
|
392
434
|
cached = null;
|
|
393
|
-
}
|
|
435
|
+
}
|
|
@@ -29,7 +29,7 @@ export async function continuePendingComputerWork(initial, command, send, signal
|
|
|
29
29
|
try {
|
|
30
30
|
const waited = payload(await send({ action: 'wait_for_user', timeout_ms: 60_000 }));
|
|
31
31
|
signal?.throwIfAborted();
|
|
32
|
-
if (waited.status === 'timeout' &&
|
|
32
|
+
if (waited.status === 'timeout' && waited.reason === 'user_pause') continue;
|
|
33
33
|
if (waited.status !== 'resumed' || waited.resumed !== true) {
|
|
34
34
|
return {
|
|
35
35
|
text: JSON.stringify({
|
|
@@ -0,0 +1,230 @@
|
|
|
1
|
+
// The one MCP server of a multi-account connector (connector-catalog.mjs
|
|
2
|
+
// connectorAccountsOf): Gmail, Google Calendar or Google Drive with every
|
|
3
|
+
// connected account behind one tool set. Answered in-process like the
|
|
4
|
+
// one-account servers it fronts (google-mcp.mjs, gmail-app-password.mjs):
|
|
5
|
+
// each tool takes `account` (the account's address), and the call goes to
|
|
6
|
+
// that account's own endpoint with that account's own credentials (its OAuth
|
|
7
|
+
// tokens, or its app password from the keychain). With one account
|
|
8
|
+
// `account` may be left out; with several, a call naming none is refused
|
|
9
|
+
// with the list, so the model asks the user. An account that fails stays
|
|
10
|
+
// listed with why (connectorAccountHealth); the server only fails to start
|
|
11
|
+
// when no account can be used.
|
|
12
|
+
import { accountsOfInstructions, connectorAccountsInstructions } from '../shared/connector-accounts.mjs';
|
|
13
|
+
import { connectorById } from '../shared/connector-catalog.mjs';
|
|
14
|
+
import { gmailAppPasswordTools } from './gmail-app-password.mjs';
|
|
15
|
+
import { googleMcpTools } from './google-mcp.mjs';
|
|
16
|
+
|
|
17
|
+
const PROTOCOL_VERSION = '2025-06-18';
|
|
18
|
+
|
|
19
|
+
const json = (status, body) =>
|
|
20
|
+
new Response(JSON.stringify(body), { status, headers: { 'content-type': 'application/json' } });
|
|
21
|
+
const text = (value) => (typeof value === 'string' ? value.trim() : '');
|
|
22
|
+
const errorResult = (message) => ({ content: [{ type: 'text', text: message }], isError: true });
|
|
23
|
+
|
|
24
|
+
// account name → `{ email, error, authRequired }` as the last connect or call
|
|
25
|
+
// of that account found it; the status rows read it (session-runtime
|
|
26
|
+
// mcp-glue/server-catalog.mjs).
|
|
27
|
+
const health = new Map();
|
|
28
|
+
|
|
29
|
+
/** What the last connect or call of account `name` found, or null. */
|
|
30
|
+
export function connectorAccountHealth(name) {
|
|
31
|
+
return health.get(name) || null;
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
/** Forget account `name`'s recorded state (it was removed). */
|
|
35
|
+
export function forgetConnectorAccountHealth(name) {
|
|
36
|
+
health.delete(name);
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
const ACCOUNT_PROPERTY = Object.freeze({
|
|
40
|
+
type: 'string',
|
|
41
|
+
description:
|
|
42
|
+
'The account to act as (its email address). May be left out when one account is connected; required when several are.',
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
const SERVICE_OF = { gmail: 'gmail', 'google-calendar': 'calendar', 'google-drive': 'drive' };
|
|
46
|
+
|
|
47
|
+
/** The tools of `connector` over `accounts`, each taking `account`. Gmail on
|
|
48
|
+
* an app password has the larger set (IMAP); a Google sign-in Gmail account
|
|
49
|
+
* answers the tools it has and refuses the others. */
|
|
50
|
+
function connectorTools(connector, accounts, { hidden = false } = {}) {
|
|
51
|
+
const tools =
|
|
52
|
+
connector === 'gmail' && accounts.some((account) => account.appPassword)
|
|
53
|
+
? gmailAppPasswordTools({ hidden })
|
|
54
|
+
: googleMcpTools(SERVICE_OF[connector]);
|
|
55
|
+
return tools.map((tool) => ({
|
|
56
|
+
...tool,
|
|
57
|
+
inputSchema: {
|
|
58
|
+
...tool.inputSchema,
|
|
59
|
+
properties: { ...(tool.inputSchema?.properties || {}), account: ACCOUNT_PROPERTY },
|
|
60
|
+
},
|
|
61
|
+
}));
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
class AccountChoiceError extends Error {}
|
|
65
|
+
|
|
66
|
+
const labelOf = (account) => account.email || account.name;
|
|
67
|
+
|
|
68
|
+
/** The account a call names (by address, or by its account name), or its
|
|
69
|
+
* only account; throws the account list otherwise. */
|
|
70
|
+
function pickAccount(accounts, value, service) {
|
|
71
|
+
const list = accounts.map(labelOf).join(', ');
|
|
72
|
+
const wanted = text(value).toLowerCase();
|
|
73
|
+
if (wanted) {
|
|
74
|
+
const found = accounts.find(
|
|
75
|
+
(account) => account.email.toLowerCase() === wanted || account.name.toLowerCase() === wanted
|
|
76
|
+
);
|
|
77
|
+
if (!found) throw new AccountChoiceError(`Unknown ${service} account "${text(value)}". Accounts: ${list}.`);
|
|
78
|
+
return found;
|
|
79
|
+
}
|
|
80
|
+
if (accounts.length === 1) return accounts[0];
|
|
81
|
+
throw new AccountChoiceError(
|
|
82
|
+
`Several ${service} accounts are connected: ${list}. Ask the user which one, then pass it as \`account\`.`
|
|
83
|
+
);
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
const noteOf = (state) => (state.authRequired ? 'needs sign-in' : 'unavailable');
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* A `fetch` answering the accounts server of `connector` in-process. Each of
|
|
90
|
+
* `accounts` is `{ name, email, appPassword, request(message, { signal }) }`:
|
|
91
|
+
* `request` sends one JSON-RPC message to that account's own endpoint with its own
|
|
92
|
+
* credentials and resolves the JSON-RPC reply; it throws when the account
|
|
93
|
+
* cannot be reached (an `authRequired` error when it needs a sign-in).
|
|
94
|
+
*/
|
|
95
|
+
export function withConnectorAccountsMcp({ connector, accounts }) {
|
|
96
|
+
const service = connectorById(connector)?.name || connector;
|
|
97
|
+
const listed = connectorTools(connector, accounts);
|
|
98
|
+
const callable = connectorTools(connector, accounts, { hidden: true });
|
|
99
|
+
const record = (account, state) => {
|
|
100
|
+
if (state.email) account.email = state.email;
|
|
101
|
+
health.set(account.name, {
|
|
102
|
+
email: account.email,
|
|
103
|
+
error: state.error || '',
|
|
104
|
+
authRequired: state.authRequired === true,
|
|
105
|
+
});
|
|
106
|
+
};
|
|
107
|
+
const failure = (account, error) => {
|
|
108
|
+
const state = { error: error?.message || String(error), authRequired: error?.authRequired === true };
|
|
109
|
+
record(account, state);
|
|
110
|
+
return state;
|
|
111
|
+
};
|
|
112
|
+
// Each account's own initialize: whether it can be used, and its address.
|
|
113
|
+
const probe = async (account, signal) => {
|
|
114
|
+
try {
|
|
115
|
+
const reply = await account.request({ jsonrpc: '2.0', id: 1, method: 'initialize', params: {} }, { signal });
|
|
116
|
+
if (reply?.error) return failure(account, new Error(reply.error.message || 'The account did not start'));
|
|
117
|
+
const [email = ''] = accountsOfInstructions(reply?.result?.instructions);
|
|
118
|
+
const state = { email: account.email || email };
|
|
119
|
+
record(account, state);
|
|
120
|
+
return state;
|
|
121
|
+
} catch (error) {
|
|
122
|
+
return failure(account, error);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
// The calls in flight by JSON-RPC id, so a `notifications/cancelled` for one
|
|
126
|
+
// aborts its downstream request.
|
|
127
|
+
const inflight = new Map();
|
|
128
|
+
async function rpc(message, transportSignal) {
|
|
129
|
+
const { id, method, params } = message || {};
|
|
130
|
+
const reply = (result) => ({ jsonrpc: '2.0', id, result });
|
|
131
|
+
if (method === 'initialize') {
|
|
132
|
+
const states = await Promise.all(accounts.map((account) => probe(account, transportSignal)));
|
|
133
|
+
if (!states.some((state) => !state.error)) {
|
|
134
|
+
const first = states[0];
|
|
135
|
+
return {
|
|
136
|
+
jsonrpc: '2.0',
|
|
137
|
+
id,
|
|
138
|
+
error: { code: -32001, message: first?.error || `No ${service} account is connected` },
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
return reply({
|
|
142
|
+
protocolVersion: text(params?.protocolVersion) || PROTOCOL_VERSION,
|
|
143
|
+
capabilities: { tools: { listChanged: false } },
|
|
144
|
+
serverInfo: { name: `mixdog-${connector}`, version: '1.0.0' },
|
|
145
|
+
instructions: connectorAccountsInstructions(
|
|
146
|
+
accounts.map((account, index) => ({
|
|
147
|
+
email: labelOf(account),
|
|
148
|
+
...(states[index].error ? { note: noteOf(states[index]) } : {}),
|
|
149
|
+
}))
|
|
150
|
+
),
|
|
151
|
+
});
|
|
152
|
+
}
|
|
153
|
+
if (method === 'ping') return reply({});
|
|
154
|
+
if (method === 'tools/list') return reply({ tools: listed });
|
|
155
|
+
if (method === 'tools/call') {
|
|
156
|
+
const name = params?.name;
|
|
157
|
+
if (!callable.some((tool) => tool.name === name)) {
|
|
158
|
+
return { jsonrpc: '2.0', id, error: { code: -32602, message: `Unknown tool: ${name}` } };
|
|
159
|
+
}
|
|
160
|
+
const { account: chosen, ...args } = params?.arguments || {};
|
|
161
|
+
let account;
|
|
162
|
+
try {
|
|
163
|
+
account = pickAccount(accounts, chosen, service);
|
|
164
|
+
} catch (error) {
|
|
165
|
+
return reply(errorResult(error.message));
|
|
166
|
+
}
|
|
167
|
+
const cancel = new AbortController();
|
|
168
|
+
const signal = transportSignal ? AbortSignal.any([transportSignal, cancel.signal]) : cancel.signal;
|
|
169
|
+
inflight.set(id, cancel);
|
|
170
|
+
try {
|
|
171
|
+
const answer = await account.request(
|
|
172
|
+
{ jsonrpc: '2.0', id, method, params: { name, arguments: args } },
|
|
173
|
+
{ signal }
|
|
174
|
+
);
|
|
175
|
+
if (answer?.error) return reply(errorResult(`${labelOf(account)}: ${answer.error.message}`));
|
|
176
|
+
if (health.get(account.name)?.error) record(account, {});
|
|
177
|
+
return reply(answer?.result ?? errorResult(`${labelOf(account)}: no answer`));
|
|
178
|
+
} catch (error) {
|
|
179
|
+
// A cancelled call says nothing about the account's health.
|
|
180
|
+
if (signal.aborted) return reply(errorResult(`${labelOf(account)}: cancelled`));
|
|
181
|
+
const state = failure(account, error);
|
|
182
|
+
return reply(errorResult(`${labelOf(account)}: ${state.error}`));
|
|
183
|
+
} finally {
|
|
184
|
+
inflight.delete(id);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
return { jsonrpc: '2.0', id, error: { code: -32601, message: `Method not found: ${method}` } };
|
|
188
|
+
}
|
|
189
|
+
return async (input, init) => {
|
|
190
|
+
const request = input instanceof Request ? input : null;
|
|
191
|
+
if (String(request?.method || init?.method || 'GET').toUpperCase() !== 'POST') {
|
|
192
|
+
return new Response(null, { status: 405, headers: { allow: 'POST' } });
|
|
193
|
+
}
|
|
194
|
+
const body = request ? await request.text() : init?.body;
|
|
195
|
+
let message;
|
|
196
|
+
try {
|
|
197
|
+
message = JSON.parse(typeof body === 'string' ? body : new TextDecoder().decode(body));
|
|
198
|
+
} catch {
|
|
199
|
+
return json(400, { jsonrpc: '2.0', id: null, error: { code: -32700, message: 'Parse error' } });
|
|
200
|
+
}
|
|
201
|
+
const batch = Array.isArray(message) ? message : [message];
|
|
202
|
+
const signal = init?.signal ?? request?.signal;
|
|
203
|
+
for (const one of batch) {
|
|
204
|
+
if (one?.method === 'notifications/cancelled') inflight.get(one.params?.requestId)?.abort();
|
|
205
|
+
}
|
|
206
|
+
const replies = (await Promise.all(batch.map((one) => (one?.id === undefined ? null : rpc(one, signal))))).filter(
|
|
207
|
+
Boolean
|
|
208
|
+
);
|
|
209
|
+
if (!replies.length) return new Response(null, { status: 202 });
|
|
210
|
+
return json(200, Array.isArray(message) ? replies : replies[0]);
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
/** `request` for an account answered at `url` through `fetchImpl` (its
|
|
215
|
+
* credentials applied there) with `headers`: one JSON-RPC POST, its reply. */
|
|
216
|
+
export function connectorAccountRequest(url, fetchImpl, headers = {}) {
|
|
217
|
+
return async (message, { signal } = {}) => {
|
|
218
|
+
const response = await fetchImpl(url, {
|
|
219
|
+
method: 'POST',
|
|
220
|
+
headers: { 'content-type': 'application/json', accept: 'application/json, text/event-stream', ...headers },
|
|
221
|
+
body: JSON.stringify(message),
|
|
222
|
+
signal,
|
|
223
|
+
});
|
|
224
|
+
if (!response.ok) {
|
|
225
|
+
await response.body?.cancel();
|
|
226
|
+
throw new Error(`The account's server answered ${response.status}`);
|
|
227
|
+
}
|
|
228
|
+
return response.json();
|
|
229
|
+
};
|
|
230
|
+
}
|