mixdog 1.4.0 → 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/check-voice-runtime-inputs.mjs +25 -0
- package/scripts/gate-local.mjs +183 -63
- package/scripts/latest-guard.mjs +21 -9
- package/scripts/lib/gate-scheduler.mjs +138 -32
- package/scripts/lib/gate-timing-reporter.mjs +16 -0
- package/scripts/lib/isolated-test-env.mjs +10 -5
- package/scripts/lib/run-node-tests.mjs +91 -66
- package/scripts/lib/scoped-temp.d.mts +16 -0
- package/scripts/lib/scoped-temp.mjs +124 -0
- package/scripts/lib/stale-temp.mjs +44 -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/post-release-check.mjs +1 -6
- package/scripts/pptx-kit-index.mjs +17 -5
- package/scripts/suite-health.mjs +115 -24
- package/scripts/test-data-dir.mjs +10 -7
- 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/app.mjs +4 -0
- package/src/cli.mjs +7 -0
- package/src/defaults/agents.json +7 -0
- package/src/defaults/shipped-history.json +23 -2
- package/src/defaults/skills/browser-use/SKILL.md +10 -5
- 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 +16 -4
- 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 +35 -42
- package/src/output-styles/common.md +2 -2
- package/src/output-styles/simple.md +1 -1
- package/src/rules/agent/AGENT.md +5 -4
- package/src/rules/lead/LEAD.md +12 -7
- package/src/rules/shared/10-tool-workflow.md +3 -1
- package/src/rules/shared/20-research.md +3 -6
- package/src/rules/shared/40-editing.md +1 -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 +10 -9
- package/src/rules/shared/70-delivery.md +8 -9
- 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 +156 -24
- 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/cache-break-trace.mjs +2 -0
- package/src/runtime/agent/orchestrator/config.mjs +12 -7
- package/src/runtime/agent/orchestrator/context/deferred-tools.mjs +8 -8
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +5 -26
- package/src/runtime/agent/orchestrator/context/skill-catalog.mjs +3 -1
- 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 +88 -54
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +42 -26
- package/src/runtime/agent/orchestrator/providers/account-pool.mjs +54 -8
- package/src/runtime/agent/orchestrator/providers/anthropic-api-recovery.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +37 -31
- package/src/runtime/agent/orchestrator/providers/anthropic-api-transport.mjs +8 -2
- 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 +31 -21
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-request/initial-status.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +14 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-sse.mjs +6 -0
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -2
- 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-login.mjs +1 -10
- package/src/runtime/agent/orchestrator/providers/command-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +3 -0
- 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/devin.mjs +3 -0
- 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 +248 -41
- 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-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-login.mjs +1 -10
- package/src/runtime/agent/orchestrator/providers/mimo-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/model-cache.mjs +100 -33
- package/src/runtime/agent/orchestrator/providers/muse-code-oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/oauth-secret-fields.fixtures.mjs +45 -0
- package/src/runtime/agent/orchestrator/providers/openai-compat-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 +160 -31
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream/event-switch.mjs +22 -12
- package/src/runtime/agent/orchestrator/providers/openai-ws-stream.mjs +7 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws-watchdogs.mjs +49 -22
- 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 +45 -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/ask-user-tool-defs.mjs +41 -13
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +2 -0
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +8 -6
- package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +7 -3
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +3 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +6 -1
- 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/runtime-core/workflow.mjs +5 -2
- 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/scoped-cache.mjs +1 -3
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +102 -12
- 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 +160 -36
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +164 -23
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +139 -19
- 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 +100 -22
- 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/compact-policy.mjs +33 -3
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +9 -2
- 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 +14 -0
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +23 -4
- 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/tool-exposure-migration.mjs +39 -21
- 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/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/owner-route-fallbacks.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/manager/route-fallback-chain.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +30 -13
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +63 -6
- 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 +35 -13
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +24 -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 +10 -6
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +56 -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/pre-send-compact.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/prompt-cache-touch-store.mjs +30 -7
- package/src/runtime/agent/orchestrator/session/restart-prefix-parity.fixture.mjs +154 -0
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +7 -0
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/store-summary-fields.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +37 -8
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +252 -39
- 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/session/transcript-restore/restore.mjs +61 -2
- package/src/runtime/agent/orchestrator/stall-policy.mjs +23 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/invocation-plan.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/spawn-env.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +6 -1
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +46 -20
- package/src/runtime/agent/orchestrator/tools/builtin/cache-layers.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +67 -31
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +25 -13
- package/src/runtime/agent/orchestrator/tools/builtin/lib/scoped-search-flight.mjs +9 -5
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +58 -20
- 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/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/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/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 +28 -4
- 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/webhook/signature.mjs +4 -1
- package/src/runtime/channels/lib/whisper-port.mjs +29 -11
- package/src/runtime/channels/lib/whisper-server.mjs +10 -1
- package/src/runtime/computer-bridge/action-schema.mjs +2 -2
- package/src/runtime/computer-bridge/core-actions.mjs +2 -2
- package/src/runtime/computer-bridge/error-recovery.mjs +5 -4
- 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/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/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/index.mjs +4 -0
- package/src/runtime/memory/lib/embedding-provider.mjs +4 -1
- package/src/runtime/memory/lib/embedding-worker.mjs +10 -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/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 +4 -2
- 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/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/bot-owned-work.mjs +56 -0
- 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/defaults-separation.mjs +1 -4
- 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-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/handoff-artifacts.d.mts +2 -1
- package/src/runtime/shared/handoff-artifacts.mjs +18 -8
- package/src/runtime/shared/idle-auto-clear-gate.mjs +29 -7
- package/src/runtime/shared/llm/cost.mjs +11 -2
- 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/loopback-listener.mjs +25 -2
- 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/provider-accounts.mjs +52 -2
- package/src/runtime/shared/session-activity-signal.mjs +14 -0
- package/src/runtime/shared/session-scratch.mjs +37 -0
- package/src/runtime/shared/staged-install-worker.mjs +5 -0
- package/src/runtime/shared/staged-update.mjs +47 -2
- package/src/runtime/shared/tool-card-model/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 +1 -1
- package/src/runtime/shared/tool-surface.mjs +113 -36
- package/src/runtime/shared/tool-work-units.mjs +6 -0
- package/src/runtime/shared/turn-snapshot-store.mjs +13 -6
- 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/contract.mjs +4 -1
- package/src/runtime/shared/worktrees/git.mjs +72 -0
- package/src/runtime/shared/worktrees/manager.mjs +285 -168
- package/src/runtime/shared/worktrees/test-support.mjs +6 -10
- 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 +6 -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-home-delivery.mjs +41 -0
- package/src/session-runtime/agent-task-sessions.mjs +458 -312
- package/src/session-runtime/agent-tool-routing.mjs +8 -41
- package/src/session-runtime/boot/tools.mjs +7 -1
- package/src/session-runtime/bot-status.mjs +107 -101
- package/src/session-runtime/bot-target.mjs +38 -0
- package/src/session-runtime/channel-config-api.mjs +6 -1
- package/src/session-runtime/connector-merge-migration.mjs +18 -15
- package/src/session-runtime/conversation-import/codex-titles.mjs +88 -0
- package/src/session-runtime/conversation-import/discovery.mjs +401 -36
- package/src/session-runtime/conversation-import/service.mjs +35 -8
- package/src/session-runtime/handoff-attachments.mjs +82 -31
- package/src/session-runtime/held-requests.mjs +3 -1
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +12 -13
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +1 -0
- 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/reaction-tool.mjs +4 -1
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +145 -112
- package/src/session-runtime/lifecycle/cold-heir.mjs +11 -6
- package/src/session-runtime/lifecycle/session-catalog.mjs +9 -1
- 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/model-route/set-route.mjs +11 -2
- package/src/session-runtime/provider-auth/login.mjs +2 -2
- 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 +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/resource-recall-api.mjs +6 -1
- package/src/session-runtime/runtime-feature-gates.mjs +5 -1
- 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/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-tool/spawn-preset.mjs +6 -2
- package/src/session-runtime/services/agent-tool/tool-def.mjs +9 -9
- 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 +283 -11
- 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/tool-policy/policy-stage.mjs +1 -0
- 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-editor.mjs +5 -1
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +25 -5
- package/src/session-runtime/workflow-agents-api/onboarding.mjs +3 -3
- 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 -1041
- 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 +73 -56
- package/src/standalone/daemon-desktop-runtime.mjs +2 -0
- package/src/standalone/daemon-session-control.mjs +169 -138
- 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/agent-turns.mjs +16 -12
- 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-action.mjs +10 -3
- package/src/standalone/session-service/session-calls/session-views.mjs +160 -104
- package/src/standalone/session-service/stored-reader.mjs +127 -40
- package/src/standalone/session-transport/client-registry/client-grace.mjs +12 -9
- package/src/tui/App.jsx +154 -164
- package/src/tui/app/app-view/floating-panel.jsx +10 -4
- package/src/tui/app/app-view/text-entry-labels.mjs +1 -0
- package/src/tui/app/clipboard.mjs +21 -10
- 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/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 +58 -21
- package/src/tui/app/provider-setup/provider-items.mjs +8 -2
- package/src/tui/app/provider-setup-picker.mjs +29 -18
- 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/QuestionPanel.jsx +13 -4
- 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 +1963 -1361
- 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/session-flow/queue/take-entries.mjs +11 -0
- 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/ui/statusline-agents.mjs +1 -3
- package/src/defaults/skills/skill-creator/references/source-review.md +0 -94
|
@@ -1,6 +1,8 @@
|
|
|
1
|
-
// Session snapshots are latest-wins under backpressure;
|
|
2
|
-
//
|
|
1
|
+
// Session snapshots are latest-wins under backpressure; a session patch chains
|
|
2
|
+
// onto the queued frame it builds on, and terminal byte streams concatenate.
|
|
3
|
+
// Keep socket ownership and bounded backlog policy here.
|
|
3
4
|
const TERMINAL_BACKLOG_MAX_CHARS = 256 * 1024;
|
|
5
|
+
const KEEPALIVE_MS = 15_000;
|
|
4
6
|
|
|
5
7
|
function terminalDataFrame(frame) {
|
|
6
8
|
return frame?.type === 'desktop-event' &&
|
|
@@ -26,13 +28,28 @@ function mergePendingFrame(existing, frame, json) {
|
|
|
26
28
|
}
|
|
27
29
|
|
|
28
30
|
function pendingEntry(frame, json, queuedAt) {
|
|
29
|
-
|
|
31
|
+
const sse = `data: ${json}\n\n`;
|
|
32
|
+
return { frame, sse, bytes: Buffer.byteLength(sse), queuedAt };
|
|
30
33
|
}
|
|
31
34
|
|
|
32
35
|
function isResyncMarker(frame) {
|
|
33
36
|
return frame?.resyncRequired === true || frame?.message?.resyncRequired === true;
|
|
34
37
|
}
|
|
35
38
|
|
|
39
|
+
// A patch builds on the frame queued before it for the same key. Replacing
|
|
40
|
+
// that frame hands the receiver a lane it cannot decode, and the resync it
|
|
41
|
+
// asks for re-sends the full snapshot into the same backlog.
|
|
42
|
+
function isPatchFrame(frame) {
|
|
43
|
+
if (isResyncMarker(frame)) return false;
|
|
44
|
+
if (frame?.type === 'session-state') return Boolean(frame.patch) && Number.isSafeInteger(frame.baseRevision);
|
|
45
|
+
const wire = frame?.type === 'desktop-event' && frame.message?.kind === 'session-state' ? frame.message.wire : null;
|
|
46
|
+
return Boolean(wire?.__itemsPatch);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
function readTraceIdOf(frame) {
|
|
50
|
+
return frame?.readTraceId ?? frame?.message?.readTraceId;
|
|
51
|
+
}
|
|
52
|
+
|
|
36
53
|
function resyncEntry(frame) {
|
|
37
54
|
if (frame?.type === 'desktop-event' && frame.message?.kind === 'session-state' && frame.message.sessionId) {
|
|
38
55
|
// The desktop decoder cannot apply a patch against base -2, so it resets
|
|
@@ -116,13 +133,39 @@ export function createSessionFrameStream({ clients, maxPendingBytes, nowMs, onAt
|
|
|
116
133
|
} catch {}
|
|
117
134
|
}
|
|
118
135
|
|
|
136
|
+
function pause(client) {
|
|
137
|
+
if (!client.paused) client.pausedAt = nowMs();
|
|
138
|
+
client.paused = true;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
// A stream paused across a keepalive period: bytes still buffered mean the
|
|
142
|
+
// consumer stopped reading; none buffered means a drain that never fired.
|
|
143
|
+
function reportStall(client, res) {
|
|
144
|
+
if (typeof onDiagnostic !== 'function') return;
|
|
145
|
+
const atMs = nowMs();
|
|
146
|
+
if (atMs - client.pausedAt < KEEPALIVE_MS) return;
|
|
147
|
+
try {
|
|
148
|
+
onDiagnostic({
|
|
149
|
+
stage: 'stream-stalled',
|
|
150
|
+
atMs,
|
|
151
|
+
pausedMs: atMs - client.pausedAt,
|
|
152
|
+
bufferedBytes: res.writableLength,
|
|
153
|
+
needDrain: res.writableNeedDrain,
|
|
154
|
+
pendingBytes: client.pendingBytes || 0,
|
|
155
|
+
maxPendingBytes,
|
|
156
|
+
});
|
|
157
|
+
} catch {
|
|
158
|
+
/* A diagnostic failure cannot change backpressure. */
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
|
|
119
162
|
function flushPending(client) {
|
|
120
163
|
while (client.sse && !client.paused && client.pending.size > 0) {
|
|
121
164
|
const [key, entry] = client.pending.entries().next().value;
|
|
122
165
|
client.pending.delete(key);
|
|
123
166
|
client.pendingBytes = Math.max(0, client.pendingBytes - (entry.bytes || 0));
|
|
124
167
|
try {
|
|
125
|
-
if (client.sse.write(
|
|
168
|
+
if (client.sse.write(entry.sse) === false) pause(client);
|
|
126
169
|
traceFrame(client, entry.frame, 'stream-write', entry);
|
|
127
170
|
} catch {
|
|
128
171
|
traceFrame(client, entry.frame, 'stream-write-failed', entry, true);
|
|
@@ -144,13 +187,18 @@ export function createSessionFrameStream({ clients, maxPendingBytes, nowMs, onAt
|
|
|
144
187
|
client.pending.set(key, entry);
|
|
145
188
|
client.pendingBytes += entry.bytes || 0;
|
|
146
189
|
traceFrame(client, entry.frame, 'stream-queued', entry);
|
|
190
|
+
boundPending(client, key);
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
function boundPending(client, key) {
|
|
147
194
|
// The cap bounds accumulated backlog: older entries collapse to resync
|
|
148
195
|
// markers or drop, oldest first. The newest frame is always admitted, so a
|
|
149
196
|
// snapshot larger than the cap still reaches a client with no backlog, and
|
|
150
197
|
// markers are kept so a receiver always learns what it missed.
|
|
151
198
|
for (const [oldestKey, oldest] of client.pending) {
|
|
152
199
|
if (client.pendingBytes <= maxPendingBytes) break;
|
|
153
|
-
|
|
200
|
+
// Only a single newest frame is exempt: a patch chain is backlog too.
|
|
201
|
+
if ((oldestKey === key && !oldest.chained) || isResyncMarker(oldest.frame)) continue;
|
|
154
202
|
const marker = resyncEntry(oldest.frame);
|
|
155
203
|
if (marker && marker.bytes < oldest.bytes) {
|
|
156
204
|
traceFrame(client, oldest.frame, 'stream-resync-marker', oldest, true);
|
|
@@ -166,7 +214,26 @@ export function createSessionFrameStream({ clients, maxPendingBytes, nowMs, onAt
|
|
|
166
214
|
}
|
|
167
215
|
|
|
168
216
|
function queueFrame(client, key, frame, json) {
|
|
169
|
-
const
|
|
217
|
+
const existing = client.pending.get(key);
|
|
218
|
+
if (existing && isPatchFrame(frame)) {
|
|
219
|
+
// A queued marker already makes the receiver fetch a fresh full
|
|
220
|
+
// snapshot, which supersedes every patch issued before it.
|
|
221
|
+
if (isResyncMarker(existing.frame)) return;
|
|
222
|
+
const next = pendingEntry(frame, json, nowMs());
|
|
223
|
+
// Map.set on a present key keeps its place: the chain leaves with its base.
|
|
224
|
+
client.pending.set(key, {
|
|
225
|
+
frame: readTraceIdOf(existing.frame) ? existing.frame : frame,
|
|
226
|
+
sse: existing.sse + next.sse,
|
|
227
|
+
bytes: existing.bytes + next.bytes,
|
|
228
|
+
queuedAt: existing.queuedAt,
|
|
229
|
+
chained: true,
|
|
230
|
+
});
|
|
231
|
+
client.pendingBytes += next.bytes;
|
|
232
|
+
traceFrame(client, frame, 'stream-queued', next);
|
|
233
|
+
boundPending(client, key);
|
|
234
|
+
return;
|
|
235
|
+
}
|
|
236
|
+
const merged = mergePendingFrame(existing, frame, json);
|
|
170
237
|
setPending(client, key, pendingEntry(merged.frame, merged.json, nowMs()));
|
|
171
238
|
}
|
|
172
239
|
|
|
@@ -177,7 +244,7 @@ export function createSessionFrameStream({ clients, maxPendingBytes, nowMs, onAt
|
|
|
177
244
|
return;
|
|
178
245
|
}
|
|
179
246
|
try {
|
|
180
|
-
if (client.sse.write(`data: ${json}\n\n`) === false) client
|
|
247
|
+
if (client.sse.write(`data: ${json}\n\n`) === false) pause(client);
|
|
181
248
|
traceFrame(client, frame, 'stream-write');
|
|
182
249
|
} catch {
|
|
183
250
|
traceFrame(client, frame, 'stream-write-failed', {}, true);
|
|
@@ -221,7 +288,8 @@ export function createSessionFrameStream({ clients, maxPendingBytes, nowMs, onAt
|
|
|
221
288
|
const paused = res.write(': attached\n\n') === false;
|
|
222
289
|
const previous = client.sse;
|
|
223
290
|
client.sse = res;
|
|
224
|
-
client.paused =
|
|
291
|
+
client.paused = false;
|
|
292
|
+
if (paused) pause(client);
|
|
225
293
|
client.lastSeen = nowMs();
|
|
226
294
|
// Replacement transfers ownership before closing the old stream, so its
|
|
227
295
|
// close/error callbacks cannot detach the new response.
|
|
@@ -252,13 +320,17 @@ export function createSessionFrameStream({ clients, maxPendingBytes, nowMs, onAt
|
|
|
252
320
|
res.on('close', cleanup);
|
|
253
321
|
res.on('error', cleanup);
|
|
254
322
|
keepAlive = setInterval(() => {
|
|
255
|
-
if (client.sse !== res
|
|
323
|
+
if (client.sse !== res) return;
|
|
324
|
+
if (client.paused) {
|
|
325
|
+
reportStall(client, res);
|
|
326
|
+
return;
|
|
327
|
+
}
|
|
256
328
|
try {
|
|
257
|
-
if (res.write(': ka\n\n') === false) client
|
|
329
|
+
if (res.write(': ka\n\n') === false) pause(client);
|
|
258
330
|
} catch {
|
|
259
331
|
retireStream(res);
|
|
260
332
|
}
|
|
261
|
-
},
|
|
333
|
+
}, KEEPALIVE_MS);
|
|
262
334
|
keepAlive.unref?.();
|
|
263
335
|
flushPending(client);
|
|
264
336
|
return true;
|
|
@@ -16,6 +16,7 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
16
16
|
'getAgentConnectors',
|
|
17
17
|
'getProjectConnectors',
|
|
18
18
|
'getAgentAlwaysAllowedTools',
|
|
19
|
+
'getAgentConnectorTools',
|
|
19
20
|
'getAgentPermissions',
|
|
20
21
|
'listConnectors',
|
|
21
22
|
'listConnectorTools',
|
|
@@ -94,6 +95,7 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
94
95
|
'listWebSearchModels',
|
|
95
96
|
'listThemes',
|
|
96
97
|
'listShellJobs',
|
|
98
|
+
'listStoppableShellJobs',
|
|
97
99
|
'listWorkflows',
|
|
98
100
|
'mcpStatus',
|
|
99
101
|
'pluginsStatus',
|
|
@@ -107,6 +109,7 @@ export const SESSION_READ_ACTIONS = Object.freeze([
|
|
|
107
109
|
export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
108
110
|
'addHookRule',
|
|
109
111
|
'addMcpServer',
|
|
112
|
+
'addConnectorAccount',
|
|
110
113
|
'addPlugin',
|
|
111
114
|
'addSkill',
|
|
112
115
|
'agentControl',
|
|
@@ -269,6 +272,7 @@ export const SESSION_CONFIGURE_ACTIONS = Object.freeze([
|
|
|
269
272
|
'startConversationImport',
|
|
270
273
|
'startMediaJob',
|
|
271
274
|
'stopShellJob',
|
|
275
|
+
'stopShellJobs',
|
|
272
276
|
'releaseShellJob',
|
|
273
277
|
'switchContext',
|
|
274
278
|
'taskControl',
|
|
@@ -5,8 +5,12 @@ import { randomUUID } from 'node:crypto';
|
|
|
5
5
|
import { createAgentChildFactory } from './agent-child.mjs';
|
|
6
6
|
import { partialHandoffTextFromSession } from '../../../runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs';
|
|
7
7
|
import { attachmentsForIntake } from '../../../runtime/attachments/store.mjs';
|
|
8
|
-
import {
|
|
9
|
-
import {
|
|
8
|
+
import { producedFileLines } from '../../../runtime/shared/handoff-artifacts.mjs';
|
|
9
|
+
import {
|
|
10
|
+
collectUnreportedWrites,
|
|
11
|
+
handoffContent,
|
|
12
|
+
sessionRoots,
|
|
13
|
+
} from '../../../session-runtime/handoff-attachments.mjs';
|
|
10
14
|
|
|
11
15
|
/** An agent turn's prompt: text, or text with forwarded attachment parts
|
|
12
16
|
* (handoff-attachments.mjs), never any other shape. */
|
|
@@ -25,18 +29,19 @@ export function agentTurnTranscriptMeta(content) {
|
|
|
25
29
|
return { sender: 'lead', ...(attachments.length ? { attachments } : {}) };
|
|
26
30
|
}
|
|
27
31
|
|
|
28
|
-
/** The
|
|
29
|
-
*
|
|
30
|
-
|
|
32
|
+
/** The lines for files the turn that began at `messageStart` created or
|
|
33
|
+
* modified and `report` does not already name; [] on any failure to read it
|
|
34
|
+
* (the handoff still goes out). */
|
|
35
|
+
async function turnArtifactLines(runtime, messageStart, descriptor, report) {
|
|
31
36
|
try {
|
|
32
37
|
const { messages } = await runtime.readModelMessages(messageStart);
|
|
33
38
|
const session = runtime.session || descriptor;
|
|
34
|
-
const { files, omitted } =
|
|
39
|
+
const { files, omitted } = collectUnreportedWrites(messages, {
|
|
35
40
|
cwd: descriptor.cwd,
|
|
36
41
|
roots: sessionRoots(session, descriptor.cwd),
|
|
42
|
+
report,
|
|
37
43
|
});
|
|
38
|
-
|
|
39
|
-
return artifactLines(files, omitted, { ids: false });
|
|
44
|
+
return producedFileLines(files, omitted);
|
|
40
45
|
} catch {
|
|
41
46
|
return [];
|
|
42
47
|
}
|
|
@@ -131,10 +136,9 @@ export function createAgentTurns({
|
|
|
131
136
|
}
|
|
132
137
|
let result = detail?.result || { content: '' };
|
|
133
138
|
// The files the turn produced reach the owner with its handoff.
|
|
134
|
-
const
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
}
|
|
139
|
+
const report = String(result.content || '');
|
|
140
|
+
const files = await turnArtifactLines(entry.runtime, messageStart, descriptor, report);
|
|
141
|
+
if (files.length) result = { ...result, content: [report, files.join('\n')].join('\n\n') };
|
|
138
142
|
descriptor.status = 'idle';
|
|
139
143
|
descriptor.stage = 'idle';
|
|
140
144
|
descriptor.lastHandoff = typeof result?.content === 'string' ? result.content : '';
|
|
@@ -47,18 +47,51 @@ export function createAgentTree({
|
|
|
47
47
|
cancelTranscripts.delete(sessionId);
|
|
48
48
|
return messages;
|
|
49
49
|
};
|
|
50
|
+
// How each session's last snapshot was obtained. A wire-safe runtime is read
|
|
51
|
+
// asynchronously and the watchdog judges the cached result, so a failed or
|
|
52
|
+
// hung read leaves old clocks that the watchdog row must be able to flag.
|
|
53
|
+
const progressObservation = new Map();
|
|
54
|
+
const observationOf = (sessionId) => {
|
|
55
|
+
let observation = progressObservation.get(sessionId);
|
|
56
|
+
if (!observation) {
|
|
57
|
+
observation = { source: null, lastReadOkAt: null, readPendingSince: null, lastReadError: null };
|
|
58
|
+
progressObservation.set(sessionId, observation);
|
|
59
|
+
}
|
|
60
|
+
return observation;
|
|
61
|
+
};
|
|
50
62
|
function getSessionProgressSnapshot(sessionId) {
|
|
51
63
|
const runtime = sessionOwner(sessionId)?.runtime;
|
|
52
64
|
if (typeof runtime?.getTurnLiveness !== 'function') return null;
|
|
53
|
-
|
|
65
|
+
const observation = observationOf(sessionId);
|
|
66
|
+
if (runtime.isWireSafe !== true) {
|
|
67
|
+
const snapshot = runtime.getTurnLiveness();
|
|
68
|
+
observation.source = snapshot ? 'direct' : null;
|
|
69
|
+
if (snapshot) observation.lastReadOkAt = Date.now();
|
|
70
|
+
return snapshot;
|
|
71
|
+
}
|
|
54
72
|
if (!progressReads.has(sessionId)) {
|
|
55
73
|
progressReads.add(sessionId);
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
74
|
+
observation.readPendingSince = Date.now();
|
|
75
|
+
// A synchronous throw must settle like a rejected read; otherwise the
|
|
76
|
+
// session stays in progressReads and is never read again.
|
|
77
|
+
new Promise((resolve) => resolve(runtime.getTurnLiveness()))
|
|
78
|
+
.then((snapshot) => {
|
|
79
|
+
progress.set(sessionId, snapshot);
|
|
80
|
+
observation.lastReadOkAt = Date.now();
|
|
81
|
+
observation.lastReadError = null;
|
|
82
|
+
})
|
|
83
|
+
.catch((error) => {
|
|
84
|
+
observation.lastReadError = String(error?.code || error?.name || 'Error').slice(0, 40);
|
|
85
|
+
log(`agent progress read failed session=${sessionId}: ${error?.message || error}`);
|
|
86
|
+
})
|
|
87
|
+
.finally(() => {
|
|
88
|
+
progressReads.delete(sessionId);
|
|
89
|
+
observation.readPendingSince = null;
|
|
90
|
+
});
|
|
60
91
|
}
|
|
61
|
-
|
|
92
|
+
const cached = progress.get(sessionId) || null;
|
|
93
|
+
observation.source = cached ? 'cache' : null;
|
|
94
|
+
return cached;
|
|
62
95
|
}
|
|
63
96
|
const { rehydrateAgentSessions } = createAgentRehydration({ registry, listSessions, readStoredSession, log });
|
|
64
97
|
const { createAgentChild, runAgentTurn } = createAgentTurns({
|
|
@@ -169,14 +202,17 @@ export function createAgentTree({
|
|
|
169
202
|
: null;
|
|
170
203
|
},
|
|
171
204
|
getSessionProgressSnapshot,
|
|
205
|
+
getSessionProgressObservation: (sessionId) => ({ ...observationOf(sessionId) }),
|
|
172
206
|
linkParentSignalToSession(sessionId, signal) {
|
|
173
207
|
const runtime = sessionOwner(sessionId)?.runtime;
|
|
174
208
|
if (typeof runtime?.abort !== 'function') throw new Error(`agent runtime cannot abort session ${sessionId}`);
|
|
175
209
|
const abort = () => {
|
|
176
210
|
watchdogStops.set(sessionId, signal.reason);
|
|
177
|
-
Promise.resolve(runtime.abort({ restorePrompt: false, reason: 'agent-watchdog' })).catch(
|
|
178
|
-
|
|
179
|
-
|
|
211
|
+
Promise.resolve(runtime.abort({ restorePrompt: false, reason: 'agent-watchdog', timeout: true })).catch(
|
|
212
|
+
(error) => {
|
|
213
|
+
log(`agent watchdog abort failed session=${sessionId}: ${error?.message || error}`);
|
|
214
|
+
}
|
|
215
|
+
);
|
|
180
216
|
};
|
|
181
217
|
if (signal.aborted) abort();
|
|
182
218
|
else signal.addEventListener('abort', abort, { once: true });
|