mixdog 1.3.1 → 1.3.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/README.md +8 -4
- package/package.json +8 -8
- package/scripts/native-release-status.mjs +238 -0
- package/scripts/verify-runtime-dependency-versions.mjs +158 -0
- package/src/agents/reviewer/AGENT.md +5 -7
- package/src/agents/reviewer/agent.json +1 -1
- package/src/defaults/shipped-history.json +9 -1
- package/src/defaults/skills/browser-use/SKILL.md +6 -3
- package/src/defaults/skills/local-provider/SKILL.md +33 -6
- package/src/defaults/skills/pptx/scripts/qc-pages.mjs +3 -2
- package/src/defaults/skills/setup/SKILL.md +23 -1
- package/src/defaults/skills/setup/references/actions.md +50 -3
- package/src/defaults/skills/setup/references/surfaces.md +23 -3
- package/src/defaults/skills/setup-guide/SKILL.md +7 -3
- package/src/defaults/skills/visualize/SKILL.md +9 -6
- package/src/defaults/skills/visualize/references/craft.md +8 -1
- package/src/help.mjs +1 -1
- package/src/lib/keychain-cjs.cjs +4 -1
- package/src/lib/rules-builder.cjs +14 -7
- package/src/rules/agent-mode/AGENT_MODE.md +8 -5
- package/src/rules/agent-mode/MIXY.md +6 -8
- package/src/rules/lead/LEAD.md +7 -10
- package/src/rules/shared/10-tool-workflow.md +4 -0
- package/src/rules/shared/20-research.md +2 -0
- package/src/rules/shared/45-destructive.md +5 -1
- package/src/rules/shared/60-verification.md +6 -4
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/preset.mjs +5 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-dispatch/session-prep.mjs +8 -0
- package/src/runtime/agent/orchestrator/agent-runtime/agent-progress-watchdog.mjs +6 -1
- package/src/runtime/agent/orchestrator/agent-runtime/cache-strategy.mjs +114 -26
- package/src/runtime/agent/orchestrator/agent-runtime/maintenance-route.mjs +8 -0
- package/src/runtime/agent/orchestrator/agent-runtime/room-supervisor-completion.mjs +5 -4
- package/src/runtime/agent/orchestrator/agent-trace.mjs +3 -0
- package/src/runtime/agent/orchestrator/cache-break-trace.mjs +4 -0
- package/src/runtime/agent/orchestrator/config-presets.mjs +2 -0
- package/src/runtime/agent/orchestrator/config-storage.mjs +10 -3
- package/src/runtime/agent/orchestrator/config.mjs +11 -0
- package/src/runtime/agent/orchestrator/context/role-instructions.mjs +9 -2
- package/src/runtime/agent/orchestrator/mcp/agent-connectors.mjs +97 -5
- package/src/runtime/agent/orchestrator/mcp/child-tree.mjs +6 -10
- package/src/runtime/agent/orchestrator/mcp/client.mjs +7 -4
- package/src/runtime/agent/orchestrator/providers/anthropic-api-request.mjs +84 -32
- package/src/runtime/agent/orchestrator/providers/anthropic-max-tokens.mjs +38 -11
- package/src/runtime/agent/orchestrator/providers/anthropic-messages.mjs +15 -3
- package/src/runtime/agent/orchestrator/providers/anthropic-model-resolve.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/anthropic-oauth.mjs +84 -42
- package/src/runtime/agent/orchestrator/providers/anthropic-turn-result.mjs +2 -0
- package/src/runtime/agent/orchestrator/providers/anthropic.mjs +14 -1
- package/src/runtime/agent/orchestrator/providers/antigravity-request.mjs +6 -2
- package/src/runtime/agent/orchestrator/providers/auto-effort.mjs +27 -8
- package/src/runtime/agent/orchestrator/providers/cursor-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/cursor-wire.mjs +31 -4
- package/src/runtime/agent/orchestrator/providers/cursor.mjs +4 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider-config.mjs +14 -1
- package/src/runtime/agent/orchestrator/providers/custom-provider.mjs +11 -8
- package/src/runtime/agent/orchestrator/providers/grok-client-version.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-prefix-trace.mjs +76 -0
- package/src/runtime/agent/orchestrator/providers/lib/anthropic-request-utils.mjs +16 -0
- package/src/runtime/agent/orchestrator/providers/lib/tail-reminder-split.mjs +13 -0
- package/src/runtime/agent/orchestrator/providers/media-normalization.mjs +16 -1
- package/src/runtime/agent/orchestrator/providers/mixdog-local.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/model-proxy-provider.mjs +1 -0
- package/src/runtime/agent/orchestrator/providers/openai-codex-metadata.mjs +5 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-models.mjs +9 -5
- package/src/runtime/agent/orchestrator/providers/openai-compat-responses.mjs +9 -1
- package/src/runtime/agent/orchestrator/providers/openai-compat-wire.mjs +2 -1
- package/src/runtime/agent/orchestrator/providers/openai-direct-request.mjs +30 -3
- package/src/runtime/agent/orchestrator/providers/openai-model-capabilities.mjs +1 -1
- package/src/runtime/agent/orchestrator/providers/openai-ws.mjs +3 -1
- package/src/runtime/agent/orchestrator/providers/opencode-go-oauth.mjs +61 -8
- package/src/runtime/agent/orchestrator/providers/registry.mjs +19 -0
- package/src/runtime/agent/orchestrator/providers/wire-gateway.mjs +13 -1
- package/src/runtime/agent/orchestrator/runtime-core/config-helpers.mjs +90 -24
- package/src/runtime/agent/orchestrator/runtime-core/fs-utils.mjs +8 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-mutations.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-runtime.mjs +5 -0
- package/src/runtime/agent/orchestrator/runtime-core/goal-storage.mjs +68 -22
- package/src/runtime/agent/orchestrator/runtime-core/goal-tool-exec.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/goal-turns.mjs +10 -1
- package/src/runtime/agent/orchestrator/runtime-core/orchestration.mjs +4 -6
- package/src/runtime/agent/orchestrator/runtime-core/route-context-state.mjs +81 -0
- package/src/runtime/agent/orchestrator/runtime-core/session-text.mjs +2 -1
- package/src/runtime/agent/orchestrator/runtime-core/tool-catalog.mjs +52 -6
- package/src/runtime/agent/orchestrator/runtime-core/tool-defs.mjs +35 -13
- package/src/runtime/agent/orchestrator/runtime-core/workflow/agents.mjs +7 -6
- package/src/runtime/agent/orchestrator/runtime-core/workflow/context.mjs +1 -1
- package/src/runtime/agent/orchestrator/runtime-core/workflow/packs.mjs +8 -4
- package/src/runtime/agent/orchestrator/runtime-core/workflow.mjs +8 -3
- package/src/runtime/agent/orchestrator/session/agent-loop.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/agent-mode.mjs +0 -6
- package/src/runtime/agent/orchestrator/session/agent-room-supervisor.d.mts +1 -1
- package/src/runtime/agent/orchestrator/session/agent-room-supervisor.mjs +22 -4
- package/src/runtime/agent/orchestrator/session/agent-room.d.mts +30 -2
- package/src/runtime/agent/orchestrator/session/agent-room.mjs +196 -45
- package/src/runtime/agent/orchestrator/session/attachment-preflight.mjs +80 -0
- package/src/runtime/agent/orchestrator/session/catalog-db/schema.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/compact/continuation.mjs +15 -6
- package/src/runtime/agent/orchestrator/session/compact/execution-tail.mjs +45 -19
- package/src/runtime/agent/orchestrator/session/compact/forked-summary.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/compact/messages.mjs +44 -0
- package/src/runtime/agent/orchestrator/session/compact/runner.mjs +185 -37
- package/src/runtime/agent/orchestrator/session/compact/summary-mode.mjs +16 -0
- package/src/runtime/agent/orchestrator/session/compact/summary-route.mjs +87 -0
- package/src/runtime/agent/orchestrator/session/compact/summary.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/compact/text-utils.mjs +6 -2
- package/src/runtime/agent/orchestrator/session/compact/user-message-kind.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/compaction-archive-capture.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/context-utils.mjs +41 -10
- package/src/runtime/agent/orchestrator/session/human-gate/delegation.mjs +240 -0
- package/src/runtime/agent/orchestrator/session/human-gate/gate.mjs +102 -35
- package/src/runtime/agent/orchestrator/session/human-gate/outbound-policy.mjs +20 -0
- package/src/runtime/agent/orchestrator/session/human-gate/requests.mjs +19 -9
- package/src/runtime/agent/orchestrator/session/human-gate/run-policy.mjs +73 -0
- package/src/runtime/agent/orchestrator/session/human-gate/store.mjs +55 -27
- package/src/runtime/agent/orchestrator/session/human-gate/unattended-port.mjs +15 -0
- package/src/runtime/agent/orchestrator/session/loop/compact-policy.mjs +4 -1
- package/src/runtime/agent/orchestrator/session/loop/fresh-context.mjs +199 -109
- package/src/runtime/agent/orchestrator/session/loop/loop-state.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/continuation.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/empty-nudge.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn/output-limit.mjs +62 -13
- package/src/runtime/agent/orchestrator/session/loop/no-tool-turn.mjs +22 -6
- package/src/runtime/agent/orchestrator/session/loop/pre-dispatch-deny.mjs +6 -2
- package/src/runtime/agent/orchestrator/session/loop/route-fallback.mjs +5 -5
- package/src/runtime/agent/orchestrator/session/loop/send-phase.mjs +10 -0
- package/src/runtime/agent/orchestrator/session/loop/steering.mjs +3 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/before-hook.mjs +33 -8
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/call-prep.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec/dispatch.mjs +27 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-exec.mjs +2 -1
- package/src/runtime/agent/orchestrator/session/loop/tool-exposure-migration.mjs +12 -0
- package/src/runtime/agent/orchestrator/session/loop/tool-helpers.mjs +11 -5
- package/src/runtime/agent/orchestrator/session/manager/agent-listing-notice.mjs +102 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-queue.mjs +2 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-session.mjs +13 -1
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-auto-effort.mjs +13 -2
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-execute.mjs +27 -14
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-prepare.mjs +14 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-settle.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/manager/ask-turn-steering-drain.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/manager/compaction-runner.mjs +44 -18
- package/src/runtime/agent/orchestrator/session/manager/idle-cleanup.mjs +32 -1
- package/src/runtime/agent/orchestrator/session/manager/orchestration-mode-switch-notice.mjs +115 -0
- package/src/runtime/agent/orchestrator/session/manager/owner-route-fallbacks.mjs +42 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-message-entry.mjs +6 -0
- package/src/runtime/agent/orchestrator/session/manager/pending-messages.mjs +3 -9
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-file.mjs +1 -1
- package/src/runtime/agent/orchestrator/session/manager/pending-spool-shard.mjs +5 -3
- package/src/runtime/agent/orchestrator/session/manager/prompt-utils.mjs +36 -0
- package/src/runtime/agent/orchestrator/session/manager/rules-cache.mjs +40 -1
- package/src/runtime/agent/orchestrator/session/manager/runtime-liveness.mjs +12 -0
- package/src/runtime/agent/orchestrator/session/manager/runtime-state.mjs +20 -0
- package/src/runtime/agent/orchestrator/session/manager/session-crud.mjs +28 -9
- package/src/runtime/agent/orchestrator/session/manager/session-lifecycle.mjs +55 -27
- package/src/runtime/agent/orchestrator/session/manager/session-prompt-composition.mjs +4 -9
- package/src/runtime/agent/orchestrator/session/manager/session-record.mjs +14 -1
- package/src/runtime/agent/orchestrator/session/manager/session-tool-surface.mjs +7 -3
- package/src/runtime/agent/orchestrator/session/manager/turn-checkpoint-journal.mjs +6 -15
- package/src/runtime/agent/orchestrator/session/manager/turn-interruption.mjs +24 -8
- package/src/runtime/agent/orchestrator/session/manager/workflow-switch-notice.mjs +94 -13
- package/src/runtime/agent/orchestrator/session/pre-send-compact.mjs +52 -11
- package/src/runtime/agent/orchestrator/session/provider-prefix-guard.mjs +21 -3
- package/src/runtime/agent/orchestrator/session/routine-result.d.mts +18 -3
- package/src/runtime/agent/orchestrator/session/routine-result.mjs +126 -12
- package/src/runtime/agent/orchestrator/session/runtime-user-context.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/send-with-recovery.mjs +16 -3
- package/src/runtime/agent/orchestrator/session/side-question-store.mjs +3 -1
- package/src/runtime/agent/orchestrator/session/store/canonical-reader.mjs +41 -7
- package/src/runtime/agent/orchestrator/session/store/lifecycle-barriers.mjs +10 -2
- package/src/runtime/agent/orchestrator/session/store/load-cache.mjs +14 -2
- package/src/runtime/agent/orchestrator/session/store/session-delete.mjs +15 -1
- package/src/runtime/agent/orchestrator/session/store/sweep/stale-sweep.mjs +5 -4
- package/src/runtime/agent/orchestrator/session/store/sweep/sub-agent-retention.mjs +140 -0
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-plan.mjs +5 -0
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-record.mjs +15 -5
- package/src/runtime/agent/orchestrator/session/store/sweep/sweep-row.mjs +49 -1
- package/src/runtime/agent/orchestrator/session/store-summary-catalog.mjs +80 -1
- package/src/runtime/agent/orchestrator/session/store-summary-index.mjs +40 -5
- package/src/runtime/agent/orchestrator/session/store-summary-last-message.mjs +47 -2
- package/src/runtime/agent/orchestrator/session/store-summary-reader.mjs +33 -1
- package/src/runtime/agent/orchestrator/session/store-summary-visibility.d.mts +5 -0
- package/src/runtime/agent/orchestrator/session/store-summary-visibility.mjs +37 -0
- package/src/runtime/agent/orchestrator/session/store.mjs +1 -0
- package/src/runtime/agent/orchestrator/session/tail-reminder-rules.mjs +125 -0
- package/src/runtime/agent/orchestrator/session/tool-batch/finalize.mjs +4 -0
- package/src/runtime/agent/orchestrator/session/tool-result-offload.mjs +78 -43
- package/src/runtime/agent/orchestrator/session/transcript-restore/restore.mjs +35 -5
- package/src/runtime/agent/orchestrator/session/transcript-restore/user-text.mjs +42 -2
- package/src/runtime/agent/orchestrator/tools/builtin/advisory-lock.mjs +47 -14
- package/src/runtime/agent/orchestrator/tools/builtin/atomic-write.mjs +25 -5
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/backgrounded-result.mjs +6 -3
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/completed-result.mjs +13 -14
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool/transport-artifacts.mjs +9 -0
- package/src/runtime/agent/orchestrator/tools/builtin/bash-tool.mjs +19 -14
- package/src/runtime/agent/orchestrator/tools/builtin/builtin-tools.mjs +7 -1
- package/src/runtime/agent/orchestrator/tools/builtin/git-command-tool.mjs +127 -20
- package/src/runtime/agent/orchestrator/tools/builtin/git-worktree-tool.mjs +557 -0
- package/src/runtime/agent/orchestrator/tools/builtin/lib/shell-job-records.mjs +10 -12
- package/src/runtime/agent/orchestrator/tools/builtin/pdf-test-fixtures.mjs +5 -3
- package/src/runtime/agent/orchestrator/tools/builtin/read-image.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-single-media.mjs +47 -2
- package/src/runtime/agent/orchestrator/tools/builtin/read-special-files.mjs +264 -87
- package/src/runtime/agent/orchestrator/tools/builtin/shell-analysis.mjs +10 -4
- package/src/runtime/agent/orchestrator/tools/builtin/shell-jobs.mjs +42 -23
- package/src/runtime/agent/orchestrator/tools/code-graph/constants.mjs +8 -4
- package/src/runtime/agent/orchestrator/tools/lib/shell-descendants.mjs +9 -30
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-settle.mjs +24 -12
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-spawn.mjs +3 -2
- package/src/runtime/agent/orchestrator/tools/lib/shell-run-state.mjs +6 -2
- package/src/runtime/agent/orchestrator/tools/patch/delete-quarantine.mjs +2 -1
- package/src/runtime/agent/orchestrator/tools/patch/replay-capture.mjs +4 -2
- package/src/runtime/agent/orchestrator/tools/patch/rollback-state.mjs +33 -2
- package/src/runtime/agent/orchestrator/tools/patch-manifest.json +13 -13
- package/src/runtime/agent/orchestrator/tools/shell-command.mjs +5 -3
- package/src/runtime/agent/orchestrator/tools/shell-exec-output.mjs +3 -1
- package/src/runtime/attachments/attachment-reference.mjs +155 -0
- package/src/runtime/attachments/legacy-office.mjs +110 -0
- package/src/runtime/attachments/limits.mjs +5 -1
- package/src/runtime/attachments/office-extract.mjs +3 -6
- package/src/runtime/attachments/pdf-extract.mjs +84 -10
- package/src/runtime/attachments/prompt-restore.mjs +70 -0
- package/src/runtime/attachments/store.mjs +109 -33
- package/src/runtime/browser-bridge/client.mjs +73 -20
- package/src/runtime/channels/lib/runtime-paths.mjs +1 -1
- package/src/runtime/channels/lib/scheduler.mjs +14 -7
- package/src/runtime/channels/lib/state-file.mjs +15 -15
- package/src/runtime/channels/lib/voice-runtime-fetcher.mjs +14 -13
- package/src/runtime/channels/lib/webhook/relay-tunnel.mjs +22 -18
- package/src/runtime/channels/lib/webhook/session-dispatch.mjs +14 -36
- package/src/runtime/channels/lib/worker-main.mjs +3 -2
- package/src/runtime/effort-judge/compact-tokenizer.mjs +8 -2
- package/src/runtime/effort-judge/judge-client.mjs +66 -16
- package/src/runtime/effort-judge/model-install.mjs +47 -7
- package/src/runtime/local-provider/asset-installer.mjs +10 -4
- package/src/runtime/local-provider/catalog.mjs +5 -2
- package/src/runtime/local-provider/registered-models.mjs +64 -27
- package/src/runtime/local-provider/server.mjs +2 -3
- package/src/runtime/media/adapters/image-api.mjs +89 -0
- package/src/runtime/media/auth.mjs +64 -1
- package/src/runtime/media/catalog.mjs +66 -4
- package/src/runtime/media/jobs.mjs +4 -0
- package/src/runtime/media/lanes.mjs +46 -5
- package/src/runtime/media/media-usage.mjs +17 -0
- package/src/runtime/media/renditions.mjs +15 -15
- package/src/runtime/media/store.mjs +36 -35
- package/src/runtime/media/tool.mjs +8 -1
- package/src/runtime/memory/lib/cycle-scheduler/health-ledger.mjs +8 -2
- package/src/runtime/memory/lib/embedding-model-files.mjs +30 -7
- package/src/runtime/memory/lib/ingest/transcript-tail.mjs +16 -7
- package/src/runtime/memory/lib/memory-chunk-quality.mjs +14 -2
- package/src/runtime/memory/lib/pg/process.mjs +8 -4
- package/src/runtime/memory/lib/project-id-resolver.mjs +5 -1
- package/src/runtime/memory/lib/runtime-fetcher.mjs +6 -1
- package/src/runtime/office/core/journal.mjs +7 -14
- package/src/runtime/office/design/library/design-library-core.mjs +4 -16
- package/src/runtime/office/pdf/ocr-engine-worker.mjs +37 -0
- package/src/runtime/office/pdf/ocr-engine.mjs +146 -0
- package/src/runtime/office/pdf/pdf-ocr.mjs +51 -21
- package/src/runtime/office/pdf/pdf-render.mjs +30 -18
- package/src/runtime/office/portable/ooxml-validator.mjs +2 -2
- package/src/runtime/office/portable/portable-soffice.mjs +135 -29
- package/src/runtime/shared/agent-avatar-sprites.mjs +23 -8
- package/src/runtime/shared/agent-avatar.mjs +3 -2
- package/src/runtime/shared/agent-kind-migration.mjs +200 -0
- package/src/runtime/shared/agent-message-envelope.d.mts +6 -0
- package/src/runtime/shared/agent-message-envelope.mjs +44 -0
- package/src/runtime/shared/agent-reap-state.d.mts +4 -0
- package/src/runtime/shared/agent-room-host.d.mts +31 -0
- package/src/runtime/shared/agent-room-host.mjs +58 -0
- package/src/runtime/shared/agent-store.mjs +24 -7
- package/src/runtime/shared/agent-task-starts.mjs +27 -0
- package/src/runtime/shared/atomic-file.d.mts +50 -0
- package/src/runtime/shared/atomic-file.mjs +394 -132
- package/src/runtime/shared/background-tasks.mjs +7 -4
- package/src/runtime/shared/bot-hops.mjs +35 -0
- package/src/runtime/shared/bot-split-migration.mjs +1 -1
- package/src/runtime/shared/bounded-download.mjs +4 -2
- package/src/runtime/shared/config.mjs +39 -9
- package/src/runtime/shared/defaults-separation.mjs +6 -2
- package/src/runtime/shared/delegated-approval-host.mjs +74 -0
- package/src/runtime/shared/err-text.mjs +4 -0
- package/src/runtime/shared/error-presentation.mjs +22 -4
- package/src/runtime/shared/file-has-data.mjs +28 -0
- package/src/runtime/shared/llm/usage-ledger-import.mjs +37 -18
- package/src/runtime/shared/pending-agent-work.mjs +54 -0
- package/src/runtime/shared/process-lifecycle.mjs +8 -12
- package/src/runtime/shared/projects.mjs +50 -41
- package/src/runtime/shared/provider-accounts.mjs +17 -12
- package/src/runtime/shared/redact-directories.mjs +18 -0
- package/src/runtime/shared/remove-directory.mjs +28 -0
- package/src/runtime/shared/routine-trigger.d.mts +6 -1
- package/src/runtime/shared/routine-trigger.mjs +14 -6
- package/src/runtime/shared/run-child.d.mts +3 -0
- package/src/runtime/shared/run-child.mjs +24 -3
- package/src/runtime/shared/session-baseline-store.mjs +8 -2
- package/src/runtime/shared/session-sidebar-host.d.mts +11 -2
- package/src/runtime/shared/session-sidebar-host.mjs +16 -3
- package/src/runtime/shared/singleton-owner.mjs +7 -6
- package/src/runtime/shared/skill-tool-dependencies.mjs +4 -10
- package/src/runtime/shared/staged-update.mjs +4 -2
- package/src/runtime/shared/statusline/statusline-segments.mjs +4 -15
- package/src/runtime/shared/tool-execution-contract.mjs +10 -0
- package/src/runtime/shared/tool-work-units.mjs +12 -9
- package/src/runtime/shared/transcript-metadata.mjs +28 -3
- package/src/runtime/shared/transcript-writer/session-record.mjs +7 -6
- package/src/runtime/shared/turn-snapshot-store.mjs +5 -4
- package/src/runtime/shared/turn-snapshot.mjs +277 -124
- package/src/runtime/shared/user-cwd.mjs +9 -4
- package/src/runtime/shared/user-data-guard.mjs +92 -61
- package/src/runtime/shared/utf8-cut.mjs +10 -0
- package/src/runtime/shared/worktrees/activity-gate.mjs +251 -61
- package/src/runtime/shared/worktrees/contract.mjs +11 -3
- package/src/runtime/shared/worktrees/maintenance.mjs +11 -2
- package/src/runtime/shared/worktrees/manager.mjs +419 -52
- package/src/runtime/shared/worktrees/registry.mjs +29 -27
- package/src/runtime/shared/worktrees/tool-host.mjs +39 -0
- package/src/runtime/tidy/core-install.mjs +26 -4
- package/src/runtime/tidy/install.mjs +91 -23
- package/src/runtime/tidy/process.mjs +41 -8
- package/src/runtime/tidy/resolve.mjs +10 -7
- package/src/runtime/web-search/lib/config.mjs +4 -16
- package/src/session-runtime/agent-home-delivery.mjs +542 -204
- package/src/session-runtime/agent-profile-changes.mjs +16 -0
- package/src/session-runtime/agent-room-delivery.mjs +81 -35
- package/src/session-runtime/agent-task-sessions.mjs +811 -179
- package/src/session-runtime/agent-tool-routing.mjs +1 -0
- package/src/session-runtime/boot/apis.mjs +48 -24
- package/src/session-runtime/boot/config.mjs +1 -0
- package/src/session-runtime/boot/facade.mjs +16 -7
- package/src/session-runtime/boot/infrastructure.mjs +14 -2
- package/src/session-runtime/boot/providers.mjs +2 -2
- package/src/session-runtime/boot/shared.mjs +12 -6
- package/src/session-runtime/boot/tools.mjs +23 -3
- package/src/session-runtime/bot-status.mjs +432 -0
- package/src/session-runtime/config-lifecycle/lead-route-sync.mjs +29 -0
- package/src/session-runtime/config-lifecycle.mjs +60 -55
- package/src/session-runtime/cwd-plugins/core-memory-context.mjs +2 -4
- package/src/session-runtime/held-requests.mjs +31 -33
- package/src/session-runtime/internal-tool-executor/bridge-tools.mjs +10 -1
- package/src/session-runtime/internal-tool-executor/feature-tools.mjs +2 -2
- package/src/session-runtime/internal-tool-executor/workspace-tools.mjs +24 -26
- package/src/session-runtime/lifecycle/session-catalog.mjs +12 -2
- package/src/session-runtime/lifecycle/teardown.mjs +11 -3
- package/src/session-runtime/mcp-glue/connect.mjs +100 -186
- package/src/session-runtime/mcp-glue/initial-connect-gate.mjs +57 -0
- package/src/session-runtime/mcp-glue/server-connection.mjs +71 -0
- package/src/session-runtime/media-api.mjs +5 -2
- package/src/session-runtime/model-recency.mjs +1 -0
- package/src/session-runtime/model-route/route-tuning.mjs +4 -1
- package/src/session-runtime/model-route/set-route.mjs +61 -1
- package/src/session-runtime/owned-automation-run.mjs +8 -1
- package/src/session-runtime/provider-models/row-hydration.mjs +8 -1
- package/src/session-runtime/quick-model-rows/model-meta.mjs +2 -0
- package/src/session-runtime/quick-model-rows/provider-rows.mjs +7 -1
- package/src/session-runtime/route-resolution.mjs +16 -8
- package/src/session-runtime/route-state.mjs +1 -59
- package/src/session-runtime/routine-home-turn.mjs +5 -3
- package/src/session-runtime/runtime-bootstrap.mjs +5 -3
- package/src/session-runtime/runtime-paths.mjs +11 -5
- package/src/session-runtime/runtime-review-api.mjs +4 -1
- package/src/session-runtime/runtime-tunables.mjs +6 -0
- package/src/session-runtime/services/agent-tool/close-flow/close-all.mjs +11 -2
- package/src/session-runtime/services/agent-tool/close-flow.mjs +4 -2
- package/src/session-runtime/services/agent-tool/execute-send.mjs +1 -0
- package/src/session-runtime/services/agent-tool/execute-spawn.mjs +1 -0
- package/src/session-runtime/services/agent-tool/job-views/agent-list.mjs +34 -19
- package/src/session-runtime/services/agent-tool/restart-notify.mjs +10 -0
- package/src/session-runtime/services/agent-tool/send-flow.mjs +25 -21
- package/src/session-runtime/services/agent-tool/spawn-flow/job-start.mjs +7 -0
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-prep.mjs +6 -3
- package/src/session-runtime/services/agent-tool/spawn-flow/spawn-run.mjs +8 -5
- package/src/session-runtime/services/agent-tool/worker-index/row-liveness.mjs +22 -2
- package/src/session-runtime/services/agent-tool/worker-index.mjs +4 -6
- package/src/session-runtime/services/agent-tool.mjs +6 -0
- package/src/session-runtime/services/daemon-crash-capture/daemon-exit-record.mjs +1 -1
- package/src/session-runtime/services/daemon-crash-capture/retention.mjs +4 -3
- package/src/session-runtime/services/hook-bus/config-loader.mjs +14 -5
- package/src/session-runtime/services/hook-bus/rule-file.mjs +49 -11
- package/src/session-runtime/services/plugin-admin.mjs +26 -26
- package/src/session-runtime/services/provider-admin.mjs +26 -6
- package/src/session-runtime/services/schedule-access.mjs +33 -4
- package/src/session-runtime/services/seeds.mjs +4 -3
- package/src/session-runtime/services/usage-dashboard.mjs +1 -1
- package/src/session-runtime/services/usage-stats-model.mjs +2 -1
- package/src/session-runtime/services/worktree-access.mjs +27 -0
- package/src/session-runtime/session-create/materialize.mjs +2 -3
- package/src/session-runtime/session-create/session-options.mjs +15 -2
- package/src/session-runtime/session-hooks.mjs +9 -17
- package/src/session-runtime/settings-builtin-tools-api.mjs +65 -1
- package/src/session-runtime/settings-compaction-api.mjs +86 -39
- package/src/session-runtime/setup-tool/executor.mjs +12 -2
- package/src/session-runtime/setup-tool/settings-contract.mjs +34 -1
- package/src/session-runtime/setup-tool/tool-defs.mjs +20 -3
- package/src/session-runtime/skills-api.mjs +12 -5
- package/src/session-runtime/tool-policy/agent-profile-fold.mjs +349 -0
- package/src/session-runtime/tool-policy/mode-switch.mjs +54 -0
- package/src/session-runtime/tool-policy/pending-switches.mjs +59 -0
- package/src/session-runtime/tool-policy/policy-stage.mjs +183 -0
- package/src/session-runtime/tool-policy/session-switches.mjs +169 -0
- package/src/session-runtime/tool-policy/surface-helpers.mjs +114 -0
- package/src/session-runtime/tool-policy/workflow-overlay.mjs +145 -0
- package/src/session-runtime/tool-policy-refresh.mjs +48 -369
- package/src/session-runtime/tool-surface.mjs +10 -4
- package/src/session-runtime/turn/session-ops.mjs +8 -0
- package/src/session-runtime/turn/turn-run/turn-prepare.mjs +95 -88
- package/src/session-runtime/turn/turn-run/turn-timing.mjs +4 -3
- package/src/session-runtime/turn/turn-run.mjs +7 -2
- package/src/session-runtime/workflow-agents-api/agent-connectors.mjs +54 -7
- package/src/session-runtime/workflow-agents-api/agent-editor.mjs +527 -333
- package/src/session-runtime/workflow-agents-api/agent-route.mjs +85 -63
- package/src/session-runtime/workflow-agents-api/shared.mjs +5 -1
- package/src/session-runtime/workflow-agents-api/style-and-mode.mjs +14 -1
- package/src/session-runtime/workflow-agents-api/workflow-packs.mjs +6 -3
- package/src/session-runtime/workspace/transition-steps.mjs +1 -18
- package/src/session-runtime/workspace/transitions.mjs +279 -67
- package/src/session-runtime/workspace/workspace-state.mjs +7 -6
- package/src/session-runtime/workspace/worktree-tool.mjs +194 -0
- package/src/standalone/daemon-agent-control.mjs +4 -1
- package/src/standalone/daemon-lag-profiler.mjs +3 -1
- package/src/standalone/daemon-session-control.mjs +173 -15
- package/src/standalone/daemon-telemetry.mjs +9 -0
- package/src/standalone/daemon.mjs +33 -10
- package/src/standalone/local-session-runtime.mjs +33 -16
- package/src/standalone/session-client.mjs +7 -2
- package/src/standalone/session-protocol.mjs +8 -0
- package/src/standalone/session-runtime-inline-host/boot-loaders.mjs +2 -0
- package/src/standalone/session-service/agent-route-follow.mjs +69 -0
- package/src/standalone/session-service/session-calls/session-turns.mjs +33 -4
- package/src/standalone/session-service.mjs +21 -0
- package/src/standalone/session-state-projection.mjs +19 -9
- package/src/standalone/session-tool-output.mjs +36 -9
- package/src/standalone/staged-import.mjs +47 -0
- package/src/tui/App.jsx +2 -0
- package/src/tui/app/maintenance-pickers/auto-clear-picker.mjs +19 -13
- package/src/tui/app/message-selector.mjs +15 -2
- package/src/tui/app/model-options.mjs +16 -2
- package/src/tui/app/model-picker.mjs +2 -1
- package/src/tui/app/route-pickers.mjs +3 -1
- package/src/tui/app/settings-picker/settings-rows.mjs +2 -2
- package/src/tui/app/slash-commands.mjs +1 -1
- package/src/tui/app/usage-context-panels/context-model.mjs +8 -2
- package/src/tui/dist/index.mjs +617 -369
- package/src/tui/paste-attachments.mjs +0 -1
- package/src/tui/paste-text-policy.mjs +4 -5
- package/src/tui/prompt-history-store.mjs +16 -21
- package/src/tui/session/agent-job-feed/execution-delivery.mjs +4 -1
- package/src/tui/session/context-state.mjs +4 -0
- package/src/tui/session/notice-surface.mjs +3 -0
- package/src/tui/session/session-api/intake/abort.mjs +52 -18
- package/src/tui/session/session-api/intake/rewind.mjs +39 -4
- package/src/tui/session/session-api/media.mjs +2 -1
- package/src/tui/session/session-api/routes-agent-definitions.mjs +76 -0
- package/src/tui/session/session-api/routes-write.mjs +203 -0
- package/src/tui/session/session-api/routes.mjs +23 -247
- package/src/tui/session/session-api/settings.mjs +14 -1
- package/src/tui/session/session-flow/drain.mjs +28 -3
- package/src/tui/session/session-flow/failed-turn-rewind.mjs +4 -2
- package/src/tui/session/session-flow/queue/take-entries.mjs +8 -0
- package/src/tui/session/session-flow/steering.mjs +8 -3
- package/src/tui/session/tool-approval.mjs +142 -14
- package/src/tui/session/transcript-intake.mjs +2 -0
- package/src/tui/session/turn.mjs +23 -14
- package/src/tui/transcript-tool-failures.mjs +8 -2
- package/src/vendor/statusline/src/gateway/route-meta.mjs +7 -8
- package/src/vendor/statusline/src/gateway/session-routes.mjs +6 -7
- package/src/rules/agent-mode/ROUTINE.md +0 -6
- package/src/session-runtime/room-member-gate.mjs +0 -48
|
@@ -8,8 +8,10 @@ import {
|
|
|
8
8
|
setBuiltinInstalledInConfig,
|
|
9
9
|
} from '../runtime/agent/orchestrator/runtime-core/builtin-features.mjs';
|
|
10
10
|
import { featureEnvOverride, moduleEnabled } from '../runtime/agent/orchestrator/runtime-core/config-helpers.mjs';
|
|
11
|
+
import { normalizeAgentAvatar } from '../runtime/shared/agent-avatar.mjs';
|
|
11
12
|
import { LOCAL_PROVIDER_ID } from '../runtime/local-provider/managed-runtime.mjs';
|
|
12
13
|
import { INSTRUCTION_FILES_MODES, normalizeInstructionFilesMode } from '../runtime/shared/instruction-files-mode.mjs';
|
|
14
|
+
import { AUTO_EFFORT_BASES, autoEffortBase } from '../runtime/agent/orchestrator/providers/auto-effort.mjs';
|
|
13
15
|
import { getEmbeddingInfo } from '../runtime/memory/lib/embedding-provider.mjs';
|
|
14
16
|
import { onnxRuntimeSupported } from '../runtime/shared/onnx-runtime-support.mjs';
|
|
15
17
|
import {
|
|
@@ -17,10 +19,19 @@ import {
|
|
|
17
19
|
effortJudgeAvailable,
|
|
18
20
|
effortJudgeInfo,
|
|
19
21
|
effortJudgeInstalling,
|
|
22
|
+
effortJudgeLastError,
|
|
20
23
|
effortJudgeReady,
|
|
21
24
|
shutdownEffortJudge,
|
|
22
25
|
} from '../runtime/effort-judge/judge-client.mjs';
|
|
23
26
|
|
|
27
|
+
const MAX_BOT_ORDER_IDS = 500;
|
|
28
|
+
const isBotOrderId = (id) => typeof id === 'string' && id.trim().length > 0 && id.trim().length <= 128;
|
|
29
|
+
/** A stored bot order as trimmed, de-duplicated ids; anything else is no order (null). */
|
|
30
|
+
function normalizeBotOrder(value) {
|
|
31
|
+
if (!Array.isArray(value)) return null;
|
|
32
|
+
return [...new Set(value.filter(isBotOrderId).map((id) => id.trim()))].slice(0, MAX_BOT_ORDER_IDS);
|
|
33
|
+
}
|
|
34
|
+
|
|
24
35
|
const TOGGLEABLE_BUILTINS = ['git', 'office', 'tidy', 'localProvider', 'autoEffort', 'visualize', 'media'];
|
|
25
36
|
|
|
26
37
|
function setLocalProviderEnabledInConfig(configLike, enabled) {
|
|
@@ -85,12 +96,50 @@ export function createBuiltinToolSettings(
|
|
|
85
96
|
saveConfigAndAdopt({ ...getConfig(), aiSessionTitles: enabled !== false });
|
|
86
97
|
return this.getSessionTitleSettings();
|
|
87
98
|
},
|
|
99
|
+
// The one pixel face every Lead row on the bot page wears, shared by every
|
|
100
|
+
// device that follows this host. Only a mascot look counts; null (the
|
|
101
|
+
// default grey pup) is stored as no key.
|
|
102
|
+
getLeadAppearance() {
|
|
103
|
+
const avatar = normalizeAgentAvatar(getConfig()?.leadAvatar);
|
|
104
|
+
return { avatar: avatar?.kind === 'mascot' ? avatar : null };
|
|
105
|
+
},
|
|
106
|
+
setLeadAppearance(avatar) {
|
|
107
|
+
const config = { ...getConfig() };
|
|
108
|
+
if (avatar == null) {
|
|
109
|
+
delete config.leadAvatar;
|
|
110
|
+
} else {
|
|
111
|
+
const normalized = normalizeAgentAvatar(avatar);
|
|
112
|
+
if (normalized?.kind !== 'mascot') throw new Error('usage: setLeadAppearance(a mascot appearance or null)');
|
|
113
|
+
config.leadAvatar = normalized;
|
|
114
|
+
}
|
|
115
|
+
saveConfigAndAdopt(config);
|
|
116
|
+
return this.getLeadAppearance();
|
|
117
|
+
},
|
|
118
|
+
// The one bot order every device that follows this host shows (Bots page
|
|
119
|
+
// and the Sessions bot section): agent ids only. Mixy is pinned first by
|
|
120
|
+
// the UI and is not part of it; ids of unknown or deleted bots are ignored
|
|
121
|
+
// where the order is applied. No key = the UI's current order.
|
|
122
|
+
getBotOrder() {
|
|
123
|
+
return { order: normalizeBotOrder(getConfig()?.botOrder) ?? [] };
|
|
124
|
+
},
|
|
125
|
+
setBotOrder(order) {
|
|
126
|
+
if (!Array.isArray(order) || order.length > MAX_BOT_ORDER_IDS || order.some((id) => !isBotOrderId(id))) {
|
|
127
|
+
throw new Error('usage: setBotOrder(an array of agent ids)');
|
|
128
|
+
}
|
|
129
|
+
const config = { ...getConfig() };
|
|
130
|
+
const ids = normalizeBotOrder(order);
|
|
131
|
+
if (!ids.length) delete config.botOrder;
|
|
132
|
+
else config.botOrder = ids;
|
|
133
|
+
saveConfigAndAdopt(config);
|
|
134
|
+
return this.getBotOrder();
|
|
135
|
+
},
|
|
88
136
|
getToolModuleSettings() {
|
|
89
137
|
const config = getConfig();
|
|
90
138
|
const localProvider = getLocalProviderStatus?.() || {};
|
|
91
139
|
const localProviderRuntimeInstalled = localProvider?.runtime?.installed === true;
|
|
92
140
|
return {
|
|
93
141
|
instructionFiles: normalizeInstructionFilesMode(config?.instructionFiles),
|
|
142
|
+
autoEffortBase: autoEffortBase(config?.autoEffortBase),
|
|
94
143
|
webSearch: { enabled: webSearchEnabled() },
|
|
95
144
|
memory: {
|
|
96
145
|
enabled: memoryToolsEnabledFn(),
|
|
@@ -130,6 +179,7 @@ export function createBuiltinToolSettings(
|
|
|
130
179
|
installed: effortJudgeAvailable(),
|
|
131
180
|
installing: effortJudgeInstalling(),
|
|
132
181
|
ready: effortJudgeReady(),
|
|
182
|
+
lastError: effortJudgeLastError(),
|
|
133
183
|
info: effortJudgeInfo(),
|
|
134
184
|
},
|
|
135
185
|
};
|
|
@@ -152,6 +202,14 @@ export function createBuiltinToolSettings(
|
|
|
152
202
|
await refreshEmptySessionToolPolicy?.();
|
|
153
203
|
return this.getToolModuleSettings();
|
|
154
204
|
},
|
|
205
|
+
/** The global "Auto reasoning base": the effort Auto works around. */
|
|
206
|
+
setAutoEffortBase(level) {
|
|
207
|
+
if (!AUTO_EFFORT_BASES.includes(level)) {
|
|
208
|
+
throw new TypeError(`Auto reasoning base must be one of ${AUTO_EFFORT_BASES.join(', ')}.`);
|
|
209
|
+
}
|
|
210
|
+
saveConfigAndAdopt({ ...getConfig(), autoEffortBase: level });
|
|
211
|
+
return this.getToolModuleSettings();
|
|
212
|
+
},
|
|
155
213
|
async setMemoryToolsEnabled(enabled) {
|
|
156
214
|
const config = getConfig();
|
|
157
215
|
const memoryEnabled = enabled !== false;
|
|
@@ -202,11 +260,17 @@ export function createBuiltinToolSettings(
|
|
|
202
260
|
/** Extensions → Built-in Install: run the feature's preparation adapter
|
|
203
261
|
* (model pre-download, component verification), then mark it installed
|
|
204
262
|
* and enabled in one step. New sessions pick up the tool surface. */
|
|
205
|
-
async installBuiltinFeature(name) {
|
|
263
|
+
async installBuiltinFeature(name, options = null) {
|
|
206
264
|
if (!INSTALLABLE_BUILTIN_IDS.includes(name)) {
|
|
207
265
|
throw new TypeError('Built-in feature must be git, memory, office, tidy, localProvider, or autoEffort.');
|
|
208
266
|
}
|
|
209
267
|
if (name === 'autoEffort' && !onnxRuntimeSupported()) throw new Error(EFFORT_JUDGE_UNSUPPORTED);
|
|
268
|
+
// Code Tidy retry for named engines: fetch just those and leave the
|
|
269
|
+
// feature's installed/enabled state exactly as the user set it.
|
|
270
|
+
if (name === 'tidy' && Array.isArray(options?.engines)) {
|
|
271
|
+
await prepareBuiltinFeature?.(name, { engines: options.engines });
|
|
272
|
+
return this.getToolModuleSettings();
|
|
273
|
+
}
|
|
210
274
|
await prepareBuiltinFeature?.(name);
|
|
211
275
|
const config = getConfig();
|
|
212
276
|
let nextConfig = setBuiltinInstalledInConfig({ ...config }, name, true);
|
|
@@ -3,6 +3,8 @@ import {
|
|
|
3
3
|
refreshLiveSessionsProviderCacheOpts,
|
|
4
4
|
refreshSessionProviderCacheOpts,
|
|
5
5
|
} from '../runtime/agent/orchestrator/session/manager/session-lifecycle.mjs';
|
|
6
|
+
import { isAutoClearUnlimited } from '../runtime/agent/orchestrator/runtime-core/config-helpers.mjs';
|
|
7
|
+
import { COMPACTION_SUMMARY_MODES } from '../runtime/agent/orchestrator/session/compact/summary-mode.mjs';
|
|
6
8
|
|
|
7
9
|
// Every spelling of the main-context buffer budget; a new representation
|
|
8
10
|
// replaces the previous one.
|
|
@@ -32,9 +34,60 @@ const SESSION_COMPACTION_KEYS = [
|
|
|
32
34
|
'recallWindowSize',
|
|
33
35
|
'recallConcurrency',
|
|
34
36
|
'recallCycle1DeadlineMs',
|
|
37
|
+
// Replaced by summaryMode.
|
|
38
|
+
'useMaintainer',
|
|
35
39
|
...MAIN_BUFFER_KEYS,
|
|
36
40
|
];
|
|
37
41
|
|
|
42
|
+
// Unlimited (never auto-clear) typed as a duration.
|
|
43
|
+
const UNLIMITED_DURATION = /^(?:unlimited|never)$/i;
|
|
44
|
+
|
|
45
|
+
/** Fold the recognised compaction input fields into `next` (mutated and returned). */
|
|
46
|
+
function applyCompactionInput(next, input, hasOwn) {
|
|
47
|
+
if (hasOwn(input, 'auto')) next.auto = input.auto !== false;
|
|
48
|
+
if (hasOwn(input, 'enabled')) next.auto = input.enabled !== false;
|
|
49
|
+
if (hasOwn(input, 'onModelChange')) next.onModelChange = input.onModelChange !== false;
|
|
50
|
+
if (hasOwn(input, 'summaryMode')) {
|
|
51
|
+
if (!COMPACTION_SUMMARY_MODES.includes(input.summaryMode)) {
|
|
52
|
+
throw new Error(`usage: summaryMode ${COMPACTION_SUMMARY_MODES.join(' | ')}`);
|
|
53
|
+
}
|
|
54
|
+
next.summaryMode = input.summaryMode;
|
|
55
|
+
}
|
|
56
|
+
// Legacy Compact type fields are intentionally ignored. There is one
|
|
57
|
+
// fresh-context Compact contract for every session.
|
|
58
|
+
// A new budget representation replaces the previous one. Otherwise a
|
|
59
|
+
// saved token override silently outranks a later percentage edit.
|
|
60
|
+
if (MAIN_BUFFER_KEYS.some((key) => hasOwn(input, key))) {
|
|
61
|
+
for (const old of MAIN_BUFFER_KEYS) delete next[old];
|
|
62
|
+
}
|
|
63
|
+
for (const key of MAIN_BUFFER_KEYS) {
|
|
64
|
+
if (hasOwn(input, key)) next[key] = input[key];
|
|
65
|
+
}
|
|
66
|
+
return next;
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
/** Replace the live session's compaction fields with the saved config's. */
|
|
70
|
+
function adoptSessionCompaction(session, saved) {
|
|
71
|
+
if (!session) return;
|
|
72
|
+
const currentSessionCompaction = { ...(session.compaction || {}) };
|
|
73
|
+
for (const key of SESSION_COMPACTION_KEYS) delete currentSessionCompaction[key];
|
|
74
|
+
session.compaction = { ...currentSessionCompaction, ...saved };
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
// Advanced picker shows only providers the user actually has enabled
|
|
78
|
+
// (config.providers[*].enabled), plus the active route provider, any
|
|
79
|
+
// provider with a custom override, and the 'default' fallback row —
|
|
80
|
+
// not the full built-in table.
|
|
81
|
+
function enabledProviderKeys(config, provider) {
|
|
82
|
+
const enabledProviders = new Set(
|
|
83
|
+
Object.entries(config?.providers || {})
|
|
84
|
+
.filter(([, v]) => v && typeof v === 'object' && v.enabled !== false)
|
|
85
|
+
.map(([k]) => String(k).toLowerCase())
|
|
86
|
+
);
|
|
87
|
+
if (provider) enabledProviders.add(String(provider).toLowerCase());
|
|
88
|
+
return enabledProviders;
|
|
89
|
+
}
|
|
90
|
+
|
|
38
91
|
export function createCompactionSettings({
|
|
39
92
|
getConfig,
|
|
40
93
|
getRoute,
|
|
@@ -63,9 +116,21 @@ export function createCompactionSettings({
|
|
|
63
116
|
if (input.resetProvider === true || (hasOwn(input, 'idleMs') && input.idleMs == null)) {
|
|
64
117
|
delete providerIdleMs[providerKey];
|
|
65
118
|
} else {
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
119
|
+
// Unlimited (never auto-clear) is stored as 0: `unlimited: true`, a
|
|
120
|
+
// duration of 'unlimited'/'never', or idleMs 0.
|
|
121
|
+
const unlimited =
|
|
122
|
+
input.unlimited === true ||
|
|
123
|
+
(hasOwn(input, 'duration') && UNLIMITED_DURATION.test(String(input.duration ?? '').trim())) ||
|
|
124
|
+
(!hasOwn(input, 'duration') && hasOwn(input, 'idleMs') && input.idleMs === 0);
|
|
125
|
+
if (unlimited) {
|
|
126
|
+
providerIdleMs[providerKey] = 0;
|
|
127
|
+
} else {
|
|
128
|
+
const idleMs = hasOwn(input, 'duration') ? parseDurationMs(input.duration) : Number(input.idleMs);
|
|
129
|
+
if (!idleMs || !Number.isFinite(idleMs) || idleMs <= 0) {
|
|
130
|
+
throw new Error('usage: duration like 10m, 1h, 24h, or unlimited');
|
|
131
|
+
}
|
|
132
|
+
providerIdleMs[providerKey] = Math.max(60_000, Math.round(idleMs));
|
|
133
|
+
}
|
|
69
134
|
}
|
|
70
135
|
saveConfigAndAdopt({ ...config, autoClear: { ...next, providerIdleMs } });
|
|
71
136
|
refreshLeadCacheOpts();
|
|
@@ -79,28 +144,10 @@ export function createCompactionSettings({
|
|
|
79
144
|
setCompactionSettings(input = {}) {
|
|
80
145
|
const config = getConfig();
|
|
81
146
|
const current = normalizeCompactionConfig(config.compaction);
|
|
82
|
-
const next = { ...current };
|
|
83
|
-
if (hasOwn(input, 'auto')) next.auto = input.auto !== false;
|
|
84
|
-
if (hasOwn(input, 'enabled')) next.auto = input.enabled !== false;
|
|
85
|
-
if (hasOwn(input, 'onModelChange')) next.onModelChange = input.onModelChange !== false;
|
|
86
|
-
// Legacy Compact type fields are intentionally ignored. There is one
|
|
87
|
-
// fresh-context Compact contract for every session.
|
|
88
|
-
// A new budget representation replaces the previous one. Otherwise a
|
|
89
|
-
// saved token override silently outranks a later percentage edit.
|
|
90
|
-
if (MAIN_BUFFER_KEYS.some((key) => hasOwn(input, key))) {
|
|
91
|
-
for (const old of MAIN_BUFFER_KEYS) delete next[old];
|
|
92
|
-
}
|
|
93
|
-
for (const key of MAIN_BUFFER_KEYS) {
|
|
94
|
-
if (hasOwn(input, key)) next[key] = input[key];
|
|
95
|
-
}
|
|
147
|
+
const next = applyCompactionInput({ ...current }, input, hasOwn);
|
|
96
148
|
saveConfigAndAdopt({ ...config, compaction: normalizeCompactionConfig(next) });
|
|
97
149
|
const saved = normalizeCompactionConfig(getConfig().compaction);
|
|
98
|
-
|
|
99
|
-
if (session) {
|
|
100
|
-
const currentSessionCompaction = { ...(session.compaction || {}) };
|
|
101
|
-
for (const key of SESSION_COMPACTION_KEYS) delete currentSessionCompaction[key];
|
|
102
|
-
session.compaction = { ...currentSessionCompaction, ...saved };
|
|
103
|
-
}
|
|
150
|
+
adoptSessionCompaction(getSession(), saved);
|
|
104
151
|
invalidateContextStatusCache();
|
|
105
152
|
return saved;
|
|
106
153
|
},
|
|
@@ -113,22 +160,17 @@ export function createCompactionSettings({
|
|
|
113
160
|
const idleMs = resolveAutoClearIdleMs(config, provider);
|
|
114
161
|
const key = String(provider || '').toLowerCase();
|
|
115
162
|
const providerCustom = Boolean(key && key !== 'default' && normalized.providerIdleMs?.[key]);
|
|
116
|
-
|
|
117
|
-
//
|
|
118
|
-
//
|
|
119
|
-
|
|
120
|
-
const enabledProviders = new Set(
|
|
121
|
-
Object.entries(config?.providers || {})
|
|
122
|
-
.filter(([, v]) => v && typeof v === 'object' && v.enabled !== false)
|
|
123
|
-
.map(([k]) => String(k).toLowerCase())
|
|
124
|
-
);
|
|
125
|
-
if (provider) enabledProviders.add(String(provider).toLowerCase());
|
|
126
|
-
const providerDefaults = autoClearProviderDefaults(normalized.providerIdleMs).filter(
|
|
163
|
+
const enabledProviders = enabledProviderKeys(config, provider);
|
|
164
|
+
// Every enabled provider gets its row, including ones without a
|
|
165
|
+
// built-in window (they resolve through the 'default' row).
|
|
166
|
+
const providerDefaults = autoClearProviderDefaults(normalized.providerIdleMs, [...enabledProviders]).filter(
|
|
127
167
|
(entry) => entry.provider === 'default' || entry.custom === true || enabledProviders.has(entry.provider)
|
|
128
168
|
);
|
|
129
169
|
return {
|
|
130
170
|
enabled: normalized.enabled,
|
|
131
171
|
idleMs,
|
|
172
|
+
unlimited: isAutoClearUnlimited(idleMs),
|
|
173
|
+
label: isAutoClearUnlimited(idleMs) ? 'unlimited' : formatDurationMs(idleMs),
|
|
132
174
|
custom: normalized.custom,
|
|
133
175
|
providerCustom,
|
|
134
176
|
providerDefault,
|
|
@@ -148,11 +190,17 @@ export function createCompactionSettings({
|
|
|
148
190
|
throw new Error('autoclear minContextPercent must be a number between 0 and 100');
|
|
149
191
|
next.minContextPercent = Math.min(100, Math.max(0, Math.round(rawMinPct)));
|
|
150
192
|
}
|
|
151
|
-
|
|
193
|
+
// `/autoclear unlimited` names no provider: it means the current route's.
|
|
194
|
+
const wantsUnlimited = hasOwn(input, 'duration') && UNLIMITED_DURATION.test(String(input.duration ?? '').trim());
|
|
195
|
+
const providerKey = String(input.provider || (wantsUnlimited ? getRoute()?.provider : '') || '')
|
|
152
196
|
.trim()
|
|
153
197
|
.toLowerCase();
|
|
154
198
|
const editsProviderDefault =
|
|
155
|
-
providerKey &&
|
|
199
|
+
providerKey &&
|
|
200
|
+
(input.resetProvider === true ||
|
|
201
|
+
input.unlimited === true ||
|
|
202
|
+
hasOwn(input, 'duration') ||
|
|
203
|
+
hasOwn(input, 'idleMs'));
|
|
156
204
|
if (editsProviderDefault) {
|
|
157
205
|
saveProviderIdle(config, next, providerKey, input);
|
|
158
206
|
} else {
|
|
@@ -165,15 +213,14 @@ export function createCompactionSettings({
|
|
|
165
213
|
}
|
|
166
214
|
if (hasOwn(input, 'duration')) {
|
|
167
215
|
const idleMs = parseDurationMs(input.duration);
|
|
168
|
-
if (!idleMs) throw new Error('usage: /autoclear [on|off|status|<minutes|1h|90m
|
|
216
|
+
if (!idleMs) throw new Error('usage: /autoclear [on|off|status|<minutes|1h|90m>|unlimited]');
|
|
169
217
|
next.idleMs = idleMs;
|
|
170
218
|
if (!hasOwn(input, 'enabled')) next.enabled = true;
|
|
171
219
|
}
|
|
172
220
|
saveConfigAndAdopt({ ...config, autoClear: next });
|
|
173
221
|
refreshLeadCacheOpts();
|
|
174
222
|
}
|
|
175
|
-
|
|
176
|
-
return { ...resolved, label: formatDurationMs(resolved.idleMs) };
|
|
223
|
+
return this.getAutoClear();
|
|
177
224
|
},
|
|
178
225
|
};
|
|
179
226
|
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* registers the tool executor before it finishes assembling the API object. */
|
|
6
6
|
import { builtinFeatureActive } from '../../runtime/agent/orchestrator/runtime-core/builtin-features.mjs';
|
|
7
7
|
import { ORCHESTRATION_MODES } from '../../runtime/shared/orchestration.mjs';
|
|
8
|
+
import { AUTO_EFFORT_BASES } from '../../runtime/agent/orchestrator/providers/auto-effort.mjs';
|
|
8
9
|
import { INSTRUCTION_FILES_MODES } from '../../runtime/shared/instruction-files-mode.mjs';
|
|
9
10
|
import { MEDIA_KINDS } from '../../runtime/media/tool-defs.mjs';
|
|
10
11
|
import { SETUP_DESKTOP_DOMAINS, SETUP_HANDOFFS } from './settings-contract.mjs';
|
|
@@ -37,6 +38,10 @@ const PROFILE_VALUE_IDS = Object.freeze({
|
|
|
37
38
|
});
|
|
38
39
|
|
|
39
40
|
const ACTION_APPLIES_TO = {
|
|
41
|
+
set_agent_route:
|
|
42
|
+
"the bot's chats from their next turn (a running turn finishes on the old model); an agent switched on or off reaches open conversations from their next turn as an agent list reminder",
|
|
43
|
+
set_orchestration_mode:
|
|
44
|
+
"new sessions and an empty current one (the default mode); a conversation keeps its own mode until it is switched with the composer's mode selector",
|
|
40
45
|
set_recap_enabled: 'background Memory cycles; no restart required',
|
|
41
46
|
set_auto_update: 'subsequent automatic update checks',
|
|
42
47
|
set_worktree_settings: 'new tasks and worktrees created afterwards; existing worktrees are unchanged',
|
|
@@ -403,8 +408,11 @@ function validateSetupInput(args) {
|
|
|
403
408
|
if (action !== 'set_agent_route' && Object.hasOwn(args.route, 'disabled')) {
|
|
404
409
|
throw new Error('route.disabled is only accepted by set_agent_route');
|
|
405
410
|
}
|
|
406
|
-
if (
|
|
407
|
-
|
|
411
|
+
if (
|
|
412
|
+
Object.hasOwn(args.route, 'fallbacks') &&
|
|
413
|
+
!['set_route', 'set_agent_route', 'set_web_search_route'].includes(action)
|
|
414
|
+
) {
|
|
415
|
+
throw new Error('route.fallbacks is only accepted by set_route, set_agent_route and set_web_search_route');
|
|
408
416
|
}
|
|
409
417
|
for (const field of ['contextPercent', 'contextTokens', 'autoEffort']) {
|
|
410
418
|
if (action !== 'set_route' && action !== 'set_agent_route' && Object.hasOwn(args.route, field)) {
|
|
@@ -533,6 +541,8 @@ const SETUP_ACTION_HANDLERS = {
|
|
|
533
541
|
set_web_search_enabled: (rt, args) => rt.setWebSearchEnabled(requireBoolean(args.enabled)),
|
|
534
542
|
set_instruction_files: (rt, args) =>
|
|
535
543
|
rt.setInstructionFiles(requireEnum(args.instructionFiles, INSTRUCTION_FILES_MODES, 'instructionFiles')),
|
|
544
|
+
set_auto_effort_base: (rt, args) =>
|
|
545
|
+
rt.setAutoEffortBase(requireEnum(args.autoEffortBase, AUTO_EFFORT_BASES, 'autoEffortBase')),
|
|
536
546
|
set_builtin_enabled: (rt, args, { requestDesktop }) => {
|
|
537
547
|
const name = requireEnum(args.name, SETUP_BUILTIN_TOGGLE_FEATURES, 'name');
|
|
538
548
|
if (DESKTOP_HOSTED_FEATURES.includes(name)) return requestDesktop(args);
|
|
@@ -163,7 +163,11 @@ export const SETUP_EXTENDED_PROPERTIES = Object.freeze({
|
|
|
163
163
|
description:
|
|
164
164
|
'Agent create only: "bot" (a contact the user chats with) or "agent" (a workflow sub-agent). Omitted: a bot when created from the representative bot\'s chat, else a workflow agent. Fixed after creation.',
|
|
165
165
|
},
|
|
166
|
-
whenToUse:
|
|
166
|
+
whenToUse: {
|
|
167
|
+
...text,
|
|
168
|
+
description:
|
|
169
|
+
'Skill only: the SKILL.md when_to_use trigger line shown in the model\'s skill listing; "" clears it.',
|
|
170
|
+
},
|
|
167
171
|
toolDependencies: {
|
|
168
172
|
type: ['array', 'null'],
|
|
169
173
|
items: object({ type: { type: 'string', enum: ['tool', 'mcp'] }, value: text }, ['type', 'value']),
|
|
@@ -219,6 +223,9 @@ export const SETUP_EXTENDED_PROPERTIES = Object.freeze({
|
|
|
219
223
|
turnNotifications: boolean,
|
|
220
224
|
usagePinned: boolean,
|
|
221
225
|
usageRailShortLong: boolean,
|
|
226
|
+
usageAccountsExpanded: boolean,
|
|
227
|
+
usageRailSlotsThree: boolean,
|
|
228
|
+
usageRailSlotsAll: boolean,
|
|
222
229
|
computerObserveOnly: boolean,
|
|
223
230
|
browserAutoSignIn: boolean,
|
|
224
231
|
notificationVolume: {
|
|
@@ -238,6 +245,32 @@ export const SETUP_EXTENDED_PROPERTIES = Object.freeze({
|
|
|
238
245
|
markdownDefaultView: { type: 'string', enum: ['preview', 'rich', 'source'] },
|
|
239
246
|
linkPreview: boolean,
|
|
240
247
|
toolActivityExpansion: { type: 'string', enum: ['collapsed', 'commands', 'all'] },
|
|
248
|
+
uiFont: { ...text, description: 'Installed font family for the UI; "" restores the built-in font.' },
|
|
249
|
+
codeFont: { ...text, description: 'Installed font family for code; "" restores the built-in font.' },
|
|
250
|
+
skinTransparency: {
|
|
251
|
+
type: 'integer',
|
|
252
|
+
minimum: 0,
|
|
253
|
+
maximum: 100,
|
|
254
|
+
description: 'Sets both skin transparency sliders at once, 0-100 (defaults: outer 20, main 40).',
|
|
255
|
+
},
|
|
256
|
+
skinOuterTransparency: {
|
|
257
|
+
type: 'integer',
|
|
258
|
+
minimum: 0,
|
|
259
|
+
maximum: 100,
|
|
260
|
+
description:
|
|
261
|
+
'How much of the skin picture shows through the outer panels (window frame, titlebar, rail, sidebar, side dock), 0-100 (default 20).',
|
|
262
|
+
},
|
|
263
|
+
skinMainTransparency: {
|
|
264
|
+
type: 'integer',
|
|
265
|
+
minimum: 0,
|
|
266
|
+
maximum: 100,
|
|
267
|
+
description:
|
|
268
|
+
'How much of the skin picture shows through the main panel (conversation area, composer card, status island), 0-100 (default 40).',
|
|
269
|
+
},
|
|
270
|
+
colorTheme: {
|
|
271
|
+
...text,
|
|
272
|
+
description: 'Imported JSON color theme id from status appearance colorThemes; "builtin" turns themes off.',
|
|
273
|
+
},
|
|
241
274
|
}),
|
|
242
275
|
hookRule: object(
|
|
243
276
|
{
|
|
@@ -6,6 +6,7 @@ import {
|
|
|
6
6
|
} from './settings-contract.mjs';
|
|
7
7
|
import { MEDIA_KINDS } from '../../runtime/media/tool-defs.mjs';
|
|
8
8
|
import { INSTRUCTION_FILES_MODES } from '../../runtime/shared/instruction-files-mode.mjs';
|
|
9
|
+
import { AUTO_EFFORT_BASES } from '../../runtime/agent/orchestrator/providers/auto-effort.mjs';
|
|
9
10
|
import { WORKTREE_NEW_TASK_DEFAULTS } from '../../runtime/shared/worktrees/settings.mjs';
|
|
10
11
|
import { CONNECTOR_IDS } from '../../runtime/shared/connector-catalog.mjs';
|
|
11
12
|
|
|
@@ -83,6 +84,7 @@ export const SETUP_ACTION_FIELDS = Object.freeze({
|
|
|
83
84
|
set_recap_enabled: 'enabled',
|
|
84
85
|
set_web_search_enabled: 'enabled',
|
|
85
86
|
set_instruction_files: 'instructionFiles',
|
|
87
|
+
set_auto_effort_base: 'autoEffortBase',
|
|
86
88
|
set_builtin_enabled: 'name enabled',
|
|
87
89
|
install_builtin: 'name',
|
|
88
90
|
install_local_model: 'modelId',
|
|
@@ -160,7 +162,8 @@ const ROUTE_SCHEMA = {
|
|
|
160
162
|
|
|
161
163
|
ROUTE_SCHEMA.properties.fallbacks = {
|
|
162
164
|
type: 'array',
|
|
163
|
-
description:
|
|
165
|
+
description:
|
|
166
|
+
'Lead (set_route), agent (bots included) and Web Search routes only: ordered fallback models tried when the model hits its usage limit or is unavailable; [] clears the list.',
|
|
164
167
|
items: {
|
|
165
168
|
type: 'object',
|
|
166
169
|
additionalProperties: false,
|
|
@@ -224,8 +227,16 @@ export const SETUP_TOOL_DEFS = Object.freeze([
|
|
|
224
227
|
additionalProperties: false,
|
|
225
228
|
properties: {
|
|
226
229
|
enabled: { type: 'boolean' },
|
|
227
|
-
duration: {
|
|
228
|
-
|
|
230
|
+
duration: {
|
|
231
|
+
type: 'string',
|
|
232
|
+
description:
|
|
233
|
+
'Idle window such as "45m" or "2h" (minimum 1m), or "unlimited"/"never" to stop idle clearing. Without provider, "unlimited" applies to the current route provider.',
|
|
234
|
+
},
|
|
235
|
+
provider: {
|
|
236
|
+
type: 'string',
|
|
237
|
+
description:
|
|
238
|
+
'Scope the duration to one provider; "default" is the fallback for providers without a built-in window.',
|
|
239
|
+
},
|
|
229
240
|
reset: { type: 'boolean', description: 'Restore the global idle duration default.' },
|
|
230
241
|
resetProvider: { type: 'boolean', description: 'Restore the given provider idle duration default.' },
|
|
231
242
|
minContextPercent: { type: 'number', minimum: 0, maximum: 100 },
|
|
@@ -251,6 +262,12 @@ export const SETUP_TOOL_DEFS = Object.freeze([
|
|
|
251
262
|
description:
|
|
252
263
|
"set_instruction_files: which user instruction files new sessions load (global ~/.codex/AGENTS.md, ~/.claude/CLAUDE.md, then the Project root's AGENTS.md/CLAUDE.md).",
|
|
253
264
|
},
|
|
265
|
+
autoEffortBase: {
|
|
266
|
+
type: 'string',
|
|
267
|
+
enum: [...AUTO_EFFORT_BASES],
|
|
268
|
+
description:
|
|
269
|
+
"set_auto_effort_base: the reasoning effort Auto works around (global; default medium). Auto moves one step down to two steps up from it, within the model's supported efforts.",
|
|
270
|
+
},
|
|
254
271
|
name: {
|
|
255
272
|
type: 'string',
|
|
256
273
|
description: `set_builtin_enabled: ${SETUP_BUILTIN_TOGGLE_FEATURES.join('|')}; install_builtin also accepts memory. Memory toggles use set_memory_enabled. revoke_linked_device: client id from status connection, not its display name; set_developer_option: option id from status developer; read_definition/delete_definition: the definition id; reconnect_mcp: optional MCP server name (omit for all); else MCP/plugin/provider id.`,
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
// Skill surface (status listing, resource load, tool envelope, global skill
|
|
2
2
|
// creation/editing). The runtime facade only wires the mutable cwd and the
|
|
3
3
|
// context module into it.
|
|
4
|
-
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync
|
|
4
|
+
import { existsSync, mkdirSync, readFileSync, renameSync, rmSync } from 'node:fs';
|
|
5
5
|
import { basename, dirname, isAbsolute, join, relative, resolve } from 'node:path';
|
|
6
|
+
import { holdsNoData, writeFileAtomicSync } from '../runtime/shared/atomic-file.mjs';
|
|
6
7
|
import { resolvePluginData } from '../runtime/shared/plugin-paths.mjs';
|
|
7
8
|
import {
|
|
8
9
|
createSkillDocument,
|
|
@@ -21,6 +22,10 @@ import { loadSkillToolDependencies } from '../runtime/agent/orchestrator/runtime
|
|
|
21
22
|
|
|
22
23
|
const DEFAULT_SKILL_BODY = '# Instructions\n\nDescribe how to use this skill.';
|
|
23
24
|
|
|
25
|
+
// SKILL.md is user-authored: written atomically (a crash never leaves it torn
|
|
26
|
+
// or NUL-filled), the replaced copy kept as SKILL.md.bak.
|
|
27
|
+
const writeSkillFile = (filePath, text) => writeFileAtomicSync(filePath, text, { backup: true, mode: 0o644 });
|
|
28
|
+
|
|
24
29
|
export function createSkillsApi({ contextMod, getCwd, getTools = () => [] }) {
|
|
25
30
|
const globalSkillsRoot = () => resolve(resolvePluginData(), 'skills');
|
|
26
31
|
|
|
@@ -114,9 +119,11 @@ export function createSkillsApi({ contextMod, getCwd, getTools = () => [] }) {
|
|
|
114
119
|
: normalizeSkillToolDependencies(input.toolDependencies, { strict: true });
|
|
115
120
|
const dir = join(globalSkillsRoot(), name);
|
|
116
121
|
const filePath = join(dir, 'SKILL.md');
|
|
117
|
-
|
|
122
|
+
// A SKILL.md holding no data (empty, NUL-filled by a crash) is no skill:
|
|
123
|
+
// creating over it is allowed.
|
|
124
|
+
if (existsSync(filePath) && !holdsNoData(readFileSync(filePath))) throw new Error(`skill already exists: ${name}`);
|
|
118
125
|
mkdirSync(dir, { recursive: true });
|
|
119
|
-
|
|
126
|
+
writeSkillFile(filePath, createSkillDocument({ name, description, whenToUse, body }));
|
|
120
127
|
if (dependencies !== undefined) saveSkillToolDependencies(filePath, dependencies);
|
|
121
128
|
invalidateSkills();
|
|
122
129
|
return { name, filePath };
|
|
@@ -177,13 +184,13 @@ export function createSkillsApi({ contextMod, getCwd, getTools = () => [] }) {
|
|
|
177
184
|
renameSync(currentDir, nextDir);
|
|
178
185
|
filePath = join(nextDir, 'SKILL.md');
|
|
179
186
|
try {
|
|
180
|
-
|
|
187
|
+
writeSkillFile(filePath, updated);
|
|
181
188
|
} catch (error) {
|
|
182
189
|
renameSync(nextDir, currentDir);
|
|
183
190
|
throw error;
|
|
184
191
|
}
|
|
185
192
|
} else {
|
|
186
|
-
|
|
193
|
+
writeSkillFile(filePath, updated);
|
|
187
194
|
}
|
|
188
195
|
if (dependencies !== undefined) saveSkillToolDependencies(filePath, dependencies);
|
|
189
196
|
else if (filePath !== resource.filePath && resource.dependencySource === 'override') {
|