@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,5 +1,5 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
2
|
-
import {
|
|
2
|
+
import { rmSync } from "node:fs";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
5
|
import {
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
resolveLimit,
|
|
23
23
|
setOutputReserveConfig,
|
|
24
24
|
} from "./models-dev-cache";
|
|
25
|
+
import { createTestTempDirFromPath } from "./test-temp-dir";
|
|
25
26
|
|
|
26
27
|
/**
|
|
27
28
|
* Model context limits resolve from OpenCode's SDK only (`config.providers()`),
|
|
@@ -137,7 +138,7 @@ describe("models-dev-cache (SDK-only)", () => {
|
|
|
137
138
|
}
|
|
138
139
|
|
|
139
140
|
beforeEach(() => {
|
|
140
|
-
tempDir =
|
|
141
|
+
tempDir = createTestTempDirFromPath(join(tmpdir(), "mc-models-dev-"));
|
|
141
142
|
// Isolate the persisted-cache file under a temp data dir so tests never
|
|
142
143
|
// touch the real ~/.local/share/cortexkit/magic-context cache.
|
|
143
144
|
originalXdgData = process.env.XDG_DATA_HOME;
|
|
@@ -646,3 +647,74 @@ describe("getSdkContextLimit prompt_only pre-carve arm", () => {
|
|
|
646
647
|
).toBe(167000);
|
|
647
648
|
});
|
|
648
649
|
});
|
|
650
|
+
|
|
651
|
+
describe("prompt_only detected limit above a declared input cap", () => {
|
|
652
|
+
beforeEach(() => clearModelsDevCache());
|
|
653
|
+
afterEach(() => clearModelsDevCache());
|
|
654
|
+
|
|
655
|
+
const seed = () =>
|
|
656
|
+
refreshModelLimitsFromApi({
|
|
657
|
+
config: {
|
|
658
|
+
providers: async () => ({
|
|
659
|
+
data: {
|
|
660
|
+
providers: [
|
|
661
|
+
{
|
|
662
|
+
id: "anthropic",
|
|
663
|
+
models: {
|
|
664
|
+
"capped-model": {
|
|
665
|
+
limit: {
|
|
666
|
+
context: 400_000,
|
|
667
|
+
input: 272_000,
|
|
668
|
+
output: 128_000,
|
|
669
|
+
},
|
|
670
|
+
},
|
|
671
|
+
},
|
|
672
|
+
},
|
|
673
|
+
],
|
|
674
|
+
},
|
|
675
|
+
}),
|
|
676
|
+
},
|
|
677
|
+
});
|
|
678
|
+
|
|
679
|
+
test("baseline: no detection resolves to the declared cap", async () => {
|
|
680
|
+
await seed();
|
|
681
|
+
expect(getSdkContextLimit("anthropic", "capped-model")).toBe(272_000);
|
|
682
|
+
});
|
|
683
|
+
|
|
684
|
+
test("reservation none keeps the declared cap", async () => {
|
|
685
|
+
await seed();
|
|
686
|
+
expect(
|
|
687
|
+
getSdkContextLimit("anthropic", "capped-model", 1_000_000, {
|
|
688
|
+
detectedLimitProvenance: "prompt_only",
|
|
689
|
+
reservation: "none",
|
|
690
|
+
}),
|
|
691
|
+
).toBe(272_000);
|
|
692
|
+
});
|
|
693
|
+
|
|
694
|
+
test("combined keeps the declared cap", async () => {
|
|
695
|
+
await seed();
|
|
696
|
+
expect(
|
|
697
|
+
getSdkContextLimit("anthropic", "capped-model", 1_000_000, {
|
|
698
|
+
detectedLimitProvenance: "combined",
|
|
699
|
+
}),
|
|
700
|
+
).toBe(272_000);
|
|
701
|
+
});
|
|
702
|
+
|
|
703
|
+
test("default arm: prompt_only keeps the declared cap", async () => {
|
|
704
|
+
await seed();
|
|
705
|
+
expect(
|
|
706
|
+
getSdkContextLimit("anthropic", "capped-model", 1_000_000, {
|
|
707
|
+
detectedLimitProvenance: "prompt_only",
|
|
708
|
+
}),
|
|
709
|
+
).toBe(272_000);
|
|
710
|
+
});
|
|
711
|
+
|
|
712
|
+
test("default arm: geometry usableSoft keeps the declared cap", async () => {
|
|
713
|
+
await seed();
|
|
714
|
+
const geometry = getSdkWindowGeometry("anthropic", "capped-model", 1_000_000, {
|
|
715
|
+
detectedLimitProvenance: "prompt_only",
|
|
716
|
+
});
|
|
717
|
+
expect(geometry?.usableSoft).toBe(272_000);
|
|
718
|
+
expect(geometry?.usableHard).toBeGreaterThanOrEqual(geometry?.usableSoft ?? 0);
|
|
719
|
+
});
|
|
720
|
+
});
|
|
@@ -533,7 +533,11 @@ export function getSdkWindowGeometry(
|
|
|
533
533
|
},
|
|
534
534
|
);
|
|
535
535
|
if (!result || promptOnlyDetected === undefined) return result;
|
|
536
|
-
|
|
536
|
+
// A declared input cap bounds the prompt wall; without one the wall is
|
|
537
|
+
// already pre-carved and may exceed the catalog-derived window.
|
|
538
|
+
const usableSoft = isFinitePositive(metadata.inputLimit)
|
|
539
|
+
? Math.min(promptOnlyDetected, result.usableSoft)
|
|
540
|
+
: promptOnlyDetected;
|
|
537
541
|
return {
|
|
538
542
|
...result,
|
|
539
543
|
usableSoft,
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { afterEach, describe, expect, test } from "bun:test";
|
|
2
|
+
import {
|
|
3
|
+
__resetOffThreadMigrationClockForTests,
|
|
4
|
+
beginOffThreadMigration,
|
|
5
|
+
startBootDeadline,
|
|
6
|
+
} from "./off-thread-migration-clock";
|
|
7
|
+
|
|
8
|
+
const sleep = (ms: number) => new Promise<void>((resolve) => setTimeout(resolve, ms));
|
|
9
|
+
|
|
10
|
+
async function expiredWithin(promise: Promise<void>, ms: number): Promise<boolean> {
|
|
11
|
+
return Promise.race([promise.then(() => true), sleep(ms).then(() => false)]);
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
describe("boot deadline that excludes off-thread migration time", () => {
|
|
15
|
+
afterEach(() => __resetOffThreadMigrationClockForTests());
|
|
16
|
+
|
|
17
|
+
test("expires on time when no migration runs", async () => {
|
|
18
|
+
const deadline = startBootDeadline(30);
|
|
19
|
+
expect(await expiredWithin(deadline.expired, 500)).toBe(true);
|
|
20
|
+
});
|
|
21
|
+
|
|
22
|
+
test("does not expire while a migration runs, and resumes counting afterwards", async () => {
|
|
23
|
+
let deferred = 0;
|
|
24
|
+
const deadline = startBootDeadline(40, () => {
|
|
25
|
+
deferred += 1;
|
|
26
|
+
});
|
|
27
|
+
const end = beginOffThreadMigration();
|
|
28
|
+
expect(await expiredWithin(deadline.expired, 150)).toBe(false);
|
|
29
|
+
expect(deferred).toBe(1);
|
|
30
|
+
|
|
31
|
+
const endedAt = performance.now();
|
|
32
|
+
end();
|
|
33
|
+
await deadline.expired;
|
|
34
|
+
// Only the few milliseconds before the migration began were counted, so
|
|
35
|
+
// nearly the whole 40ms budget is still left once it ends.
|
|
36
|
+
expect(performance.now() - endedAt).toBeGreaterThanOrEqual(25);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
test("time between migrations still counts", async () => {
|
|
40
|
+
const deadline = startBootDeadline(60);
|
|
41
|
+
await sleep(40);
|
|
42
|
+
const end = beginOffThreadMigration();
|
|
43
|
+
await sleep(80);
|
|
44
|
+
end();
|
|
45
|
+
const endedAt = performance.now();
|
|
46
|
+
await deadline.expired;
|
|
47
|
+
expect(performance.now() - endedAt).toBeLessThan(45);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
test("a cancelled deadline never expires", async () => {
|
|
51
|
+
const deadline = startBootDeadline(20);
|
|
52
|
+
deadline.cancel();
|
|
53
|
+
expect(await expiredWithin(deadline.expired, 100)).toBe(false);
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Boot deadlines that do not count time spent migrating the schema on a worker
|
|
3
|
+
* thread.
|
|
4
|
+
*
|
|
5
|
+
* Plugin startup bounds the storage open with a timer so a stuck open cannot
|
|
6
|
+
* hold the host's plugin loader forever. When migrations ran on the main thread
|
|
7
|
+
* that timer could not fire while a migration body ran, so in effect migration
|
|
8
|
+
* time never counted against the deadline, and a long first-start upgrade still
|
|
9
|
+
* ended with tools registered. Migrations now run on a worker thread and the
|
|
10
|
+
* timer stays live, so without this clock a long upgrade would trip the
|
|
11
|
+
* deadline and start the host without Magic Context tools. Excluding the
|
|
12
|
+
* worker's busy time keeps the previous outcome while the host's event loop
|
|
13
|
+
* keeps serving requests. Waits for another process's write lock still count,
|
|
14
|
+
* exactly as before, because the worker reports them as idle time.
|
|
15
|
+
*/
|
|
16
|
+
|
|
17
|
+
let activeMigrations = 0;
|
|
18
|
+
let activeSince = 0;
|
|
19
|
+
let accumulatedMs = 0;
|
|
20
|
+
let idleWaiters: Array<() => void> = [];
|
|
21
|
+
|
|
22
|
+
/** Total milliseconds any off-thread migration has been running, up to `now`. */
|
|
23
|
+
export function offThreadMigrationMs(now = performance.now()): number {
|
|
24
|
+
return accumulatedMs + (activeMigrations > 0 ? Math.max(0, now - activeSince) : 0);
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
export function isOffThreadMigrationRunning(): boolean {
|
|
28
|
+
return activeMigrations > 0;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Mark the start of off-thread migration work. The returned function marks its
|
|
33
|
+
* end; calling it more than once has no further effect.
|
|
34
|
+
*/
|
|
35
|
+
export function beginOffThreadMigration(): () => void {
|
|
36
|
+
if (activeMigrations === 0) activeSince = performance.now();
|
|
37
|
+
activeMigrations += 1;
|
|
38
|
+
let ended = false;
|
|
39
|
+
return () => {
|
|
40
|
+
if (ended) return;
|
|
41
|
+
ended = true;
|
|
42
|
+
activeMigrations -= 1;
|
|
43
|
+
if (activeMigrations > 0) return;
|
|
44
|
+
accumulatedMs += Math.max(0, performance.now() - activeSince);
|
|
45
|
+
const waiters = idleWaiters;
|
|
46
|
+
idleWaiters = [];
|
|
47
|
+
for (const wake of waiters) wake();
|
|
48
|
+
};
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
function whenOffThreadMigrationIdle(): Promise<void> {
|
|
52
|
+
if (activeMigrations === 0) return Promise.resolve();
|
|
53
|
+
return new Promise((resolve) => idleWaiters.push(resolve));
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
export interface BootDeadlineTimer {
|
|
57
|
+
/** Resolves once `timeoutMs` of non-migration time has passed. */
|
|
58
|
+
readonly expired: Promise<void>;
|
|
59
|
+
cancel(): void;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Start a deadline that expires after `timeoutMs` of elapsed time, not counting
|
|
64
|
+
* time during which an off-thread migration was running. `onDeferred` is called
|
|
65
|
+
* once, the first time the deadline would have expired but a migration was
|
|
66
|
+
* still running.
|
|
67
|
+
*/
|
|
68
|
+
export function startBootDeadline(timeoutMs: number, onDeferred?: () => void): BootDeadlineTimer {
|
|
69
|
+
const startedAt = performance.now();
|
|
70
|
+
const migratedAtStart = offThreadMigrationMs(startedAt);
|
|
71
|
+
const budgetMs = Math.max(0, timeoutMs);
|
|
72
|
+
let timer: ReturnType<typeof setTimeout> | undefined;
|
|
73
|
+
let cancelled = false;
|
|
74
|
+
let deferredReported = false;
|
|
75
|
+
let resolveExpired!: () => void;
|
|
76
|
+
const expired = new Promise<void>((resolve) => {
|
|
77
|
+
resolveExpired = resolve;
|
|
78
|
+
});
|
|
79
|
+
|
|
80
|
+
const remainingMs = (): number => {
|
|
81
|
+
const now = performance.now();
|
|
82
|
+
const countedMs = now - startedAt - (offThreadMigrationMs(now) - migratedAtStart);
|
|
83
|
+
return budgetMs - countedMs;
|
|
84
|
+
};
|
|
85
|
+
|
|
86
|
+
const check = (): void => {
|
|
87
|
+
timer = undefined;
|
|
88
|
+
if (cancelled) return;
|
|
89
|
+
if (isOffThreadMigrationRunning()) {
|
|
90
|
+
if (!deferredReported) {
|
|
91
|
+
deferredReported = true;
|
|
92
|
+
onDeferred?.();
|
|
93
|
+
}
|
|
94
|
+
void whenOffThreadMigrationIdle().then(check);
|
|
95
|
+
return;
|
|
96
|
+
}
|
|
97
|
+
const left = remainingMs();
|
|
98
|
+
if (left > 0) {
|
|
99
|
+
timer = setTimeout(check, left);
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
102
|
+
resolveExpired();
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
timer = setTimeout(check, budgetMs);
|
|
106
|
+
return {
|
|
107
|
+
expired,
|
|
108
|
+
cancel: () => {
|
|
109
|
+
cancelled = true;
|
|
110
|
+
if (timer) clearTimeout(timer);
|
|
111
|
+
timer = undefined;
|
|
112
|
+
},
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Test seam: forget accumulated migration time between isolated tests. */
|
|
117
|
+
export function __resetOffThreadMigrationClockForTests(): void {
|
|
118
|
+
activeMigrations = 0;
|
|
119
|
+
activeSince = 0;
|
|
120
|
+
accumulatedMs = 0;
|
|
121
|
+
const waiters = idleWaiters;
|
|
122
|
+
idleWaiters = [];
|
|
123
|
+
for (const wake of waiters) wake();
|
|
124
|
+
}
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
/// <reference types="bun-types" />
|
|
2
2
|
|
|
3
3
|
import { afterEach, describe, expect, it } from "bun:test";
|
|
4
|
-
import { mkdirSync,
|
|
4
|
+
import { mkdirSync, rmSync, unlinkSync, utimesSync, writeFileSync } from "node:fs";
|
|
5
5
|
import { tmpdir } from "node:os";
|
|
6
6
|
import { join } from "node:path";
|
|
7
7
|
import {
|
|
@@ -17,6 +17,7 @@ import {
|
|
|
17
17
|
sourceOpenCodeDatabaseFilename,
|
|
18
18
|
} from "./opencode-db-path";
|
|
19
19
|
import { Database } from "./sqlite";
|
|
20
|
+
import { createTestTempDirFromPath } from "./test-temp-dir";
|
|
20
21
|
|
|
21
22
|
const ORIGINAL_ENV = {
|
|
22
23
|
XDG_DATA_HOME: process.env.XDG_DATA_HOME,
|
|
@@ -42,7 +43,7 @@ afterEach(() => {
|
|
|
42
43
|
});
|
|
43
44
|
|
|
44
45
|
function useDataHome(): { dataHome: string; openCodeDir: string } {
|
|
45
|
-
const dataHome =
|
|
46
|
+
const dataHome = createTestTempDirFromPath(join(tmpdir(), "opencode-db-path-"));
|
|
46
47
|
const openCodeDir = join(dataHome, "opencode");
|
|
47
48
|
mkdirSync(openCodeDir, { recursive: true });
|
|
48
49
|
tempDirs.push(dataHome);
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { existsSync, readFileSync } from "node:fs";
|
|
2
|
+
import { dirname, join } from "node:path";
|
|
3
|
+
import { fileURLToPath } from "node:url";
|
|
4
|
+
|
|
5
|
+
const PACKAGE_NAME = "@cortexkit/opencode-magic-context";
|
|
6
|
+
|
|
7
|
+
let cachedVersion: string | null | undefined;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Version of the Magic Context package this code was loaded from.
|
|
11
|
+
*
|
|
12
|
+
* The server and the TUI each call this from their own loaded copy, and the
|
|
13
|
+
* status RPC carries the server's answer to the TUI. After an update the two
|
|
14
|
+
* can differ (OpenCode keeps running the copy it started with), and comparing
|
|
15
|
+
* the two values is how the status dialog tells the user to restart.
|
|
16
|
+
*
|
|
17
|
+
* Found by walking up from this module to the nearest `package.json` carrying
|
|
18
|
+
* the package's name, which works for the source tree, the built `dist/`
|
|
19
|
+
* bundle and an npm cache install alike. Null when no such file is readable.
|
|
20
|
+
*/
|
|
21
|
+
export function pluginPackageVersion(moduleUrl: string = import.meta.url): string | null {
|
|
22
|
+
const useCache = moduleUrl === import.meta.url;
|
|
23
|
+
if (useCache && cachedVersion !== undefined) return cachedVersion;
|
|
24
|
+
let found: string | null = null;
|
|
25
|
+
try {
|
|
26
|
+
let directory = dirname(fileURLToPath(moduleUrl));
|
|
27
|
+
for (let depth = 0; depth < 10; depth++) {
|
|
28
|
+
const candidate = join(directory, "package.json");
|
|
29
|
+
if (existsSync(candidate)) {
|
|
30
|
+
const parsed: unknown = JSON.parse(readFileSync(candidate, "utf8"));
|
|
31
|
+
if (
|
|
32
|
+
typeof parsed === "object" &&
|
|
33
|
+
parsed !== null &&
|
|
34
|
+
"name" in parsed &&
|
|
35
|
+
parsed.name === PACKAGE_NAME &&
|
|
36
|
+
"version" in parsed &&
|
|
37
|
+
typeof parsed.version === "string"
|
|
38
|
+
) {
|
|
39
|
+
found = parsed.version;
|
|
40
|
+
break;
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
const parent = dirname(directory);
|
|
44
|
+
if (parent === directory) break;
|
|
45
|
+
directory = parent;
|
|
46
|
+
}
|
|
47
|
+
} catch {
|
|
48
|
+
// An unreadable or unparsable manifest leaves the version unknown.
|
|
49
|
+
}
|
|
50
|
+
if (useCache) cachedVersion = found;
|
|
51
|
+
return found;
|
|
52
|
+
}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The RPC server files its discovery record under `projectHash(directory)` and
|
|
3
|
+
* the TUI looks it up with its own spelling of the same directory. Each pair
|
|
4
|
+
* below is one directory spelled two ways that hosts really produce; both must
|
|
5
|
+
* hash to the same discovery directory, or the TUI finds no server and the
|
|
6
|
+
* sidebar reads zero.
|
|
7
|
+
*/
|
|
8
|
+
import { afterEach, describe, expect, test } from "bun:test";
|
|
9
|
+
import { mkdirSync, realpathSync, rmSync, symlinkSync } from "node:fs";
|
|
10
|
+
import { tmpdir } from "node:os";
|
|
11
|
+
import { join } from "node:path";
|
|
12
|
+
import {
|
|
13
|
+
__setCanonicalDirectoryRealpathForTests,
|
|
14
|
+
canonicalProjectDirectory,
|
|
15
|
+
projectDirectoryKey,
|
|
16
|
+
} from "./project-directory-key";
|
|
17
|
+
import { projectHash, rpcPortDirsForLookup } from "./rpc-utils";
|
|
18
|
+
import { createTestTempDirFromPath } from "./test-temp-dir";
|
|
19
|
+
|
|
20
|
+
const created: string[] = [];
|
|
21
|
+
|
|
22
|
+
afterEach(() => {
|
|
23
|
+
__setCanonicalDirectoryRealpathForTests();
|
|
24
|
+
for (const dir of created.splice(0)) rmSync(dir, { recursive: true, force: true });
|
|
25
|
+
});
|
|
26
|
+
|
|
27
|
+
const WINDOWS_PAIRS: Array<[string, string, string]> = [
|
|
28
|
+
[
|
|
29
|
+
"drive-letter case",
|
|
30
|
+
"C:\\Users\\Amministratore\\Pictures\\TGroup",
|
|
31
|
+
"c:\\Users\\Amministratore\\Pictures\\TGroup",
|
|
32
|
+
],
|
|
33
|
+
[
|
|
34
|
+
"separators",
|
|
35
|
+
"C:\\Users\\Amministratore\\Pictures\\TGroup",
|
|
36
|
+
"C:/Users/Amministratore/Pictures/TGroup",
|
|
37
|
+
],
|
|
38
|
+
[
|
|
39
|
+
"trailing separator",
|
|
40
|
+
"C:\\Users\\Amministratore\\Pictures\\TGroup",
|
|
41
|
+
"C:\\Users\\Amministratore\\Pictures\\TGroup\\",
|
|
42
|
+
],
|
|
43
|
+
[
|
|
44
|
+
"long-path prefix",
|
|
45
|
+
"C:\\Users\\Amministratore\\Pictures\\TGroup",
|
|
46
|
+
"\\\\?\\C:\\Users\\Amministratore\\Pictures\\TGroup",
|
|
47
|
+
],
|
|
48
|
+
[
|
|
49
|
+
"name case",
|
|
50
|
+
"C:\\Users\\Amministratore\\Pictures\\TGroup",
|
|
51
|
+
"C:\\USERS\\amministratore\\pictures\\tgroup",
|
|
52
|
+
],
|
|
53
|
+
["UNC long-path prefix", "\\\\server\\share\\TGroup", "\\\\?\\UNC\\server\\share\\TGroup"],
|
|
54
|
+
];
|
|
55
|
+
|
|
56
|
+
describe("one discovery directory per project directory", () => {
|
|
57
|
+
for (const [name, left, right] of WINDOWS_PAIRS) {
|
|
58
|
+
test(`Windows ${name}`, () => {
|
|
59
|
+
expect(projectDirectoryKey(left)).toBe(projectDirectoryKey(right));
|
|
60
|
+
expect(projectHash(left)).toBe(projectHash(right));
|
|
61
|
+
});
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
test("Windows 8.3 short name resolves through the filesystem's realpath", () => {
|
|
65
|
+
// realpathSync.native expands short names on Windows; this host cannot
|
|
66
|
+
// create one, so the realpath is stood in for.
|
|
67
|
+
const long = "C:\\Users\\Amministratore\\Pictures\\Camera Roll\\VikStudio\\TGroup";
|
|
68
|
+
const short = "C:\\Users\\AMMINI~1\\Pictures\\CAMERA~1\\VikStudio\\TGroup";
|
|
69
|
+
__setCanonicalDirectoryRealpathForTests((directory) => {
|
|
70
|
+
if (directory === short || directory === long) return long;
|
|
71
|
+
throw new Error("ENOENT");
|
|
72
|
+
});
|
|
73
|
+
expect(canonicalProjectDirectory(short)).toBe(canonicalProjectDirectory(long));
|
|
74
|
+
expect(projectHash(short)).toBe(projectHash(long));
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
test("macOS /var and /private/var", () => {
|
|
78
|
+
const raw = createTestTempDirFromPath(join(tmpdir(), "mc-key-var-"));
|
|
79
|
+
created.push(raw);
|
|
80
|
+
const real = realpathSync(raw);
|
|
81
|
+
if (process.platform === "darwin") expect(real.startsWith("/private/")).toBe(true);
|
|
82
|
+
expect(projectHash(raw)).toBe(projectHash(real));
|
|
83
|
+
});
|
|
84
|
+
|
|
85
|
+
test("a symlinked directory and its target", () => {
|
|
86
|
+
const root = realpathSync(createTestTempDirFromPath(join(tmpdir(), "mc-key-link-")));
|
|
87
|
+
created.push(root);
|
|
88
|
+
const target = join(root, "Pictures", "project");
|
|
89
|
+
mkdirSync(target, { recursive: true });
|
|
90
|
+
const link = join(root, "linked-project");
|
|
91
|
+
symlinkSync(target, link);
|
|
92
|
+
expect(projectHash(link)).toBe(projectHash(target));
|
|
93
|
+
});
|
|
94
|
+
|
|
95
|
+
test("POSIX trailing slash", () => {
|
|
96
|
+
const root = realpathSync(createTestTempDirFromPath(join(tmpdir(), "mc-key-slash-")));
|
|
97
|
+
created.push(root);
|
|
98
|
+
expect(projectHash(`${root}/`)).toBe(projectHash(root));
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
test("different directories still get different discovery directories", () => {
|
|
102
|
+
expect(projectHash("C:\\Users\\A\\one")).not.toBe(projectHash("C:\\Users\\A\\two"));
|
|
103
|
+
expect(projectHash("/tmp/does-not-exist-a")).not.toBe(projectHash("/tmp/does-not-exist-b"));
|
|
104
|
+
});
|
|
105
|
+
|
|
106
|
+
test("lookups also read the pre-canonical directory older servers wrote", () => {
|
|
107
|
+
const dirs = rpcPortDirsForLookup("/storage", "C:\\Users\\A\\Proj\\");
|
|
108
|
+
expect(dirs).toHaveLength(2);
|
|
109
|
+
expect(dirs[0]).toBe(join("/storage", "rpc", projectHash("C:\\Users\\A\\Proj\\")));
|
|
110
|
+
});
|
|
111
|
+
});
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { realpathSync } from "node:fs";
|
|
2
|
+
import path from "node:path";
|
|
3
|
+
|
|
4
|
+
/**
|
|
5
|
+
* Normalize Windows-formatted directory paths consistently, even on a non-Windows OS.
|
|
6
|
+
*
|
|
7
|
+
* Spelling only, no filesystem access: separators become `/`, the `\\?\` and
|
|
8
|
+
* `\\?\UNC\` long-path prefixes are dropped, a trailing separator is removed and
|
|
9
|
+
* the result is lowercased, because Windows paths are case-insensitive. A POSIX
|
|
10
|
+
* path is resolved to an absolute path, which also drops a trailing slash.
|
|
11
|
+
*/
|
|
12
|
+
export function projectDirectoryKey(directory: string): string {
|
|
13
|
+
const slashed = directory
|
|
14
|
+
.replaceAll("\\", "/")
|
|
15
|
+
.replace(/^\/\/\?\/UNC\//i, "//")
|
|
16
|
+
.replace(/^\/\/\?\//, "");
|
|
17
|
+
if (/^[a-z]:\//i.test(slashed) || slashed.startsWith("//")) {
|
|
18
|
+
return path.win32.normalize(slashed).replaceAll("\\", "/").replace(/\/$/, "").toLowerCase();
|
|
19
|
+
}
|
|
20
|
+
return path.resolve(directory);
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
let realpathForCanonicalDirectory: (directory: string) => string = (directory) =>
|
|
24
|
+
realpathSync.native(directory);
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* One spelling for a project directory, shared by everything that has to agree
|
|
28
|
+
* on it across processes (the RPC server that writes its discovery file and the
|
|
29
|
+
* TUI that looks the file up).
|
|
30
|
+
*
|
|
31
|
+
* The filesystem's own answer comes first where the directory exists:
|
|
32
|
+
* `realpathSync.native` resolves symlinks (macOS `/var` → `/private/var`),
|
|
33
|
+
* junctions, and Windows 8.3 short names (`AMMINI~1` → the long name). The
|
|
34
|
+
* result then goes through `projectDirectoryKey`, so drive-letter case,
|
|
35
|
+
* separators, `\\?\` prefixes and trailing separators cannot make two
|
|
36
|
+
* spellings of one directory differ. A directory that cannot be resolved (it
|
|
37
|
+
* no longer exists, or access is denied) falls back to its spelling alone.
|
|
38
|
+
*/
|
|
39
|
+
export function canonicalProjectDirectory(directory: string): string {
|
|
40
|
+
let resolved = directory;
|
|
41
|
+
try {
|
|
42
|
+
resolved = realpathForCanonicalDirectory(directory);
|
|
43
|
+
} catch {
|
|
44
|
+
// Keep the given spelling; the key below still normalizes it.
|
|
45
|
+
}
|
|
46
|
+
return projectDirectoryKey(resolved);
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
/** Test seam: stand in for the filesystem's realpath (for example Windows 8.3 expansion). */
|
|
50
|
+
export function __setCanonicalDirectoryRealpathForTests(
|
|
51
|
+
realpath?: (directory: string) => string,
|
|
52
|
+
): void {
|
|
53
|
+
realpathForCanonicalDirectory = realpath ?? ((directory) => realpathSync.native(directory));
|
|
54
|
+
}
|