@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
|
@@ -18,6 +18,12 @@ import { formatCacheTtlDisplay } from "./cache-ttl-display";
|
|
|
18
18
|
import { type ConfigParseFailure, formatConfigParseStatusLine } from "./config-diagnostics";
|
|
19
19
|
import { formatThresholdPercent } from "./format-threshold";
|
|
20
20
|
import type { TailHygieneStatus } from "./rpc-types";
|
|
21
|
+
import {
|
|
22
|
+
type StatusCheck,
|
|
23
|
+
type StatusUnavailableReason,
|
|
24
|
+
type StatusVersions,
|
|
25
|
+
statusVersionNotice,
|
|
26
|
+
} from "./status-view-check";
|
|
21
27
|
import { formatTailHygiene } from "./tail-hygiene-status";
|
|
22
28
|
import {
|
|
23
29
|
renderUserFacingFailure,
|
|
@@ -140,6 +146,7 @@ export interface StatusViewSource {
|
|
|
140
146
|
* backlog that silently never falls.
|
|
141
147
|
*/
|
|
142
148
|
readonly dreamerUnsupportedTasks?: readonly string[];
|
|
149
|
+
readonly dreamerSkipped?: readonly string[];
|
|
143
150
|
/**
|
|
144
151
|
* Set when the last background maintenance pass stopped before finishing.
|
|
145
152
|
* Shown so "the dreamer has nothing to do" and "the dreamer never got to
|
|
@@ -159,9 +166,31 @@ export interface StatusViewSource {
|
|
|
159
166
|
readonly compactionEnabled?: boolean;
|
|
160
167
|
/** Failure codes to print under the sections, already selected by the host. */
|
|
161
168
|
readonly warnings?: readonly UserFacingFailureKey[];
|
|
169
|
+
/**
|
|
170
|
+
* Set when this server migrated the shared store at startup while other
|
|
171
|
+
* OpenCode servers (these PIDs, from their RPC discovery records) could not
|
|
172
|
+
* be checked; if one was an older build still running, it now reads a
|
|
173
|
+
* store newer than it supports.
|
|
174
|
+
*/
|
|
175
|
+
readonly unconfirmedMigrationHolders?: {
|
|
176
|
+
readonly pids: readonly number[];
|
|
177
|
+
readonly fromVersion: number;
|
|
178
|
+
readonly toVersion: number;
|
|
179
|
+
};
|
|
162
180
|
readonly hiddenVariantWarnings?: readonly string[];
|
|
163
181
|
}
|
|
164
182
|
|
|
183
|
+
declare const checkedStatusViewSource: unique symbol;
|
|
184
|
+
|
|
185
|
+
/**
|
|
186
|
+
* A `StatusViewSource` that has passed `checkStatusViewSource`. The brand exists
|
|
187
|
+
* only in the type system: `buildStatusView` accepts nothing else, so a payload
|
|
188
|
+
* cannot reach the view model without going through the check.
|
|
189
|
+
*/
|
|
190
|
+
export type CheckedStatusViewSource = StatusViewSource & {
|
|
191
|
+
readonly [checkedStatusViewSource]: true;
|
|
192
|
+
};
|
|
193
|
+
|
|
165
194
|
export interface StatusViewOptions {
|
|
166
195
|
/** Plugin version shown next to the title. */
|
|
167
196
|
readonly version: string;
|
|
@@ -475,11 +504,17 @@ function historyRows(source: StatusViewSource, now: number): StatusRow[] {
|
|
|
475
504
|
return rows;
|
|
476
505
|
}
|
|
477
506
|
|
|
478
|
-
/**
|
|
507
|
+
/** Availability rows for unsupported tasks and explicitly disabled/unavailable runs. */
|
|
479
508
|
function dreamerUnsupportedRows(source: StatusViewSource): StatusRow[] {
|
|
480
509
|
const unsupported = source.dreamerUnsupportedTasks ?? [];
|
|
481
|
-
|
|
510
|
+
const skipped: StatusRow[] = (source.dreamerSkipped ?? []).map((value) => ({
|
|
511
|
+
label: "Dreamer skipped",
|
|
512
|
+
value,
|
|
513
|
+
tone: "muted",
|
|
514
|
+
}));
|
|
515
|
+
if (unsupported.length === 0) return skipped;
|
|
482
516
|
return [
|
|
517
|
+
...skipped,
|
|
483
518
|
{
|
|
484
519
|
label: "Dreamer unavailable",
|
|
485
520
|
value: `${unsupported.join(", ")} (${userFacingFailureCode("dream_task_needs_tool_loop")})`,
|
|
@@ -627,7 +662,16 @@ function statusSections(source: StatusViewSource, now: number): StatusSection[]
|
|
|
627
662
|
}
|
|
628
663
|
|
|
629
664
|
function warningBlock(source: StatusViewSource): StatusWarning[] {
|
|
665
|
+
const holders = source.unconfirmedMigrationHolders;
|
|
630
666
|
return [
|
|
667
|
+
...(holders && holders.pids.length > 0
|
|
668
|
+
? [
|
|
669
|
+
{
|
|
670
|
+
text: `Magic Context upgraded its database from v${holders.fromVersion} to v${holders.toVersion} while OpenCode PID ${holders.pids.join(", ")} could not be checked. If an older OpenCode is still open, quit all OpenCode processes and start again.`,
|
|
671
|
+
tone: "error" as const,
|
|
672
|
+
},
|
|
673
|
+
]
|
|
674
|
+
: []),
|
|
631
675
|
...(source.hiddenVariantWarnings ?? []).map((text) => ({ text, tone: "warning" as const })),
|
|
632
676
|
...(source.configReloadFailure
|
|
633
677
|
? [
|
|
@@ -651,8 +695,11 @@ function warningBlock(source: StatusViewSource): StatusWarning[] {
|
|
|
651
695
|
];
|
|
652
696
|
}
|
|
653
697
|
|
|
654
|
-
/** Builds the full status view from one snapshot. */
|
|
655
|
-
export function buildStatusView(
|
|
698
|
+
/** Builds the full status view from one checked snapshot. */
|
|
699
|
+
export function buildStatusView(
|
|
700
|
+
source: CheckedStatusViewSource,
|
|
701
|
+
options: StatusViewOptions,
|
|
702
|
+
): StatusView {
|
|
656
703
|
const now = options.now ?? Date.now();
|
|
657
704
|
const off = !compactionEnabled(source);
|
|
658
705
|
const tone = off ? "accent" : pressureTone(source.usagePercentage);
|
|
@@ -699,6 +746,131 @@ export function buildStatusView(source: StatusViewSource, options: StatusViewOpt
|
|
|
699
746
|
};
|
|
700
747
|
}
|
|
701
748
|
|
|
749
|
+
/** Short name for the reason, shown on the headline and in the reason row. */
|
|
750
|
+
function unavailableLabel(reason: StatusUnavailableReason): string {
|
|
751
|
+
if (reason.kind === "rpc_error") return "server did not answer";
|
|
752
|
+
if (reason.kind === "not_tracked") {
|
|
753
|
+
return reason.cause === "home_directory" ? "home directory" : "memory paused";
|
|
754
|
+
}
|
|
755
|
+
if (reason.kind === "malformed") return "incomplete status data";
|
|
756
|
+
return "view error";
|
|
757
|
+
}
|
|
758
|
+
|
|
759
|
+
/** Full-width sentences explaining the reason and what to do about it. */
|
|
760
|
+
function unavailableExplanation(
|
|
761
|
+
reason: StatusUnavailableReason,
|
|
762
|
+
versionNotice: string | null,
|
|
763
|
+
): string[] {
|
|
764
|
+
const persists = "If this persists after a restart, report it with magic-context.log attached.";
|
|
765
|
+
if (reason.kind === "rpc_error") {
|
|
766
|
+
return [
|
|
767
|
+
`The Magic Context server did not return status: ${reason.message}`,
|
|
768
|
+
renderUserFacingFailure("status_unavailable", "plain"),
|
|
769
|
+
];
|
|
770
|
+
}
|
|
771
|
+
if (reason.kind === "not_tracked" && reason.cause === "home_directory") {
|
|
772
|
+
return [
|
|
773
|
+
"This is your home directory, so Magic Context keeps no project history or memory here.",
|
|
774
|
+
"Set allow_home_project in magic-context.jsonc to opt in.",
|
|
775
|
+
];
|
|
776
|
+
}
|
|
777
|
+
if (reason.kind === "not_tracked") {
|
|
778
|
+
return [
|
|
779
|
+
"Magic Context could not work out a project identity for this directory, so its memory features are paused.",
|
|
780
|
+
'magic-context.log names the cause (search for "memory features paused"), for example a git command that failed.',
|
|
781
|
+
];
|
|
782
|
+
}
|
|
783
|
+
if (reason.kind === "malformed") {
|
|
784
|
+
return [
|
|
785
|
+
`The status reply is missing, or has unexpected values for: ${reason.fields.join(", ")}.`,
|
|
786
|
+
versionNotice ? "The version difference above is the likely cause." : persists,
|
|
787
|
+
];
|
|
788
|
+
}
|
|
789
|
+
return [`The status view could not be drawn: ${reason.message}`, persists];
|
|
790
|
+
}
|
|
791
|
+
|
|
792
|
+
/**
|
|
793
|
+
* The view drawn instead of the status when there is no usable snapshot. It has
|
|
794
|
+
* the same shape as a full view (headline, sections, warnings, footer), so a
|
|
795
|
+
* host draws it with the same code and cannot crash on a missing part.
|
|
796
|
+
*/
|
|
797
|
+
export function buildUnavailableStatusView(
|
|
798
|
+
reason: StatusUnavailableReason,
|
|
799
|
+
versions: StatusVersions | null,
|
|
800
|
+
options: StatusViewOptions,
|
|
801
|
+
): StatusView {
|
|
802
|
+
const label = unavailableLabel(reason);
|
|
803
|
+
const versionNotice = statusVersionNotice(versions);
|
|
804
|
+
const rows: StatusRow[] = [{ label: "Reason", value: label, tone: "warning" }];
|
|
805
|
+
if (versions) {
|
|
806
|
+
rows.push(
|
|
807
|
+
{ label: "Server", value: versions.server ?? "not reported", tone: "muted" },
|
|
808
|
+
{ label: "UI", value: versions.ui, tone: "muted" },
|
|
809
|
+
);
|
|
810
|
+
}
|
|
811
|
+
return {
|
|
812
|
+
title: "⚡ Magic Context Status",
|
|
813
|
+
version: `v${options.version}`,
|
|
814
|
+
headline: {
|
|
815
|
+
left: { text: "Status unavailable", tone: "error" },
|
|
816
|
+
right: { text: label, tone: "muted" },
|
|
817
|
+
},
|
|
818
|
+
windowLine: null,
|
|
819
|
+
bar: [],
|
|
820
|
+
breakdown: [],
|
|
821
|
+
hygiene: null,
|
|
822
|
+
sections: [{ title: "Status unavailable", labelWidth: 8, rows }],
|
|
823
|
+
warnings: [
|
|
824
|
+
...(versionNotice ? [{ text: versionNotice, tone: "error" as const }] : []),
|
|
825
|
+
...unavailableExplanation(reason, versionNotice).map((text) => ({
|
|
826
|
+
text,
|
|
827
|
+
tone: "warning" as const,
|
|
828
|
+
})),
|
|
829
|
+
],
|
|
830
|
+
footer: "Esc to close",
|
|
831
|
+
};
|
|
832
|
+
}
|
|
833
|
+
|
|
834
|
+
/**
|
|
835
|
+
* The view for one checked status result: the full status, or the
|
|
836
|
+
* "status unavailable" view naming why there is none. A version difference
|
|
837
|
+
* between the server and this UI is named in both. This never throws, so a
|
|
838
|
+
* host can call it inside a render without guarding it.
|
|
839
|
+
*/
|
|
840
|
+
export function buildStatusViewFor(
|
|
841
|
+
check: StatusCheck<unknown>,
|
|
842
|
+
options: StatusViewOptions,
|
|
843
|
+
): StatusView {
|
|
844
|
+
if (check.state === "unavailable") {
|
|
845
|
+
return buildUnavailableStatusView(check.reason, check.versions, options);
|
|
846
|
+
}
|
|
847
|
+
try {
|
|
848
|
+
const view = buildStatusView(check.source, options);
|
|
849
|
+
const versionNotice = statusVersionNotice(check.versions);
|
|
850
|
+
const notices: StatusWarning[] = [
|
|
851
|
+
...(versionNotice ? [{ text: versionNotice, tone: "warning" as const }] : []),
|
|
852
|
+
...(check.ignoredFields.length > 0
|
|
853
|
+
? [
|
|
854
|
+
{
|
|
855
|
+
text: `Ignored status fields with an unexpected shape: ${check.ignoredFields.join(", ")}`,
|
|
856
|
+
tone: "warning" as const,
|
|
857
|
+
},
|
|
858
|
+
]
|
|
859
|
+
: []),
|
|
860
|
+
];
|
|
861
|
+
return notices.length > 0 ? { ...view, warnings: [...notices, ...view.warnings] } : view;
|
|
862
|
+
} catch (error) {
|
|
863
|
+
return buildUnavailableStatusView(
|
|
864
|
+
{
|
|
865
|
+
kind: "view_error",
|
|
866
|
+
message: error instanceof Error ? error.message : String(error),
|
|
867
|
+
},
|
|
868
|
+
check.versions,
|
|
869
|
+
options,
|
|
870
|
+
);
|
|
871
|
+
}
|
|
872
|
+
}
|
|
873
|
+
|
|
702
874
|
/** Pads one row to its section's label column; values print flush right. */
|
|
703
875
|
export function formatStatusRowText(row: StatusRow, labelWidth: number, width: number): string {
|
|
704
876
|
const label = row.label.padEnd(labelWidth);
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { 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 {
|
|
@@ -8,10 +8,11 @@ import {
|
|
|
8
8
|
withAsyncPrivilegedWriter,
|
|
9
9
|
withPrivilegedWriter,
|
|
10
10
|
} from "./sqlite";
|
|
11
|
+
import { createTestTempDirFromPath } from "./test-temp-dir";
|
|
11
12
|
|
|
12
13
|
describe("writer acquisition", () => {
|
|
13
14
|
test("exhausted async admission preserves the foreground budget and never invokes the callback", async () => {
|
|
14
|
-
const dir =
|
|
15
|
+
const dir = createTestTempDirFromPath(join(tmpdir(), "mc-writer-budget-"));
|
|
15
16
|
const path = join(dir, "context.db");
|
|
16
17
|
const blocker = new Database(path);
|
|
17
18
|
blocker.exec(
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
/// <reference types="bun-types" />
|
|
2
|
+
|
|
3
|
+
import { describe, expect, it } from "bun:test";
|
|
4
|
+
import { contentTagOwnerMessageId } from "./tag-owner-id";
|
|
5
|
+
|
|
6
|
+
const DIGEST_A = "a".repeat(64);
|
|
7
|
+
const DIGEST_B = "0123456789abcdef".repeat(4);
|
|
8
|
+
|
|
9
|
+
describe("contentTagOwnerMessageId", () => {
|
|
10
|
+
it("strips positional text and file suffixes", () => {
|
|
11
|
+
expect(contentTagOwnerMessageId("pi-msg-1:p0")).toBe("pi-msg-1");
|
|
12
|
+
expect(contentTagOwnerMessageId("pi-msg-1:p12")).toBe("pi-msg-1");
|
|
13
|
+
expect(contentTagOwnerMessageId("pi-msg-1:file3")).toBe("pi-msg-1");
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
it("strips a content-derived text suffix", () => {
|
|
17
|
+
expect(contentTagOwnerMessageId(`pi-msg-1:mc-text-v1:${DIGEST_A}:${DIGEST_B}:o0`)).toBe(
|
|
18
|
+
"pi-msg-1",
|
|
19
|
+
);
|
|
20
|
+
expect(
|
|
21
|
+
contentTagOwnerMessageId(`m:with:colons:mc-text-v1:${DIGEST_A}:${DIGEST_B}:o7`),
|
|
22
|
+
).toBe("m:with:colons");
|
|
23
|
+
});
|
|
24
|
+
|
|
25
|
+
it("leaves an id with no content suffix unchanged", () => {
|
|
26
|
+
expect(contentTagOwnerMessageId("pi-msg-1")).toBe("pi-msg-1");
|
|
27
|
+
expect(contentTagOwnerMessageId("pi-msg-1:pfile")).toBe("pi-msg-1:pfile");
|
|
28
|
+
// A marker without the digest shape is not a content-derived id.
|
|
29
|
+
expect(contentTagOwnerMessageId("pi-msg-1:mc-text-v1:not-hex")).toBe(
|
|
30
|
+
"pi-msg-1:mc-text-v1:not-hex",
|
|
31
|
+
);
|
|
32
|
+
});
|
|
33
|
+
});
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Content tag ids name the message that owns them plus a suffix that picks one
|
|
3
|
+
* part of it. Two suffix families exist:
|
|
4
|
+
*
|
|
5
|
+
* - positional: `<messageId>:p<N>` for the Nth text part, `<messageId>:file<N>`
|
|
6
|
+
* for the Nth file part;
|
|
7
|
+
* - content-derived (Pi, after the text of a message drifts):
|
|
8
|
+
* `<messageId>:mc-text-v1:<vector digest>:<content digest>:o<occurrence>`.
|
|
9
|
+
*
|
|
10
|
+
* Anything that groups tags by message has to strip both, or a content-derived
|
|
11
|
+
* tag is treated as belonging to a message that does not exist.
|
|
12
|
+
*/
|
|
13
|
+
|
|
14
|
+
export const TEXT_TAG_IDENTITY_MARKER = ":mc-text-v1:";
|
|
15
|
+
|
|
16
|
+
const POSITIONAL_CONTENT_SUFFIX = /:(?:p|file)\d+$/;
|
|
17
|
+
const CONTENT_DERIVED_TEXT_SUFFIX = /:mc-text-v1:[0-9a-f]+:[0-9a-f]+:o\d+$/;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* The owning message id of a content tag id. An id with neither suffix is
|
|
21
|
+
* returned unchanged: it already is the message id.
|
|
22
|
+
*/
|
|
23
|
+
export function contentTagOwnerMessageId(contentId: string): string {
|
|
24
|
+
const positional = POSITIONAL_CONTENT_SUFFIX.exec(contentId);
|
|
25
|
+
if (positional) return contentId.slice(0, positional.index);
|
|
26
|
+
const derived = CONTENT_DERIVED_TEXT_SUFFIX.exec(contentId);
|
|
27
|
+
if (derived) return contentId.slice(0, derived.index);
|
|
28
|
+
return contentId;
|
|
29
|
+
}
|
|
@@ -67,9 +67,11 @@ import {
|
|
|
67
67
|
} from "../hooks/magic-context/tag-content-primitives";
|
|
68
68
|
import type { TagTarget } from "../hooks/magic-context/tag-messages";
|
|
69
69
|
import { toolInputStringBytes } from "../hooks/magic-context/tool-input-size";
|
|
70
|
+
import { TEXT_TAG_IDENTITY_MARKER } from "./tag-owner-id";
|
|
70
71
|
import type { Transcript, TranscriptMessage, TranscriptPart } from "./transcript";
|
|
71
72
|
|
|
72
|
-
|
|
73
|
+
// Re-exported so existing importers keep one source for the marker.
|
|
74
|
+
export { TEXT_TAG_IDENTITY_MARKER };
|
|
73
75
|
|
|
74
76
|
export interface TagTranscriptOptions {
|
|
75
77
|
/**
|
|
@@ -972,7 +974,14 @@ function applyTextPrefixAndTarget(args: TagTextPartArgs, tagId: number, text: st
|
|
|
972
974
|
}
|
|
973
975
|
|
|
974
976
|
const targetStart = args.timing ? performance.now() : 0;
|
|
975
|
-
args.targets.set(
|
|
977
|
+
args.targets.set(
|
|
978
|
+
tagId,
|
|
979
|
+
buildTextTarget(
|
|
980
|
+
args.part,
|
|
981
|
+
args.message,
|
|
982
|
+
args.skipPrefixInjection ? "" : prependTag(tagId, ""),
|
|
983
|
+
),
|
|
984
|
+
);
|
|
976
985
|
if (args.timing) args.timing.targets += performance.now() - targetStart;
|
|
977
986
|
}
|
|
978
987
|
|
|
@@ -1307,8 +1316,10 @@ function buildAggregateTarget(
|
|
|
1307
1316
|
function buildTextTarget(
|
|
1308
1317
|
part: TranscriptPart,
|
|
1309
1318
|
message: { info: { id?: string; role: string } },
|
|
1319
|
+
textPrefix: string,
|
|
1310
1320
|
): TagTarget {
|
|
1311
1321
|
return {
|
|
1322
|
+
textPrefix,
|
|
1312
1323
|
setContent(content: string): boolean {
|
|
1313
1324
|
return part.setText(content);
|
|
1314
1325
|
},
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import { expect, it } from "bun:test";
|
|
2
|
+
import { readdirSync, readFileSync } from "node:fs";
|
|
3
|
+
import { join, relative, resolve } from "node:path";
|
|
4
|
+
|
|
5
|
+
const packagesRoot = resolve(import.meta.dir, "../../..");
|
|
6
|
+
|
|
7
|
+
function testFiles(directory: string): string[] {
|
|
8
|
+
return readdirSync(directory, { withFileTypes: true }).flatMap((entry) => {
|
|
9
|
+
const path = join(directory, entry.name);
|
|
10
|
+
return entry.isDirectory()
|
|
11
|
+
? testFiles(path)
|
|
12
|
+
: /\.(test|spec)\.[cm]?[jt]sx?$/.test(entry.name)
|
|
13
|
+
? [path]
|
|
14
|
+
: [];
|
|
15
|
+
});
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
it("source tests allocate temporary directories only through the registered helper", () => {
|
|
19
|
+
// Ban the raw API name, including imports and aliases, rather than just one
|
|
20
|
+
// spelling of a call. Nested fixtures also need registration on setup failure.
|
|
21
|
+
const rawApi = new RegExp("\\b" + "mk" + "dtemp(?:Sync)?\\b");
|
|
22
|
+
const violations = readdirSync(packagesRoot, { withFileTypes: true }).flatMap((entry) => {
|
|
23
|
+
if (!entry.isDirectory()) return [];
|
|
24
|
+
const src = join(packagesRoot, entry.name, "src");
|
|
25
|
+
try {
|
|
26
|
+
return testFiles(src).filter((path) => rawApi.test(readFileSync(path, "utf8")));
|
|
27
|
+
} catch (error) {
|
|
28
|
+
if ((error as NodeJS.ErrnoException).code === "ENOENT") return [];
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
});
|
|
32
|
+
expect(violations.map((path) => relative(packagesRoot, path))).toEqual([]);
|
|
33
|
+
});
|
|
@@ -4,6 +4,7 @@ import { join } from "node:path";
|
|
|
4
4
|
import {
|
|
5
5
|
cleanupTestTempDir,
|
|
6
6
|
createTestTempDir,
|
|
7
|
+
createTestTempDirFromPath,
|
|
7
8
|
sweepStaleTestTempDirs,
|
|
8
9
|
withTestTempDir,
|
|
9
10
|
} from "./test-temp-dir";
|
|
@@ -21,6 +22,32 @@ function createFixtureRoot(): string {
|
|
|
21
22
|
}
|
|
22
23
|
|
|
23
24
|
describe("test temp directories", () => {
|
|
25
|
+
it("rejects labels that could escape the system temp directory", () => {
|
|
26
|
+
for (const label of [
|
|
27
|
+
"",
|
|
28
|
+
".",
|
|
29
|
+
"..",
|
|
30
|
+
"../outside-",
|
|
31
|
+
"nested/path-",
|
|
32
|
+
"nested\\path-",
|
|
33
|
+
"nul\0-",
|
|
34
|
+
]) {
|
|
35
|
+
expect(() => createTestTempDir(label)).toThrow("single path segments");
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
it("cleans and sweeps previously unknown labels", () => {
|
|
39
|
+
const root = createFixtureRoot();
|
|
40
|
+
const dir = createTestTempDirFromPath(join(root, "previously-unlisted-"));
|
|
41
|
+
expect(existsSync(dir)).toBe(true);
|
|
42
|
+
const old = new Date(Date.now() - 7_200_000);
|
|
43
|
+
utimesSync(dir, old, old);
|
|
44
|
+
expect(sweepStaleTestTempDirs({ tempDir: root })).toContain(dir);
|
|
45
|
+
expect(existsSync(dir)).toBe(false);
|
|
46
|
+
cleanupTestTempDir(dir);
|
|
47
|
+
const fixture = createTestTempDir("another-unlisted-");
|
|
48
|
+
fixture.cleanup();
|
|
49
|
+
expect(existsSync(fixture.dir)).toBe(false);
|
|
50
|
+
});
|
|
24
51
|
it("removes a root when its fixture callback throws", () => {
|
|
25
52
|
let directory = "";
|
|
26
53
|
|
|
@@ -44,7 +44,8 @@ export const TEST_TEMP_DIR_PREFIXES = [
|
|
|
44
44
|
"mc-test-db-backstop-",
|
|
45
45
|
] as const;
|
|
46
46
|
|
|
47
|
-
export type TestTempDirPrefix =
|
|
47
|
+
export type TestTempDirPrefix = string;
|
|
48
|
+
const OWNED_PREFIX = "mc-test-owned-";
|
|
48
49
|
|
|
49
50
|
type AfterAll = (callback: () => void) => void;
|
|
50
51
|
type SweepOptions = {
|
|
@@ -55,18 +56,18 @@ type SweepOptions = {
|
|
|
55
56
|
|
|
56
57
|
const registeredTempDirs = new Set<string>();
|
|
57
58
|
let lifecycleCleanupInstalled = false;
|
|
59
|
+
let exitCleanupInstalled = false;
|
|
58
60
|
|
|
59
61
|
function hasRecognizedPrefix(name: string): boolean {
|
|
60
|
-
return
|
|
62
|
+
return (
|
|
63
|
+
name.startsWith(OWNED_PREFIX) ||
|
|
64
|
+
TEST_TEMP_DIR_PREFIXES.some((prefix) => name.startsWith(prefix))
|
|
65
|
+
);
|
|
61
66
|
}
|
|
62
67
|
|
|
63
68
|
function isRegisteredTempDir(directory: string): boolean {
|
|
64
69
|
const resolvedDirectory = resolve(directory);
|
|
65
|
-
return (
|
|
66
|
-
registeredTempDirs.has(resolvedDirectory) &&
|
|
67
|
-
dirname(resolvedDirectory) === resolve(tmpdir()) &&
|
|
68
|
-
hasRecognizedPrefix(basename(resolvedDirectory))
|
|
69
|
-
);
|
|
70
|
+
return registeredTempDirs.has(resolvedDirectory);
|
|
70
71
|
}
|
|
71
72
|
|
|
72
73
|
/**
|
|
@@ -78,17 +79,36 @@ export function createTestTempDir(
|
|
|
78
79
|
prefix: TestTempDirPrefix,
|
|
79
80
|
nameSuffix = "",
|
|
80
81
|
): { dir: string; cleanup: () => void } {
|
|
81
|
-
const
|
|
82
|
-
|
|
82
|
+
const label = prefix + nameSuffix;
|
|
83
|
+
if (!label || label === "." || label === ".." || /[/\\\0]/.test(label)) {
|
|
84
|
+
throw new Error("Test temp directory labels must be single path segments");
|
|
85
|
+
}
|
|
86
|
+
const dir = createTestTempDirFromPath(join(tmpdir(), `${prefix}${nameSuffix}`));
|
|
83
87
|
return { dir, cleanup: () => cleanupTestTempDir(dir) };
|
|
84
88
|
}
|
|
85
89
|
|
|
86
|
-
/**
|
|
90
|
+
/**
|
|
91
|
+
* Registers fixtures with an explicit parent (including ADV_ROOT and nested roots).
|
|
92
|
+
* A common namespace lets the stale sweep recognize every system-temp fixture,
|
|
93
|
+
* without maintaining a list of caller-supplied labels.
|
|
94
|
+
*/
|
|
95
|
+
export function createTestTempDirFromPath(prefixPath: string): string {
|
|
96
|
+
const dir = resolve(
|
|
97
|
+
mkdtempSync(join(dirname(prefixPath), `${OWNED_PREFIX}${basename(prefixPath)}`)),
|
|
98
|
+
);
|
|
99
|
+
registeredTempDirs.add(dir);
|
|
100
|
+
if (!exitCleanupInstalled) {
|
|
101
|
+
exitCleanupInstalled = true;
|
|
102
|
+
process.once("exit", cleanupRegisteredTestTempDirs);
|
|
103
|
+
}
|
|
104
|
+
return dir;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/** Removes one registered test root; busy roots remain registered for an exit retry. */
|
|
87
108
|
export function cleanupTestTempDir(directory: string): void {
|
|
88
109
|
const resolvedDirectory = resolve(directory);
|
|
89
110
|
if (!isRegisteredTempDir(resolvedDirectory)) return;
|
|
90
111
|
|
|
91
|
-
registeredTempDirs.delete(resolvedDirectory);
|
|
92
112
|
try {
|
|
93
113
|
rmSync(resolvedDirectory, {
|
|
94
114
|
recursive: true,
|
|
@@ -96,6 +116,7 @@ export function cleanupTestTempDir(directory: string): void {
|
|
|
96
116
|
maxRetries: 10,
|
|
97
117
|
retryDelay: 100,
|
|
98
118
|
});
|
|
119
|
+
registeredTempDirs.delete(resolvedDirectory);
|
|
99
120
|
} catch {
|
|
100
121
|
// A process can still hold a file open on Windows. The next startup sweep retries it.
|
|
101
122
|
}
|
|
@@ -131,7 +152,10 @@ export function installTestTempDirCleanup(afterAll: AfterAll): void {
|
|
|
131
152
|
if (lifecycleCleanupInstalled) return;
|
|
132
153
|
lifecycleCleanupInstalled = true;
|
|
133
154
|
afterAll(cleanupRegisteredTestTempDirs);
|
|
134
|
-
|
|
155
|
+
if (!exitCleanupInstalled) {
|
|
156
|
+
exitCleanupInstalled = true;
|
|
157
|
+
process.once("exit", cleanupRegisteredTestTempDirs);
|
|
158
|
+
}
|
|
135
159
|
}
|
|
136
160
|
|
|
137
161
|
/**
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { afterEach, describe, expect, it } from "bun:test";
|
|
2
|
-
import { existsSync,
|
|
2
|
+
import { existsSync, readFileSync, rmSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { join } from "node:path";
|
|
5
|
+
import { createTestTempDirFromPath } from "./test-temp-dir";
|
|
5
6
|
|
|
6
7
|
const roots: string[] = [];
|
|
7
8
|
afterEach(() => {
|
|
@@ -12,7 +13,7 @@ afterEach(() => {
|
|
|
12
13
|
|
|
13
14
|
describe("ensureTuiPluginEntry", () => {
|
|
14
15
|
it("preserves tuple dev-path plugin entry and does not add @latest", async () => {
|
|
15
|
-
const root =
|
|
16
|
+
const root = createTestTempDirFromPath(join(tmpdir(), "mc-tui-"));
|
|
16
17
|
roots.push(root);
|
|
17
18
|
const devPath = "/Work/magic-context/packages/plugin";
|
|
18
19
|
const tuiPath = join(root, "tui.json");
|
|
@@ -33,7 +34,7 @@ describe("ensureTuiPluginEntry", () => {
|
|
|
33
34
|
});
|
|
34
35
|
|
|
35
36
|
it("upgrades bare npm name to @latest while preserving tuple options", async () => {
|
|
36
|
-
const root =
|
|
37
|
+
const root = createTestTempDirFromPath(join(tmpdir(), "mc-tui-npm-"));
|
|
37
38
|
roots.push(root);
|
|
38
39
|
const tuiPath = join(root, "tui.json");
|
|
39
40
|
writeFileSync(
|
|
@@ -56,7 +57,7 @@ describe("ensureTuiPluginEntry", () => {
|
|
|
56
57
|
});
|
|
57
58
|
|
|
58
59
|
it("creates tui.jsonc (not tui.json) on a fresh install", async () => {
|
|
59
|
-
const root =
|
|
60
|
+
const root = createTestTempDirFromPath(join(tmpdir(), "mc-tui-fresh-"));
|
|
60
61
|
roots.push(root);
|
|
61
62
|
|
|
62
63
|
const { ensureTuiPluginEntry } = await import("./tui-config");
|
|
@@ -73,7 +74,7 @@ describe("ensureTuiPluginEntry", () => {
|
|
|
73
74
|
});
|
|
74
75
|
|
|
75
76
|
it("writes into the existing tui.jsonc when both files exist", async () => {
|
|
76
|
-
const root =
|
|
77
|
+
const root = createTestTempDirFromPath(join(tmpdir(), "mc-tui-both-"));
|
|
77
78
|
roots.push(root);
|
|
78
79
|
// A real user config in tui.jsonc plus a leftover empty tui.json.
|
|
79
80
|
writeFileSync(
|
|
@@ -1,8 +1,9 @@
|
|
|
1
1
|
import { afterEach, beforeEach, describe, expect, test } from "bun:test";
|
|
2
|
-
import {
|
|
2
|
+
import { readFile, rename, rm, writeFile } from "node:fs/promises";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { basename, join } from "node:path";
|
|
5
5
|
import { parse } from "comment-json";
|
|
6
|
+
import { createTestTempDirFromPath } from "./test-temp-dir";
|
|
6
7
|
import {
|
|
7
8
|
__resetTuiPreferencesWatchTestHooks,
|
|
8
9
|
__setTuiPreferencesWatchTestHooks,
|
|
@@ -25,7 +26,7 @@ const ENV_KEYS = [TUI_PREFS_FILE_ENV, "OPENCODE_CONFIG_DIR", "XDG_CONFIG_HOME"];
|
|
|
25
26
|
|
|
26
27
|
beforeEach(async () => {
|
|
27
28
|
for (const key of ENV_KEYS) savedEnv[key] = process.env[key];
|
|
28
|
-
dir = await
|
|
29
|
+
dir = await createTestTempDirFromPath(join(tmpdir(), "mc-tui-prefs-test-"));
|
|
29
30
|
file = join(dir, "tui-preferences.jsonc");
|
|
30
31
|
process.env[TUI_PREFS_FILE_ENV] = file;
|
|
31
32
|
});
|