mixdog 1.4.2 → 1.4.3
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 +2 -2
- package/scripts/build-shipped-history.mjs +15 -5
- package/scripts/gate-local.mjs +65 -19
- package/scripts/graph-parity.mjs +8 -3
- package/scripts/lib/gate-scheduler.mjs +2 -1
- package/scripts/lib/run-node-tests.mjs +17 -5
- package/scripts/lib/test-failure-summary.mjs +1 -8
- package/scripts/lib/test-spawn-ledger.mjs +33 -2
- package/scripts/post-release-check.mjs +26 -16
- package/scripts/provider-pingpong-live.mjs +1 -1
- package/scripts/prune-embedding-runtime.mjs +3 -1
- package/scripts/release-paths.mjs +7 -1
- package/src/defaults/shipped-history.json +20 -0
- package/src/defaults/skills/setup/SKILL.md +2 -2
- package/src/defaults/skills/setup/references/actions.md +16 -3
- package/src/defaults/skills/setup/references/surfaces.md +3 -0
- package/src/defaults/skills/setup-guide/SKILL.md +6 -1
- package/src/lib/instruction-text.cjs +36 -0
- package/src/lib/rules-builder.cjs +34 -20
- package/src/orchestration/balanced.md +23 -0
- package/src/orchestration/focused.md +22 -0
- package/src/orchestration/none.md +5 -0
- package/src/orchestration/swarm.md +24 -0
- package/src/rules/agent-mode/AGENT_MODE.md +3 -1
- package/src/rules/agent-mode/MIXY.md +2 -2
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +3 -3
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch.mjs +0 -1
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +4 -2
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +0 -9
- package/src/runtime/agent/orchestrator/agent-runtime/heartbeat-completion.mjs +2 -2
- package/src/runtime/agent/orchestrator/agent-runtime/session-builder.mjs +67 -0
- package/src/runtime/agent/orchestrator/agent-trace-format.mjs +1 -0
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +4 -4
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +3 -1
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +199 -46
- package/src/runtime/agent/orchestrator/mcp/client-config.mjs +3 -5
- package/src/runtime/agent/orchestrator/mcp/client-transport.mjs +9 -3
- package/src/runtime/agent/orchestrator/mcp/client.mjs +3 -5
- package/src/runtime/agent/orchestrator/mcp/oauth-client.mjs +1 -1
- package/src/runtime/agent/orchestrator/mcp/oauth-credentials.mjs +8 -2
- package/src/runtime/agent/orchestrator/mcp/oauth-probe.mjs +1 -1
- package/src/runtime/agent/orchestrator/mcp/oauth-provider.mjs +14 -0
- package/src/runtime/agent/orchestrator/mcp/oauth.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-sse-turn/turn-events/content-block-stop.mjs +3 -3
- package/src/runtime/agent/orchestrator/providers/codex-client-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/gemini-thinking.mjs +2 -2
- package/src/runtime/agent/orchestrator/providers/openai-compat-response-normalization.mjs +4 -6
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses-head-parity.json +2784 -2872
- package/src/runtime/agent/orchestrator/providers/openai-compat-xai.mjs +5 -8
- package/src/runtime/agent/orchestrator/providers/openai-responses-payload-parity.fixture.json +288 -300
- package/src/runtime/agent/orchestrator/providers/vertex-ai.mjs +10 -1
- package/src/runtime/agent/orchestrator/providers/xai-tool-search-head-parity.json +10 -30
- package/src/runtime/agent/orchestrator/runtime-core/builtin-features.mjs +30 -0
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +0 -11
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-availability.mjs +8 -0
- package/src/runtime/agent/orchestrator/runtime-core/deferred-tool-delta.mjs +17 -3
- package/src/runtime/agent/orchestrator/runtime-core/goal-control.mjs +47 -27
- package/src/runtime/agent/orchestrator/runtime-core/goal-deadlines.mjs +141 -10
- package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +26 -63
- package/src/runtime/agent/orchestrator/runtime-core/goal-reminder.mjs +28 -3
- package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +36 -11
- package/src/runtime/agent/orchestrator/runtime-core/goal-state.mjs +88 -56
- package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +4 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-store.mjs +51 -32
- package/src/runtime/agent/orchestrator/runtime-core/goal-text.mjs +45 -145
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-defs.mjs +15 -98
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +32 -99
- package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +23 -78
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +69 -48
- package/src/runtime/agent/orchestrator/runtime-core/todo-list.mjs +367 -0
- package/src/runtime/agent/orchestrator/runtime-core/todo-tool-defs.mjs +47 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-availability.mjs +155 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog-data.mjs +9 -0
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +119 -35
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +28 -22
- package/src/runtime/agent/orchestrator/session/agent-pool-progress.mjs +30 -0
- package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/cache-warm.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/catalog-db/index.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +8 -12
- package/src/runtime/agent/orchestrator/session/conversation-import/claude.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/codex.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/convert.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/conversation-import/imported-session.mjs +7 -3
- package/src/runtime/agent/orchestrator/session/human-gate/held-message.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +1 -2
- package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/image-strip-recovery.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/completion-guards.mjs +11 -1
- package/src/runtime/agent/orchestrator/session/loop/context-overflow.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/todo-check.mjs +196 -0
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +116 -50
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/loop/provider-tool-exclusions.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/loop/stored-tool-args.mjs +5 -6
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +16 -2
- package/src/runtime/agent/orchestrator/session/loop/turn-report.mjs +35 -0
- package/src/runtime/agent/orchestrator/session/loop/usage.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +57 -26
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +9 -7
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +21 -3
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-failure.mjs +27 -11
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-open.mjs +37 -34
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +25 -15
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-state.mjs +79 -24
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +12 -1
- package/src/runtime/agent/orchestrator/session/manager/context-meta.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +6 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +9 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-path.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/prompt-settings.mjs +598 -0
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +19 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +19 -10
- package/src/runtime/agent/orchestrator/session/manager/session-close.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/manager/session-fallback-title.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +31 -0
- package/src/runtime/agent/orchestrator/session/manager/session-lock.mjs +31 -0
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +42 -6
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/tool-resolution.mjs +11 -1
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-context.mjs +8 -9
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +339 -88
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-recovery.mjs +135 -11
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint.mjs +377 -104
- package/src/runtime/agent/orchestrator/session/manager/turn-durability.mjs +144 -0
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/usage-metrics.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/mixy-name.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +8 -1
- package/src/runtime/agent/orchestrator/session/save-session-worker.mjs +5 -1
- package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store/liveness-veto.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/store/save-worker.mjs +23 -2
- package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +3 -3
- package/src/runtime/agent/orchestrator/session/store/transcript-durability.mjs +88 -0
- package/src/runtime/agent/orchestrator/session/store-agent-worker-rows.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/store-summary-log.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/store-transcript-projection.mjs +14 -5
- package/src/runtime/agent/orchestrator/session/store-transcript-worker.mjs +2 -2
- package/src/runtime/agent/orchestrator/session/store.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/synthetic-user-envelope.mjs +7 -1
- package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +9 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/agent-envelope.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +2 -2
- package/src/runtime/agent/orchestrator/stall-policy.mjs +3 -5
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +4 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/misuse-guard.mjs +21 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/result-format.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/worktree-add-guard.mjs +77 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +7 -3
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +27 -9
- package/src/runtime/agent/orchestrator/tools/builtin/lib/search-input-helpers.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-range-index.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-fast-paths.mjs +0 -1
- package/src/runtime/agent/orchestrator/tools/builtin/search-tool.mjs +0 -10
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +1 -2
- package/src/runtime/agent/orchestrator/tools/builtin.mjs +1 -24
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary/child-kill.mjs +4 -3
- package/src/runtime/agent/orchestrator/tools/code-graph/graph-binary.mjs +1 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/modes/calls.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/code-graph/modes/symbols.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/code-graph/search.mjs +4 -5
- package/src/runtime/agent/orchestrator/tools/code-graph/symbol-index.mjs +3 -4
- package/src/runtime/agent/orchestrator/tools/code-graph.mjs +4 -22
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +2 -2
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +1 -1
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +0 -4
- package/src/runtime/agent/orchestrator/tools/shell-policy.mjs +0 -1
- package/src/runtime/attachments/attachment-reference.mjs +1 -1
- package/src/runtime/attachments/pdf-extract.mjs +1 -1
- package/src/runtime/attachments/store.d.mts +1 -0
- package/src/runtime/attachments/store.mjs +2 -2
- package/src/runtime/channels/lib/config-reload-watch.mjs +42 -0
- package/src/runtime/channels/lib/owned-runtime/config-reload.mjs +29 -9
- package/src/runtime/channels/lib/scheduler.mjs +33 -0
- package/src/runtime/channels/lib/schedules-db.mjs +11 -4
- package/src/runtime/channels/lib/webhook/session-dispatch.mjs +4 -1
- package/src/runtime/channels/lib/webhooks-db.mjs +9 -3
- package/src/runtime/channels/lib/whisper-server.mjs +12 -12
- package/src/runtime/channels/lib/worker-main.mjs +9 -31
- package/src/runtime/computer-bridge/linux-readiness.mjs +10 -14
- package/src/runtime/connectors/connector-accounts-mcp.mjs +169 -33
- package/src/runtime/connectors/gmail-app-password.mjs +2 -2
- package/src/runtime/connectors/google-mcp.mjs +1 -1
- package/src/runtime/effort-judge/judge-client.mjs +2 -2
- package/src/runtime/effort-judge/judge-input.mjs +4 -4
- package/src/runtime/explore/explorer.mjs +0 -5
- package/src/runtime/explore/tool.mjs +3 -3
- package/src/runtime/local-provider/hardware.mjs +1 -1
- package/src/runtime/media/adapters/codex-image.mjs +3 -3
- package/src/runtime/media/adapters/gemini-video.mjs +1 -1
- package/src/runtime/media/media-usage.mjs +1 -1
- package/src/runtime/media/store.mjs +1 -1
- package/src/runtime/memory/index.mjs +11 -1
- package/src/runtime/memory/lib/embedding-reindex.mjs +27 -0
- package/src/runtime/memory/lib/memory-embed.mjs +83 -14
- package/src/runtime/memory/lib/memory-process-lock.mjs +159 -36
- package/src/runtime/memory/lib/memory-text-utils.mjs +6 -1
- package/src/runtime/memory/lib/memory.mjs +17 -0
- package/src/runtime/memory/lib/pg/process.mjs +1 -1
- package/src/runtime/memory/lib/pg/supervisor.mjs +16 -96
- package/src/runtime/memory/lib/recall-hybrid/hybrid-sql.mjs +12 -3
- package/src/runtime/office/authoring/docx-html-runner.mjs +1 -1
- package/src/runtime/office/authoring/pptx-author-action.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-build.mjs +1 -1
- package/src/runtime/office/authoring/xlsx-html-runner.mjs +1 -1
- package/src/runtime/office/capabilities.mjs +1 -1
- package/src/runtime/office/core/office-core.mjs +1 -1
- package/src/runtime/office/design/content-model.mjs +3 -3
- package/src/runtime/office/design/docx/design-docx/section.mjs +6 -6
- package/src/runtime/office/design/xlsx/design-xlsx-components.mjs +1 -1
- package/src/runtime/office/design/xlsx/design-xlsx.mjs +1 -1
- package/src/runtime/office/pdf/ocr-engine.mjs +1 -1
- package/src/runtime/office/pdf/pdf-writer.mjs +4 -4
- package/src/runtime/office/portable/portable-docx-operations.mjs +2 -2
- package/src/runtime/office/portable/portable-soffice.mjs +8 -6
- package/src/runtime/office/portable/xlsx-contract.mjs +1 -1
- package/src/runtime/shared/atomic-file.d.mts +8 -0
- package/src/runtime/shared/background-tasks.mjs +22 -4
- package/src/runtime/shared/background-wait.mjs +66 -0
- package/src/runtime/shared/child-guardian.mjs +17 -7
- package/src/runtime/shared/config.mjs +313 -16
- package/src/runtime/shared/connector-catalog.d.mts +4 -5
- package/src/runtime/shared/connector-catalog.mjs +11 -1
- package/src/runtime/shared/file-lock.mjs +8 -3
- package/src/runtime/shared/git-runner.mjs +7 -2
- package/src/runtime/shared/idle-gc.mjs +30 -7
- package/src/runtime/shared/llm/http-agent.mjs +8 -5
- package/src/runtime/shared/llm/system-proxy.mjs +2 -1
- package/src/runtime/shared/llm/usage-ledger-quota.mjs +31 -12
- package/src/runtime/shared/llm/usage-ledger-rollup.mjs +84 -8
- package/src/runtime/shared/llm/usage-ledger.mjs +3 -0
- package/src/runtime/shared/llm/usage-rollup.mjs +48 -0
- package/src/runtime/shared/maintenance-schedule.mjs +109 -0
- package/src/runtime/shared/process-runner.mjs +8 -4
- package/src/runtime/shared/routine-trigger.d.mts +13 -0
- package/src/runtime/shared/routine-trigger.mjs +34 -0
- package/src/runtime/shared/run-child.d.mts +2 -1
- package/src/runtime/shared/run-child.mjs +70 -18
- package/src/runtime/shared/session-scratch.mjs +14 -2
- package/src/runtime/shared/shipped-definitions.mjs +7 -1
- package/src/runtime/shared/tool-card-model.golden.json +3 -12
- package/src/runtime/shared/tool-execution-contract.mjs +2 -0
- package/src/runtime/shared/tool-work-units.mjs +31 -6
- package/src/runtime/shared/turn-snapshot.mjs +26 -4
- package/src/runtime/shared/turn-worktree-snapshot.mjs +6 -11
- package/src/runtime/shared/worker-requests.mjs +17 -3
- package/src/runtime/shared/worktrees/branch-management.mjs +1 -5
- package/src/runtime/shared/worktrees/contract.mjs +16 -6
- package/src/runtime/shared/worktrees/dependencies.mjs +127 -89
- package/src/runtime/shared/worktrees/disk.mjs +79 -2
- package/src/runtime/shared/worktrees/git.mjs +44 -11
- package/src/runtime/shared/worktrees/include.mjs +6 -4
- package/src/runtime/shared/worktrees/maintenance.mjs +422 -30
- package/src/runtime/shared/worktrees/manager.mjs +772 -75
- package/src/runtime/shared/worktrees/settings.mjs +33 -7
- package/src/runtime/shared/worktrees/test-support.mjs +5 -1
- package/src/runtime/shared/worktrees/worker-snapshots.mjs +82 -0
- package/src/runtime/tidy/process.mjs +2 -1
- package/src/runtime/web-search/index.mjs +3 -22
- package/src/runtime/web-search/lib/web-tools.mjs +2 -2
- package/src/runtime/web-search/tool-defs.mjs +17 -26
- package/src/session-runtime/agent-profile-changes.mjs +55 -4
- package/src/session-runtime/boot/apis.mjs +27 -4
- package/src/session-runtime/boot/begin.mjs +2 -0
- package/src/session-runtime/boot/config.mjs +10 -1
- package/src/session-runtime/boot/facade.mjs +1 -0
- package/src/session-runtime/boot/providers.mjs +70 -3
- package/src/session-runtime/boot/session.mjs +2 -0
- package/src/session-runtime/boot/tools.mjs +69 -25
- package/src/session-runtime/channel-config-api.mjs +1 -0
- package/src/session-runtime/config-change-effects.mjs +179 -0
- package/src/session-runtime/config-lifecycle/config-writers.mjs +1 -0
- package/src/session-runtime/config-lifecycle.mjs +160 -24
- package/src/session-runtime/conversation-import/discovery.mjs +86 -7
- package/src/session-runtime/conversation-import/service.mjs +3 -2
- package/src/session-runtime/goal-facade-api.mjs +49 -3
- package/src/session-runtime/internal-tool-executor/ask-user-tool.mjs +3 -0
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +3 -2
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +3 -11
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +18 -4
- package/src/session-runtime/internal-tool-executor.mjs +12 -19
- package/src/session-runtime/lifecycle/cold-heir.mjs +7 -0
- package/src/session-runtime/lifecycle/memory-ingest.mjs +3 -3
- package/src/session-runtime/lifecycle/session-switch/session-delete.mjs +53 -5
- package/src/session-runtime/lifecycle/session-switch.mjs +13 -2
- package/src/session-runtime/lifecycle/teardown/session-close.mjs +4 -4
- package/src/session-runtime/lifecycle-api.mjs +1 -0
- package/src/session-runtime/mcp-glue/server-catalog.mjs +14 -3
- package/src/session-runtime/mcp-glue/server-connection.mjs +34 -8
- package/src/session-runtime/model-route/set-route.mjs +40 -7
- package/src/session-runtime/native-web-search/routes.mjs +3 -3
- package/src/session-runtime/provider-auth/refresh.mjs +6 -3
- package/src/session-runtime/provider-auth/setup.mjs +1 -1
- package/src/session-runtime/provider-readiness.mjs +53 -4
- package/src/session-runtime/resource-api.mjs +1 -1
- package/src/session-runtime/resource-extension-sync.mjs +4 -8
- package/src/session-runtime/resource-mcp-connector-accounts.mjs +5 -1
- package/src/session-runtime/resource-mcp-secrets.mjs +3 -3
- package/src/session-runtime/resource-plugins-api.mjs +4 -0
- package/src/session-runtime/routine-executor.mjs +152 -0
- package/src/session-runtime/routine-home-turn.mjs +46 -5
- package/src/session-runtime/runtime-facade.mjs +5 -0
- package/src/session-runtime/runtime-feature-gates.mjs +2 -11
- package/src/session-runtime/schedule-session-run.mjs +1 -0
- package/src/session-runtime/services/agent-tool/job-task-reconcile.mjs +6 -1
- package/src/session-runtime/services/agent-tool/job-views/session-progress.mjs +7 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +110 -6
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +12 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-plan.mjs +5 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +24 -6
- package/src/session-runtime/services/agent-tool.mjs +51 -1
- package/src/session-runtime/services/channel-admin.mjs +18 -0
- package/src/session-runtime/services/hook-bus/command-handler.mjs +7 -11
- package/src/session-runtime/services/plugin-admin.mjs +4 -0
- package/src/session-runtime/services/seeds.mjs +7 -0
- package/src/session-runtime/services/usage-stats-model.mjs +32 -11
- package/src/session-runtime/session-create/materialize.mjs +4 -2
- package/src/session-runtime/session-create/session-options.mjs +2 -0
- package/src/session-runtime/settings-builtin-tools-api.mjs +1 -9
- package/src/session-runtime/setup-tool/connector-widen-approval.mjs +1 -1
- package/src/session-runtime/setup-tool/executor.mjs +8 -1
- package/src/session-runtime/setup-tool/extended-actions.mjs +2 -0
- package/src/session-runtime/setup-tool/settings-contract.mjs +28 -0
- package/src/session-runtime/setup-tool/tool-defs.mjs +26 -1
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +40 -43
- package/src/session-runtime/tool-policy/mode-switch.mjs +1 -1
- package/src/session-runtime/tool-policy/policy-stage.mjs +106 -8
- package/src/session-runtime/tool-policy/workflow-overlay.mjs +2 -1
- package/src/session-runtime/tool-policy-refresh.mjs +182 -5
- package/src/session-runtime/tool-surface.mjs +38 -1
- package/src/session-runtime/turn/agent-ops.mjs +10 -2
- package/src/session-runtime/turn/session-ops.mjs +2 -0
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +5 -0
- package/src/session-runtime/turn/turn-run.mjs +1 -1
- package/src/session-runtime/webhook-session-run.mjs +2 -0
- package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +1 -4
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +3 -10
- package/src/session-runtime/workflow-agents-api/instruction-files.mjs +165 -0
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +5 -4
- package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +2 -3
- package/src/session-runtime/workflow-agents-api.mjs +2 -0
- package/src/session-runtime/workspace/project-branches.mjs +1 -1
- package/src/session-runtime/workspace/session-view.mjs +1 -1
- package/src/session-runtime/workspace/transitions.mjs +20 -4
- package/src/session-runtime/workspace/worktree-maintenance.mjs +126 -6
- package/src/session-runtime/workspace/worktree-setup.mjs +13 -1
- package/src/session-runtime/workspace/worktree-tool.mjs +16 -0
- package/src/standalone/daemon-agent-control.mjs +25 -8
- package/src/standalone/daemon-desktop-runtime.mjs +6 -2
- package/src/standalone/daemon-lag-profiler.mjs +7 -7
- package/src/standalone/daemon.mjs +54 -2
- package/src/standalone/local-session-runtime.mjs +16 -0
- package/src/standalone/session-client/daemon-unavailable.mjs +1 -1
- package/src/standalone/session-protocol.mjs +11 -0
- package/src/standalone/session-service/agent-route-follow.mjs +23 -20
- package/src/standalone/session-service/agent-tree/agent-turns.mjs +18 -6
- package/src/standalone/session-service/quota-resume.mjs +9 -0
- package/src/standalone/session-service/session-calls/session-action.mjs +51 -1
- package/src/standalone/session-service/session-calls/session-turns.mjs +37 -18
- package/src/standalone/session-service/session-calls/turn-gate.mjs +34 -0
- package/src/standalone/session-service/session-calls.mjs +2 -1
- package/src/tui/App.jsx +8 -0
- package/src/tui/app/clipboard.mjs +1 -1
- package/src/tui/app/create-app-pickers.mjs +2 -0
- package/src/tui/app/doctor.mjs +2 -2
- package/src/tui/app/panel-signature.mjs +1 -1
- package/src/tui/app/settings-picker.mjs +53 -8
- package/src/tui/app/shell-layout/row-budgets.mjs +2 -2
- package/src/tui/app/slash-commands.mjs +1 -1
- package/src/tui/app/slash-dispatch/route-commands.mjs +1 -1
- package/src/tui/app/slash-dispatch/session-commands.mjs +1 -1
- package/src/tui/app/use-prompt-queue-history.mjs +2 -2
- package/src/tui/app/use-transcript-activity.mjs +1 -1
- package/src/tui/app/use-transcript-window/geometry.mjs +1 -1
- package/src/tui/components/prompt-input/escape-policy.d.mts +0 -1
- package/src/tui/components/prompt-input/escape-policy.mjs +1 -1
- package/src/tui/components/question-panel-model.mjs +4 -4
- package/src/tui/components/tool-execution/standard-card.jsx +3 -4
- package/src/tui/components/user-message-skills.mjs +1 -1
- package/src/tui/dist/index.mjs +309 -30
- package/src/tui/markdown/render-ansi.mjs +1 -1
- package/src/tui/session/agent-job-feed/notification-router.mjs +10 -0
- package/src/tui/session/agent-job-feed.mjs +2 -0
- package/src/tui/session/context-state.mjs +3 -0
- package/src/tui/session/quota-resume.mjs +1 -1
- package/src/tui/session/session-api/lifecycle/dispose.mjs +1 -0
- package/src/tui/session/session-api/lifecycle/session-reset.mjs +7 -0
- package/src/tui/session/session-api/routes-agent-definitions.mjs +5 -0
- package/src/tui/session/session-api/worktree.mjs +13 -1
- package/src/tui/session/session-flow/drain.mjs +11 -14
- package/src/tui/session/tool-card-results/grouped-result.mjs +2 -2
- package/src/tui/session/turn-quiet.mjs +1 -1
- package/src/tui/session/turn.mjs +3 -0
- package/src/tui/session/worktree-setup-notice.mjs +1 -1
- package/src/tui/spinner-meta.mjs +3 -3
- package/src/tui/spinner-verbs.mjs +2 -2
- package/src/defaults/skills/goal-management/SKILL.md +0 -169
- package/src/runtime/agent/orchestrator/runtime-core/goal-tasks.mjs +0 -156
- package/src/session-runtime/goal-tasks.mjs +0 -1
|
@@ -6,6 +6,7 @@ import { captureTurnCheckpointContextState, createTurnCheckpointRecorder } from
|
|
|
6
6
|
import { finalizeTurnInterruptionSnapshot } from './turn-interruption.mjs';
|
|
7
7
|
import { onSensitiveValuesMarked } from '../sensitive-values.mjs';
|
|
8
8
|
import { saveSessionAsync } from '../store.mjs';
|
|
9
|
+
import { setTranscriptSnapshotHook } from '../store/transcript-durability.mjs';
|
|
9
10
|
import { ingestSessionTurn } from '../../../../session-search/session-search-ingest.mjs';
|
|
10
11
|
|
|
11
12
|
// Coalescing window for streaming-delta flushes. Each flush journals only the
|
|
@@ -22,6 +23,8 @@ export function createAskTurnState(session) {
|
|
|
22
23
|
outgoing: null,
|
|
23
24
|
/** The user turn exactly as sent, kept for interruption finalization. */
|
|
24
25
|
userTurnContent: '',
|
|
26
|
+
/** Index of the user turn in `outgoing` when it was assembled. */
|
|
27
|
+
boundary: null,
|
|
25
28
|
/** Queue entries this turn consumed: acked on commit, released on failure. */
|
|
26
29
|
pendingEntries: [],
|
|
27
30
|
};
|
|
@@ -29,34 +32,60 @@ export function createAskTurnState(session) {
|
|
|
29
32
|
|
|
30
33
|
/** The recorder writes this turn's header synchronously on its first flush
|
|
31
34
|
* (the crash-durability anchor for the prompt, landing before the provider
|
|
32
|
-
* runs) and appends bounded deltas afterwards.
|
|
33
|
-
|
|
35
|
+
* runs) and appends bounded deltas afterwards. `base` is the durable
|
|
36
|
+
* transcript the turn opens on (store/transcript-durability.mjs). Every
|
|
37
|
+
* save of the session flushes first, so a history rewrite is in the
|
|
38
|
+
* checkpoint before any record carries its new epoch. */
|
|
39
|
+
export function createTurnCheckpointScheduler({
|
|
40
|
+
sessionId,
|
|
41
|
+
generation,
|
|
42
|
+
turnToken,
|
|
43
|
+
startedAt,
|
|
44
|
+
turn,
|
|
45
|
+
interruption,
|
|
46
|
+
base,
|
|
47
|
+
}) {
|
|
34
48
|
let timer = null;
|
|
35
49
|
let stopped = false;
|
|
36
50
|
let lastAt = 0;
|
|
37
51
|
let warned = false;
|
|
38
|
-
let
|
|
39
|
-
const recorder = createTurnCheckpointRecorder({
|
|
52
|
+
let contextDirty = false;
|
|
53
|
+
const recorder = createTurnCheckpointRecorder({
|
|
54
|
+
session: turn.session,
|
|
55
|
+
sessionId,
|
|
56
|
+
generation,
|
|
57
|
+
turnToken,
|
|
58
|
+
startedAt,
|
|
59
|
+
base,
|
|
60
|
+
});
|
|
61
|
+
const record = (messages, extra = {}) =>
|
|
62
|
+
recorder.record({
|
|
63
|
+
boundary: turn.boundary,
|
|
64
|
+
currentUserContent: turn.userTurnContent,
|
|
65
|
+
turnOutgoing: messages,
|
|
66
|
+
interruption,
|
|
67
|
+
captureContext: (boundary) => captureTurnCheckpointContextState(turn.session, messages, boundary),
|
|
68
|
+
contextDirty,
|
|
69
|
+
...extra,
|
|
70
|
+
});
|
|
71
|
+
const warn = (error) => {
|
|
72
|
+
if (warned) return;
|
|
73
|
+
warned = true;
|
|
74
|
+
try {
|
|
75
|
+
process.stderr.write(`[turn-checkpoint] write failed session=${sessionId}: ${error?.message || error}\n`);
|
|
76
|
+
} catch {
|
|
77
|
+
// stderr may be closed; the checkpoint failure is only reported
|
|
78
|
+
}
|
|
79
|
+
};
|
|
40
80
|
const flush = () => {
|
|
41
81
|
if (stopped || !turn.outgoing || !turn.userTurnContent) return false;
|
|
42
82
|
try {
|
|
43
|
-
const written =
|
|
44
|
-
|
|
45
|
-
turnOutgoing: turn.outgoing,
|
|
46
|
-
interruption,
|
|
47
|
-
contextState,
|
|
48
|
-
});
|
|
83
|
+
const written = record(turn.outgoing);
|
|
84
|
+
contextDirty = false;
|
|
49
85
|
if (written) lastAt = Date.now();
|
|
50
86
|
return written;
|
|
51
87
|
} catch (error) {
|
|
52
|
-
|
|
53
|
-
warned = true;
|
|
54
|
-
try {
|
|
55
|
-
process.stderr.write(`[turn-checkpoint] write failed session=${sessionId}: ${error?.message || error}\n`);
|
|
56
|
-
} catch {
|
|
57
|
-
// stderr may be closed; the checkpoint failure is only reported
|
|
58
|
-
}
|
|
59
|
-
}
|
|
88
|
+
warn(error);
|
|
60
89
|
return false;
|
|
61
90
|
}
|
|
62
91
|
};
|
|
@@ -83,9 +112,20 @@ export function createTurnCheckpointScheduler({ sessionId, generation, turnToken
|
|
|
83
112
|
});
|
|
84
113
|
ingestSessionTurn(turn.session);
|
|
85
114
|
});
|
|
115
|
+
const unhookSaves = setTranscriptSnapshotHook(turn.session, () => {
|
|
116
|
+
if (!stopped && turn.outgoing) flushNow();
|
|
117
|
+
});
|
|
118
|
+
const halt = (options) => {
|
|
119
|
+
stopped = true;
|
|
120
|
+
stopMarks();
|
|
121
|
+
unhookSaves();
|
|
122
|
+
if (timer) clearTimeout(timer);
|
|
123
|
+
timer = null;
|
|
124
|
+
recorder.stop(options);
|
|
125
|
+
};
|
|
86
126
|
return {
|
|
87
127
|
refreshContextState() {
|
|
88
|
-
|
|
128
|
+
contextDirty = true;
|
|
89
129
|
},
|
|
90
130
|
schedule(immediate = false) {
|
|
91
131
|
if (stopped || !turn.outgoing) return;
|
|
@@ -101,12 +141,27 @@ export function createTurnCheckpointScheduler({ sessionId, generation, turnToken
|
|
|
101
141
|
}, waitMs);
|
|
102
142
|
timer.unref?.();
|
|
103
143
|
},
|
|
144
|
+
/** Record the finished transcript (`turn.session.messages`, with the
|
|
145
|
+
* final assistant message and its completion) as sealed, then stop: a
|
|
146
|
+
* crash before a save covers the turn replays it as finished, not as
|
|
147
|
+
* interrupted. */
|
|
148
|
+
seal() {
|
|
149
|
+
if (stopped) return false;
|
|
150
|
+
let written = false;
|
|
151
|
+
if (turn.outgoing && turn.userTurnContent) {
|
|
152
|
+
try {
|
|
153
|
+
contextDirty = true;
|
|
154
|
+
written = record(turn.session.messages, { sealed: true });
|
|
155
|
+
} catch (error) {
|
|
156
|
+
warn(error);
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
halt({ keepQueued: true });
|
|
160
|
+
return written;
|
|
161
|
+
},
|
|
104
162
|
stop() {
|
|
105
|
-
stopped
|
|
106
|
-
|
|
107
|
-
if (timer) clearTimeout(timer);
|
|
108
|
-
timer = null;
|
|
109
|
-
recorder.stop();
|
|
163
|
+
if (stopped) return;
|
|
164
|
+
halt();
|
|
110
165
|
},
|
|
111
166
|
};
|
|
112
167
|
}
|
|
@@ -44,6 +44,9 @@ export function createAskSteeringDrain({ sessionId, turn, askOpts }) {
|
|
|
44
44
|
// nothing. Entries consumed here join the turn's pending entries: their
|
|
45
45
|
// delivery/ack (and release on failure) rides this turn, and the
|
|
46
46
|
// post-loop drain can no longer see them.
|
|
47
|
+
// A route saved while this turn runs (session.heldRoute) leaves the
|
|
48
|
+
// queued entries to the next turn, which opens on that route.
|
|
49
|
+
if (turn.session?.heldRoute) return out;
|
|
47
50
|
if (drainOptions?.stage === 'terminal' || pendingQueueHoldsOnlyNotifications(sessionId)) {
|
|
48
51
|
const pendingNow = drainPendingMessages(sessionId);
|
|
49
52
|
if (pendingNow.length > 0) {
|
|
@@ -36,7 +36,8 @@ import {
|
|
|
36
36
|
resolveWorkerCompactPolicy,
|
|
37
37
|
shouldCompactForRequestMedia,
|
|
38
38
|
} from '../loop/compact-policy.mjs';
|
|
39
|
-
import { snapshotProviderRequestTools } from '../../runtime-core/tool-catalog.mjs';
|
|
39
|
+
import { rearmLateDeferredTools, snapshotProviderRequestTools } from '../../runtime-core/tool-catalog.mjs';
|
|
40
|
+
import { rearmPromptSettingsNotice } from './prompt-settings.mjs';
|
|
40
41
|
import { prepareCompactionArchive, stampCompactionMessageIds } from '../compaction-archive-capture.mjs';
|
|
41
42
|
|
|
42
43
|
// 'compacting' is a transient in-flight stage written just before Compact
|
|
@@ -724,6 +725,16 @@ async function commitSessionCompaction(plan, run, compactStartedAt) {
|
|
|
724
725
|
// break instead of logging an unexplained input_prefix_mismatch.
|
|
725
726
|
if (changed) {
|
|
726
727
|
session.pendingCacheBreakIntent = mode === 'auto' ? 'post_turn_compaction' : 'manual_compaction';
|
|
728
|
+
// The compacted history no longer holds the late-tool announcements
|
|
729
|
+
// (connected MCP tools, built-ins a setting opened); a worker gets no
|
|
730
|
+
// prompt fold to list them, so they ride the next prompt again, as the
|
|
731
|
+
// pre-send compaction does.
|
|
732
|
+
try {
|
|
733
|
+
rearmLateDeferredTools(session);
|
|
734
|
+
rearmPromptSettingsNotice(session);
|
|
735
|
+
} catch {
|
|
736
|
+
/* a tool reminder never fails the compaction */
|
|
737
|
+
}
|
|
727
738
|
}
|
|
728
739
|
recordCompactionTiming(plan, freshContextResult, { startedAt: compactStartedAt, commitStartedAt, afterTokens });
|
|
729
740
|
return compactionResult(
|
|
@@ -154,7 +154,7 @@ export function resolveSessionContextMeta(provider, model, seed = {}, { wholeWin
|
|
|
154
154
|
// Legacy-data migration: old implementations derived autoCompactTokenLimit
|
|
155
155
|
// from the full effective/raw window and persisted it onto the session.
|
|
156
156
|
// A resumed session therefore re-seeds autoCompactTokenLimit == boundary
|
|
157
|
-
// (or the raw window), which compactTriggerForSession / loop policy
|
|
157
|
+
// (or the raw window), which compactTriggerForSession / loop policy would
|
|
158
158
|
// honor as an explicit trigger, collapsing the compaction buffer to 0. Only
|
|
159
159
|
// accept an explicit limit that is STRICTLY BELOW the boundary; a value at
|
|
160
160
|
// or above the boundary is a derived full-window artifact and is dropped to
|
|
@@ -9,6 +9,7 @@ import {
|
|
|
9
9
|
evictIdleLiveSessions,
|
|
10
10
|
} from '../store.mjs';
|
|
11
11
|
import { sweepOrphanedPendingMessages } from './pending-messages.mjs';
|
|
12
|
+
import { sweepOrphanTurnJournals } from './turn-checkpoint-recovery.mjs';
|
|
12
13
|
import { applySessionSidebarChange, readSessionSidebarState } from '../../../../shared/session-sidebar-host.mjs';
|
|
13
14
|
import {
|
|
14
15
|
IN_FLIGHT_STAGES,
|
|
@@ -184,7 +185,7 @@ function _runCleanupCycle() {
|
|
|
184
185
|
await sweepOrphanedPendingMessages();
|
|
185
186
|
await sweepIdleSessions({ includeTombstones: true });
|
|
186
187
|
// Reclaim same-process session snapshots whose state is durable on disk
|
|
187
|
-
// (memory-leak guard: _liveSessions
|
|
188
|
+
// (memory-leak guard: _liveSessions would otherwise grow for process lifetime).
|
|
188
189
|
try {
|
|
189
190
|
evictIdleLiveSessions({ isSessionLive: _isSessionLive });
|
|
190
191
|
} catch {
|
|
@@ -213,6 +214,10 @@ function _startCleanupInterval() {
|
|
|
213
214
|
|
|
214
215
|
export function startIdleCleanup() {
|
|
215
216
|
if (_cleanupTimer || _cleanupInitialTimer) return;
|
|
217
|
+
// Once per start, ahead of the first delayed cycle: checkpoint journals a
|
|
218
|
+
// previous run could not delete (their sessions may never be reopened).
|
|
219
|
+
// Only the daemon owner sweeps (it checks); the daemon runs in worker mode.
|
|
220
|
+
void sweepOrphanTurnJournals().catch(() => {});
|
|
216
221
|
if (CLEANUP_INITIAL_DELAY_MS <= 0) {
|
|
217
222
|
void _runCleanupCycle();
|
|
218
223
|
_startCleanupInterval();
|
|
@@ -490,6 +490,14 @@ registerTaskWaitSteeringCheck((sessionId) => {
|
|
|
490
490
|
return wake;
|
|
491
491
|
});
|
|
492
492
|
|
|
493
|
+
/** Whether anything waits in this session's queue (memory or takeover-hydrated). */
|
|
494
|
+
export function hasPendingMessages(sessionId) {
|
|
495
|
+
return (
|
|
496
|
+
(_sessionPendingMessages.get(sessionId)?.length ?? 0) > 0 ||
|
|
497
|
+
(_hydratedPendingMessages.get(sessionId)?.length ?? 0) > 0
|
|
498
|
+
);
|
|
499
|
+
}
|
|
500
|
+
|
|
493
501
|
// True when this session's queue holds task notifications and nothing else:
|
|
494
502
|
// the mid-chain boundary may then take the whole queue without bypassing the
|
|
495
503
|
// prompt filters that keep queued prompts for the terminal boundary.
|
|
@@ -583,7 +591,7 @@ export function drainPendingMessages(sessionId) {
|
|
|
583
591
|
);
|
|
584
592
|
}
|
|
585
593
|
// Only materialize the ledger when there is an id to suppress: an empty
|
|
586
|
-
// drain
|
|
594
|
+
// drain would leave a dead Set behind on every call.
|
|
587
595
|
const claimedIds = accepted.filter((entry) => entry.id);
|
|
588
596
|
if (claimedIds.length > 0) {
|
|
589
597
|
const inDelivery = pendingIdSet(_inDeliveryPendingIds, sessionId);
|
|
@@ -9,8 +9,8 @@ export const PENDING_MESSAGES_MODE = 0o600;
|
|
|
9
9
|
// Layout: one file (and one lock) per pending key under `session-pending/`.
|
|
10
10
|
// A key is an orchestrator session id or a `tui_<lead session id>` steering
|
|
11
11
|
// bucket, so operations on different sessions never share a lock.
|
|
12
|
-
|
|
13
|
-
|
|
12
|
+
const PENDING_SHARD_DIR_NAME = 'session-pending';
|
|
13
|
+
const LEGACY_PENDING_FILE_NAME = 'session-pending-messages.json';
|
|
14
14
|
|
|
15
15
|
export function pendingShardDir() {
|
|
16
16
|
return join(resolvePluginData(), PENDING_SHARD_DIR_NAME);
|
|
@@ -9,7 +9,7 @@ import { legacyPendingMessagesPath, pendingMessagesPath, PENDING_MESSAGES_MODE }
|
|
|
9
9
|
const SHARD_KEY_RE = /^[A-Za-z0-9_-]+$/;
|
|
10
10
|
const MIGRATION_LOCK_TIMEOUT_MS = 15_000;
|
|
11
11
|
|
|
12
|
-
|
|
12
|
+
function isShardKey(key) {
|
|
13
13
|
return typeof key === 'string' && SHARD_KEY_RE.test(key);
|
|
14
14
|
}
|
|
15
15
|
|