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,11 +1,15 @@
|
|
|
1
1
|
// A steering handoff cancels a turn, not its durable Goal. Record the explicit
|
|
2
2
|
// abort path against its turn epoch instead of guessing intent from error text.
|
|
3
|
-
export function abortGoalTurn(runtime, flags, hasPendingSteering, reason = 'user-cancel') {
|
|
3
|
+
export function abortGoalTurn(runtime, flags, hasPendingSteering, reason = 'user-cancel', { timeout = false } = {}) {
|
|
4
4
|
const previous = flags.goalSteeringAbortEpoch;
|
|
5
5
|
const epoch = flags.leadTurnEpoch;
|
|
6
6
|
flags.goalSteeringAbortEpoch = hasPendingSteering ? epoch : null;
|
|
7
7
|
try {
|
|
8
|
-
|
|
8
|
+
// A steering interrupt outranks a timeout: the turn was redirected, not abandoned.
|
|
9
|
+
const result =
|
|
10
|
+
timeout && !hasPendingSteering
|
|
11
|
+
? runtime.abort(reason, { timeout: true })
|
|
12
|
+
: runtime.abort(hasPendingSteering ? 'interrupt' : reason);
|
|
9
13
|
if (result === false) flags.goalSteeringAbortEpoch = previous;
|
|
10
14
|
return result;
|
|
11
15
|
} catch (error) {
|
|
@@ -67,6 +67,10 @@ export function createSessionControlsApi(bag) {
|
|
|
67
67
|
stopShellJob: async (taskId) => {
|
|
68
68
|
return (await runtime.stopShellJob?.(taskId)) ?? { stopped: false, error: 'shell job control is unavailable' };
|
|
69
69
|
},
|
|
70
|
+
// `/stop`: this session's background shells, and stopping all of them:
|
|
71
|
+
// { jobs } and { stopped, stopping }.
|
|
72
|
+
listStoppableShellJobs: async () => (await runtime.listStoppableShellJobs?.()) ?? { jobs: [] },
|
|
73
|
+
stopShellJobs: async () => (await runtime.stopShellJobs?.()) ?? { stopped: 0, stopping: 0 },
|
|
70
74
|
// Explicit force-release of a shell whose termination is unconfirmed:
|
|
71
75
|
// { released, error? }. Surfaces confirm with the user before calling.
|
|
72
76
|
releaseShellJob: async (taskId) => {
|
|
@@ -54,6 +54,14 @@ export function createSessionExtensionsApi(bag) {
|
|
|
54
54
|
(input) => runtime.addMcpServer?.(input),
|
|
55
55
|
(result, input) => [`mcp added: ${result?.name || input?.name || 'server'}`]
|
|
56
56
|
),
|
|
57
|
+
// No command lock: the runtime serializes adds per connector
|
|
58
|
+
// (oneAddAtATime), so concurrent adds each succeed with their own key.
|
|
59
|
+
addConnectorAccount: async (input) => {
|
|
60
|
+
const result = await runtime.addConnectorAccount?.(input);
|
|
61
|
+
refreshRouteStats();
|
|
62
|
+
pushNotice(`mcp account added: ${result?.account || input?.connector || 'connector'}`);
|
|
63
|
+
return result;
|
|
64
|
+
},
|
|
57
65
|
saveMcpServer: lockedChange(
|
|
58
66
|
(input) => runtime.saveMcpServer?.(input),
|
|
59
67
|
(result, input) => [`mcp saved: ${result?.name || input?.name || 'server'}`]
|
|
@@ -172,7 +172,8 @@ export function createAbortAction(bag) {
|
|
|
172
172
|
runtime,
|
|
173
173
|
flags,
|
|
174
174
|
hasPendingSteering,
|
|
175
|
-
keepsPrompt ? USER_CANCEL_KEEP_PROMPT_REASON : reason
|
|
175
|
+
keepsPrompt ? USER_CANCEL_KEEP_PROMPT_REASON : reason,
|
|
176
|
+
{ timeout: options?.timeout === true }
|
|
176
177
|
);
|
|
177
178
|
if (restoreState) {
|
|
178
179
|
// A user Stop consumes this input even when no draft is requested.
|
|
@@ -20,6 +20,7 @@ export function createSessionIntakeApi(bag) {
|
|
|
20
20
|
patchItem,
|
|
21
21
|
restoreOlderTranscript,
|
|
22
22
|
restoreNewerTranscript,
|
|
23
|
+
readSpilledTranscript,
|
|
23
24
|
routeState,
|
|
24
25
|
restoreQueued,
|
|
25
26
|
prioritizeQueued,
|
|
@@ -32,6 +33,7 @@ export function createSessionIntakeApi(bag) {
|
|
|
32
33
|
patchItem,
|
|
33
34
|
restoreOlderTranscript,
|
|
34
35
|
restoreNewerTranscript,
|
|
36
|
+
...(typeof readSpilledTranscript === 'function' ? { readSpilledTranscript } : {}),
|
|
35
37
|
subscribe: (listener) => {
|
|
36
38
|
listeners.add(listener);
|
|
37
39
|
return () => listeners.delete(listener);
|
|
@@ -129,8 +129,8 @@ export function createSessionIntegrationsApi(bag, { oauthFlows }) {
|
|
|
129
129
|
getOAuthProviderLoginStatus: (flowId) => oauthFlows.status(flowId),
|
|
130
130
|
completeOAuthProviderLogin: async (flowId, code) => oauthFlows.complete(flowId, code),
|
|
131
131
|
cancelOAuthProviderLogin: async (flowId) => oauthFlows.cancel(flowId),
|
|
132
|
-
saveProviderApiKey: async (provider, secret) => {
|
|
133
|
-
const result = await runtime.saveProviderApiKey(provider, secret);
|
|
132
|
+
saveProviderApiKey: async (provider, secret, options) => {
|
|
133
|
+
const result = await runtime.saveProviderApiKey(provider, secret, options);
|
|
134
134
|
pushNotice(`provider api key saved: ${result.provider}`, 'info');
|
|
135
135
|
return true;
|
|
136
136
|
},
|
|
@@ -43,6 +43,7 @@ export function createAgentDefinitionApi(runtime) {
|
|
|
43
43
|
setAgentConnectorToolPermission: async (agentId, connectorId, toolName, permission, options) =>
|
|
44
44
|
runtime.setAgentConnectorToolPermission?.(agentId, connectorId, toolName, permission, options) ?? null,
|
|
45
45
|
getAgentAlwaysAllowedTools: (agentId) => runtime.getAgentAlwaysAllowedTools?.(agentId) ?? [],
|
|
46
|
+
getAgentConnectorTools: (agentId) => runtime.getAgentConnectorTools?.(agentId) ?? [],
|
|
46
47
|
// Per-agent action-kind permissions (ask / allow / block) for the profile.
|
|
47
48
|
getAgentPermissions: async (agentId) =>
|
|
48
49
|
(await import('../../../runtime/agent/orchestrator/session/human-gate/store.mjs')).agentPermissions(agentId),
|
|
@@ -113,13 +113,13 @@ export function createSessionSettingsApi(bag) {
|
|
|
113
113
|
return await runtime.setAiSessionTitles?.(enabled);
|
|
114
114
|
}),
|
|
115
115
|
getCacheWarmingSettings: () => {
|
|
116
|
-
return runtime.getCacheWarmingSettings?.() || { enabled:
|
|
116
|
+
return runtime.getCacheWarmingSettings?.() || { enabled: false };
|
|
117
117
|
},
|
|
118
118
|
setCacheWarmingEnabled: withCommandLock(async (enabled) => {
|
|
119
119
|
return await runtime.setCacheWarmingEnabled?.(enabled);
|
|
120
120
|
}),
|
|
121
121
|
getHeartbeatSettings: () => {
|
|
122
|
-
return runtime.getHeartbeatSettings?.() || { heartbeat:
|
|
122
|
+
return runtime.getHeartbeatSettings?.() || { heartbeat: false, intervalMinutes: 60 };
|
|
123
123
|
},
|
|
124
124
|
setHeartbeatEnabled: withCommandLock(async (enabled) => {
|
|
125
125
|
return await runtime.setHeartbeatEnabled?.(enabled);
|
|
@@ -87,6 +87,17 @@ export function createTakeEntriesOps({ pending, pendingNotificationKeys, removeQ
|
|
|
87
87
|
// prompt the user already took back.
|
|
88
88
|
const mirrored = queued.filter((entry) => entry.steeringPersistId);
|
|
89
89
|
if (mirrored.length > 0) void dropTuiSteeringPersist(leadSessionId(), mirrored);
|
|
90
|
+
// The entries left the queue for good, so nothing later (a drain, the
|
|
91
|
+
// close of the session) can settle them: whoever submitted one is told it
|
|
92
|
+
// was cancelled, once, here. A submitter that waits on its settlement (a
|
|
93
|
+
// bot's send, which owns the work until then) is released.
|
|
94
|
+
for (const entry of queued) {
|
|
95
|
+
try {
|
|
96
|
+
entry.onSettled?.({ status: 'cancelled', reason: 'reclaimed', result: null, session: null });
|
|
97
|
+
} catch {
|
|
98
|
+
// A throwing callback must not leave the remaining entries unsettled.
|
|
99
|
+
}
|
|
100
|
+
}
|
|
90
101
|
const queuedText = queued
|
|
91
102
|
.map((item) => item.text)
|
|
92
103
|
.filter((text) => String(text || '').trim())
|
|
@@ -10,6 +10,8 @@
|
|
|
10
10
|
// Pages are self-contained files named by the owner, so a restart continues
|
|
11
11
|
// the same spill directory with nothing to hand over.
|
|
12
12
|
import { randomUUID } from 'node:crypto';
|
|
13
|
+
import { mkdirSync } from 'node:fs';
|
|
14
|
+
import { dirname } from 'node:path';
|
|
13
15
|
|
|
14
16
|
const MAX_ATTEMPTS = 2;
|
|
15
17
|
const SPILL_WRITER_IDLE_MS = 10_000;
|
|
@@ -67,6 +69,11 @@ export function createSpillWriter({ workerFactory, writeTimeoutMs = 5000, idleMs
|
|
|
67
69
|
if (record.cancelled) return;
|
|
68
70
|
record.attempts += 1;
|
|
69
71
|
if (record.attempts <= MAX_ATTEMPTS) {
|
|
72
|
+
// The spill folder vanished (TEMP cleaned): the retry recreates it. Only
|
|
73
|
+
// the parent does this, synchronously right before it posts the retry
|
|
74
|
+
// and only for a live record, so a reset or cleanup (which cancels the
|
|
75
|
+
// record first) can never have its folder resurrected by a late write.
|
|
76
|
+
record.recreateDir = /ENOENT/.test(String(error));
|
|
70
77
|
queue.unshift(record);
|
|
71
78
|
return;
|
|
72
79
|
}
|
|
@@ -159,6 +166,14 @@ export function createSpillWriter({ workerFactory, writeTimeoutMs = 5000, idleMs
|
|
|
159
166
|
queueMicrotask(pump);
|
|
160
167
|
return;
|
|
161
168
|
}
|
|
169
|
+
if (active.recreateDir) {
|
|
170
|
+
active.recreateDir = false;
|
|
171
|
+
try {
|
|
172
|
+
mkdirSync(dirname(active.path), { recursive: true });
|
|
173
|
+
} catch {
|
|
174
|
+
/* the retry reports the failure */
|
|
175
|
+
}
|
|
176
|
+
}
|
|
162
177
|
// Pages are capped at chunkSize, so the structured-clone post cost is
|
|
163
178
|
// bounded; the retry payload is identical to the first attempt.
|
|
164
179
|
const tempPath = `${active.path}.attempt-${active.attempts}-${randomUUID()}.tmp`;
|
|
@@ -20,6 +20,13 @@ export const tuiDebug = (msg) => {
|
|
|
20
20
|
} catch {}
|
|
21
21
|
};
|
|
22
22
|
|
|
23
|
+
/** Normal-level spill warning for the daemon: its stderr is daemon.log. */
|
|
24
|
+
export const spillWarningToStderr = (message) => {
|
|
25
|
+
try {
|
|
26
|
+
process.stderr.write(`[transcript-spill] ${message}\n`);
|
|
27
|
+
} catch {}
|
|
28
|
+
};
|
|
29
|
+
|
|
23
30
|
// Item ids outlive the process (queued-input mirror, turn change records), so
|
|
24
31
|
// a restarted process never issues an id again.
|
|
25
32
|
const ID_PREFIX = `it_${randomBytes(4).toString('hex')}_`;
|
|
@@ -41,6 +48,48 @@ export function sweepStaleTranscriptSpillDirsOnce() {
|
|
|
41
48
|
cleanupStaleTranscriptSpillDirs();
|
|
42
49
|
}
|
|
43
50
|
|
|
51
|
+
const decodePage = (record) => record.pendingItems || JSON.parse(readFileSync(record.path, 'utf8'));
|
|
52
|
+
|
|
53
|
+
/** Spilled rows `[stop - limit, stop)` of `pages` (`spilledRows` rows in all),
|
|
54
|
+
* `stop` being `end` clamped to the spilled rows, read newest page first;
|
|
55
|
+
* `broken` when a page cannot be read whole. */
|
|
56
|
+
function readSpilledRows(pages, spilledRows, end, limit) {
|
|
57
|
+
const stop = Math.max(0, Math.min(Number(end) || 0, spilledRows));
|
|
58
|
+
const begin = Math.max(0, stop - Math.max(0, Number(limit) || 0));
|
|
59
|
+
const parts = [];
|
|
60
|
+
const result = (broken) => {
|
|
61
|
+
const items = parts.reverse().flat();
|
|
62
|
+
return { items, start: stop - items.length, broken };
|
|
63
|
+
};
|
|
64
|
+
// The page holding row `stop - 1`, by binary search over the pages' first
|
|
65
|
+
// rows: a read touches only the pages it returns rows from, at any depth.
|
|
66
|
+
let low = 0;
|
|
67
|
+
let high = pages.length - 1;
|
|
68
|
+
let last = -1;
|
|
69
|
+
while (low <= high) {
|
|
70
|
+
const middle = (low + high) >> 1;
|
|
71
|
+
if (pages[middle].start < stop) {
|
|
72
|
+
last = middle;
|
|
73
|
+
low = middle + 1;
|
|
74
|
+
} else high = middle - 1;
|
|
75
|
+
}
|
|
76
|
+
for (let index = last; index >= 0; index -= 1) {
|
|
77
|
+
const record = pages[index];
|
|
78
|
+
const pageStart = record.start;
|
|
79
|
+
const pageEnd = pageStart + record.count;
|
|
80
|
+
if (pageEnd <= begin) break;
|
|
81
|
+
let items = null;
|
|
82
|
+
try {
|
|
83
|
+
items = decodePage(record);
|
|
84
|
+
} catch {
|
|
85
|
+
items = null;
|
|
86
|
+
}
|
|
87
|
+
if (!Array.isArray(items) || items.length !== record.count) return result(true);
|
|
88
|
+
parts.push(items.slice(Math.max(begin, pageStart) - pageStart, Math.min(stop, pageEnd) - pageStart));
|
|
89
|
+
}
|
|
90
|
+
return result(false);
|
|
91
|
+
}
|
|
92
|
+
|
|
44
93
|
// Serialized pages deliberately release the old item object graph while
|
|
45
94
|
// keeping every byte restorable. Only `items` is render-live and walkable.
|
|
46
95
|
// This buffer owns the page list, the reading cursor and snapshots; the spill
|
|
@@ -65,6 +114,21 @@ export function createTranscriptSpillBuffer({
|
|
|
65
114
|
let cursor = null;
|
|
66
115
|
let spillDir = null;
|
|
67
116
|
let pageSequence = 0;
|
|
117
|
+
// Spilled rows in this page list, and its epoch: it moves whenever the list
|
|
118
|
+
// is replaced (reset, restored snapshot, dispose), so an absolute row index
|
|
119
|
+
// names one row only within an epoch. Cursor-independent.
|
|
120
|
+
let spilledRows = 0;
|
|
121
|
+
let epoch = 0;
|
|
122
|
+
let spilledInfo = { rows: 0, epoch: 0 };
|
|
123
|
+
// Each page's first absolute row (`start`) within the current page list.
|
|
124
|
+
const replaced = () => {
|
|
125
|
+
spilledRows = 0;
|
|
126
|
+
for (const record of pages) {
|
|
127
|
+
record.start = spilledRows;
|
|
128
|
+
spilledRows += record.count;
|
|
129
|
+
}
|
|
130
|
+
epoch += 1;
|
|
131
|
+
};
|
|
68
132
|
let warningEmitted = false;
|
|
69
133
|
let spillDisabled = false;
|
|
70
134
|
const snapshots = new Set();
|
|
@@ -96,6 +160,7 @@ export function createTranscriptSpillBuffer({
|
|
|
96
160
|
const record = {
|
|
97
161
|
id: pageSequence,
|
|
98
162
|
path: page,
|
|
163
|
+
count: items.length,
|
|
99
164
|
pendingItems: items,
|
|
100
165
|
cancelled: false,
|
|
101
166
|
attempts: 0,
|
|
@@ -104,11 +169,10 @@ export function createTranscriptSpillBuffer({
|
|
|
104
169
|
writer.enqueue(record);
|
|
105
170
|
return record;
|
|
106
171
|
};
|
|
107
|
-
const decode = (record) => record.pendingItems || JSON.parse(readFileSync(record.path, 'utf8'));
|
|
108
172
|
const restoredWithOverlap = (liveItems) => {
|
|
109
|
-
const restored =
|
|
173
|
+
const restored = decodePage(pages[cursor]);
|
|
110
174
|
let following = Array.isArray(liveItems) ? liveItems : [];
|
|
111
|
-
if (cursor + 1 < pages.length) following =
|
|
175
|
+
if (cursor + 1 < pages.length) following = decodePage(pages[cursor + 1]);
|
|
112
176
|
return [...restored, ...following.slice(0, TRANSCRIPT_RESTORE_OVERLAP_ITEMS)];
|
|
113
177
|
};
|
|
114
178
|
return {
|
|
@@ -118,6 +182,14 @@ export function createTranscriptSpillBuffer({
|
|
|
118
182
|
get hasNewer() {
|
|
119
183
|
return cursor != null;
|
|
120
184
|
},
|
|
185
|
+
/** `{ rows, epoch }`: how many rows were spilled above the live ones, in
|
|
186
|
+
* which page list. The same object while neither changes. */
|
|
187
|
+
get spilled() {
|
|
188
|
+
if (spilledInfo.rows !== spilledRows || spilledInfo.epoch !== epoch) {
|
|
189
|
+
spilledInfo = { rows: spilledRows, epoch };
|
|
190
|
+
}
|
|
191
|
+
return spilledInfo;
|
|
192
|
+
},
|
|
121
193
|
reset() {
|
|
122
194
|
const retained = [...snapshots].some((snapshot) => snapshot.spillDir === spillDir);
|
|
123
195
|
const oldPages = pages.splice(0);
|
|
@@ -127,6 +199,7 @@ export function createTranscriptSpillBuffer({
|
|
|
127
199
|
pageSequence = 0;
|
|
128
200
|
spillDisabled = false;
|
|
129
201
|
warningEmitted = false;
|
|
202
|
+
replaced();
|
|
130
203
|
if (!retained) cleanupRecords(oldPages, oldDir);
|
|
131
204
|
},
|
|
132
205
|
snapshot() {
|
|
@@ -155,6 +228,7 @@ export function createTranscriptSpillBuffer({
|
|
|
155
228
|
pageSequence = snapshot.pageSequence;
|
|
156
229
|
spillDisabled = snapshot.spillDisabled === true;
|
|
157
230
|
warningEmitted = snapshot.warningEmitted === true;
|
|
231
|
+
replaced();
|
|
158
232
|
snapshots.delete(snapshot);
|
|
159
233
|
return true;
|
|
160
234
|
},
|
|
@@ -169,6 +243,7 @@ export function createTranscriptSpillBuffer({
|
|
|
169
243
|
if (snapshot.spillDir !== spillDir) cleanupRecords(snapshot.pages, snapshot.spillDir);
|
|
170
244
|
}
|
|
171
245
|
pages.length = 0;
|
|
246
|
+
replaced();
|
|
172
247
|
snapshots.clear();
|
|
173
248
|
cursor = null;
|
|
174
249
|
spillDir = null;
|
|
@@ -191,11 +266,24 @@ export function createTranscriptSpillBuffer({
|
|
|
191
266
|
let live = Array.isArray(items) ? items : [];
|
|
192
267
|
if (spillDisabled) return live;
|
|
193
268
|
while (live.length > cap) {
|
|
194
|
-
|
|
269
|
+
const record = encode(live.slice(0, chunkSize));
|
|
270
|
+
record.start = spilledRows;
|
|
271
|
+
pages.push(record);
|
|
272
|
+
spilledRows += chunkSize;
|
|
195
273
|
live = live.slice(chunkSize);
|
|
196
274
|
}
|
|
197
275
|
return live;
|
|
198
276
|
},
|
|
277
|
+
/** Spilled rows `[start, end)` by absolute index (0 = the first row ever
|
|
278
|
+
* spilled in this `epoch`), at most `limit` ending at `end`, exactly as
|
|
279
|
+
* they were spilled. Reads pages in order without moving the reading
|
|
280
|
+
* cursor. Null for another epoch. A page that cannot be read whole (gone,
|
|
281
|
+
* not JSON, not an array of its recorded length) ends the spilled
|
|
282
|
+
* history there: `broken`, with only the rows below it. */
|
|
283
|
+
readSpilled({ epoch: wanted, end = spilledRows, limit = 0 } = {}) {
|
|
284
|
+
if (wanted !== epoch) return null;
|
|
285
|
+
return readSpilledRows(pages, spilledRows, end, limit);
|
|
286
|
+
},
|
|
199
287
|
restoreOlder(liveItems) {
|
|
200
288
|
const nextCursor = cursor == null ? pages.length - 1 : cursor - 1;
|
|
201
289
|
if (nextCursor < 0) return null;
|
|
@@ -21,6 +21,8 @@ export function createTranscriptStore({ draft, store, flags, transcriptSpill, it
|
|
|
21
21
|
const transcriptHistoryFlags = () => ({
|
|
22
22
|
transcriptHistoryBefore: transcriptSpill.hasOlder,
|
|
23
23
|
transcriptHistoryAfter: transcriptSpill.hasNewer,
|
|
24
|
+
// Paged views read spilled rows by this, never by the TUI reading cursor.
|
|
25
|
+
transcriptSpilled: transcriptSpill.spilled,
|
|
24
26
|
});
|
|
25
27
|
const restoreOlderTranscript = () => {
|
|
26
28
|
const transcriptViewItems = transcriptSpill.restoreOlder(draft.state.items);
|
|
@@ -13,9 +13,7 @@ import { positiveInt } from '../runtime/shared/numbers.mjs';
|
|
|
13
13
|
|
|
14
14
|
// One table owns both halves of a maintenance agent: which agents are hidden
|
|
15
15
|
// from the worker list by default, and the short label they render as.
|
|
16
|
-
const MAINTENANCE_AGENT_LABELS = new Map([
|
|
17
|
-
['cycle1-agent', 'cycle1'],
|
|
18
|
-
]);
|
|
16
|
+
const MAINTENANCE_AGENT_LABELS = new Map([['cycle1-agent', 'cycle1']]);
|
|
19
17
|
const DEFAULT_HIDDEN_STATUSLINE_AGENTS = Object.freeze([...MAINTENANCE_AGENT_LABELS.keys()]);
|
|
20
18
|
const TERMINAL_AGENT_STATUS = /idle|done|complete|success|closed|error|fail|cancel|killed|timeout/i;
|
|
21
19
|
const ACTIVE_AGENT_STATUS = /^(?:connecting|requesting|streaming|tool[-_\s]?running|running|queued|pending|starting)$/i;
|
|
@@ -1,94 +0,0 @@
|
|
|
1
|
-
# Reviewing public skills
|
|
2
|
-
|
|
3
|
-
Use this reference to decide whether a public skill should be used as-is,
|
|
4
|
-
reimplemented, or rejected.
|
|
5
|
-
|
|
6
|
-
## Research order
|
|
7
|
-
|
|
8
|
-
Look for evidence in this order:
|
|
9
|
-
|
|
10
|
-
1. current first-party documentation;
|
|
11
|
-
2. the maintainer's source repository;
|
|
12
|
-
3. maintained community implementations;
|
|
13
|
-
4. indexes and lists for discovery only.
|
|
14
|
-
|
|
15
|
-
Stop when the decision has enough evidence. Popularity and search position do
|
|
16
|
-
not prove quality or compatibility.
|
|
17
|
-
|
|
18
|
-
## Candidate record
|
|
19
|
-
|
|
20
|
-
For each viable candidate, capture:
|
|
21
|
-
|
|
22
|
-
- the exact capability and trigger boundary;
|
|
23
|
-
- source URL plus release or commit when available;
|
|
24
|
-
- target agent and supported platforms;
|
|
25
|
-
- license and redistribution conditions;
|
|
26
|
-
- last meaningful maintenance;
|
|
27
|
-
- file layout and runtime assumptions;
|
|
28
|
-
- scripts, dependencies, network calls, secret access, and side effects;
|
|
29
|
-
- tests or examples that demonstrate behavior.
|
|
30
|
-
|
|
31
|
-
Compare candidates against the user's required outcome, not against each
|
|
32
|
-
other's feature count.
|
|
33
|
-
|
|
34
|
-
## Integration decision
|
|
35
|
-
|
|
36
|
-
### Reimplement the behavior
|
|
37
|
-
|
|
38
|
-
Prefer a local implementation when the useful part is a small set of ideas or
|
|
39
|
-
requirements. Write a new structure and new language from Mixdog constraints
|
|
40
|
-
and local evidence. Do not translate or lightly rearrange upstream text.
|
|
41
|
-
|
|
42
|
-
This path avoids carrying incompatible conventions and usually produces a
|
|
43
|
-
smaller skill. It does not permit copying protected prose or code without
|
|
44
|
-
following its license.
|
|
45
|
-
|
|
46
|
-
### Import third-party material
|
|
47
|
-
|
|
48
|
-
Use exact upstream material only when its implementation is necessary and its
|
|
49
|
-
license is acceptable. Preserve required notices, identify modifications, and
|
|
50
|
-
test the imported behavior in Mixdog. Upstream test results do not validate a
|
|
51
|
-
local adaptation.
|
|
52
|
-
|
|
53
|
-
### Reject the candidate
|
|
54
|
-
|
|
55
|
-
Reject it when:
|
|
56
|
-
|
|
57
|
-
- no usable license is present;
|
|
58
|
-
- executable behavior is unexplained or excessive;
|
|
59
|
-
- it depends on unavailable tools or private infrastructure;
|
|
60
|
-
- its trigger overlaps a stronger local owner;
|
|
61
|
-
- adapting it would cost more than a focused local design;
|
|
62
|
-
- maintenance or security evidence is insufficient.
|
|
63
|
-
|
|
64
|
-
## Executable-content audit
|
|
65
|
-
|
|
66
|
-
Read scripts rather than trusting their documentation. Look for:
|
|
67
|
-
|
|
68
|
-
- vendor-specific subprocesses;
|
|
69
|
-
- writes into hidden product directories;
|
|
70
|
-
- downloads, telemetry, or remote execution;
|
|
71
|
-
- environment and credential collection;
|
|
72
|
-
- package installation or privilege elevation;
|
|
73
|
-
- deletion, overwrite, publishing, deployment, or recurring scheduling;
|
|
74
|
-
- unbounded concurrency, retries, waits, or external spend;
|
|
75
|
-
- hard-coded local paths and platform-specific shell commands.
|
|
76
|
-
|
|
77
|
-
Removing an unnecessary executable is often safer than wrapping it in warnings.
|
|
78
|
-
When it is necessary, make its dependency and side effects visible in the main
|
|
79
|
-
skill.
|
|
80
|
-
|
|
81
|
-
## Extracting useful ideas safely
|
|
82
|
-
|
|
83
|
-
Record abstract lessons such as:
|
|
84
|
-
|
|
85
|
-
- a decision the workflow should make;
|
|
86
|
-
- a failure mode worth detecting;
|
|
87
|
-
- a completion condition;
|
|
88
|
-
- a useful separation of responsibilities;
|
|
89
|
-
- a test category or compatibility concern.
|
|
90
|
-
|
|
91
|
-
Then design the local workflow from those requirements without consulting the
|
|
92
|
-
source phrasing while drafting. Review the result for accidental product names,
|
|
93
|
-
foreign paths, commands, metadata, or structural assumptions.
|
|
94
|
-
|