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
|
@@ -122,6 +122,13 @@ export function createSessionResetActions(bag) {
|
|
|
122
122
|
throw error;
|
|
123
123
|
}
|
|
124
124
|
}),
|
|
125
|
+
// The desktop's auto-delete (session-delete.mjs deleteSessionIfIdle): never
|
|
126
|
+
// the current session, so no reset of this one's view.
|
|
127
|
+
deleteSessionIfIdle: async (id, expected, guards) => {
|
|
128
|
+
const result = await runtime.deleteSessionIfIdle(id, expected, guards);
|
|
129
|
+
if (result?.deleted === true) bag.supersedeQuotaResume?.(id);
|
|
130
|
+
return result;
|
|
131
|
+
},
|
|
125
132
|
switchContext: (options) =>
|
|
126
133
|
withResetLock(async () => {
|
|
127
134
|
const rollbackSnapshot = beginTuiReset();
|
|
@@ -27,6 +27,11 @@ export function createAgentDefinitionApi(runtime) {
|
|
|
27
27
|
createWorkflow: async (payload) => runtime.createWorkflow?.(payload) ?? null,
|
|
28
28
|
deleteWorkflow: async (workflowId) => runtime.deleteWorkflow?.(workflowId) ?? null,
|
|
29
29
|
getAgentDefinition: (agentId) => runtime.getAgentDefinition?.(agentId) ?? null,
|
|
30
|
+
listInstructionFiles: () => runtime.listInstructionFiles?.() ?? [],
|
|
31
|
+
getInstructionFile: (group, id) => runtime.getInstructionFile?.(group, id) ?? null,
|
|
32
|
+
saveInstructionFile: async (payload) => runtime.saveInstructionFile?.(payload) ?? null,
|
|
33
|
+
resetInstructionFile: async (group, id, expectedRevision) =>
|
|
34
|
+
runtime.resetInstructionFile?.(group, id, expectedRevision) ?? null,
|
|
30
35
|
getAgentAvatarImage: (agentId) => runtime.getAgentAvatarImage?.(agentId) ?? null,
|
|
31
36
|
getAgentConnectors: (agentId) => runtime.getAgentConnectors?.(agentId) ?? [],
|
|
32
37
|
listConnectors: () => runtime.listConnectors?.() ?? [],
|
|
@@ -23,7 +23,15 @@
|
|
|
23
23
|
* (expectedRevision: WORKTREE_REVISION_CONFLICT when the session moved on)
|
|
24
24
|
* (WORKTREE_REMOVAL_INCOMPLETE: partly removed; call again to finish)
|
|
25
25
|
* listWorktrees() → every managed worktree with its retention
|
|
26
|
-
* pruneWorktrees() → reconcile report (
|
|
26
|
+
* pruneWorktrees() → reconcile report (with autoCleanup on, also the
|
|
27
|
+
* count/age limits and archive rules of the automatic cleanup)
|
|
28
|
+
* previewWorktreeCleanup({ repoCommonDir? }) → { hasCandidates } (whether pruneWorktrees could act on
|
|
29
|
+
* anything; read-only, no git verification)
|
|
30
|
+
* deleteWorktree({ entryId, force? }) → { removed, entryId, path } (Settings → Worktrees;
|
|
31
|
+
* refuses one in use, dirty or unmerged work unless `force`)
|
|
32
|
+
* getSessionWorktreeWork({ sessionIds }) → { sessionIds } owning a worktree removal would refuse
|
|
33
|
+
* setArchivedSessionWorktrees({ sessionIds, archived }) → { changed } (autoCleanup on: archived
|
|
34
|
+
* sessions' worktrees become disposable for the startup reconcile / prune; a restore unmarks) */
|
|
27
35
|
import { worktreeError } from '../../../runtime/shared/worktrees/contract.mjs';
|
|
28
36
|
|
|
29
37
|
/** Session actions of the Lead worktree feature (settings live in settings.mjs). */
|
|
@@ -40,6 +48,10 @@ export const SESSION_WORKTREE_ACTIONS = Object.freeze([
|
|
|
40
48
|
'removeWorktree',
|
|
41
49
|
'listWorktrees',
|
|
42
50
|
'pruneWorktrees',
|
|
51
|
+
'previewWorktreeCleanup',
|
|
52
|
+
'deleteWorktree',
|
|
53
|
+
'getSessionWorktreeWork',
|
|
54
|
+
'setArchivedSessionWorktrees',
|
|
43
55
|
]);
|
|
44
56
|
|
|
45
57
|
export function createSessionWorktreeApi({ runtime, set, routeState } = {}) {
|
|
@@ -29,16 +29,13 @@ function earliestSubmittedAt(batch) {
|
|
|
29
29
|
|
|
30
30
|
function renderBatchItems(batch, pushUserOrSyntheticItem) {
|
|
31
31
|
for (const entry of batch) {
|
|
32
|
-
// Async-completion twins (queued model-visible wrapper)
|
|
33
|
-
//
|
|
34
|
-
//
|
|
35
|
-
//
|
|
36
|
-
//
|
|
37
|
-
//
|
|
38
|
-
//
|
|
39
|
-
// task_id upsert in upsertSyntheticToolItem patches an
|
|
40
|
-
// already-rendered card, so the double-delivery case stays
|
|
41
|
-
// duplicate-free. Non-wrapper entries keep the old skip.
|
|
32
|
+
// Async-completion twins (queued model-visible wrapper) are rendered
|
|
33
|
+
// through the synthetic path rather than display-skipped: the live
|
|
34
|
+
// notification push is event-ephemeral and can be missed (listener race,
|
|
35
|
+
// dedupe state from another surface, daemon restart), which would leave
|
|
36
|
+
// the completion with NO transcript card at all. The task_id upsert in
|
|
37
|
+
// upsertSyntheticToolItem patches an already-rendered card, so the
|
|
38
|
+
// double-delivery case stays duplicate-free. Non-wrapper entries are skipped.
|
|
42
39
|
if (entry.mode === 'pending-resume' || entry.suppressDisplay) {
|
|
43
40
|
const twin = typeof entry.content === 'string' ? entry.content : String(entry.text || '');
|
|
44
41
|
if (parseModelVisibleCompletionWrapper(twin)) {
|
|
@@ -145,10 +142,10 @@ export function turnOptionsForBatch(batch, steering) {
|
|
|
145
142
|
Array.isArray(entry?.resumeCompletionKeys) ? entry.resumeCompletionKeys : []
|
|
146
143
|
),
|
|
147
144
|
transcriptMeta: completionWakeTranscriptMeta(batch),
|
|
148
|
-
// Only
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
145
|
+
// Only host code names a selection text (queue/entry-shape.mjs): a
|
|
146
|
+
// routine turn, or a routine's executor sub-agent turn — its trusted
|
|
147
|
+
// instructions, never a payload.
|
|
148
|
+
...(typeof batch[0]?.skillSelection === 'string' ? { skillSelection: batch[0].skillSelection } : {}),
|
|
152
149
|
context:
|
|
153
150
|
batch
|
|
154
151
|
.map((entry) => String(entry.context || '').trim())
|
|
@@ -49,8 +49,8 @@ function applyAgentJobFields(ctx, patch, { itemId, group, text, rawText, isError
|
|
|
49
49
|
const body = String(text || rawText || '').trim();
|
|
50
50
|
if (body) patch.rawResult = text || rawText;
|
|
51
51
|
if (parseAgentJob(rawText)) ctx.set(ctx.agentStatusState({ force: true }));
|
|
52
|
-
//
|
|
53
|
-
//
|
|
52
|
+
// Writing the same card back-to-back with different result/text strings
|
|
53
|
+
// produces a visible L1/L2 flash, so a single patch is written. The agent fields
|
|
54
54
|
// win (final display) while patch keeps the completion metadata
|
|
55
55
|
// (count/completedCount/completedAt/rawResult) for expand.
|
|
56
56
|
Object.assign(patch, ctx.buildAgentJobCardPatch(itemId, rawText, isError));
|
|
@@ -9,7 +9,7 @@ import { resolveAgentStallThresholds } from '../../runtime/agent/orchestrator/st
|
|
|
9
9
|
const QUIET_POLL_MS = 1_000;
|
|
10
10
|
|
|
11
11
|
/** The lead's stall-watchdog warn point, in ms. */
|
|
12
|
-
|
|
12
|
+
function leadStallWarnMs() {
|
|
13
13
|
return resolveAgentStallThresholds('lead').warn * 1000;
|
|
14
14
|
}
|
|
15
15
|
|
package/src/tui/session/turn.mjs
CHANGED
|
@@ -549,6 +549,8 @@ export function failTurn(ctx, error) {
|
|
|
549
549
|
if (record.quota) turn.quota = record.quota;
|
|
550
550
|
turn.failureDetail = record.detail;
|
|
551
551
|
turn.failureDiagnostic = record.errorDetails;
|
|
552
|
+
// Answers the turn went on past before it failed (turn-report.mjs).
|
|
553
|
+
if (typeof error?.carriedReport === 'string') turn.carriedReport = error.carriedReport;
|
|
552
554
|
pushNotice(turn.failureDetail, 'error', { owner: 'transcript' });
|
|
553
555
|
}
|
|
554
556
|
|
|
@@ -661,6 +663,7 @@ async function settleTurn(ctx) {
|
|
|
661
663
|
session: runtime.session || null,
|
|
662
664
|
error: turn.failureDetail || null,
|
|
663
665
|
errorKind: turn.failed ? turn.errorKind || null : null,
|
|
666
|
+
...(turn.failed && turn.carriedReport ? { carriedReport: turn.carriedReport } : {}),
|
|
664
667
|
};
|
|
665
668
|
// Publish termination before optional Goal work can delay the caller.
|
|
666
669
|
bag.settleSteeredSubmissions?.(turn.epoch, detail);
|
|
@@ -12,7 +12,7 @@ const ENDINGS = {
|
|
|
12
12
|
const INCOMPLETE = 'Some worktree dependencies were not installed; the agent has the details.';
|
|
13
13
|
|
|
14
14
|
/** Notice text and tone for one install progress event. */
|
|
15
|
-
|
|
15
|
+
function worktreeSetupNotice(event) {
|
|
16
16
|
if (event.final) {
|
|
17
17
|
const text = ENDINGS[event.status] ?? INCOMPLETE;
|
|
18
18
|
return { text, tone: event.status === 'completed' ? 'info' : 'warn' };
|
package/src/tui/spinner-meta.mjs
CHANGED
|
@@ -17,7 +17,7 @@ const compactNumberFormatter = new Intl.NumberFormat('en-US', {
|
|
|
17
17
|
minimumFractionDigits: 0,
|
|
18
18
|
});
|
|
19
19
|
|
|
20
|
-
|
|
20
|
+
function formatSpinnerTokens(value) {
|
|
21
21
|
const tokens = Math.max(0, Number(value || 0));
|
|
22
22
|
if (tokens >= 1000) return compactNumberFormatter.format(tokens).toLowerCase();
|
|
23
23
|
return String(Math.round(tokens));
|
|
@@ -84,8 +84,8 @@ export function buildSpinnerMeta({
|
|
|
84
84
|
thinkingParts,
|
|
85
85
|
tokensText: tokens > 0 ? `${formatSpinnerTokens(tokens)} tokens` : '',
|
|
86
86
|
// The count appears with the FIRST token (user: 30초가 아니라 바로).
|
|
87
|
-
// Elapsed
|
|
88
|
-
//
|
|
87
|
+
// Elapsed is never gated, so showing tokens with the first token keeps the
|
|
88
|
+
// byline from growing a second field mid-turn; both arrive together.
|
|
89
89
|
showTokens: tokens > 0,
|
|
90
90
|
thinkingText,
|
|
91
91
|
thinkingActive: Boolean(thinking || Number(thinkingSince) > 0),
|
|
@@ -199,13 +199,13 @@ export const SPINNER_VERBS = [
|
|
|
199
199
|
];
|
|
200
200
|
|
|
201
201
|
/** How long one phrase holds before the pool advances. */
|
|
202
|
-
|
|
202
|
+
const SPINNER_VERB_ROTATE_MS = 30_000;
|
|
203
203
|
|
|
204
204
|
/** Odds that a 30s boundary actually swaps the phrase (user: 바꿀지 말지만
|
|
205
205
|
* 랜덤 돌리면 되잖아). Below 1 the window stretches: ~half the boundaries
|
|
206
206
|
* hold, so a phrase lives 30s, 60s, 90s… and the rhythm stops being a
|
|
207
207
|
* metronome. */
|
|
208
|
-
|
|
208
|
+
const SPINNER_VERB_CHANGE_ODDS = 0.5;
|
|
209
209
|
|
|
210
210
|
/**
|
|
211
211
|
* Deterministic coin for ONE (turn, boundary) pair.
|
|
@@ -1,169 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: goal-management
|
|
3
|
-
description: Manage the task list of approved work carried across turns, its progress, approvals, and completion.
|
|
4
|
-
when_to_use: 'Goal requests or approved multi-turn work in progress; not one-turn tasks or recurring schedules.'
|
|
5
|
-
dependencies:
|
|
6
|
-
tools:
|
|
7
|
-
- type: tool
|
|
8
|
-
value: goal
|
|
9
|
-
---
|
|
10
|
-
|
|
11
|
-
# Goal management
|
|
12
|
-
|
|
13
|
-
Use `goal` to maintain durable tasks and their idle reminders. The tool schema
|
|
14
|
-
owns arguments and limits; this guide owns the lifecycle and completion policy.
|
|
15
|
-
|
|
16
|
-
## Admission and current state
|
|
17
|
-
|
|
18
|
-
Create a Goal for an explicit user or system/developer Goal request, or for
|
|
19
|
-
user delegation or approval of work that runs past a single turn: a staged
|
|
20
|
-
refactor or migration, repeated improvement passes, a partition list or
|
|
21
|
-
candidate inventory carried between turns, or an open-ended objective that
|
|
22
|
-
must be finished. A time budget is optional, and the user need not name Goal —
|
|
23
|
-
approval of an assistant-proposed scope also qualifies. Resolve a short
|
|
24
|
-
approval against the preceding proposal and retain any user constraints.
|
|
25
|
-
|
|
26
|
-
Create the Goal so that scope and state survive the turn boundary instead of
|
|
27
|
-
being rebuilt or dropped. A single-turn task, planning, estimates, and
|
|
28
|
-
deadlines alone do not qualify, and neither does an unaccepted assistant
|
|
29
|
-
proposal.
|
|
30
|
-
|
|
31
|
-
If work needs approval, obtain it first; then create the
|
|
32
|
-
Goal, or reconcile an existing one, before starting the approved work,
|
|
33
|
-
including execution-stage exploration. An existing Goal does not authorize
|
|
34
|
-
new scope.
|
|
35
|
-
|
|
36
|
-
For creation, use the requested or approved budget for `time_limit_minutes`;
|
|
37
|
-
omit it when no budget was agreed — an untimed Goal runs on its objective
|
|
38
|
-
alone. A stated budget commits that time: "a 5-hour Goal", "improvement
|
|
39
|
-
rounds for 3 hours", or polishing for a period use `time_mode: duration`, the
|
|
40
|
-
default when a budget is given. Use `time_mode: max` only when the user frames
|
|
41
|
-
the budget as an upper bound ("at most", "within", "최대", "안에").
|
|
42
|
-
|
|
43
|
-
Use the latest returned state and revision. If unknown or stale, read `status`
|
|
44
|
-
and reconcile before mutating. Never replay a stale mutation blindly.
|
|
45
|
-
For multi-step work, record the approved milestones and keep them durable.
|
|
46
|
-
One-step work does not need a ceremonial plan or a separate verification row.
|
|
47
|
-
|
|
48
|
-
## Additional rounds
|
|
49
|
-
|
|
50
|
-
An approved request to continue for another period changes the work commitment,
|
|
51
|
-
not just the conversation. Reconcile the Goal before research or execution:
|
|
52
|
-
|
|
53
|
-
- For the same unfinished objective, use `resume` with the approved remaining
|
|
54
|
-
budget in `time_limit_minutes` and new tasks or task updates in one call.
|
|
55
|
-
This also covers a paused Goal or exhausted budget with all old rows done.
|
|
56
|
-
Preserve completed rows and unfinished requirements; record the new round's
|
|
57
|
-
work rather than leaving the old completed checklist unchanged.
|
|
58
|
-
- The resume budget runs from now and retains elapsed work. Omit it for a
|
|
59
|
-
plain continuation with no approved time change. Preserve `time_mode`
|
|
60
|
-
unless the new request explicitly changes the time commitment.
|
|
61
|
-
- If the prior Goal is complete or stopped, create a new Goal for the approved
|
|
62
|
-
round; the runtime archives the prior record. Do not falsely complete or
|
|
63
|
-
abandon unfinished work merely to get a fresh clock.
|
|
64
|
-
- Proceed only after the returned state has the intended active status,
|
|
65
|
-
remaining budget, and tasks. A statement that work will continue is not a
|
|
66
|
-
substitute for the mutation. Reconcile a rejected update before continuing.
|
|
67
|
-
|
|
68
|
-
## Maintain progress
|
|
69
|
-
|
|
70
|
-
- Update tasks at meaningful milestones and scope changes. Preserve unfinished
|
|
71
|
-
requirements; drop a task only after the user changes its scope.
|
|
72
|
-
- Prefer `update_tasks` for changed items; `set_tasks` replaces the full list.
|
|
73
|
-
Serialize mutations to the same Goal. `resume` accepts updates and additions
|
|
74
|
-
atomically. `resume` a blocked Goal when the user's reply supplies what it
|
|
75
|
-
was waiting for or asks to continue, and a cancelled-turn pause when the next
|
|
76
|
-
instruction carries the objective forward; a user-initiated pause resumes
|
|
77
|
-
only when the user asks. Bookkeeping alone does not authorize execution.
|
|
78
|
-
- Batch related task changes and independent work. Creation, status, and resume return full state; other
|
|
79
|
-
successful replies are brief and need no confirmation read.
|
|
80
|
-
|
|
81
|
-
## Approval and waiting
|
|
82
|
-
|
|
83
|
-
Finish every approved step and decide choices within the objective yourself,
|
|
84
|
-
including any option you would recommend; state those decisions in the report
|
|
85
|
-
instead of asking. Park as `awaiting_approval` only work that needs the user's
|
|
86
|
-
own action (a sign-in, a device check) or scope outside the objective,
|
|
87
|
-
including a commit, push, release, deployment, or payment the user has not
|
|
88
|
-
requested, together with anything its answer could invalidate. Record additions
|
|
89
|
-
immediately and continue unaffected approved work.
|
|
90
|
-
|
|
91
|
-
Foreground app or window control, local and test-environment runs and the test
|
|
92
|
-
resources they consume, reversible changes, and time or cost belong to in-scope
|
|
93
|
-
work, not approval gates. Wanting confirmation for in-scope work is never a
|
|
94
|
-
reason to stop.
|
|
95
|
-
|
|
96
|
-
Never pause on your own initiative: `pause` is only for the user's explicit
|
|
97
|
-
request to pause this Goal. When no approved work can proceed without the user,
|
|
98
|
-
ask the parked questions together and report that impasse with `block`.
|
|
99
|
-
Respect a user-initiated pause until the user asks to continue; routine errors
|
|
100
|
-
and retries are not reasons to stop.
|
|
101
|
-
|
|
102
|
-
A cancelled turn pauses the Goal with `pauseReason: cancelled`. The user stopped
|
|
103
|
-
that turn, not the objective, and only the stop control retires a Goal. Judge the
|
|
104
|
-
next instruction: resume and continue the work when it carries this objective
|
|
105
|
-
forward or redirects it, and leave the Goal paused when it is unrelated or asks
|
|
106
|
-
you to stay stopped.
|
|
107
|
-
|
|
108
|
-
Each continuation should do concrete work or wait on a verified live handle.
|
|
109
|
-
Evidence that changes the next action is progress; repeated reports and plan
|
|
110
|
-
updates alone are not. Reassess a no-progress turn and take the next safe action.
|
|
111
|
-
Observation timeouts do not terminate the observed work or justify restarting it.
|
|
112
|
-
An automatic continuation that ends without a tool call stops automatic turns
|
|
113
|
-
until the task list changes, the user acts, or the time boundary arrives; end a
|
|
114
|
-
turn that way only when no safe action remains, not to idle out the clock.
|
|
115
|
-
|
|
116
|
-
## Completion and recovery
|
|
117
|
-
|
|
118
|
-
Distinguish a turn boundary, objective completion, and a budget stop. A Goal
|
|
119
|
-
can stay active across turn-ending progress reports; never present such a
|
|
120
|
-
report as completion of the whole objective.
|
|
121
|
-
|
|
122
|
-
Complete only after auditing every user condition against evidence. Reuse valid
|
|
123
|
-
checks; a separate verification task is optional, verification itself is not.
|
|
124
|
-
A maximum time budget allows verified early completion. A full-period
|
|
125
|
-
commitment does not. Preserve an existing Goal's time mode; never extend its
|
|
126
|
-
budget or change its meaning on your own.
|
|
127
|
-
Do not end a Goal merely because a partial result is available.
|
|
128
|
-
|
|
129
|
-
For an achieved objective, reconcile the task records, call `complete`, and
|
|
130
|
-
check the returned status before claiming Goal completion. A tool call or a
|
|
131
|
-
plausible final response is not itself confirmation.
|
|
132
|
-
|
|
133
|
-
### Time-budget extension
|
|
134
|
-
|
|
135
|
-
Elapsed-time budgets are a Mixdog extension to the persistent Goal lifecycle.
|
|
136
|
-
Keep `max` upper bounds distinct from explicitly requested `duration` periods.
|
|
137
|
-
An advance deadline warning does not stop the Goal or request an early final
|
|
138
|
-
report; prioritize bounded approved work and needed verification. Under a
|
|
139
|
-
`max` budget, do not invent unfinished tasks merely to fill remaining clock
|
|
140
|
-
time. Under a `duration` commitment, when the recorded rows are done, find the
|
|
141
|
-
next round's real improvements within the objective and record them as new
|
|
142
|
-
tasks instead of idling or reporting completion.
|
|
143
|
-
|
|
144
|
-
At the boundary, the runtime first records `duration_reached`, disables
|
|
145
|
-
automatic Goal work, and delivers closeout without cancelling the current
|
|
146
|
-
turn. Finish or safely park only in-flight work, then report once. The elapsed
|
|
147
|
-
period proves only that the time condition ended: call `complete` only if the
|
|
148
|
-
whole objective is verified; otherwise retain unfinished tasks and the limited
|
|
149
|
-
status. Do not resume or extend the Goal without the user's approval.
|
|
150
|
-
|
|
151
|
-
### Blocked and redirected work
|
|
152
|
-
|
|
153
|
-
`block` stops the Goal immediately, with a stable description of an impasse
|
|
154
|
-
that only external state or the user can clear. Do not block the first time a
|
|
155
|
-
blocker appears: block only after the same condition has repeated for three
|
|
156
|
-
consecutive Goal turns, counting the user-triggered turn and automatic
|
|
157
|
-
continuations; after a resume, count only turns since that resume. Until then,
|
|
158
|
-
continue any available work and re-check the blocker against current state with
|
|
159
|
-
a tool each turn rather than restating it. When current state verifies an
|
|
160
|
-
impasse that only the user can clear (their action, approval, credentials, or a
|
|
161
|
-
resource they control), block on that turn. Once the threshold is met, block
|
|
162
|
-
instead of reporting the same blocker again. Treat equivalent blockers as the
|
|
163
|
-
same condition even when their wording or stated next step changes. Never block for difficulty, slowness,
|
|
164
|
-
uncertainty, a choice you can make, confirmation for in-scope work, or
|
|
165
|
-
clarification that would only help. Use `abandon` only when the user redirects away from
|
|
166
|
-
the objective; it preserves a stopped record rather than declaring success.
|
|
167
|
-
|
|
168
|
-
Done when the returned Goal state accurately represents completed work,
|
|
169
|
-
remaining approved work, or the justified waiting/terminal condition.
|
|
@@ -1,156 +0,0 @@
|
|
|
1
|
-
import { GOAL_TASK_SETTLED, GOAL_TASK_STATUSES, MAX_GOAL_TASKS, MAX_GOAL_TASK_TEXT_LENGTH } from './goal-tool-defs.mjs';
|
|
2
|
-
import { clean } from '../../../shared/clean.mjs';
|
|
3
|
-
|
|
4
|
-
// Fields a task entry or patch may carry. 'kind' is a retired field: stored
|
|
5
|
-
// records and frozen provider schemas still send it, so it is accepted and
|
|
6
|
-
// dropped on normalize rather than rejected.
|
|
7
|
-
const TASK_ENTRY_FIELDS = ['id', 'text', 'status', 'kind'];
|
|
8
|
-
|
|
9
|
-
// Dropped rows remain in the record but are no longer requested work. Every
|
|
10
|
-
// row, completed and dropped included, still fills one of the capped slots.
|
|
11
|
-
export function goalTaskProgress(tasks) {
|
|
12
|
-
return {
|
|
13
|
-
tasksCompleted: tasks.filter((task) => task?.status === 'completed').length,
|
|
14
|
-
tasksTotal: tasks.filter((task) => task?.status !== 'dropped').length,
|
|
15
|
-
taskSlotsUsed: tasks.length,
|
|
16
|
-
};
|
|
17
|
-
}
|
|
18
|
-
|
|
19
|
-
// Frozen schemas can populate every optional array with an anonymous blank
|
|
20
|
-
// row. Only discard that filler for optional lifecycle changes; addressed,
|
|
21
|
-
// populated, or malformed rows must still reach the normal validators.
|
|
22
|
-
export function optionalGoalTaskChanges({ tasks, updates } = {}) {
|
|
23
|
-
const populated = (entry) =>
|
|
24
|
-
!entry ||
|
|
25
|
-
typeof entry !== 'object' ||
|
|
26
|
-
Array.isArray(entry) ||
|
|
27
|
-
clean(entry.id) ||
|
|
28
|
-
clean(entry.text) ||
|
|
29
|
-
Object.keys(entry).some((key) => !TASK_ENTRY_FIELDS.includes(key));
|
|
30
|
-
return {
|
|
31
|
-
tasks: Array.isArray(tasks) ? tasks.filter(populated) : tasks,
|
|
32
|
-
updates: Array.isArray(updates) ? updates.filter(populated) : updates,
|
|
33
|
-
};
|
|
34
|
-
}
|
|
35
|
-
|
|
36
|
-
export function normalizeGoalTasks(input, previous = [], { strict = false } = {}) {
|
|
37
|
-
if (input == null) return previous.map((task) => ({ ...task }));
|
|
38
|
-
if (!Array.isArray(input)) throw new Error('goal tasks must be an array');
|
|
39
|
-
if (input.length > MAX_GOAL_TASKS) {
|
|
40
|
-
// Settled rows count toward the cap; set_tasks may omit them (only
|
|
41
|
-
// unfinished tasks must be retained), which is how a long Goal makes room.
|
|
42
|
-
const settled = previous.some((task) => GOAL_TASK_SETTLED.includes(task?.status));
|
|
43
|
-
throw new Error(
|
|
44
|
-
`goal tasks support at most ${MAX_GOAL_TASKS} entries${
|
|
45
|
-
settled
|
|
46
|
-
? '; completed and dropped tasks count, so to add more send set_tasks with only the unfinished tasks plus the new ones'
|
|
47
|
-
: ''
|
|
48
|
-
}`
|
|
49
|
-
);
|
|
50
|
-
}
|
|
51
|
-
const previousByText = new Map(previous.map((task) => [clean(task?.text), task]));
|
|
52
|
-
const reservedIds = new Set([...previous, ...input].map((task) => clean(task?.id)).filter(Boolean));
|
|
53
|
-
let nextId = 1;
|
|
54
|
-
for (const id of reservedIds) {
|
|
55
|
-
const match = /^task_(\d+)$/.exec(id);
|
|
56
|
-
if (
|
|
57
|
-
match &&
|
|
58
|
-
Number.isSafeInteger(Number(match[1])) &&
|
|
59
|
-
Number(match[1]) < Number.MAX_SAFE_INTEGER - MAX_GOAL_TASKS
|
|
60
|
-
) {
|
|
61
|
-
nextId = Math.max(nextId, Number(match[1]) + 1);
|
|
62
|
-
}
|
|
63
|
-
}
|
|
64
|
-
const seenText = new Set();
|
|
65
|
-
const seenIds = new Set();
|
|
66
|
-
return input.map((entry, index) => {
|
|
67
|
-
const source = typeof entry === 'string' ? { text: entry, status: 'pending' } : entry;
|
|
68
|
-
if (!source || typeof source !== 'object') throw new Error(`goal task ${index + 1} is invalid`);
|
|
69
|
-
const text = clean(source.text);
|
|
70
|
-
if (!text) throw new Error('goal task text is required');
|
|
71
|
-
if ([...text].length > MAX_GOAL_TASK_TEXT_LENGTH)
|
|
72
|
-
throw new Error(`goal task exceeds ${MAX_GOAL_TASK_TEXT_LENGTH} characters`);
|
|
73
|
-
if (seenText.has(text)) throw new Error(`duplicate goal task: ${text}`);
|
|
74
|
-
seenText.add(text);
|
|
75
|
-
const id = clean(source.id) || clean(previousByText.get(text)?.id) || `task_${nextId++}`;
|
|
76
|
-
if (seenIds.has(id)) throw new Error(`duplicate goal task id: ${id}`);
|
|
77
|
-
seenIds.add(id);
|
|
78
|
-
const rawStatus = clean(source.status).toLowerCase();
|
|
79
|
-
if (strict && !GOAL_TASK_STATUSES.includes(rawStatus))
|
|
80
|
-
throw new Error(`goal task ${index + 1} has an invalid status`);
|
|
81
|
-
let status = source.satisfied === true ? 'completed' : 'pending';
|
|
82
|
-
if (GOAL_TASK_STATUSES.includes(rawStatus)) status = rawStatus;
|
|
83
|
-
return { id, text, status };
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
function taskInputRetains(entry, task) {
|
|
88
|
-
if (typeof entry === 'string') return clean(entry) === task.text;
|
|
89
|
-
if (!entry || typeof entry !== 'object') return false;
|
|
90
|
-
return clean(entry.id) ? clean(entry.id) === task.id : clean(entry.text) === task.text;
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
export function patchGoalTasks(previous, { updates, tasks } = {}) {
|
|
94
|
-
const requested = updates ?? [];
|
|
95
|
-
const entries = tasks ?? [];
|
|
96
|
-
if (!Array.isArray(requested) || !Array.isArray(entries)) throw new Error('goal updates and tasks must be arrays');
|
|
97
|
-
const byId = new Map(previous.map((task) => [task.id, { ...task }]));
|
|
98
|
-
// A new-task entry naming an id this Goal already has can only mean that
|
|
99
|
-
// task, so it is applied as the task's update. An id the Goal does not have
|
|
100
|
-
// is still refused below.
|
|
101
|
-
const addressesExisting = (entry) => byId.has(clean(entry?.id));
|
|
102
|
-
const patches = [...requested, ...entries.filter(addressesExisting)];
|
|
103
|
-
const additions = entries.filter((entry) => !addressesExisting(entry));
|
|
104
|
-
if (!patches.length && !additions.length) throw new Error('goal update_tasks requires updates or new tasks');
|
|
105
|
-
if (patches.length > MAX_GOAL_TASKS) throw new Error(`goal updates support at most ${MAX_GOAL_TASKS} entries`);
|
|
106
|
-
const seen = new Set();
|
|
107
|
-
for (const patch of patches) {
|
|
108
|
-
const id = clean(patch?.id);
|
|
109
|
-
if (!id || !byId.has(id)) throw new Error(`unknown Goal task id: ${id || '(missing)'}`);
|
|
110
|
-
if (seen.has(id)) throw new Error(`duplicate Goal task update: ${id}`);
|
|
111
|
-
seen.add(id);
|
|
112
|
-
if (Object.keys(patch).some((key) => !TASK_ENTRY_FIELDS.includes(key)))
|
|
113
|
-
throw new Error(`unknown Goal task update field for ${id}`);
|
|
114
|
-
byId.set(id, { ...byId.get(id), ...patch, id });
|
|
115
|
-
}
|
|
116
|
-
if (additions.some((task) => clean(task?.id)))
|
|
117
|
-
throw new Error('new Goal tasks must omit ids; use updates for existing tasks');
|
|
118
|
-
return normalizeGoalTasks([...byId.values(), ...additions], previous, { strict: true });
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
// Prepare a working copy without publishing it. Lifecycle actions can include
|
|
122
|
-
// task changes in the same durable commit instead of exposing an intermediate
|
|
123
|
-
// paused/active snapshot or consuming two revisions.
|
|
124
|
-
export function applyGoalTaskChanges(goal, args = {}, { partial = false, at = Date.now() } = {}) {
|
|
125
|
-
if (['complete', 'stopped'].includes(goal.status))
|
|
126
|
-
throw new Error('cannot update tasks for a completed or stopped Goal');
|
|
127
|
-
if (!partial && (!Array.isArray(args.tasks) || args.tasks.length === 0)) {
|
|
128
|
-
throw new Error('goal set_tasks requires at least one task');
|
|
129
|
-
}
|
|
130
|
-
if (partial && goal.tasksObjectiveRevision !== goal.objectiveRevision) {
|
|
131
|
-
throw new Error(
|
|
132
|
-
'Goal objective changed; read status and reconcile the full task list with set_tasks before partial updates'
|
|
133
|
-
);
|
|
134
|
-
}
|
|
135
|
-
const previousTasks = normalizeGoalTasks(goal.tasks || []);
|
|
136
|
-
const input = partial ? patchGoalTasks(previousTasks, args) : args.tasks;
|
|
137
|
-
const omitted = previousTasks.filter(
|
|
138
|
-
(task) => !GOAL_TASK_SETTLED.includes(task.status) && !input.some((entry) => taskInputRetains(entry, task))
|
|
139
|
-
);
|
|
140
|
-
if (omitted.length > 0) {
|
|
141
|
-
const detail = omitted.map((task) => `${task.id} (${task.text})`).join(', ');
|
|
142
|
-
throw new Error(`cannot remove unfinished Goal tasks: ${detail}`);
|
|
143
|
-
}
|
|
144
|
-
const nextTasks = normalizeGoalTasks(input, previousTasks, { strict: true });
|
|
145
|
-
// Re-sending the same tasks is not progress. A newly dropped task must
|
|
146
|
-
// survive this turn before completion can retire the requested work.
|
|
147
|
-
if (JSON.stringify(nextTasks) !== JSON.stringify(previousTasks)) goal.tasksUpdatedAt = at;
|
|
148
|
-
const droppedNow = nextTasks.some(
|
|
149
|
-
(task) => task.status === 'dropped' && previousTasks.find((prev) => prev.id === task.id)?.status !== 'dropped'
|
|
150
|
-
);
|
|
151
|
-
if (droppedNow) goal.lastDropTurn = Math.max(0, Math.floor(Number(goal.turnCount) || 0));
|
|
152
|
-
goal.tasks = nextTasks;
|
|
153
|
-
goal.tasksObjectiveRevision = goal.objectiveRevision;
|
|
154
|
-
goal.updatedAt = at;
|
|
155
|
-
return goal;
|
|
156
|
-
}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export * from '../runtime/agent/orchestrator/runtime-core/goal-tasks.mjs';
|