@cortexkit/opencode-magic-context 0.44.4 → 0.45.0
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/dist/agents/hidden-agent-registrations.d.ts +3 -2
- package/dist/agents/hidden-agent-registrations.d.ts.map +1 -1
- package/dist/agents/magic-context-prompt.d.ts +1 -0
- package/dist/agents/magic-context-prompt.d.ts.map +1 -1
- package/dist/agents/permissions.d.ts +8 -28
- package/dist/agents/permissions.d.ts.map +1 -1
- package/dist/{announcement-n8hs7kjw.js → announcement-f75t58v9.js} +4 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/project-security.d.ts +48 -0
- package/dist/config/project-security.d.ts.map +1 -1
- package/dist/config/raw-loader.d.ts.map +1 -1
- package/dist/config/schema/magic-context.d.ts +10 -7
- package/dist/config/schema/magic-context.d.ts.map +1 -1
- package/dist/{conflict-warning-hook-hmpzxep6.js → conflict-warning-hook-5yrz2r24.js} +10 -6
- package/dist/{derive-budgets-ncwn1jk9.js → derive-budgets-a63zsm5c.js} +3 -3
- package/dist/embedding-worker.js +49 -0
- package/dist/emscripten-module-0g8f45e6.js +602 -0
- package/dist/emscripten-module-0pekdjxz.js +1532 -0
- package/dist/emscripten-module-e67xwsp3.js +503 -0
- package/dist/emscripten-module-pj1vyb44.js +4559 -0
- package/dist/features/magic-context/compartment-chunk-embedding.d.ts +23 -3
- package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
- package/dist/features/magic-context/compartment-embedding.d.ts.map +1 -1
- package/dist/features/magic-context/compartment-storage.d.ts +14 -3
- package/dist/features/magic-context/compartment-storage.d.ts.map +1 -1
- package/dist/features/magic-context/context-store-uuid.d.ts +7 -0
- package/dist/features/magic-context/context-store-uuid.d.ts.map +1 -0
- package/dist/features/magic-context/dreamer/classify.d.ts +1 -3
- package/dist/features/magic-context/dreamer/classify.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/cron.d.ts +5 -4
- package/dist/features/magic-context/dreamer/cron.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/docs-proposals.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/expire-memories.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/idle-schedule-prune.d.ts +24 -0
- package/dist/features/magic-context/dreamer/idle-schedule-prune.d.ts.map +1 -0
- package/dist/features/magic-context/dreamer/manual-summary.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/map-memories.d.ts +5 -5
- package/dist/features/magic-context/dreamer/module-apply.d.ts +4 -25
- package/dist/features/magic-context/dreamer/module-apply.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/retrospective-learnings.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts +5 -1
- package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts +12 -5
- package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-executor.d.ts +6 -0
- package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-gates.d.ts +34 -0
- package/dist/features/magic-context/dreamer/task-gates.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-prompts.d.ts +1 -1
- package/dist/features/magic-context/dreamer/task-prompts.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-registry.d.ts +7 -5
- package/dist/features/magic-context/dreamer/task-registry.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-scheduler.d.ts +10 -3
- package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/token-budget.d.ts +3 -0
- package/dist/features/magic-context/dreamer/token-budget.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/verify.d.ts +2 -2
- package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
- package/dist/features/magic-context/git-commits/git-log-reader.d.ts +11 -2
- package/dist/features/magic-context/git-commits/git-log-reader.d.ts.map +1 -1
- package/dist/features/magic-context/git-commits/indexer.d.ts.map +1 -1
- package/dist/features/magic-context/git-commits/search-git-commits.d.ts.map +1 -1
- package/dist/features/magic-context/git-commits/storage-git-commits.d.ts +2 -0
- package/dist/features/magic-context/git-commits/storage-git-commits.d.ts.map +1 -1
- package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts +6 -0
- package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts.map +1 -0
- package/dist/features/magic-context/lkg-prefix-chunks.d.ts +53 -0
- package/dist/features/magic-context/lkg-prefix-chunks.d.ts.map +1 -0
- package/dist/features/magic-context/memory/embedding-backfill.d.ts.map +1 -1
- package/dist/features/magic-context/memory/embedding-local.d.ts +8 -0
- package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
- package/dist/features/magic-context/memory/embedding-openai.d.ts.map +1 -1
- package/dist/features/magic-context/memory/embedding-worker-client.d.ts +27 -0
- package/dist/features/magic-context/memory/embedding-worker-client.d.ts.map +1 -0
- package/dist/features/magic-context/memory/embedding-worker.d.ts +2 -0
- package/dist/features/magic-context/memory/embedding-worker.d.ts.map +1 -0
- package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts +2 -0
- package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts.map +1 -0
- package/dist/features/magic-context/memory/memory-selection.d.ts.map +1 -1
- package/dist/features/magic-context/memory/project-identity-cache.d.ts +4 -3
- package/dist/features/magic-context/memory/project-identity-cache.d.ts.map +1 -1
- package/dist/features/magic-context/memory/project-identity.d.ts.map +1 -1
- package/dist/features/magic-context/memory/storage-memory-fts.d.ts.map +1 -1
- package/dist/features/magic-context/memory/visibility.d.ts +1 -1
- package/dist/features/magic-context/memory/visibility.d.ts.map +1 -1
- package/dist/features/magic-context/message-fts-rowid-map.d.ts +14 -1
- package/dist/features/magic-context/message-fts-rowid-map.d.ts.map +1 -1
- package/dist/features/magic-context/message-fts-session-filter.d.ts +14 -0
- package/dist/features/magic-context/message-fts-session-filter.d.ts.map +1 -0
- package/dist/features/magic-context/message-index.d.ts +1 -7
- package/dist/features/magic-context/message-index.d.ts.map +1 -1
- package/dist/features/magic-context/message-time-backfill.d.ts.map +1 -1
- package/dist/features/magic-context/migration-v94-write-split.d.ts +62 -0
- package/dist/features/magic-context/migration-v94-write-split.d.ts.map +1 -0
- package/dist/features/magic-context/migration-worker-client.d.ts +23 -0
- package/dist/features/magic-context/migration-worker-client.d.ts.map +1 -0
- package/dist/features/magic-context/migration-worker-protocol.d.ts +30 -0
- package/dist/features/magic-context/migration-worker-protocol.d.ts.map +1 -0
- package/dist/features/magic-context/migration-worker.d.ts +2 -0
- package/dist/features/magic-context/migration-worker.d.ts.map +1 -0
- package/dist/features/magic-context/migrations.d.ts +7 -0
- package/dist/features/magic-context/migrations.d.ts.map +1 -1
- package/dist/features/magic-context/mural/render-mural.d.ts +24 -2
- package/dist/features/magic-context/mural/render-mural.d.ts.map +1 -1
- package/dist/features/magic-context/mural/render-trigger.d.ts +1 -1
- package/dist/features/magic-context/mural/render-trigger.d.ts.map +1 -1
- package/dist/features/magic-context/overflow-detection.d.ts +18 -7
- package/dist/features/magic-context/overflow-detection.d.ts.map +1 -1
- package/dist/features/magic-context/project-embedding-registry.d.ts +2 -0
- package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
- package/dist/features/magic-context/range-parser.d.ts +2 -3
- package/dist/features/magic-context/range-parser.d.ts.map +1 -1
- package/dist/features/magic-context/resolve-subagent-fallback.d.ts +2 -0
- package/dist/features/magic-context/resolve-subagent-fallback.d.ts.map +1 -1
- package/dist/features/magic-context/scheduler.d.ts +2 -0
- package/dist/features/magic-context/scheduler.d.ts.map +1 -1
- package/dist/features/magic-context/search.d.ts +7 -0
- package/dist/features/magic-context/search.d.ts.map +1 -1
- package/dist/features/magic-context/session-project-backfill.d.ts.map +1 -1
- package/dist/features/magic-context/session-project-storage.d.ts +10 -1
- package/dist/features/magic-context/session-project-storage.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts +1 -1
- package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/compiler.d.ts +4 -0
- package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts +2 -0
- package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts +10 -8
- package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/storage.d.ts +2 -2
- package/dist/features/magic-context/smart-notes/storage.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/types.d.ts +7 -2
- package/dist/features/magic-context/smart-notes/types.d.ts.map +1 -1
- package/dist/features/magic-context/storage-caveman-rules.d.ts +21 -0
- package/dist/features/magic-context/storage-caveman-rules.d.ts.map +1 -0
- package/dist/features/magic-context/storage-clone.d.ts.map +1 -1
- package/dist/features/magic-context/storage-compartment-history-version.d.ts +4 -0
- package/dist/features/magic-context/storage-compartment-history-version.d.ts.map +1 -0
- package/dist/features/magic-context/storage-db.d.ts +62 -2
- package/dist/features/magic-context/storage-db.d.ts.map +1 -1
- package/dist/features/magic-context/storage-identity-merge.d.ts +6 -0
- package/dist/features/magic-context/storage-identity-merge.d.ts.map +1 -1
- package/dist/features/magic-context/storage-meta-persisted.d.ts +15 -0
- package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
- package/dist/features/magic-context/storage-meta-session.d.ts +1 -1
- package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
- package/dist/features/magic-context/storage-meta-shared.d.ts +1 -1
- package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -1
- package/dist/features/magic-context/storage-notes.d.ts +2 -2
- package/dist/features/magic-context/storage-notes.d.ts.map +1 -1
- package/dist/features/magic-context/storage-reasoning-removal.d.ts +30 -0
- package/dist/features/magic-context/storage-reasoning-removal.d.ts.map +1 -0
- package/dist/features/magic-context/storage-replay-document.d.ts +42 -5
- package/dist/features/magic-context/storage-replay-document.d.ts.map +1 -1
- package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
- package/dist/features/magic-context/storage-tags.d.ts +7 -1
- package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
- package/dist/features/magic-context/storage.d.ts +1 -1
- package/dist/features/magic-context/storage.d.ts.map +1 -1
- package/dist/features/magic-context/store-generation-rebase.d.ts.map +1 -1
- package/dist/features/magic-context/tag-input.d.ts +4 -0
- package/dist/features/magic-context/tag-input.d.ts.map +1 -0
- package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
- package/dist/features/magic-context/user-memory/review-user-memories.d.ts.map +1 -1
- package/dist/features/magic-context/user-memory/storage-user-memory.d.ts.map +1 -1
- package/dist/ffi-3cx1cxpk.js +78 -0
- package/dist/ffi-7bqqe4cd.js +91 -0
- package/dist/ffi-7e6gryj5.js +91 -0
- package/dist/ffi-bpvkebwr.js +78 -0
- package/dist/hooks/magic-context/apply-operations.d.ts +9 -1
- package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-search-deadline.d.ts +10 -0
- package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -0
- package/dist/hooks/magic-context/auto-search-hint.d.ts +3 -0
- package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-search-runner.d.ts +3 -0
- package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
- package/dist/hooks/magic-context/caveman-cleanup.d.ts +8 -1
- package/dist/hooks/magic-context/caveman-cleanup.d.ts.map +1 -1
- package/dist/hooks/magic-context/caveman.d.ts +56 -1
- package/dist/hooks/magic-context/caveman.d.ts.map +1 -1
- package/dist/hooks/magic-context/child-session-spawn.d.ts +2 -0
- package/dist/hooks/magic-context/child-session-spawn.d.ts.map +1 -1
- package/dist/hooks/magic-context/command-handler.d.ts +1 -1
- package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
- package/dist/hooks/magic-context/compaction-marker-manager.d.ts +1 -1
- package/dist/hooks/magic-context/compaction-marker-manager.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-parser.d.ts +3 -3
- package/dist/hooks/magic-context/compartment-parser.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-incremental.d.ts +0 -1
- package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-partial-recomp.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-types.d.ts +3 -0
- package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-validation.d.ts +6 -0
- package/dist/hooks/magic-context/compartment-runner-validation.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
- package/dist/hooks/magic-context/degraded-pass-refusal.d.ts +35 -0
- package/dist/hooks/magic-context/degraded-pass-refusal.d.ts.map +1 -0
- package/dist/hooks/magic-context/derive-budgets.d.ts.map +1 -1
- package/dist/hooks/magic-context/dropped-input-guard.d.ts.map +1 -1
- package/dist/hooks/magic-context/embed-history-runner.d.ts.map +1 -1
- package/dist/hooks/magic-context/emergency-drop.d.ts +15 -0
- package/dist/hooks/magic-context/emergency-drop.d.ts.map +1 -1
- package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
- package/dist/hooks/magic-context/execute-status.d.ts +1 -0
- package/dist/hooks/magic-context/execute-status.d.ts.map +1 -1
- package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +17 -0
- package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
- package/dist/hooks/magic-context/heuristic-cleanup.d.ts +2 -0
- package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -1
- package/dist/hooks/magic-context/historian-host-runner.d.ts +5 -0
- package/dist/hooks/magic-context/historian-host-runner.d.ts.map +1 -1
- package/dist/hooks/magic-context/historian-prompt-fit.d.ts +116 -0
- package/dist/hooks/magic-context/historian-prompt-fit.d.ts.map +1 -0
- package/dist/hooks/magic-context/historian-prompt.generated.d.ts +1 -1
- package/dist/hooks/magic-context/historian-prompt.generated.d.ts.map +1 -1
- package/dist/hooks/magic-context/history-boundary-repair.d.ts +44 -0
- package/dist/hooks/magic-context/history-boundary-repair.d.ts.map +1 -0
- package/dist/hooks/magic-context/hook.d.ts +4 -0
- package/dist/hooks/magic-context/hook.d.ts.map +1 -1
- package/dist/hooks/magic-context/inject-compartments.d.ts +8 -0
- package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-persist.d.ts +12 -0
- package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-replay-fit.d.ts +104 -0
- package/dist/hooks/magic-context/lkg-replay-fit.d.ts.map +1 -0
- package/dist/hooks/magic-context/lkg-replay.d.ts +64 -0
- package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-client.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-state-sync-timing.d.ts +1 -1
- package/dist/hooks/magic-context/module-state-sync-timing.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-state-sync.d.ts +6 -68
- package/dist/hooks/magic-context/module-state-sync.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-tool-backends.d.ts +1 -34
- package/dist/hooks/magic-context/module-tool-backends.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-transport.d.ts +1 -55
- package/dist/hooks/magic-context/module-transport.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
- package/dist/hooks/magic-context/note-nudger.d.ts +2 -0
- package/dist/hooks/magic-context/note-nudger.d.ts.map +1 -1
- package/dist/hooks/magic-context/pass-outcome.d.ts +59 -2
- package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -1
- package/dist/hooks/magic-context/producer-window-guard.d.ts +6 -0
- package/dist/hooks/magic-context/producer-window-guard.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-chunk.d.ts +13 -2
- package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-formatting.d.ts +11 -0
- package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
- package/dist/hooks/magic-context/reasoning-removal.d.ts +60 -0
- package/dist/hooks/magic-context/reasoning-removal.d.ts.map +1 -0
- package/dist/hooks/magic-context/recomp-orchestrator.d.ts +1 -0
- package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -1
- package/dist/hooks/magic-context/reference-retrieval.d.ts +1 -1
- package/dist/hooks/magic-context/reference-retrieval.d.ts.map +1 -1
- package/dist/hooks/magic-context/reply-pages.d.ts +3 -0
- package/dist/hooks/magic-context/reply-pages.d.ts.map +1 -0
- package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts +62 -0
- package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts.map +1 -0
- package/dist/hooks/magic-context/rust-mode-transform.d.ts +17 -85
- package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
- package/dist/hooks/magic-context/send-session-notification.d.ts.map +1 -1
- package/dist/hooks/magic-context/sentinel.d.ts +35 -0
- package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
- package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts +28 -0
- package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts.map +1 -0
- package/dist/hooks/magic-context/single-store-refusal.d.ts +14 -0
- package/dist/hooks/magic-context/single-store-refusal.d.ts.map +1 -0
- package/dist/hooks/magic-context/storage-busy-refusal.d.ts +7 -0
- package/dist/hooks/magic-context/storage-busy-refusal.d.ts.map +1 -1
- package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
- package/dist/hooks/magic-context/stripped-command.d.ts +1 -1
- package/dist/hooks/magic-context/stripped-command.d.ts.map +1 -1
- package/dist/hooks/magic-context/system-injection-stripper.d.ts +7 -0
- package/dist/hooks/magic-context/system-injection-stripper.d.ts.map +1 -1
- package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
- package/dist/hooks/magic-context/tag-content-primitives.d.ts.map +1 -1
- package/dist/hooks/magic-context/tag-id-fallback.d.ts.map +1 -1
- package/dist/hooks/magic-context/tag-messages.d.ts +18 -1
- package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
- package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
- package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform-compartment-phase.d.ts +1 -0
- package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +37 -4
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform.d.ts +12 -39
- package/dist/hooks/magic-context/transform.d.ts.map +1 -1
- package/dist/hooks/magic-context/unmanaged-over-window.d.ts +36 -0
- package/dist/hooks/magic-context/unmanaged-over-window.d.ts.map +1 -0
- package/dist/hooks/magic-context/unresolved-history-boundary.d.ts +15 -0
- package/dist/hooks/magic-context/unresolved-history-boundary.d.ts.map +1 -0
- package/dist/hooks/magic-context/user-profile-render.d.ts +3 -0
- package/dist/hooks/magic-context/user-profile-render.d.ts.map +1 -0
- package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
- package/dist/{index-sqp1hz9v.js → index-16ny736w.js} +10190 -25296
- package/dist/{index-mrc0twf3.js → index-2aq21j41.js} +1201 -428
- package/dist/{index-32b096cc.js → index-2ntg5sd4.js} +6 -2
- package/dist/index-4krbw8z9.js +6034 -0
- package/dist/{index-33q7s9y2.js → index-75zjgwga.js} +61 -85
- package/dist/{index-zx7pmr39.js → index-8fgkmxmy.js} +28 -10
- package/dist/index-a4m2b1yv.js +530 -0
- package/dist/index-anq4nn6f.js +131 -0
- package/dist/index-avwt563y.js +62 -0
- package/dist/index-bmzf7zxv.js +445 -0
- package/dist/index-e44zzy84.js +10 -0
- package/dist/index-en1k8h8m.js +244 -0
- package/dist/{index-638hf49n.js → index-f85teqck.js} +15 -6
- package/dist/index-fr2z4qy8.js +7810 -0
- package/dist/{index-kwe03yde.js → index-fzbvakh0.js} +1 -1
- package/dist/{module-asyncify-2EFITU5U-rkqjhjxd.js → index-g20jdh0p.js} +114 -105
- package/dist/index-gd5qx1j9.js +398 -0
- package/dist/{index-3bygzk2d.js → index-hybnrwq0.js} +169 -4
- package/dist/{index-jqcbs2k1.js → index-mc22ayvf.js} +24 -5
- package/dist/index-q7yesyk9.js +9118 -0
- package/dist/index-remp7e2g.js +214 -0
- package/dist/{index-7k55qm8a.js → index-sfpzqvdz.js} +8 -8
- package/dist/{index-msqr3x6m.js → index-vvtfyw1z.js} +12 -75
- package/dist/index-w9jwmntv.js +202 -0
- package/dist/{index-kr5qehbd.js → index-x23gah8c.js} +1 -1
- package/dist/{index-jdxxq8cz.js → index-x8a7jmkh.js} +6 -1
- package/dist/{index-wprsye9w.js → index-xgt9k6c6.js} +23 -12
- package/dist/index-y8v6yerm.js +77 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7519 -8096
- package/dist/message-time-backfill-an311pmk.js +124 -0
- package/dist/migration-worker.js +53 -0
- package/dist/{model-resolution-dxatzjde.js → model-resolution-xhfmyyvy.js} +5 -1
- package/dist/module-ES6BEMUI-3cet1pyp.js +12 -0
- package/dist/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
- package/dist/plugin/boot-deadline.d.ts.map +1 -1
- package/dist/plugin/conflict-warning-hook.d.ts.map +1 -1
- package/dist/plugin/dream-timer-module-client.d.ts +1 -11
- package/dist/plugin/dream-timer-module-client.d.ts.map +1 -1
- package/dist/plugin/dream-timer.d.ts.map +1 -1
- package/dist/plugin/hooks/create-session-hooks.d.ts +8 -0
- package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
- package/dist/plugin/messages-transform.d.ts +20 -13
- package/dist/plugin/messages-transform.d.ts.map +1 -1
- package/dist/plugin/rpc-handlers.d.ts.map +1 -1
- package/dist/plugin/stale-build-notice.d.ts +16 -0
- package/dist/plugin/stale-build-notice.d.ts.map +1 -0
- package/dist/{read-session-chunk-339hg90t.js → read-session-chunk-8rxs0tc9.js} +24 -6
- package/dist/recomp-orchestrator-nzamtw29.js +39 -0
- package/dist/{rpc-notifications-4amf6mf4.js → rpc-notifications-3hed126v.js} +3 -1
- package/dist/{safe-notification-target-50gm9c58.js → safe-notification-target-43r8jsxw.js} +3 -3
- package/dist/send-session-notification-nqpv7cne.js +28 -0
- package/dist/shared/assistant-message-extractor.d.ts +4 -0
- package/dist/shared/assistant-message-extractor.d.ts.map +1 -1
- package/dist/shared/background-batch-drain.d.ts +8 -0
- package/dist/shared/background-batch-drain.d.ts.map +1 -0
- package/dist/{features/builtin-commands/commands.d.ts → shared/builtin-commands.d.ts} +1 -1
- package/dist/shared/builtin-commands.d.ts.map +1 -0
- package/dist/shared/embedding-activity.d.ts +13 -0
- package/dist/shared/embedding-activity.d.ts.map +1 -0
- package/dist/shared/historian-tool-expansions.d.ts +5 -0
- package/dist/shared/historian-tool-expansions.d.ts.map +1 -0
- package/dist/shared/historian-tool-template.d.ts +5 -0
- package/dist/shared/historian-tool-template.d.ts.map +1 -0
- package/dist/shared/historian-transient-error.d.ts +2 -0
- package/dist/shared/historian-transient-error.d.ts.map +1 -0
- package/dist/shared/jsonc-edit.d.ts.map +1 -1
- package/dist/shared/logger.d.ts +7 -0
- package/dist/shared/logger.d.ts.map +1 -1
- package/dist/shared/model-suggestion-retry.d.ts +2 -1
- package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
- package/dist/shared/models-dev-cache.d.ts.map +1 -1
- package/dist/shared/off-thread-migration-clock.d.ts +38 -0
- package/dist/shared/off-thread-migration-clock.d.ts.map +1 -0
- package/dist/shared/plugin-package-version.d.ts +14 -0
- package/dist/shared/plugin-package-version.d.ts.map +1 -0
- package/dist/shared/project-directory-key.d.ts +26 -0
- package/dist/shared/project-directory-key.d.ts.map +1 -0
- package/dist/shared/prompt-async-transport.d.ts +4 -0
- package/dist/shared/prompt-async-transport.d.ts.map +1 -1
- package/dist/shared/prompt-surface-runtime.d.ts +3 -3
- package/dist/shared/provider-response-completion.d.ts +12 -0
- package/dist/shared/provider-response-completion.d.ts.map +1 -0
- package/dist/shared/redaction.d.ts.map +1 -1
- package/dist/shared/rpc-client.d.ts +23 -2
- package/dist/shared/rpc-client.d.ts.map +1 -1
- package/dist/shared/rpc-types.d.ts +19 -0
- package/dist/shared/rpc-types.d.ts.map +1 -1
- package/dist/shared/rpc-utils.d.ts +34 -0
- package/dist/shared/rpc-utils.d.ts.map +1 -1
- package/dist/shared/sqlite.d.ts +13 -2
- package/dist/shared/sqlite.d.ts.map +1 -1
- package/dist/shared/stale-plugin-build.d.ts +21 -0
- package/dist/shared/stale-plugin-build.d.ts.map +1 -0
- package/dist/shared/status-summary.d.ts +29 -0
- package/dist/shared/status-summary.d.ts.map +1 -1
- package/dist/shared/status-view-check.d.ts +124 -0
- package/dist/shared/status-view-check.d.ts.map +1 -0
- package/dist/shared/status-view.d.ts +38 -2
- package/dist/shared/status-view.d.ts.map +1 -1
- package/dist/shared/tag-owner-id.d.ts +19 -0
- package/dist/shared/tag-owner-id.d.ts.map +1 -0
- package/dist/shared/tag-transcript.d.ts +2 -1
- package/dist/shared/tag-transcript.d.ts.map +1 -1
- package/dist/shared/test-temp-dir.d.ts +8 -2
- package/dist/shared/test-temp-dir.d.ts.map +1 -1
- package/dist/shared/user-facing-codes.d.ts +41 -6
- package/dist/shared/user-facing-codes.d.ts.map +1 -1
- package/dist/shared/xml-unescape.d.ts +9 -0
- package/dist/shared/xml-unescape.d.ts.map +1 -0
- package/dist/task-config-v81k8jvk.js +17 -0
- package/dist/tools/ctx-expand/constants.d.ts +1 -1
- package/dist/tools/ctx-expand/constants.d.ts.map +1 -1
- package/dist/tools/ctx-expand/mode.d.ts +4 -0
- package/dist/tools/ctx-expand/mode.d.ts.map +1 -1
- package/dist/tools/ctx-expand/render.d.ts +5 -1
- package/dist/tools/ctx-expand/render.d.ts.map +1 -1
- package/dist/tools/ctx-expand/tools.d.ts +2 -0
- package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
- package/dist/tools/ctx-expand/types.d.ts +1 -0
- package/dist/tools/ctx-expand/types.d.ts.map +1 -1
- package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
- package/dist/tools/ctx-note/render.d.ts +2 -0
- package/dist/tools/ctx-note/render.d.ts.map +1 -1
- package/dist/tools/ctx-note/tools.d.ts.map +1 -1
- package/dist/tools/ctx-reduce/constants.d.ts +1 -1
- package/dist/tools/ctx-reduce/constants.d.ts.map +1 -1
- package/dist/tools/ctx-search/constants.d.ts +1 -1
- package/dist/tools/ctx-search/constants.d.ts.map +1 -1
- package/dist/tools/light-descriptions.d.ts +3 -3
- package/dist/tools/light-descriptions.d.ts.map +1 -1
- package/dist/tools/parameter-descriptions.d.ts +14 -14
- package/dist/transform-postprocess-phase-414phndq.js +61 -0
- package/dist/tui/data/context-db.d.ts +34 -10
- package/dist/tui/data/context-db.d.ts.map +1 -1
- package/dist/tui/data/notification-socket.d.ts +6 -0
- package/dist/tui/data/notification-socket.d.ts.map +1 -1
- package/dist/tui/data/session-directory.d.ts +16 -0
- package/dist/tui/data/session-directory.d.ts.map +1 -0
- package/dist/tui-compiled/data/context-db.d.ts +34 -10
- package/dist/tui-compiled/data/context-db.d.ts.map +1 -1
- package/dist/tui-compiled/data/notification-socket.d.ts +6 -0
- package/dist/tui-compiled/data/notification-socket.d.ts.map +1 -1
- package/dist/tui-compiled/data/session-directory.d.ts +16 -0
- package/dist/tui-compiled/data/session-directory.d.ts.map +1 -0
- package/dist/v2/derive-budgets-v0krf3t7.js +18 -0
- package/dist/v2/embedding-worker.js +47 -0
- package/dist/v2/emscripten-module-0g8f45e6.js +602 -0
- package/dist/v2/emscripten-module-0pekdjxz.js +1532 -0
- package/dist/v2/emscripten-module-e67xwsp3.js +503 -0
- package/dist/v2/emscripten-module-pj1vyb44.js +4559 -0
- package/dist/v2/ffi-3cx1cxpk.js +78 -0
- package/dist/v2/ffi-7bqqe4cd.js +91 -0
- package/dist/v2/ffi-7e6gryj5.js +91 -0
- package/dist/v2/ffi-bpvkebwr.js +78 -0
- package/dist/v2/fold/boundary.d.ts.map +1 -1
- package/dist/v2/fork-inheritance.d.ts +101 -0
- package/dist/v2/fork-inheritance.d.ts.map +1 -0
- package/dist/v2/hidden-child-cleanup.d.ts +11 -0
- package/dist/v2/hidden-child-cleanup.d.ts.map +1 -0
- package/dist/v2/hidden-child-native.d.ts +29 -0
- package/dist/v2/hidden-child-native.d.ts.map +1 -0
- package/dist/v2/hidden-child-record.d.ts +135 -0
- package/dist/v2/hidden-child-record.d.ts.map +1 -0
- package/dist/v2/hidden-completion.d.ts +12 -97
- package/dist/v2/hidden-completion.d.ts.map +1 -1
- package/dist/v2/hooks/context.d.ts +20 -8
- package/dist/v2/hooks/context.d.ts.map +1 -1
- package/dist/v2/hooks/dream-manual.d.ts.map +1 -1
- package/dist/v2/hooks/dream-trigger.d.ts +5 -0
- package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
- package/dist/v2/hooks/generate.d.ts +10 -0
- package/dist/v2/hooks/generate.d.ts.map +1 -0
- package/dist/v2/hooks/hidden-child.d.ts +33 -2
- package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
- package/dist/v2/hooks/payload.d.ts +3 -0
- package/dist/v2/hooks/payload.d.ts.map +1 -1
- package/dist/v2/hooks/session-api-gate.d.ts +4 -0
- package/dist/v2/hooks/session-api-gate.d.ts.map +1 -0
- package/dist/v2/hooks/storage-gate.d.ts +3 -1
- package/dist/v2/hooks/storage-gate.d.ts.map +1 -1
- package/dist/v2/hooks/tools.d.ts.map +1 -1
- package/dist/v2/hooks/types.d.ts +10 -0
- package/dist/v2/hooks/types.d.ts.map +1 -1
- package/dist/v2/hooks/update-check.d.ts.map +1 -1
- package/dist/v2/hooks/usage-persist.d.ts.map +1 -1
- package/dist/v2/hooks/usage-reading.d.ts +4 -0
- package/dist/v2/hooks/usage-reading.d.ts.map +1 -1
- package/dist/v2/index-6e4mwffh.js +5662 -0
- package/dist/v2/index-en1k8h8m.js +244 -0
- package/dist/{message-time-backfill-q374fxc5.js → v2/message-time-backfill-0n93vrd7.js} +19 -5
- package/dist/v2/migration-worker.js +52 -0
- package/dist/v2/model-resolution-xhfmyyvy.js +16 -0
- package/dist/v2/module-ES6BEMUI-3cet1pyp.js +12 -0
- package/dist/v2/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
- package/dist/v2/prompt-context-5y5ms8f9.js +6 -0
- package/dist/v2/read-session-chunk-hjza38hr.js +83 -0
- package/dist/v2/recomp-orchestrator-1aq7h44c.js +36 -0
- package/dist/v2/retrospective-raw-provider.d.ts +21 -0
- package/dist/v2/retrospective-raw-provider.d.ts.map +1 -0
- package/dist/v2/rpc-notifications-3hed126v.js +16 -0
- package/dist/v2/safe-notification-target-wtj0bbc2.js +9 -0
- package/dist/{send-session-notification-04hvd54c.js → v2/send-session-notification-mq9frrtm.js} +10 -5
- package/dist/v2/server-0jqw05sa.js +803 -0
- package/dist/v2/server-5317ykaf.js +40 -0
- package/dist/v2/server-a4m2b1yv.js +530 -0
- package/dist/v2/server-avwt563y.js +62 -0
- package/dist/v2/server-c4g2y1z8.js +28824 -0
- package/dist/v2/server-ckpc8pxy.js +662 -0
- package/dist/v2/server-e36nf2p1.js +7702 -0
- package/dist/v2/server-e44zzy84.js +10 -0
- package/dist/v2/server-fgmxwrgy.js +16 -0
- package/dist/v2/server-fmsr7v69.js +75 -0
- package/dist/v2/server-g20jdh0p.js +1273 -0
- package/dist/{index-qm36k34q.js → v2/server-hfjfbg59.js} +796 -737
- package/dist/v2/server-n96ag4rk.js +633 -0
- package/dist/v2/server-qdjnb2z1.js +181 -0
- package/dist/v2/server-qpg6wf72.js +187 -0
- package/dist/v2/server-r7cmye3k.js +131 -0
- package/dist/v2/server-remp7e2g.js +214 -0
- package/dist/v2/server-rhdgxp1t.js +398 -0
- package/dist/v2/server-sfpzqvdz.js +137 -0
- package/dist/v2/server-syahy8j8.js +50 -0
- package/dist/v2/server-v5xgft5v.js +9116 -0
- package/dist/v2/server-w99cyt6a.js +361 -0
- package/dist/v2/server-x8a7jmkh.js +104 -0
- package/dist/v2/server-y8v6yerm.js +77 -0
- package/dist/v2/server-z19x7eqz.js +423 -0
- package/dist/v2/server.d.ts.map +1 -1
- package/dist/v2/server.js +8796 -107376
- package/dist/v2/store-reader.d.ts +50 -0
- package/dist/v2/store-reader.d.ts.map +1 -1
- package/dist/v2/task-config-tbndqyny.js +17 -0
- package/dist/v2/transformers-node-wasm.js +26768 -0
- package/dist/v2/transformers-web.js +25670 -0
- package/dist/v2/transformers.node-hj754h7s.js +29997 -0
- package/dist/v2/tui/index.d.ts +10 -1
- package/dist/v2/tui/index.d.ts.map +1 -1
- package/dist/v2/tui/sidebar-mount.d.ts +6 -0
- package/dist/v2/tui/sidebar-mount.d.ts.map +1 -1
- package/dist/v2/tui/status-dialog-mount.d.ts +7 -4
- package/dist/v2/tui/status-dialog-mount.d.ts.map +1 -1
- package/dist/v2/tui/types.d.ts +12 -0
- package/dist/v2/tui/types.d.ts.map +1 -1
- package/dist/v2/wrapup-orchestrator-tbyx78dz.js +425 -0
- package/dist/wrapup-orchestrator-h28bqsy6.js +26 -0
- package/package.json +8 -8
- package/src/agents/hidden-agent-registrations.ts +24 -16
- package/src/agents/magic-context-prompt.test.ts +41 -0
- package/src/agents/magic-context-prompt.ts +8 -5
- package/src/agents/permissions.test.ts +31 -49
- package/src/agents/permissions.ts +8 -28
- package/src/config/index.test.ts +60 -20
- package/src/config/index.ts +53 -1
- package/src/config/live-run-config.test.ts +5 -5
- package/src/config/live-snapshot.test.ts +4 -4
- package/src/config/migrate-config-location.test.ts +3 -10
- package/src/config/project-config-trust-boundary.test.ts +207 -0
- package/src/config/project-security.hostile-matrix.test.ts +4 -4
- package/src/config/project-security.ts +218 -1
- package/src/config/protected-tokens.test.ts +14 -9
- package/src/config/raw-loader.test.ts +31 -3
- package/src/config/raw-loader.ts +8 -3
- package/src/config/schema/magic-context.ts +20 -3
- package/src/config/variable.test.ts +3 -2
- package/src/features/magic-context/dreamer/cron.ts +30 -9
- package/src/features/magic-context/dreamer/task-registry.ts +7 -5
- package/src/shared/announcement.test.ts +2 -1
- package/src/shared/assistant-message-extractor.test.ts +27 -1
- package/src/shared/assistant-message-extractor.ts +27 -0
- package/src/shared/background-batch-drain.test.ts +38 -0
- package/src/shared/background-batch-drain.ts +29 -0
- package/src/shared/builtin-commands.ts +50 -0
- package/src/shared/console-diagnostics-fence.test.ts +145 -0
- package/src/shared/data-path.test.ts +6 -5
- package/src/shared/embedding-activity.test.ts +21 -0
- package/src/shared/embedding-activity.ts +36 -0
- package/src/shared/historian-tool-defaults.json +13 -0
- package/src/shared/historian-tool-expansions.ts +18 -0
- package/src/shared/historian-tool-template.ts +248 -0
- package/src/shared/historian-transient-error.test.ts +36 -0
- package/src/shared/historian-transient-error.ts +22 -0
- package/src/shared/jsonc-edit.ts +20 -1
- package/src/shared/logger.test.ts +3 -2
- package/src/shared/logger.ts +40 -1
- package/src/shared/model-suggestion-retry.test.ts +46 -0
- package/src/shared/model-suggestion-retry.ts +16 -1
- package/src/shared/models-dev-cache.test.ts +74 -2
- package/src/shared/models-dev-cache.ts +5 -1
- package/src/shared/off-thread-migration-clock.test.ts +55 -0
- package/src/shared/off-thread-migration-clock.ts +124 -0
- package/src/shared/opencode-db-path.test.ts +3 -2
- package/src/shared/plugin-package-version.ts +52 -0
- package/src/shared/project-directory-key.test.ts +111 -0
- package/src/shared/project-directory-key.ts +54 -0
- package/src/shared/prompt-async-transport.test.ts +249 -72
- package/src/shared/prompt-async-transport.ts +131 -24
- package/src/shared/prompt-surface-a1-golden.md +41 -25
- package/src/shared/prompt-surface-runtime.test.ts +3 -3
- package/src/shared/provider-response-completion.ts +23 -0
- package/src/shared/redaction.test.ts +51 -1
- package/src/shared/redaction.ts +33 -0
- package/src/shared/rpc-async-probes.test.ts +32 -2
- package/src/shared/rpc-client.test.ts +3 -2
- package/src/shared/rpc-client.ts +76 -18
- package/src/shared/rpc-types.ts +15 -0
- package/src/shared/rpc-utils.test.ts +164 -10
- package/src/shared/rpc-utils.ts +144 -15
- package/src/shared/sqlite-acquisition-routing.test.ts +46 -3
- package/src/shared/sqlite-pass-scope.test.ts +3 -2
- package/src/shared/sqlite-transaction-mode-guard.test.ts +4 -0
- package/src/shared/sqlite-writer-diagnostics.test.ts +134 -0
- package/src/shared/sqlite.ts +225 -41
- package/src/shared/stale-plugin-build.test.ts +129 -0
- package/src/shared/stale-plugin-build.ts +151 -0
- package/src/shared/status-summary.ts +40 -13
- package/src/shared/status-view-check.test.ts +253 -0
- package/src/shared/status-view-check.ts +536 -0
- package/src/shared/status-view.test.ts +6 -1
- package/src/shared/status-view.ts +176 -4
- package/src/shared/storage-busy.test.ts +3 -2
- package/src/shared/tag-owner-id.test.ts +33 -0
- package/src/shared/tag-owner-id.ts +29 -0
- package/src/shared/tag-transcript.ts +13 -2
- package/src/shared/test-temp-dir-policy.test.ts +33 -0
- package/src/shared/test-temp-dir.test.ts +27 -0
- package/src/shared/test-temp-dir.ts +36 -12
- package/src/shared/tui-config.test.ts +6 -5
- package/src/shared/tui-preferences.test.ts +3 -2
- package/src/shared/user-facing-codes.ts +52 -6
- package/src/shared/window-geometry.test.ts +3 -2
- package/src/shared/write-transaction-attribution.test.ts +11 -7
- package/src/shared/write-transaction-hold-clock.test.ts +160 -0
- package/src/shared/xml-unescape.ts +19 -0
- package/src/tui/data/context-db.test.ts +92 -4
- package/src/tui/data/context-db.ts +184 -18
- package/src/tui/data/notification-socket.test.ts +49 -2
- package/src/tui/data/notification-socket.ts +47 -9
- package/src/tui/data/session-directory.ts +19 -0
- package/src/tui/dialogs/status-dialog-render.test.ts +284 -0
- package/src/tui/dialogs/status-dialog.tsx +41 -38
- package/src/tui/index.tsx +30 -18
- package/src/tui/slots/sidebar-content.tsx +9 -2
- package/src/tui-compiled/data/context-db.ts +184 -18
- package/src/tui-compiled/data/notification-socket.ts +47 -9
- package/src/tui-compiled/data/session-directory.ts +19 -0
- package/src/tui-compiled/dialogs/status-dialog.tsx +38 -29
- package/src/tui-compiled/index.tsx +29 -16
- package/src/tui-compiled/slots/sidebar-content.tsx +3 -2
- package/src/v2/tui/host-contract.test.ts +9 -10
- package/src/v2/tui/index.ts +78 -23
- package/src/v2/tui/load-compiled-sidebar.d.mts +5 -1
- package/src/v2/tui/load-compiled-status-dialog.d.mts +3 -2
- package/src/v2/tui/session-directory.test.ts +53 -0
- package/src/v2/tui/sidebar-mount.ts +19 -1
- package/src/v2/tui/status-dialog-mount.ts +10 -7
- package/src/v2/tui/types.ts +10 -0
- package/dist/features/builtin-commands/commands.d.ts.map +0 -1
- package/dist/features/builtin-commands/types.d.ts +0 -3
- package/dist/features/builtin-commands/types.d.ts.map +0 -1
- package/dist/features/magic-context/context-authority.d.ts +0 -272
- package/dist/features/magic-context/context-authority.d.ts.map +0 -1
- package/dist/features/magic-context/memory/mirror-reembed.d.ts +0 -22
- package/dist/features/magic-context/memory/mirror-reembed.d.ts.map +0 -1
- package/dist/hooks/magic-context/historian-state-file.d.ts +0 -43
- package/dist/hooks/magic-context/historian-state-file.d.ts.map +0 -1
- package/dist/index-4an2p8qa.js +0 -1056
- package/dist/index-rn7gafjr.js +0 -8
- package/dist/index-v6t0tg85.js +0 -13
- package/dist/plugin/memory-id-translation.d.ts +0 -109
- package/dist/plugin/memory-id-translation.d.ts.map +0 -1
- package/dist/plugin/rust-note-backend.d.ts +0 -84
- package/dist/plugin/rust-note-backend.d.ts.map +0 -1
- package/dist/recomp-orchestrator-0ers6smx.js +0 -22
- package/dist/task-config-2bm68628.js +0 -9
- package/dist/transform-postprocess-phase-ttdkrm6r.js +0 -36
- package/dist/v2/host-service.d.ts +0 -66
- package/dist/v2/host-service.d.ts.map +0 -1
- package/dist/wrapup-orchestrator-x0jvvrqn.js +0 -19
- /package/dist/{index-s70wtd8k.js → index-q6hef7fh.js} +0 -0
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
import { expect, test } from "bun:test";
|
|
2
|
-
import { mkdirSync,
|
|
2
|
+
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
-
|
|
6
5
|
import {
|
|
7
6
|
buildDreamTaskRuntimeConfigs,
|
|
8
7
|
userMemoryCollectionEnabled,
|
|
9
8
|
} from "../features/magic-context/dreamer/task-config";
|
|
10
9
|
import { producerInputTokenLimit } from "../hooks/magic-context/producer-window-guard";
|
|
11
10
|
import { resolveHistorianModel } from "../shared/model-resolution";
|
|
11
|
+
import { createTestTempDirFromPath } from "../shared/test-temp-dir";
|
|
12
12
|
import { loadPluginConfigDetailed } from "./index";
|
|
13
13
|
import { dreamerRunConfig, historianRunConfig } from "./live-run-config";
|
|
14
14
|
import { LiveConfigReader } from "./live-snapshot";
|
|
15
15
|
|
|
16
16
|
for (const host of ["OC1", "OC2", "Pi", "OMP"] as const) {
|
|
17
17
|
test(`${host} historian samples the next generation while an existing run keeps its model and fallback`, () => {
|
|
18
|
-
const root =
|
|
18
|
+
const root = createTestTempDirFromPath(join(tmpdir(), "mc-live-historian-"));
|
|
19
19
|
const previous = { home: process.env.HOME, config: process.env.XDG_CONFIG_HOME };
|
|
20
20
|
process.env.HOME = root;
|
|
21
21
|
process.env.XDG_CONFIG_HOME = join(root, "config");
|
|
@@ -87,7 +87,7 @@ for (const host of ["OC1", "OC2", "Pi", "OMP"] as const) {
|
|
|
87
87
|
|
|
88
88
|
for (const host of ["OC1", "OC2", "Pi", "OMP"] as const) {
|
|
89
89
|
test(`${host} dreamer samples the new schedule and model chain without changing a running task`, () => {
|
|
90
|
-
const root =
|
|
90
|
+
const root = createTestTempDirFromPath(join(tmpdir(), "mc-live-dreamer-"));
|
|
91
91
|
const previous = { home: process.env.HOME, config: process.env.XDG_CONFIG_HOME };
|
|
92
92
|
process.env.HOME = root;
|
|
93
93
|
process.env.XDG_CONFIG_HOME = join(root, "config");
|
|
@@ -171,7 +171,7 @@ for (const host of ["OC1", "OC2", "Pi", "OMP"] as const) {
|
|
|
171
171
|
}
|
|
172
172
|
|
|
173
173
|
test("malformed project config retains last good values and deduplicates the warning; project overrides remain tier-safe", () => {
|
|
174
|
-
const root =
|
|
174
|
+
const root = createTestTempDirFromPath(join(tmpdir(), "mc-live-tiers-"));
|
|
175
175
|
const previous = { home: process.env.HOME, config: process.env.XDG_CONFIG_HOME };
|
|
176
176
|
process.env.HOME = root;
|
|
177
177
|
process.env.XDG_CONFIG_HOME = join(root, "config");
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { expect, test } from "bun:test";
|
|
2
|
-
import { mkdirSync,
|
|
2
|
+
import { mkdirSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
-
|
|
6
5
|
import { parseJsonc } from "../shared/jsonc-parser";
|
|
6
|
+
import { createTestTempDirFromPath } from "../shared/test-temp-dir";
|
|
7
7
|
import { LiveConfigReader } from "./live-snapshot";
|
|
8
8
|
|
|
9
9
|
test("one snapshot per run survives a malformed tier and adopts both tiers atomically", () => {
|
|
10
10
|
const oldConfigHome = process.env.XDG_CONFIG_HOME;
|
|
11
|
-
const root =
|
|
11
|
+
const root = createTestTempDirFromPath(join(tmpdir(), "mc-live-config-"));
|
|
12
12
|
const project = join(root, "project");
|
|
13
13
|
const projectFile = join(project, ".cortexkit", "magic-context.jsonc");
|
|
14
14
|
const userFile = join(root, "config", "cortexkit", "magic-context.jsonc");
|
|
@@ -53,7 +53,7 @@ test("one snapshot per run survives a malformed tier and adopts both tiers atomi
|
|
|
53
53
|
});
|
|
54
54
|
|
|
55
55
|
test("a write crossing the tier load boundary is not published as a mixed snapshot", () => {
|
|
56
|
-
const root =
|
|
56
|
+
const root = createTestTempDirFromPath(join(tmpdir(), "mc-live-crossing-"));
|
|
57
57
|
const previous = process.env.XDG_CONFIG_HOME;
|
|
58
58
|
process.env.XDG_CONFIG_HOME = join(root, "config");
|
|
59
59
|
const project = join(root, "project");
|
|
@@ -1,15 +1,8 @@
|
|
|
1
1
|
import { describe, expect, it } from "bun:test";
|
|
2
|
-
import {
|
|
3
|
-
existsSync,
|
|
4
|
-
mkdirSync,
|
|
5
|
-
mkdtempSync,
|
|
6
|
-
readFileSync,
|
|
7
|
-
rmSync,
|
|
8
|
-
utimesSync,
|
|
9
|
-
writeFileSync,
|
|
10
|
-
} from "node:fs";
|
|
2
|
+
import { existsSync, mkdirSync, readFileSync, rmSync, utimesSync, writeFileSync } from "node:fs";
|
|
11
3
|
import { tmpdir } from "node:os";
|
|
12
4
|
import { join } from "node:path";
|
|
5
|
+
import { createTestTempDirFromPath } from "../shared/test-temp-dir";
|
|
13
6
|
import {
|
|
14
7
|
type LegacyConfigSource,
|
|
15
8
|
migrateConfigFile,
|
|
@@ -17,7 +10,7 @@ import {
|
|
|
17
10
|
} from "./migrate-config-location";
|
|
18
11
|
|
|
19
12
|
function tmp(): string {
|
|
20
|
-
return
|
|
13
|
+
return createTestTempDirFromPath(join(tmpdir(), "mc-cfgloc-"));
|
|
21
14
|
}
|
|
22
15
|
|
|
23
16
|
function src(path: string, label = "legacy"): LegacyConfigSource {
|
|
@@ -0,0 +1,207 @@
|
|
|
1
|
+
import { describe, expect, it } from "bun:test";
|
|
2
|
+
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
3
|
+
import { tmpdir } from "node:os";
|
|
4
|
+
import { join } from "node:path";
|
|
5
|
+
import { createTestTempDirFromPath } from "../shared/test-temp-dir";
|
|
6
|
+
import { loadPluginConfigDetailed } from "./index";
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* A repository's project config may only tighten what the user configured. A
|
|
10
|
+
* wrong-typed or otherwise invalid project value used to replace the user's
|
|
11
|
+
* value in the raw deep merge; schema recovery then dropped the key and used
|
|
12
|
+
* the schema DEFAULT, so a cloned repo could reset user-only settings (turn
|
|
13
|
+
* compaction back on, unset the historian model, force a re-embed) or lower
|
|
14
|
+
* compaction thresholds. These cases pin that an invalid project value is
|
|
15
|
+
* ignored and the user's value survives.
|
|
16
|
+
*/
|
|
17
|
+
function loadUserAndProject(user: unknown, project: unknown) {
|
|
18
|
+
const xdg = createTestTempDirFromPath(join(tmpdir(), "mc-trust-user-"));
|
|
19
|
+
const projectDir = createTestTempDirFromPath(join(tmpdir(), "mc-trust-proj-"));
|
|
20
|
+
mkdirSync(join(xdg, "cortexkit"), { recursive: true });
|
|
21
|
+
mkdirSync(join(projectDir, ".cortexkit"), { recursive: true });
|
|
22
|
+
writeFileSync(join(xdg, "cortexkit", "magic-context.jsonc"), JSON.stringify(user), "utf-8");
|
|
23
|
+
writeFileSync(
|
|
24
|
+
join(projectDir, ".cortexkit", "magic-context.jsonc"),
|
|
25
|
+
JSON.stringify(project),
|
|
26
|
+
"utf-8",
|
|
27
|
+
);
|
|
28
|
+
const origXdg = process.env.XDG_CONFIG_HOME;
|
|
29
|
+
process.env.XDG_CONFIG_HOME = xdg;
|
|
30
|
+
try {
|
|
31
|
+
return loadPluginConfigDetailed(projectDir, false);
|
|
32
|
+
} finally {
|
|
33
|
+
if (origXdg === undefined) delete process.env.XDG_CONFIG_HOME;
|
|
34
|
+
else process.env.XDG_CONFIG_HOME = origXdg;
|
|
35
|
+
rmSync(xdg, { recursive: true, force: true });
|
|
36
|
+
rmSync(projectDir, { recursive: true, force: true });
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
describe("project config cannot reset user settings with a wrong-typed parent block", () => {
|
|
41
|
+
it("keeps the user's compaction block when the project sets compaction:false", () => {
|
|
42
|
+
const loaded = loadUserAndProject(
|
|
43
|
+
{ compaction: { enabled: false } },
|
|
44
|
+
{ compaction: false },
|
|
45
|
+
);
|
|
46
|
+
expect(loaded.config.compaction).toMatchObject({ enabled: false });
|
|
47
|
+
expect(loaded.config.configWarnings?.join("\n")).toContain("compaction");
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("keeps the user's historian model when the project sets historian:1", () => {
|
|
51
|
+
const loaded = loadUserAndProject(
|
|
52
|
+
{ historian: { opencode: { model: "anthropic/claude-x" } } },
|
|
53
|
+
{ historian: 1 },
|
|
54
|
+
);
|
|
55
|
+
expect(loaded.config.historian?.opencode?.model).toBe("anthropic/claude-x");
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
it("keeps the user's embedding provider when the project sets embedding:'x'", () => {
|
|
59
|
+
const loaded = loadUserAndProject(
|
|
60
|
+
{
|
|
61
|
+
embedding: {
|
|
62
|
+
provider: "openai-compatible",
|
|
63
|
+
endpoint: "https://fixture.example/v1",
|
|
64
|
+
model: "fixture-model",
|
|
65
|
+
},
|
|
66
|
+
},
|
|
67
|
+
{ embedding: "x" },
|
|
68
|
+
);
|
|
69
|
+
expect(loaded.config.embedding).toMatchObject({
|
|
70
|
+
provider: "openai-compatible",
|
|
71
|
+
endpoint: "https://fixture.example/v1",
|
|
72
|
+
model: "fixture-model",
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
|
|
76
|
+
it("keeps storage.enforce_private_permissions:false when the project sets storage:0", () => {
|
|
77
|
+
const loaded = loadUserAndProject(
|
|
78
|
+
{ storage: { enforce_private_permissions: false } },
|
|
79
|
+
{ storage: 0 },
|
|
80
|
+
);
|
|
81
|
+
expect(loaded.config.storage?.enforce_private_permissions).toBe(false);
|
|
82
|
+
});
|
|
83
|
+
|
|
84
|
+
it("keeps the user's prompt_surface override when the project sets prompt_surface:1", () => {
|
|
85
|
+
const loaded = loadUserAndProject(
|
|
86
|
+
{ prompt_surface: { default: "light" } },
|
|
87
|
+
{ prompt_surface: 1 },
|
|
88
|
+
);
|
|
89
|
+
expect(loaded.config.prompt_surface).toMatchObject({ default: "light" });
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it("keeps the user's nested leaf when the project gives that leaf a wrong type", () => {
|
|
93
|
+
const loaded = loadUserAndProject(
|
|
94
|
+
{ memory: { auto_search: { enabled: false } } },
|
|
95
|
+
{ memory: { auto_search: { enabled: "nope" } } },
|
|
96
|
+
);
|
|
97
|
+
expect(loaded.config.memory?.auto_search?.enabled).toBe(false);
|
|
98
|
+
});
|
|
99
|
+
|
|
100
|
+
it("still applies a valid project value next to an invalid one", () => {
|
|
101
|
+
const loaded = loadUserAndProject(
|
|
102
|
+
{ compaction: { enabled: false }, cache_ttl: "5m" },
|
|
103
|
+
{ compaction: false, cache_ttl: "1h" },
|
|
104
|
+
);
|
|
105
|
+
expect(loaded.config.compaction).toMatchObject({ enabled: false });
|
|
106
|
+
expect(loaded.config.cache_ttl).toBe("1h");
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it("reports the ignored project value as schema recovery", () => {
|
|
110
|
+
const loaded = loadUserAndProject(
|
|
111
|
+
{ compaction: { enabled: false } },
|
|
112
|
+
{ compaction: false },
|
|
113
|
+
);
|
|
114
|
+
expect(loaded.recoveredTopLevelKeys).toContain("compaction");
|
|
115
|
+
expect(loaded.loadOutcome).toBe("schema-recovery");
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
|
|
119
|
+
describe("project config cannot lower compaction thresholds", () => {
|
|
120
|
+
it("does not lower a user threshold of 88 to a project value of 81", () => {
|
|
121
|
+
const loaded = loadUserAndProject(
|
|
122
|
+
{ execute_threshold_percentage: 88 },
|
|
123
|
+
{ execute_threshold_percentage: 81 },
|
|
124
|
+
);
|
|
125
|
+
expect(loaded.config.execute_threshold_percentage).toBe(88);
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
it("does not lower a per-model user threshold of 89 to a project value of 82", () => {
|
|
129
|
+
const loaded = loadUserAndProject(
|
|
130
|
+
{ execute_threshold_percentage: { default: 70, "a/b": 89 } },
|
|
131
|
+
{ execute_threshold_percentage: { "a/b": 82 } },
|
|
132
|
+
);
|
|
133
|
+
expect(loaded.config.execute_threshold_percentage).toEqual({ default: 70, "a/b": 89 });
|
|
134
|
+
});
|
|
135
|
+
|
|
136
|
+
it("still raises the threshold to a valid project value above 80", () => {
|
|
137
|
+
const loaded = loadUserAndProject(
|
|
138
|
+
{ execute_threshold_percentage: 70 },
|
|
139
|
+
{ execute_threshold_percentage: 85 },
|
|
140
|
+
);
|
|
141
|
+
expect(loaded.config.execute_threshold_percentage).toBe(85);
|
|
142
|
+
});
|
|
143
|
+
|
|
144
|
+
it("keeps the user threshold of 80 when the project value 10 is invalid", () => {
|
|
145
|
+
const loaded = loadUserAndProject(
|
|
146
|
+
{ execute_threshold_percentage: 80 },
|
|
147
|
+
{ execute_threshold_percentage: 10 },
|
|
148
|
+
);
|
|
149
|
+
expect(loaded.config.execute_threshold_percentage).toBe(80);
|
|
150
|
+
});
|
|
151
|
+
|
|
152
|
+
it("keeps the user threshold when the project value is a string or an invalid object", () => {
|
|
153
|
+
for (const projectValue of ["x", { default: 5 }]) {
|
|
154
|
+
const loaded = loadUserAndProject(
|
|
155
|
+
{ execute_threshold_percentage: 80 },
|
|
156
|
+
{ execute_threshold_percentage: projectValue },
|
|
157
|
+
);
|
|
158
|
+
expect(loaded.config.execute_threshold_percentage).toBe(80);
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it("keeps the user's execute_threshold_tokens when the project sets a scalar", () => {
|
|
163
|
+
const loaded = loadUserAndProject(
|
|
164
|
+
{ execute_threshold_tokens: { default: 300_000 } },
|
|
165
|
+
{ execute_threshold_tokens: 5 },
|
|
166
|
+
);
|
|
167
|
+
expect(loaded.config.execute_threshold_tokens).toEqual({ default: 300_000 });
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
it("keeps the user's execute_threshold_tokens.default when the project value is out of range", () => {
|
|
171
|
+
const loaded = loadUserAndProject(
|
|
172
|
+
{ execute_threshold_tokens: { default: 300_000 } },
|
|
173
|
+
{ execute_threshold_tokens: { default: 10 } },
|
|
174
|
+
);
|
|
175
|
+
expect(loaded.config.execute_threshold_tokens).toEqual({ default: 300_000 });
|
|
176
|
+
});
|
|
177
|
+
});
|
|
178
|
+
|
|
179
|
+
describe("project command block", () => {
|
|
180
|
+
it("adds well-formed new commands but never replaces user or built-in ones", () => {
|
|
181
|
+
const loaded = loadUserAndProject(
|
|
182
|
+
{ command: { "my-cmd": { template: "user template" } } },
|
|
183
|
+
{
|
|
184
|
+
command: {
|
|
185
|
+
"my-cmd": { template: "repository template" },
|
|
186
|
+
"ctx-status": { template: "repository status" },
|
|
187
|
+
"repo-cmd": { template: "repository command", description: "from the repo" },
|
|
188
|
+
"bad-cmd": { template: 5 },
|
|
189
|
+
"no-template": { description: "missing template" },
|
|
190
|
+
},
|
|
191
|
+
},
|
|
192
|
+
);
|
|
193
|
+
expect(loaded.config.command).toEqual({
|
|
194
|
+
"my-cmd": { template: "user template" },
|
|
195
|
+
"repo-cmd": { template: "repository command", description: "from the repo" },
|
|
196
|
+
});
|
|
197
|
+
expect(loaded.config.configWarnings?.join("\n")).toContain("command.my-cmd");
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
it("ignores a project command block that is not an object", () => {
|
|
201
|
+
const loaded = loadUserAndProject(
|
|
202
|
+
{ command: { "my-cmd": { template: "user template" } } },
|
|
203
|
+
{ command: "nope" },
|
|
204
|
+
);
|
|
205
|
+
expect(loaded.config.command).toEqual({ "my-cmd": { template: "user template" } });
|
|
206
|
+
});
|
|
207
|
+
});
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
import { describe, expect, it } from "bun:test";
|
|
2
|
-
import { mkdirSync,
|
|
2
|
+
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
-
|
|
6
5
|
import { CANONICAL_DREAM_TASKS } from "../features/magic-context/dreamer/task-registry";
|
|
6
|
+
import { createTestTempDirFromPath } from "../shared/test-temp-dir";
|
|
7
7
|
import { loadPluginConfig } from "./index";
|
|
8
8
|
import { stripUnsafeProjectConfigFields } from "./project-security";
|
|
9
9
|
import {
|
|
@@ -339,8 +339,8 @@ function nestedMuralModelPaths(): string[] {
|
|
|
339
339
|
}
|
|
340
340
|
|
|
341
341
|
function loadWithUserAndProjectConfig(userConfigText: string, projectConfigText: string) {
|
|
342
|
-
const xdg =
|
|
343
|
-
const projectDir =
|
|
342
|
+
const xdg = createTestTempDirFromPath(join(tmpdir(), "mc-hostile-user-"));
|
|
343
|
+
const projectDir = createTestTempDirFromPath(join(tmpdir(), "mc-hostile-proj-"));
|
|
344
344
|
const configDir = join(xdg, "cortexkit");
|
|
345
345
|
mkdirSync(configDir, { recursive: true });
|
|
346
346
|
mkdirSync(join(projectDir, ".cortexkit"), { recursive: true });
|
|
@@ -203,8 +203,11 @@ function stripNestedMuralModels(
|
|
|
203
203
|
}
|
|
204
204
|
}
|
|
205
205
|
|
|
206
|
+
// Must match the schema's execute_threshold_percentage range (20-90). A narrower
|
|
207
|
+
// range here let a valid project value of 81-90 skip the raise-only clamp and
|
|
208
|
+
// reach the merged config as-is, lowering a higher user threshold.
|
|
206
209
|
function isValidPercentageThreshold(value: unknown): value is number {
|
|
207
|
-
return typeof value === "number" && Number.isFinite(value) && value >= 20 && value <=
|
|
210
|
+
return typeof value === "number" && Number.isFinite(value) && value >= 20 && value <= 90;
|
|
208
211
|
}
|
|
209
212
|
|
|
210
213
|
function isValidTokenThreshold(value: unknown): value is number {
|
|
@@ -896,3 +899,217 @@ export function dropInheritedEmbeddingKeyOnRedirect(
|
|
|
896
899
|
"exfiltration to a repository-chosen endpoint).",
|
|
897
900
|
];
|
|
898
901
|
}
|
|
902
|
+
|
|
903
|
+
/** Path of a schema issue in the merged raw config, e.g. ["compaction", "enabled"]. */
|
|
904
|
+
export type ConfigIssuePath = readonly PropertyKey[];
|
|
905
|
+
|
|
906
|
+
/**
|
|
907
|
+
* Shortest prefix of `issuePath` whose value the PROJECT tier supplied, or
|
|
908
|
+
* undefined when the invalid value did not come from the project. The raw merge
|
|
909
|
+
* recurses only into plain objects on both sides, so the project owns the value
|
|
910
|
+
* at the first prefix where its node is not a plain object (a scalar, array or
|
|
911
|
+
* null replaces the user's value whole), or at the full issue path.
|
|
912
|
+
*/
|
|
913
|
+
function projectContributionPath(
|
|
914
|
+
projectRaw: Record<string, unknown>,
|
|
915
|
+
issuePath: ConfigIssuePath,
|
|
916
|
+
): ConfigIssuePath | undefined {
|
|
917
|
+
let node: unknown = projectRaw;
|
|
918
|
+
for (let index = 0; index < issuePath.length; index++) {
|
|
919
|
+
const segment = String(issuePath[index]);
|
|
920
|
+
if (!isPlainObject(node) || !Object.hasOwn(node, segment)) return undefined;
|
|
921
|
+
node = node[segment];
|
|
922
|
+
if (index === issuePath.length - 1 || !isPlainObject(node)) {
|
|
923
|
+
return issuePath.slice(0, index + 1);
|
|
924
|
+
}
|
|
925
|
+
}
|
|
926
|
+
return undefined;
|
|
927
|
+
}
|
|
928
|
+
|
|
929
|
+
/**
|
|
930
|
+
* The trusted value the project displaced along `contribution`, and where it
|
|
931
|
+
* sits. Walking down, the first trusted node that is not a plain object was
|
|
932
|
+
* replaced whole by the project's object (e.g. a user scalar threshold of 80
|
|
933
|
+
* under a project `{ default: 5 }`), so it is restored at that shorter path.
|
|
934
|
+
* Undefined when the trusted tier has no value there to protect.
|
|
935
|
+
*/
|
|
936
|
+
function displacedTrustedValue(
|
|
937
|
+
trustedRaw: Record<string, unknown>,
|
|
938
|
+
contribution: ConfigIssuePath,
|
|
939
|
+
): { path: ConfigIssuePath; value: unknown } | undefined {
|
|
940
|
+
let node: unknown = trustedRaw;
|
|
941
|
+
for (let index = 0; index < contribution.length; index++) {
|
|
942
|
+
const segment = String(contribution[index]);
|
|
943
|
+
if (!isPlainObject(node) || !Object.hasOwn(node, segment)) return undefined;
|
|
944
|
+
node = node[segment];
|
|
945
|
+
if (index === contribution.length - 1 || !isPlainObject(node)) {
|
|
946
|
+
return { path: contribution.slice(0, index + 1), value: node };
|
|
947
|
+
}
|
|
948
|
+
}
|
|
949
|
+
return undefined;
|
|
950
|
+
}
|
|
951
|
+
|
|
952
|
+
function defineOwnValue(target: Record<string, unknown>, key: string, value: unknown): void {
|
|
953
|
+
Object.defineProperty(target, key, {
|
|
954
|
+
value,
|
|
955
|
+
enumerable: true,
|
|
956
|
+
configurable: true,
|
|
957
|
+
writable: true,
|
|
958
|
+
});
|
|
959
|
+
}
|
|
960
|
+
|
|
961
|
+
/** Put `value` at `path` in `root`, copying each object on the way so objects
|
|
962
|
+
* shared with the trusted or project raw configs are never mutated. */
|
|
963
|
+
function writeOwnPath(root: Record<string, unknown>, path: ConfigIssuePath, value: unknown): void {
|
|
964
|
+
let node = root;
|
|
965
|
+
for (let index = 0; index < path.length - 1; index++) {
|
|
966
|
+
const segment = String(path[index]);
|
|
967
|
+
const child = node[segment];
|
|
968
|
+
if (!isPlainObject(child)) return;
|
|
969
|
+
const copy = { ...child };
|
|
970
|
+
defineOwnValue(node, segment, copy);
|
|
971
|
+
node = copy;
|
|
972
|
+
}
|
|
973
|
+
defineOwnValue(node, String(path[path.length - 1]), value);
|
|
974
|
+
}
|
|
975
|
+
|
|
976
|
+
/** Most rounds a single load can take; each round restores at least one path. */
|
|
977
|
+
const MAX_PROJECT_RESTORE_ROUNDS = 16;
|
|
978
|
+
|
|
979
|
+
/**
|
|
980
|
+
* After the project config is merged over the trusted (user + profile) config,
|
|
981
|
+
* put back the trusted value wherever an INVALID project value displaced it.
|
|
982
|
+
*
|
|
983
|
+
* Without this, a repository could reset user settings by writing a wrong type:
|
|
984
|
+
* `compaction: false` replaces the user's `compaction` block in the raw merge,
|
|
985
|
+
* the schema rejects it, and schema recovery drops the key and uses the schema
|
|
986
|
+
* default, so compaction turns back on, the historian loses its model, or the
|
|
987
|
+
* embedding provider flips and forces a full re-embed. A repository may only
|
|
988
|
+
* tighten what the user configured, so an invalid project value is ignored and
|
|
989
|
+
* the user's value stays. When the user has no value at that path, the project
|
|
990
|
+
* value is left for normal schema recovery, which already lands on the default
|
|
991
|
+
* the user would get anyway.
|
|
992
|
+
*
|
|
993
|
+
* `collectIssuePaths` runs the caller's own pre-schema migrations and schema
|
|
994
|
+
* check and returns every issue path (empty when the config is valid), so this
|
|
995
|
+
* stays aligned with the loader's real parse on every harness. `mergedRaw` is
|
|
996
|
+
* mutated in place.
|
|
997
|
+
*/
|
|
998
|
+
export function restoreTrustedValuesOverInvalidProjectValues(args: {
|
|
999
|
+
mergedRaw: Record<string, unknown>;
|
|
1000
|
+
trustedRaw: Record<string, unknown>;
|
|
1001
|
+
projectRaw: Record<string, unknown>;
|
|
1002
|
+
collectIssuePaths: (raw: Record<string, unknown>) => readonly ConfigIssuePath[];
|
|
1003
|
+
}): { warnings: string[]; restoredTopLevelKeys: string[] } {
|
|
1004
|
+
const warnings: string[] = [];
|
|
1005
|
+
const restoredTopLevelKeys = new Set<string>();
|
|
1006
|
+
const restored = new Set<string>();
|
|
1007
|
+
|
|
1008
|
+
for (let round = 0; round < MAX_PROJECT_RESTORE_ROUNDS; round++) {
|
|
1009
|
+
let changed = false;
|
|
1010
|
+
for (const issuePath of args.collectIssuePaths(args.mergedRaw)) {
|
|
1011
|
+
const contribution = projectContributionPath(args.projectRaw, issuePath);
|
|
1012
|
+
if (contribution === undefined || contribution.length === 0) continue;
|
|
1013
|
+
const trusted = displacedTrustedValue(args.trustedRaw, contribution);
|
|
1014
|
+
if (trusted === undefined) continue;
|
|
1015
|
+
const key = trusted.path.map(String).join(".");
|
|
1016
|
+
// Already restored: any remaining issue there is in the user's own
|
|
1017
|
+
// value, which normal schema recovery handles.
|
|
1018
|
+
if (restored.has(key)) continue;
|
|
1019
|
+
writeOwnPath(args.mergedRaw, trusted.path, trusted.value);
|
|
1020
|
+
restored.add(key);
|
|
1021
|
+
restoredTopLevelKeys.add(String(trusted.path[0]));
|
|
1022
|
+
changed = true;
|
|
1023
|
+
warnings.push(
|
|
1024
|
+
`Ignoring invalid ${key} from project config and keeping the user-level value (security: a repository cannot reset user settings by supplying an invalid value).`,
|
|
1025
|
+
);
|
|
1026
|
+
}
|
|
1027
|
+
if (!changed) break;
|
|
1028
|
+
}
|
|
1029
|
+
|
|
1030
|
+
return { warnings, restoredTopLevelKeys: [...restoredTopLevelKeys] };
|
|
1031
|
+
}
|
|
1032
|
+
|
|
1033
|
+
const PROJECT_COMMAND_STRING_FIELDS = ["description", "agent", "model"] as const;
|
|
1034
|
+
|
|
1035
|
+
/** A well-formed command entry with only the fields the command config uses. */
|
|
1036
|
+
function wellFormedCommand(value: unknown): Record<string, unknown> | undefined {
|
|
1037
|
+
if (!isPlainObject(value)) return undefined;
|
|
1038
|
+
if (typeof value.template !== "string" || value.template.trim().length === 0) return undefined;
|
|
1039
|
+
const command: Record<string, unknown> = { template: value.template };
|
|
1040
|
+
for (const field of PROJECT_COMMAND_STRING_FIELDS) {
|
|
1041
|
+
if (value[field] === undefined) continue;
|
|
1042
|
+
if (typeof value[field] !== "string") return undefined;
|
|
1043
|
+
command[field] = value[field];
|
|
1044
|
+
}
|
|
1045
|
+
if (value.subtask !== undefined) {
|
|
1046
|
+
if (typeof value.subtask !== "boolean") return undefined;
|
|
1047
|
+
command.subtask = value.subtask;
|
|
1048
|
+
}
|
|
1049
|
+
return command;
|
|
1050
|
+
}
|
|
1051
|
+
|
|
1052
|
+
/**
|
|
1053
|
+
* Rebuild the merged `command` block so a repository may only ADD commands.
|
|
1054
|
+
*
|
|
1055
|
+
* The command block is not part of the schema; it is copied into the host's
|
|
1056
|
+
* command config after Magic Context's built-in commands. Merged as raw
|
|
1057
|
+
* config, a project could replace a command the user defined, shadow a
|
|
1058
|
+
* built-in /ctx-* command, wipe the user's commands with a non-object value,
|
|
1059
|
+
* or pass malformed entries to the host. Now the user's commands are kept as
|
|
1060
|
+
* they are, and a project entry is used only when it is well formed and its
|
|
1061
|
+
* name is neither a user command nor one of `reservedNames`. `mergedRaw` is
|
|
1062
|
+
* mutated in place.
|
|
1063
|
+
*/
|
|
1064
|
+
export function constrainProjectCommands(args: {
|
|
1065
|
+
mergedRaw: Record<string, unknown>;
|
|
1066
|
+
trustedRaw: Record<string, unknown>;
|
|
1067
|
+
projectRaw: Record<string, unknown>;
|
|
1068
|
+
reservedNames: readonly string[];
|
|
1069
|
+
}): string[] {
|
|
1070
|
+
if (!("command" in args.projectRaw)) return [];
|
|
1071
|
+
const warnings: string[] = [];
|
|
1072
|
+
const trustedCommands = isPlainObject(args.trustedRaw.command)
|
|
1073
|
+
? args.trustedRaw.command
|
|
1074
|
+
: undefined;
|
|
1075
|
+
const merged: Record<string, unknown> = { ...(trustedCommands ?? {}) };
|
|
1076
|
+
const projectCommands = args.projectRaw.command;
|
|
1077
|
+
|
|
1078
|
+
if (!isPlainObject(projectCommands)) {
|
|
1079
|
+
warnings.push(
|
|
1080
|
+
"Ignoring command from project config (it must be an object of named commands).",
|
|
1081
|
+
);
|
|
1082
|
+
} else {
|
|
1083
|
+
for (const [name, value] of Object.entries(projectCommands)) {
|
|
1084
|
+
if (trustedCommands && Object.hasOwn(trustedCommands, name)) {
|
|
1085
|
+
warnings.push(
|
|
1086
|
+
`Ignoring command.${name} from project config (security: a repository cannot replace a command defined in user config).`,
|
|
1087
|
+
);
|
|
1088
|
+
continue;
|
|
1089
|
+
}
|
|
1090
|
+
if (args.reservedNames.includes(name)) {
|
|
1091
|
+
warnings.push(
|
|
1092
|
+
`Ignoring command.${name} from project config (security: a repository cannot replace a built-in Magic Context command).`,
|
|
1093
|
+
);
|
|
1094
|
+
continue;
|
|
1095
|
+
}
|
|
1096
|
+
const command = wellFormedCommand(value);
|
|
1097
|
+
if (!command) {
|
|
1098
|
+
warnings.push(
|
|
1099
|
+
`Ignoring command.${name} from project config (it needs a non-empty string template; description, agent and model must be strings and subtask a boolean).`,
|
|
1100
|
+
);
|
|
1101
|
+
continue;
|
|
1102
|
+
}
|
|
1103
|
+
Object.defineProperty(merged, name, {
|
|
1104
|
+
value: command,
|
|
1105
|
+
enumerable: true,
|
|
1106
|
+
configurable: true,
|
|
1107
|
+
writable: true,
|
|
1108
|
+
});
|
|
1109
|
+
}
|
|
1110
|
+
}
|
|
1111
|
+
|
|
1112
|
+
if (Object.keys(merged).length === 0) delete args.mergedRaw.command;
|
|
1113
|
+
else args.mergedRaw.command = merged;
|
|
1114
|
+
return warnings;
|
|
1115
|
+
}
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
/// <reference types="bun-types" />
|
|
2
2
|
|
|
3
|
-
import { describe, expect, it } from "bun:test";
|
|
3
|
+
import { describe, expect, it, spyOn } from "bun:test";
|
|
4
4
|
import { readFileSync } from "node:fs";
|
|
5
5
|
import { resolve } from "node:path";
|
|
6
|
+
import * as logger from "../shared/logger";
|
|
6
7
|
import { parsePluginConfig, resetProtectedTagsDeprecationWarningForTest } from "./index";
|
|
7
8
|
import { constrainProjectThresholdOverrides } from "./project-security";
|
|
8
9
|
import { deriveDefaultProtectedTokens, MagicContextConfigSchema } from "./schema/magic-context";
|
|
@@ -248,9 +249,13 @@ describe("protected_tokens config and derivation", () => {
|
|
|
248
249
|
|
|
249
250
|
it("emits a once-per-process loud deprecation warning naming the replacement", () => {
|
|
250
251
|
resetProtectedTagsDeprecationWarningForTest();
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
252
|
+
// The once-per-process line goes to the plugin log; the host passes
|
|
253
|
+
// console output straight to the operator's terminal.
|
|
254
|
+
const logged = spyOn(logger, "log");
|
|
255
|
+
const warnCalls = () =>
|
|
256
|
+
logged.mock.calls
|
|
257
|
+
.map(([message]) => message)
|
|
258
|
+
.filter((message) => message.includes("protected_tags is deprecated"));
|
|
254
259
|
|
|
255
260
|
try {
|
|
256
261
|
const res1 = parsePluginConfig({ protected_tags: 20 });
|
|
@@ -261,14 +266,14 @@ describe("protected_tokens config and derivation", () => {
|
|
|
261
266
|
),
|
|
262
267
|
),
|
|
263
268
|
).toBe(true);
|
|
264
|
-
expect(warnCalls).toHaveLength(1);
|
|
265
|
-
expect(warnCalls[0]).toContain("protected_tokens");
|
|
269
|
+
expect(warnCalls()).toHaveLength(1);
|
|
270
|
+
expect(warnCalls()[0]).toContain("protected_tokens");
|
|
266
271
|
|
|
267
|
-
// Second parse in same process must NOT log
|
|
272
|
+
// Second parse in same process must NOT log again
|
|
268
273
|
parsePluginConfig({ protected_tags: 10 });
|
|
269
|
-
expect(warnCalls).toHaveLength(1);
|
|
274
|
+
expect(warnCalls()).toHaveLength(1);
|
|
270
275
|
} finally {
|
|
271
|
-
|
|
276
|
+
logged.mockRestore();
|
|
272
277
|
}
|
|
273
278
|
});
|
|
274
279
|
});
|
|
@@ -1,24 +1,26 @@
|
|
|
1
1
|
import { afterEach, describe, expect, it } from "bun:test";
|
|
2
2
|
import {
|
|
3
3
|
chmodSync,
|
|
4
|
-
|
|
4
|
+
lstatSync,
|
|
5
5
|
readdirSync,
|
|
6
6
|
readFileSync,
|
|
7
|
+
readlinkSync,
|
|
7
8
|
rmSync,
|
|
8
9
|
statSync,
|
|
10
|
+
symlinkSync,
|
|
9
11
|
writeFileSync,
|
|
10
12
|
} from "node:fs";
|
|
11
13
|
import { tmpdir } from "node:os";
|
|
12
14
|
import { join } from "node:path";
|
|
13
|
-
|
|
14
15
|
import { parseJsonc } from "../shared/jsonc-parser";
|
|
16
|
+
import { createTestTempDirFromPath } from "../shared/test-temp-dir";
|
|
15
17
|
import { hasFlatKeys, loadRawConfigFile, migrateFlatDetailed } from "./raw-loader";
|
|
16
18
|
import { PER_HARNESS_MIGRATION_INVENTORY } from "./schema/magic-context";
|
|
17
19
|
|
|
18
20
|
const temporaryDirectories: string[] = [];
|
|
19
21
|
|
|
20
22
|
function temporaryDirectory(): string {
|
|
21
|
-
const directory =
|
|
23
|
+
const directory = createTestTempDirFromPath(join(tmpdir(), "mc-per-harness-"));
|
|
22
24
|
temporaryDirectories.push(directory);
|
|
23
25
|
return directory;
|
|
24
26
|
}
|
|
@@ -373,6 +375,32 @@ describe("per-harness raw config migration", () => {
|
|
|
373
375
|
expect(statSync(backupPath).ino).toBe(backupInode);
|
|
374
376
|
});
|
|
375
377
|
|
|
378
|
+
// stow, chezmoi and home-manager link the user config into a dotfiles repo.
|
|
379
|
+
// Replacing the link with a regular file would silently stop later edits
|
|
380
|
+
// from reaching that repo, so the migration writes through to the target.
|
|
381
|
+
it("keeps a symlinked user config a symlink and migrates its target", () => {
|
|
382
|
+
const directory = temporaryDirectory();
|
|
383
|
+
const dotfiles = temporaryDirectory();
|
|
384
|
+
const targetPath = join(dotfiles, "magic-context.jsonc");
|
|
385
|
+
const configPath = join(directory, "magic-context.jsonc");
|
|
386
|
+
const original = Buffer.from('{ "historian": { "model": "provider/model" } }\n');
|
|
387
|
+
writeFileSync(targetPath, original);
|
|
388
|
+
chmodSync(targetPath, 0o600);
|
|
389
|
+
symlinkSync(targetPath, configPath);
|
|
390
|
+
|
|
391
|
+
const loaded = loadRawConfigFile({ configPath, tier: "user" });
|
|
392
|
+
|
|
393
|
+
expect(loaded?.migrated).toBe(true);
|
|
394
|
+
expect(lstatSync(configPath).isSymbolicLink()).toBe(true);
|
|
395
|
+
expect(readlinkSync(configPath)).toBe(targetPath);
|
|
396
|
+
expect(readFileSync(targetPath)).toEqual(loaded?.bytes);
|
|
397
|
+
expect(hasFlatKeys(readFileSync(targetPath))).toBe(false);
|
|
398
|
+
expect(statSync(targetPath).mode & 0o777).toBe(0o600);
|
|
399
|
+
expect(readFileSync(`${configPath}.pre-per-harness.bak`)).toEqual(original);
|
|
400
|
+
expect(readdirSync(dotfiles).filter((name) => name.endsWith(".tmp"))).toEqual([]);
|
|
401
|
+
expect(readdirSync(directory).filter((name) => name.endsWith(".tmp"))).toEqual([]);
|
|
402
|
+
});
|
|
403
|
+
|
|
376
404
|
it("reloads the winning candidate when a concurrent loader replaces the target", () => {
|
|
377
405
|
const directory = temporaryDirectory();
|
|
378
406
|
const configPath = join(directory, "magic-context.jsonc");
|