mixdog 1.4.1 → 1.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/package.json +3 -2
- package/scripts/build-shipped-history.mjs +115 -33
- package/scripts/gate-local.mjs +172 -61
- package/scripts/lib/gate-scheduler.mjs +138 -32
- package/scripts/lib/gate-timing-reporter.mjs +16 -0
- package/scripts/lib/run-node-tests.mjs +54 -29
- package/scripts/lib/scoped-temp.mjs +1 -0
- package/scripts/lib/test-failure-records.mjs +14 -1
- package/scripts/lib/test-failure-summary.mjs +16 -4
- package/scripts/lib/test-spawn-ledger.mjs +12 -3
- package/scripts/pptx-kit-index.mjs +5 -6
- package/scripts/suite-health.mjs +110 -28
- package/scripts/test.mjs +9 -14
- package/src/agents/advisor/AGENT.md +4 -4
- package/src/agents/advisor/agent.json +1 -1
- package/src/agents/explore/AGENT.md +22 -0
- package/src/agents/explore/agent.json +6 -0
- package/src/cli.mjs +7 -0
- package/src/defaults/agents.json +7 -0
- package/src/defaults/shipped-history.json +18 -2
- package/src/defaults/skills/browser-use/SKILL.md +4 -1
- package/src/defaults/skills/code-tidy/SKILL.md +71 -102
- package/src/defaults/skills/code-tidy/references/agent-cleanup.md +66 -114
- package/src/defaults/skills/code-tidy/references/cleanup-report.md +19 -35
- package/src/defaults/skills/code-tidy/references/dead-code.md +3 -9
- package/src/defaults/skills/code-tidy/references/test-suite-slop.md +16 -27
- package/src/defaults/skills/computer-use/SKILL.md +12 -2
- package/src/defaults/skills/goal-management/SKILL.md +1 -1
- package/src/defaults/skills/setup/references/actions.md +12 -6
- package/src/defaults/skills/setup/references/surfaces.md +2 -2
- package/src/defaults/skills/setup-guide/SKILL.md +5 -2
- package/src/defaults/skills/setup-guide/model-recommendations.json +13 -0
- package/src/defaults/skills/skill-creator/SKILL.md +85 -190
- package/src/defaults/skills/skill-creator/references/design.md +70 -162
- package/src/defaults/skills/skill-creator/references/evaluation.md +33 -92
- package/src/defaults/skills/test-suite/SKILL.md +194 -0
- package/src/defaults/skills/test-suite/references/case-management.md +51 -0
- package/src/defaults/skills/test-suite/references/flaky-policy.md +39 -0
- package/src/defaults/skills/test-suite/references/reliability.md +49 -0
- package/src/defaults/skills/test-suite/references/suite-design.md +78 -0
- package/src/defaults/skills/test-suite/scripts/inventory.mjs +335 -0
- package/src/defaults/skills/visualize/SKILL.md +6 -2
- package/src/lib/rules-builder.cjs +6 -30
- package/src/rules/lead/LEAD.md +3 -3
- package/src/rules/shared/20-research.md +3 -6
- package/src/rules/shared/40-editing.md +1 -0
- package/src/rules/shared/60-verification.md +10 -9
- package/src/rules/shared/70-delivery.md +4 -3
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/abort-link.mjs +5 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +10 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +130 -21
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +13 -0
- package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +4 -1
- package/src/runtime/agent/orchestrator/config.mjs +12 -7
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +7 -7
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +5 -26
- package/src/runtime/agent/orchestrator/internal-agents.mjs +3 -14
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +122 -12
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +5 -3
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +13 -2
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +152 -58
- package/src/runtime/agent/orchestrator/mcp/client.mjs +51 -18
- package/src/runtime/agent/orchestrator/mcp/oauth-login.mjs +83 -52
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +42 -26
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +43 -8
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +30 -28
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-credentials.mjs +31 -21
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-login.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-oauth-tokens.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +40 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider-keys.mjs +34 -0
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +3 -0
- package/src/runtime/agent/orchestrator/providers/devin-auth.mjs +14 -7
- package/src/runtime/agent/orchestrator/providers/devin-wire-transport.mjs +3 -2
- package/src/runtime/agent/orchestrator/providers/gemini-response.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/gemini-stream.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/grok-oauth-login.mjs +48 -31
- package/src/runtime/agent/orchestrator/providers/lib/oauth-page.mjs +0 -18
- package/src/runtime/agent/orchestrator/providers/lib/oauth-token-utils.mjs +138 -6
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
- package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
- package/src/runtime/agent/orchestrator/providers/openai-oauth-login.mjs +26 -28
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/opencode-go.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/registry.mjs +33 -2
- package/src/runtime/agent/orchestrator/providers/vertex-ai-auth.mjs +622 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai-maas.mjs +185 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai-models.mjs +445 -0
- package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +567 -0
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +2 -0
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +2 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +14 -5
- package/src/runtime/agent/orchestrator/runtime-core/workflow-ids.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -5
- package/src/runtime/agent/orchestrator/session/agent-room.mjs +171 -37
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +94 -10
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +10 -5
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +5 -5
- package/src/runtime/agent/orchestrator/session/conversation-import/turns.mjs +11 -1
- package/src/runtime/agent/orchestrator/session/eager-dispatch.mjs +4 -3
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +36 -6
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +5 -3
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +21 -2
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +23 -1
- package/src/runtime/agent/orchestrator/session/loop/turn-limits.mjs +13 -8
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +50 -28
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +3 -4
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +7 -0
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +25 -14
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +17 -14
- package/src/runtime/agent/orchestrator/session/manager/session-scratch-environment.mjs +70 -0
- package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +0 -3
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +7 -3
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +47 -29
- package/src/runtime/agent/orchestrator/session/manager/turn-reap.mjs +125 -0
- package/src/runtime/agent/orchestrator/session/mixy-name.mjs +11 -5
- package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +243 -38
- package/src/runtime/agent/orchestrator/session/store-transcript-cache.mjs +163 -64
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +164 -4
- package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +142 -18
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +36 -26
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +3 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
- package/src/runtime/agent/orchestrator/tools/builtin/runtime-capabilities.mjs +20 -15
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +96 -20
- package/src/runtime/agent/orchestrator/tools/builtin/task-tool.mjs +59 -10
- package/src/runtime/agent/orchestrator/tools/graph-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/lib/native-spawn-client.mjs +99 -2
- package/src/runtime/agent/orchestrator/tools/lib/owned-shell-trees.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +103 -13
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-background/promote-job.mjs +3 -1
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +49 -15
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +45 -27
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +34 -10
- package/src/runtime/agent/orchestrator/tools/lib/shell-warm-standby.mjs +2 -0
- package/src/runtime/agent/orchestrator/tools/lib/wait-until-fixture.mjs +26 -0
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +7 -2
- package/src/runtime/agent/orchestrator/tools/spawn-manifest.json +13 -13
- package/src/runtime/channels/lib/whisper-port.mjs +19 -10
- package/src/runtime/channels/lib/whisper-server.mjs +10 -1
- package/src/runtime/connectors/connector-accounts-mcp.mjs +236 -103
- package/src/runtime/connectors/gmail-app-password.mjs +3 -3
- package/src/runtime/explore/explorer.mjs +93 -0
- package/src/runtime/explore/tool-defs.mjs +35 -0
- package/src/runtime/explore/tool.mjs +123 -0
- package/src/runtime/memory/index.mjs +4 -0
- package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
- package/src/runtime/memory/lib/embedding-worker.mjs +4 -0
- package/src/runtime/office/quality/assurance-structure-docx.mjs +1 -1
- package/src/runtime/shared/agent-route-config.mjs +17 -2
- package/src/runtime/shared/atomic-file.mjs +103 -2
- package/src/runtime/shared/background-tasks.mjs +15 -6
- package/src/runtime/shared/connector-accounts.mjs +5 -5
- package/src/runtime/shared/connector-catalog.d.mts +11 -4
- package/src/runtime/shared/connector-catalog.mjs +60 -52
- package/src/runtime/shared/custom-provider-keys.mjs +20 -0
- package/src/runtime/shared/file-has-data.mjs +26 -2
- package/src/runtime/shared/file-lock.mjs +13 -15
- package/src/runtime/shared/git-launch.d.mts +9 -0
- package/src/runtime/shared/git-launch.mjs +213 -0
- package/src/runtime/shared/git-runner-worker.mjs +2 -1
- package/src/runtime/shared/llm/cost.mjs +6 -1
- package/src/runtime/shared/llm/http-agent.mjs +313 -29
- package/src/runtime/shared/llm/model-catalog-projection.mjs +3 -2
- package/src/runtime/shared/llm/model-catalog.mjs +46 -6
- package/src/runtime/shared/llm/provider-catalog-registry.mjs +3 -0
- package/src/runtime/shared/llm/system-proxy.mjs +452 -0
- package/src/runtime/shared/provider-accounts.mjs +52 -2
- package/src/runtime/shared/staged-install-worker.mjs +5 -0
- package/src/runtime/shared/staged-update.mjs +47 -2
- package/src/runtime/shared/tool-surface.mjs +110 -36
- package/src/runtime/shared/tool-work-units.mjs +4 -0
- package/src/runtime/shared/turn-worktree-snapshot.mjs +414 -54
- package/src/runtime/shared/worktrees/activity-gate.mjs +215 -318
- package/src/runtime/shared/worktrees/activity-ledger-worker.mjs +56 -0
- package/src/runtime/shared/worktrees/activity-ledger.mjs +391 -0
- package/src/runtime/shared/worktrees/branch-management.mjs +9 -3
- package/src/runtime/shared/worktrees/git.mjs +57 -0
- package/src/runtime/shared/worktrees/manager.mjs +205 -137
- package/src/runtime/tidy/install.mjs +95 -15
- package/src/runtime/tidy/languages.mjs +17 -15
- package/src/runtime/tidy/process.mjs +7 -4
- package/src/runtime/tidy/resolve.mjs +19 -16
- package/src/runtime/tidy/runners/biome.mjs +3 -3
- package/src/runtime/tidy/tool.mjs +1 -1
- package/src/runtime/tidy/worktree.mjs +10 -6
- package/src/runtime/visualize-bridge/client.mjs +4 -1
- package/src/runtime/visualize-bridge/tool-defs.mjs +7 -2
- package/src/runtime/web-search/index.mjs +1 -1
- package/src/session-runtime/agent-task-sessions.mjs +410 -353
- package/src/session-runtime/boot/tools.mjs +2 -0
- package/src/session-runtime/bot-status.mjs +103 -103
- package/src/session-runtime/connector-merge-migration.mjs +18 -15
- package/src/session-runtime/conversation-import/discovery.mjs +159 -40
- package/src/session-runtime/conversation-import/service.mjs +9 -3
- package/src/session-runtime/handoff-attachments.mjs +1 -1
- package/src/session-runtime/held-requests.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -0
- package/src/session-runtime/internal-tool-executor/knowledge-tools.mjs +8 -0
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +143 -116
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +6 -1
- package/src/session-runtime/lifecycle/teardown.mjs +1 -1
- package/src/session-runtime/mcp-glue/server-catalog.mjs +16 -10
- package/src/session-runtime/mcp-glue/server-input.mjs +4 -1
- package/src/session-runtime/mixy-heartbeat.mjs +1 -1
- package/src/session-runtime/provider-auth/login.mjs +2 -2
- package/src/session-runtime/resource-mcp-api.mjs +98 -35
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +44 -31
- package/src/session-runtime/resource-mcp-secrets.mjs +28 -11
- package/src/session-runtime/resource-mcp-servers.mjs +5 -4
- package/src/session-runtime/services/agent-tool/send-flow.mjs +10 -2
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +8 -3
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +4 -1
- package/src/session-runtime/services/agent-watchdog-registry.mjs +32 -4
- package/src/session-runtime/services/channel-worker/daemon-spawn.mjs +2 -0
- package/src/session-runtime/services/daemon-candidate.mjs +4 -1
- package/src/session-runtime/services/memory-runtime-proxy/daemon-spawn.mjs +4 -0
- package/src/session-runtime/services/plugin-admin.mjs +10 -6
- package/src/session-runtime/services/provider-admin.mjs +281 -10
- package/src/session-runtime/session-turn-api.mjs +2 -0
- package/src/session-runtime/settings-builtin-tools-api.mjs +4 -1
- package/src/session-runtime/settings-system-api.mjs +1 -1
- package/src/session-runtime/setup-tool/agent-settings-actions.mjs +13 -3
- package/src/session-runtime/setup-tool/connector-widen-approval.mjs +96 -0
- package/src/session-runtime/setup-tool/executor.mjs +6 -2
- package/src/session-runtime/setup-tool/tool-defs.mjs +2 -1
- package/src/session-runtime/turn/agent-ops.mjs +23 -0
- package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +49 -11
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +10 -1
- package/src/session-runtime/workspace/activity-guards.mjs +176 -0
- package/src/session-runtime/workspace/session-view.mjs +149 -0
- package/src/session-runtime/workspace/side-checkouts.mjs +203 -0
- package/src/session-runtime/workspace/transition-runner.mjs +188 -0
- package/src/session-runtime/workspace/transitions.mjs +108 -1066
- package/src/session-runtime/workspace/workspace-merge.mjs +132 -0
- package/src/session-runtime/workspace/worktree-intents.mjs +242 -0
- package/src/session-runtime/workspace/worktree-maintenance.mjs +80 -0
- package/src/session-runtime/workspace/worktree-setup.mjs +85 -0
- package/src/session-runtime/workspace/worktree-tool.mjs +54 -54
- package/src/standalone/daemon-desktop-runtime.mjs +2 -0
- package/src/standalone/daemon-session-control.mjs +151 -136
- package/src/standalone/daemon.mjs +7 -0
- package/src/standalone/desktop-service-registry.mjs +9 -0
- package/src/standalone/local-session-runtime.mjs +5 -1
- package/src/standalone/session-client/daemon-unavailable.mjs +3 -0
- package/src/standalone/session-client.mjs +5 -1
- package/src/standalone/session-frame-stream.mjs +83 -11
- package/src/standalone/session-protocol.mjs +4 -0
- package/src/standalone/session-service/agent-tree.mjs +45 -9
- package/src/standalone/session-service/projection/transcript-window.mjs +700 -64
- package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
- package/src/standalone/session-service/stored-reader.mjs +127 -40
- package/src/tui/App.jsx +154 -164
- package/src/tui/app/app-view/floating-panel.jsx +3 -0
- package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
- package/src/tui/app/clipboard.mjs +21 -10
- package/src/tui/app/prompt-handlers/use-prompt-history-nav.mjs +1 -1
- package/src/tui/app/prompt-handlers/use-prompt-interrupt.mjs +3 -0
- package/src/tui/app/prompt-submit/provider-prompts.mjs +3 -1
- package/src/tui/app/provider-setup/api-key-actions.mjs +31 -1
- package/src/tui/app/provider-setup/oauth-actions.mjs +25 -6
- package/src/tui/app/provider-setup-picker.mjs +20 -13
- package/src/tui/app/shell-layout/row-budgets.mjs +12 -10
- package/src/tui/app/slash-commands.mjs +1 -0
- package/src/tui/app/slash-dispatch/session-commands.mjs +46 -0
- package/src/tui/app/slash-dispatch.mjs +1 -1
- package/src/tui/app/use-btw-panel.mjs +29 -0
- package/src/tui/app/use-context-panel-refresh.mjs +31 -0
- package/src/tui/app/use-model-catalog-cache.mjs +13 -10
- package/src/tui/app/use-mouse-input.mjs +11 -0
- package/src/tui/app/use-onboarding-start.mjs +8 -3
- package/src/tui/app/use-panel-transition.mjs +10 -1
- package/src/tui/app/use-pasted-buffers.mjs +28 -20
- package/src/tui/app/use-prompt-draft-flow.mjs +7 -0
- package/src/tui/app/use-prompt-layout-rows.mjs +3 -3
- package/src/tui/app/use-prompt-queue-history.mjs +3 -2
- package/src/tui/app/use-selection-focus.mjs +11 -2
- package/src/tui/app/use-selection-geometry.mjs +18 -9
- package/src/tui/app/use-selection-paint.mjs +4 -4
- package/src/tui/app/use-selection-stitch.mjs +3 -3
- package/src/tui/app/use-slash-palette.mjs +62 -0
- package/src/tui/app/use-terminal-chrome.mjs +2 -2
- package/src/tui/app/use-transcript-activity.mjs +47 -32
- package/src/tui/app/use-transcript-follow.mjs +12 -4
- package/src/tui/app/use-transcript-scroll.mjs +46 -17
- package/src/tui/app/use-transcript-swap-reset.mjs +27 -0
- package/src/tui/app/use-transcript-window/geometry.mjs +19 -5
- package/src/tui/app/use-transcript-window/instance-state.mjs +4 -0
- package/src/tui/app/use-transcript-window/selection-shift.mjs +5 -1
- package/src/tui/app/use-transcript-window.mjs +21 -11
- package/src/tui/app/use-tui-ready.mjs +18 -0
- package/src/tui/app/use-welcome-prompt-hint.mjs +5 -0
- package/src/tui/app/use-workflow-tab-cycle.mjs +5 -3
- package/src/tui/components/Picker.jsx +27 -3
- package/src/tui/components/SignInUrl.jsx +68 -0
- package/src/tui/components/TextEntryPanel.jsx +76 -46
- package/src/tui/components/sign-in-url-layout.mjs +24 -0
- package/src/tui/dist/index.mjs +1896 -1341
- package/src/tui/session/goal-turn-state.mjs +6 -2
- package/src/tui/session/session-api/controls.mjs +4 -0
- package/src/tui/session/session-api/extensions.mjs +8 -0
- package/src/tui/session/session-api/intake/abort.mjs +2 -1
- package/src/tui/session/session-api/intake.mjs +2 -0
- package/src/tui/session/session-api/integrations.mjs +2 -2
- package/src/tui/session/session-api/routes-agent-definitions.mjs +1 -0
- package/src/tui/session/session-api/settings.mjs +2 -2
- package/src/tui/session/transcript-spill/spill-writer.mjs +15 -0
- package/src/tui/session/transcript-spill.mjs +92 -4
- package/src/tui/session/transcript-store.mjs +2 -0
- package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
|
@@ -22,6 +22,7 @@ import { TOOL_DEFS as OFFICE_TOOL_DEFS } from '../../runtime/office/tool-defs.mj
|
|
|
22
22
|
import { TOOL_DEFS as MEDIA_TOOL_DEFS } from '../../runtime/media/tool-defs.mjs';
|
|
23
23
|
import { TOOL_DEFS as TIDY_TOOL_DEFS } from '../../runtime/tidy/tool-defs.mjs';
|
|
24
24
|
import { TOOL_DEFS as VISUALIZE_BRIDGE_TOOL_DEFS } from '../../runtime/visualize-bridge/tool-defs.mjs';
|
|
25
|
+
import { TOOL_DEFS as EXPLORE_TOOL_DEFS } from '../../runtime/explore/tool-defs.mjs';
|
|
25
26
|
import {
|
|
26
27
|
ASK_USER_TOOL_DEFS,
|
|
27
28
|
HANDOFF_USER_TOOL_DEFS,
|
|
@@ -172,6 +173,7 @@ function wireToolSurface(boot) {
|
|
|
172
173
|
mediaToolDefs: MEDIA_TOOL_DEFS,
|
|
173
174
|
tidyToolDefs: TIDY_TOOL_DEFS,
|
|
174
175
|
visualizeToolDefs: VISUALIZE_BRIDGE_TOOL_DEFS,
|
|
176
|
+
exploreToolDefs: EXPLORE_TOOL_DEFS,
|
|
175
177
|
setupToolDefs: SETUP_TOOL_DEFS,
|
|
176
178
|
askUserToolDefs: ASK_USER_TOOL_DEFS,
|
|
177
179
|
handoffUserToolDefs: HANDOFF_USER_TOOL_DEFS,
|
|
@@ -204,6 +204,109 @@ function routineDetail(routine, now) {
|
|
|
204
204
|
return cut(`${routine.kind} ${quotedText(routine.name, 64)}: ${parts.join(', ')}`, 240);
|
|
205
205
|
}
|
|
206
206
|
|
|
207
|
+
/** Everything known about one bot, from the gathered state. */
|
|
208
|
+
function botState(bot, ctx) {
|
|
209
|
+
const homeId = agentHomeSessionId(bot.id);
|
|
210
|
+
const owned = ctx.owned.get(bot.id) || [];
|
|
211
|
+
const home = ctx.rows.get(homeId) || null;
|
|
212
|
+
// Work this bot sent that is running now: a session working with the bot's
|
|
213
|
+
// send in flight (`handedBy`, bot-owned-work.mjs). A turn the user typed
|
|
214
|
+
// in the bot's task session is the user's, not the bot working.
|
|
215
|
+
const sentWork = (row) => isWorking(row) && row.handedBy?.includes(bot.id);
|
|
216
|
+
// Running task sessions: a turn whose report is still owed, or the bot's
|
|
217
|
+
// work running now.
|
|
218
|
+
const tasks = new Map();
|
|
219
|
+
const addTask = (id, title, at) => {
|
|
220
|
+
const known = tasks.get(id);
|
|
221
|
+
if (!known) tasks.set(id, { id, title, at });
|
|
222
|
+
else if (at && (!known.at || at < known.at)) known.at = at;
|
|
223
|
+
};
|
|
224
|
+
for (const watch of ctx.watches) {
|
|
225
|
+
if (watch.agentId !== bot.id || watch.target === 'session' || !watch.taskSessionId) continue;
|
|
226
|
+
addTask(watch.taskSessionId, watch.title, Number(watch.at) || 0);
|
|
227
|
+
}
|
|
228
|
+
for (const row of owned) {
|
|
229
|
+
if (row.id === homeId || roomMemberOfSession(row.id) || !sentWork(row)) continue;
|
|
230
|
+
addTask(row.id, row.title, Number(row.createdAt) || 0);
|
|
231
|
+
}
|
|
232
|
+
const running = [...tasks.values()].sort((left, right) => left.at - right.at || (left.id < right.id ? -1 : 1));
|
|
233
|
+
const held = ctx.held.filter((entry) => entry.agentId === bot.id);
|
|
234
|
+
const approvals = held.length + [homeId, ...running.map((task) => task.id)].filter(ctx.awaitingApproval).length;
|
|
235
|
+
const routines = ctx.routines.rows
|
|
236
|
+
.filter((routine) => (routine.owner || MIXY_AGENT_ID) === bot.id)
|
|
237
|
+
.sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0));
|
|
238
|
+
const flags = [];
|
|
239
|
+
if (approvals) flags.push(`${plural(approvals, 'approval')} waiting`);
|
|
240
|
+
for (const routine of routines) {
|
|
241
|
+
const trouble = routineTrouble(routine);
|
|
242
|
+
if (trouble.length) flags.push(`${quotedText(routine.name, 20)} ${trouble.join(', ')}`);
|
|
243
|
+
}
|
|
244
|
+
if (bot.disabled) flags.push('disabled');
|
|
245
|
+
return {
|
|
246
|
+
bot,
|
|
247
|
+
homeId,
|
|
248
|
+
home,
|
|
249
|
+
owned,
|
|
250
|
+
running,
|
|
251
|
+
held,
|
|
252
|
+
approvals,
|
|
253
|
+
routines,
|
|
254
|
+
flags,
|
|
255
|
+
working: isWorking(home) || running.some((task) => sentWork(ctx.rows.get(task.id))),
|
|
256
|
+
lastAt: activityOf(home),
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
function botLine(state, now) {
|
|
261
|
+
const { bot } = state;
|
|
262
|
+
const parts = [`${quotedText(bot.name, 40)} (${bot.id})`, `chat ${state.homeId}`];
|
|
263
|
+
if (bot.self) parts.push('you');
|
|
264
|
+
parts.push(state.working ? 'working' : 'idle');
|
|
265
|
+
if (state.flags.length) parts.push(`attention: ${state.flags.join('; ')}`);
|
|
266
|
+
parts.push(state.lastAt ? `last ${ago(state.lastAt, now)}` : 'no chat yet');
|
|
267
|
+
if (state.running.length) {
|
|
268
|
+
const [first] = state.running;
|
|
269
|
+
const more = state.running.length > 1 ? ` +${state.running.length - 1}` : '';
|
|
270
|
+
const count = state.running.length > 1 ? `${state.running.length} tasks:` : 'task';
|
|
271
|
+
parts.push(`${count} "${quotedText(first.title, 24)}"${first.at ? ` ${span(now - first.at)}` : ''}${more}`);
|
|
272
|
+
}
|
|
273
|
+
if (state.routines.length) {
|
|
274
|
+
const next = state.routines
|
|
275
|
+
.filter((routine) => routine.enabled !== false && epoch(routine.nextFireAt))
|
|
276
|
+
.sort((left, right) => epoch(left.nextFireAt) - epoch(right.nextFireAt))[0];
|
|
277
|
+
parts.push(
|
|
278
|
+
`${plural(state.routines.length, 'routine')}${next ? `, next ${quotedText(next.name, 20)} ${until(epoch(next.nextFireAt), now)}` : ''}`
|
|
279
|
+
);
|
|
280
|
+
}
|
|
281
|
+
const fixed = parts.join(' · ');
|
|
282
|
+
const preview = oneLine(state.home?.lastMessagePreview || state.home?.preview);
|
|
283
|
+
const room = BOT_LINE_LIMIT - fixed.length - 5;
|
|
284
|
+
return cut(preview && room >= MIN_PREVIEW ? `${fixed} · "${quotedText(preview, room)}"` : fixed, BOT_LINE_LIMIT);
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
const mixyBot = (ctx) => ({ id: MIXY_AGENT_ID, name: ctx.mixy, self: true });
|
|
288
|
+
|
|
289
|
+
/** The bots the caller sees: every bot then Mixy when she has something to
|
|
290
|
+
* show, or just the caller's own bot. */
|
|
291
|
+
function visibleStates(ctx) {
|
|
292
|
+
if (ctx.own) {
|
|
293
|
+
const bot = ctx.own === MIXY_AGENT_ID ? mixyBot(ctx) : ctx.bots[0];
|
|
294
|
+
return bot ? [botState(bot, ctx)] : [];
|
|
295
|
+
}
|
|
296
|
+
const states = ctx.bots
|
|
297
|
+
.map((bot) => botState(bot, ctx))
|
|
298
|
+
.sort(
|
|
299
|
+
(left, right) =>
|
|
300
|
+
Number(right.flags.length > 0) - Number(left.flags.length > 0) ||
|
|
301
|
+
Number(right.working) - Number(left.working) ||
|
|
302
|
+
right.lastAt - left.lastAt ||
|
|
303
|
+
(left.bot.id < right.bot.id ? -1 : 1)
|
|
304
|
+
);
|
|
305
|
+
const mixy = botState(mixyBot(ctx), ctx);
|
|
306
|
+
if (mixy.routines.length || mixy.running.length || mixy.approvals) states.push(mixy);
|
|
307
|
+
return states;
|
|
308
|
+
}
|
|
309
|
+
|
|
207
310
|
export function createBotStatus({
|
|
208
311
|
getSessionService,
|
|
209
312
|
listBots = defaultListBots,
|
|
@@ -260,109 +363,6 @@ export function createBotStatus({
|
|
|
260
363
|
};
|
|
261
364
|
}
|
|
262
365
|
|
|
263
|
-
/** Everything known about one bot, from the gathered state. */
|
|
264
|
-
function botState(bot, ctx) {
|
|
265
|
-
const homeId = agentHomeSessionId(bot.id);
|
|
266
|
-
const owned = ctx.owned.get(bot.id) || [];
|
|
267
|
-
const home = ctx.rows.get(homeId) || null;
|
|
268
|
-
// Work this bot sent that is running now: a session working with the bot's
|
|
269
|
-
// send in flight (`handedBy`, bot-owned-work.mjs). A turn the user typed
|
|
270
|
-
// in the bot's task session is the user's, not the bot working.
|
|
271
|
-
const sentWork = (row) => isWorking(row) && row.handedBy?.includes(bot.id) === true;
|
|
272
|
-
// Running task sessions: a turn whose report is still owed, or the bot's
|
|
273
|
-
// work running now.
|
|
274
|
-
const tasks = new Map();
|
|
275
|
-
const addTask = (id, title, at) => {
|
|
276
|
-
const known = tasks.get(id);
|
|
277
|
-
if (!known) tasks.set(id, { id, title, at });
|
|
278
|
-
else if (at && (!known.at || at < known.at)) known.at = at;
|
|
279
|
-
};
|
|
280
|
-
for (const watch of ctx.watches) {
|
|
281
|
-
if (watch.agentId !== bot.id || watch.target === 'session' || !watch.taskSessionId) continue;
|
|
282
|
-
addTask(watch.taskSessionId, watch.title, Number(watch.at) || 0);
|
|
283
|
-
}
|
|
284
|
-
for (const row of owned) {
|
|
285
|
-
if (row.id === homeId || roomMemberOfSession(row.id) || !sentWork(row)) continue;
|
|
286
|
-
addTask(row.id, row.title, Number(row.createdAt) || 0);
|
|
287
|
-
}
|
|
288
|
-
const running = [...tasks.values()].sort((left, right) => left.at - right.at || (left.id < right.id ? -1 : 1));
|
|
289
|
-
const held = ctx.held.filter((entry) => entry.agentId === bot.id);
|
|
290
|
-
const approvals = held.length + [homeId, ...running.map((task) => task.id)].filter(ctx.awaitingApproval).length;
|
|
291
|
-
const routines = ctx.routines.rows
|
|
292
|
-
.filter((routine) => (routine.owner || MIXY_AGENT_ID) === bot.id)
|
|
293
|
-
.sort((left, right) => (left.name < right.name ? -1 : left.name > right.name ? 1 : 0));
|
|
294
|
-
const flags = [];
|
|
295
|
-
if (approvals) flags.push(`${plural(approvals, 'approval')} waiting`);
|
|
296
|
-
for (const routine of routines) {
|
|
297
|
-
const trouble = routineTrouble(routine);
|
|
298
|
-
if (trouble.length) flags.push(`${quotedText(routine.name, 20)} ${trouble.join(', ')}`);
|
|
299
|
-
}
|
|
300
|
-
if (bot.disabled) flags.push('disabled');
|
|
301
|
-
return {
|
|
302
|
-
bot,
|
|
303
|
-
homeId,
|
|
304
|
-
home,
|
|
305
|
-
owned,
|
|
306
|
-
running,
|
|
307
|
-
held,
|
|
308
|
-
approvals,
|
|
309
|
-
routines,
|
|
310
|
-
flags,
|
|
311
|
-
working: isWorking(home) || running.some((task) => sentWork(ctx.rows.get(task.id))),
|
|
312
|
-
lastAt: activityOf(home),
|
|
313
|
-
};
|
|
314
|
-
}
|
|
315
|
-
|
|
316
|
-
function botLine(state, now) {
|
|
317
|
-
const { bot } = state;
|
|
318
|
-
const parts = [`${quotedText(bot.name, 40)} (${bot.id})`, `chat ${state.homeId}`];
|
|
319
|
-
if (bot.self) parts.push('you');
|
|
320
|
-
parts.push(state.working ? 'working' : 'idle');
|
|
321
|
-
if (state.flags.length) parts.push(`attention: ${state.flags.join('; ')}`);
|
|
322
|
-
parts.push(state.lastAt ? `last ${ago(state.lastAt, now)}` : 'no chat yet');
|
|
323
|
-
if (state.running.length) {
|
|
324
|
-
const [first] = state.running;
|
|
325
|
-
const more = state.running.length > 1 ? ` +${state.running.length - 1}` : '';
|
|
326
|
-
const count = state.running.length > 1 ? `${state.running.length} tasks:` : 'task';
|
|
327
|
-
parts.push(`${count} "${quotedText(first.title, 24)}"${first.at ? ` ${span(now - first.at)}` : ''}${more}`);
|
|
328
|
-
}
|
|
329
|
-
if (state.routines.length) {
|
|
330
|
-
const next = state.routines
|
|
331
|
-
.filter((routine) => routine.enabled !== false && epoch(routine.nextFireAt))
|
|
332
|
-
.sort((left, right) => epoch(left.nextFireAt) - epoch(right.nextFireAt))[0];
|
|
333
|
-
parts.push(
|
|
334
|
-
`${plural(state.routines.length, 'routine')}${next ? `, next ${quotedText(next.name, 20)} ${until(epoch(next.nextFireAt), now)}` : ''}`
|
|
335
|
-
);
|
|
336
|
-
}
|
|
337
|
-
const fixed = parts.join(' · ');
|
|
338
|
-
const preview = oneLine(state.home?.lastMessagePreview || state.home?.preview);
|
|
339
|
-
const room = BOT_LINE_LIMIT - fixed.length - 5;
|
|
340
|
-
return cut(preview && room >= MIN_PREVIEW ? `${fixed} · "${quotedText(preview, room)}"` : fixed, BOT_LINE_LIMIT);
|
|
341
|
-
}
|
|
342
|
-
|
|
343
|
-
const mixyBot = (ctx) => ({ id: MIXY_AGENT_ID, name: ctx.mixy, self: true });
|
|
344
|
-
|
|
345
|
-
/** The bots the caller sees: every bot then Mixy when she has something to
|
|
346
|
-
* show, or just the caller's own bot. */
|
|
347
|
-
function visibleStates(ctx) {
|
|
348
|
-
if (ctx.own) {
|
|
349
|
-
const bot = ctx.own === MIXY_AGENT_ID ? mixyBot(ctx) : ctx.bots[0];
|
|
350
|
-
return bot ? [botState(bot, ctx)] : [];
|
|
351
|
-
}
|
|
352
|
-
const states = ctx.bots
|
|
353
|
-
.map((bot) => botState(bot, ctx))
|
|
354
|
-
.sort(
|
|
355
|
-
(left, right) =>
|
|
356
|
-
Number(right.flags.length > 0) - Number(left.flags.length > 0) ||
|
|
357
|
-
Number(right.working) - Number(left.working) ||
|
|
358
|
-
right.lastAt - left.lastAt ||
|
|
359
|
-
(left.bot.id < right.bot.id ? -1 : 1)
|
|
360
|
-
);
|
|
361
|
-
const mixy = botState(mixyBot(ctx), ctx);
|
|
362
|
-
if (mixy.routines.length || mixy.running.length || mixy.approvals) states.push(mixy);
|
|
363
|
-
return states;
|
|
364
|
-
}
|
|
365
|
-
|
|
366
366
|
async function overview(own) {
|
|
367
367
|
const ctx = await gather(own);
|
|
368
368
|
const states = visibleStates(ctx);
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
// After the
|
|
2
|
-
//
|
|
3
|
-
//
|
|
1
|
+
// After the connector merge (connector-catalog.mjs mergeConnectorAccountServers)
|
|
2
|
+
// `gmail-2`, `notion-2`, `postgres-2`… are accounts of their connector's one
|
|
3
|
+
// server, no longer servers. Every store of ours that keys a setting by
|
|
4
4
|
// MCP server name must name the surviving server instead:
|
|
5
5
|
// agents/<id>/agent.json, bots/<id>/agent.json connectors.off / connectors.tools
|
|
6
6
|
// (a legacy allow list too)
|
|
@@ -11,14 +11,15 @@
|
|
|
11
11
|
// name models, not servers.) Project and plugin hook files are the user's or
|
|
12
12
|
// the plugin's own and are never rewritten here.
|
|
13
13
|
//
|
|
14
|
-
// Rule:
|
|
15
|
-
//
|
|
16
|
-
//
|
|
17
|
-
//
|
|
18
|
-
//
|
|
19
|
-
//
|
|
20
|
-
//
|
|
21
|
-
//
|
|
14
|
+
// Rule: differences are ignored and the topmost server decides. The merged
|
|
15
|
+
// connector is on or off for an agent/project as the surviving server was
|
|
16
|
+
// there when the setting names it, else as the lowest-numbered merged server
|
|
17
|
+
// it names (so a switched-off `-N` server never becomes reachable through the
|
|
18
|
+
// merge). Per-tool permissions move to the surviving name; where merged
|
|
19
|
+
// servers disagree on a tool the surviving server's own entry wins, else the
|
|
20
|
+
// first merged server's. Entries of a server that was off are dormant and
|
|
21
|
+
// dropped when the connector stays on. A setting that names no merged-away
|
|
22
|
+
// server is never touched, so every run after the first is a no-op.
|
|
22
23
|
//
|
|
23
24
|
// The merge is saved to the config once, so the rename mapping outlives it:
|
|
24
25
|
// `<data>/connector-merge-pending.json` ({ merged: [{ name, from }] }) is
|
|
@@ -35,7 +36,6 @@ import { readdirSync, readFileSync, rmSync } from 'node:fs';
|
|
|
35
36
|
import { join } from 'node:path';
|
|
36
37
|
import { normalizeRules, standardConfigReport } from './services/hook-bus/config.mjs';
|
|
37
38
|
import {
|
|
38
|
-
PERMISSION_RANK,
|
|
39
39
|
PROJECT_CONNECTORS_FILE,
|
|
40
40
|
connectorEnabled,
|
|
41
41
|
parseConnectorPolicy,
|
|
@@ -56,7 +56,8 @@ function mapMergedConnectorPolicy(policy, merged) {
|
|
|
56
56
|
current.off.includes(server) || current.allow?.includes(server) || Object.hasOwn(current.tools, server);
|
|
57
57
|
if (!gone.some(named)) continue;
|
|
58
58
|
const live = from.filter((server) => connectorEnabled(current, server));
|
|
59
|
-
|
|
59
|
+
// `from` lists the surviving server first, then the others lowest-numbered first.
|
|
60
|
+
const on = connectorEnabled(current, from.find(named));
|
|
60
61
|
const off = current.off.filter((server) => !from.includes(server));
|
|
61
62
|
const allow = current.allow?.filter((server) => !from.includes(server));
|
|
62
63
|
if (allow && on) allow.push(name);
|
|
@@ -64,9 +65,11 @@ function mapMergedConnectorPolicy(policy, merged) {
|
|
|
64
65
|
const tools = { ...current.tools };
|
|
65
66
|
for (const server of from) delete tools[server];
|
|
66
67
|
const moved = {};
|
|
67
|
-
|
|
68
|
+
const sources = on ? live : from;
|
|
69
|
+
for (const server of [name, ...sources.filter((id) => id !== name)]) {
|
|
70
|
+
if (!sources.includes(server)) continue;
|
|
68
71
|
for (const [tool, permission] of Object.entries(current.tools[server] || {})) {
|
|
69
|
-
if (!(tool in moved)
|
|
72
|
+
if (!(tool in moved)) moved[tool] = permission;
|
|
70
73
|
}
|
|
71
74
|
}
|
|
72
75
|
if (Object.keys(moved).length) tools[name] = moved;
|