@cortexkit/opencode-magic-context 0.44.3 → 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-vjmvh6pz.js → derive-budgets-a63zsm5c.js} +4 -4
- 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/map-memories.d.ts.map +1 -1
- 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 +1 -0
- 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 +5 -4
- 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 +68 -3
- 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/features/magic-context/v22-deferred-backfill.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-render-epoch.d.ts +12 -1
- package/dist/hooks/magic-context/compartment-render-epoch.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/drop-stale-reduce-calls.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/event-resolvers.d.ts +7 -0
- package/dist/hooks/magic-context/event-resolvers.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 +13 -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 +17 -4
- 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/read-session-raw.d.ts +2 -2
- package/dist/hooks/magic-context/read-session-raw.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/tokenizer-calibration.d.ts +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 +38 -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-yhm60r53.js → index-16ny736w.js} +13622 -28584
- package/dist/{index-q5p1aqvv.js → index-2aq21j41.js} +1208 -429
- 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-nf9sk8sh.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-y5145x8k.js → index-n96ag4rk.js} +15 -1
- 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-9y5p0d50.js → index-vvtfyw1z.js} +13 -76
- 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-rdsaxnf2.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 +7560 -8084
- 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-8rxs0tc9.js +84 -0
- 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 +41 -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/transcript.d.ts +2 -0
- package/dist/shared/transcript.d.ts.map +1 -1
- package/dist/shared/user-answer.d.ts +4 -0
- package/dist/shared/user-answer.d.ts.map +1 -0
- 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/store.d.ts +1 -1
- package/dist/v2/hooks/store.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/{read-session-chunk-n072mcq4.js → v2/read-session-chunk-hjza38hr.js} +24 -7
- 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-dgg5y7er.js → v2/server-hfjfbg59.js} +849 -747
- 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 +8868 -107184
- package/dist/v2/store-reader.d.ts +52 -1
- 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 +191 -12
- package/src/shared/rpc-utils.ts +184 -26
- 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 +17 -3
- 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/transcript.ts +3 -0
- package/src/shared/tui-config.test.ts +6 -5
- package/src/shared/tui-preferences.test.ts +3 -2
- package/src/shared/user-answer.test.ts +40 -0
- package/src/shared/user-answer.ts +17 -0
- 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-19tr6zya.js +0 -22
- package/dist/task-config-2bm68628.js +0 -9
- package/dist/transform-postprocess-phase-z2mfc5w1.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-sy4m56a7.js +0 -19
- /package/dist/{index-s70wtd8k.js → index-q6hef7fh.js} +0 -0
|
@@ -3,14 +3,38 @@
|
|
|
3
3
|
* All data is fetched from the server plugin via HTTP RPC.
|
|
4
4
|
*/
|
|
5
5
|
import { getMagicContextStorageDir } from "../../shared/data-path";
|
|
6
|
-
import {
|
|
6
|
+
import { pluginPackageVersion } from "../../shared/plugin-package-version";
|
|
7
|
+
import { MagicContextRpcClient, RpcServerNotFoundError } from "../../shared/rpc-client";
|
|
7
8
|
import type { EmbedDetail, SidebarSnapshot, StatusDetail } from "../../shared/rpc-types";
|
|
9
|
+
import {
|
|
10
|
+
checkStatusDetailPayload,
|
|
11
|
+
type OpenCodeStatusExtras,
|
|
12
|
+
type StatusCheck,
|
|
13
|
+
statusRpcFailure,
|
|
14
|
+
} from "../../shared/status-view-check";
|
|
8
15
|
|
|
9
16
|
export type { EmbedDetail, SidebarSnapshot, StatusDetail };
|
|
10
17
|
|
|
11
18
|
let rpcClient: MagicContextRpcClient | null = null;
|
|
19
|
+
let rpcClientDirectory: string | null = null;
|
|
12
20
|
let rpcGeneration = 0;
|
|
13
21
|
|
|
22
|
+
/**
|
|
23
|
+
* Clients for session directories other than the one the TUI started in.
|
|
24
|
+
*
|
|
25
|
+
* OpenCode runs one Magic Context server instance per directory, and each one
|
|
26
|
+
* writes its RPC discovery file under that directory's hash. A TUI started in
|
|
27
|
+
* one directory (commonly the home directory) can show a session whose
|
|
28
|
+
* directory is another project; asking the startup directory's server about
|
|
29
|
+
* that session returns the startup directory's answer (for the home directory:
|
|
30
|
+
* no project state at all), so the sidebar and `/ctx-status` showed nothing.
|
|
31
|
+
* Session-scoped calls therefore go to the client for the session's own
|
|
32
|
+
* directory. The startup client stays as it is for the notification socket and
|
|
33
|
+
* the process-wide calls.
|
|
34
|
+
*/
|
|
35
|
+
const sessionDirectoryClients = new Map<string, MagicContextRpcClient>();
|
|
36
|
+
const MAX_SESSION_DIRECTORY_CLIENTS = 16;
|
|
37
|
+
|
|
14
38
|
/** Initialize the RPC client. Call once on TUI startup. */
|
|
15
39
|
export function initRpcClient(directory: string): void {
|
|
16
40
|
const storageDir = getMagicContextStorageDir();
|
|
@@ -19,6 +43,127 @@ export function initRpcClient(directory: string): void {
|
|
|
19
43
|
// new generation and abandons its in-flight connect).
|
|
20
44
|
rpcGeneration += 1;
|
|
21
45
|
rpcClient = new MagicContextRpcClient(storageDir, directory);
|
|
46
|
+
rpcClientDirectory = directory;
|
|
47
|
+
resetSessionDirectoryClients();
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
function resetSessionDirectoryClients(): void {
|
|
51
|
+
for (const client of sessionDirectoryClients.values()) client.reset();
|
|
52
|
+
sessionDirectoryClients.clear();
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
/**
|
|
56
|
+
* The client for the server instance that owns `directory`: the startup client
|
|
57
|
+
* when the directory is the one the TUI started in (or unknown), otherwise a
|
|
58
|
+
* client discovering that directory's own server. Null before init.
|
|
59
|
+
*/
|
|
60
|
+
function clientForDirectory(directory: string): MagicContextRpcClient | null {
|
|
61
|
+
if (!rpcClient) return null;
|
|
62
|
+
if (!directory || directory === rpcClientDirectory) return rpcClient;
|
|
63
|
+
const existing = sessionDirectoryClients.get(directory);
|
|
64
|
+
if (existing) return existing;
|
|
65
|
+
if (sessionDirectoryClients.size >= MAX_SESSION_DIRECTORY_CLIENTS) {
|
|
66
|
+
const oldest = sessionDirectoryClients.keys().next().value;
|
|
67
|
+
if (oldest !== undefined) {
|
|
68
|
+
sessionDirectoryClients.get(oldest)?.reset();
|
|
69
|
+
sessionDirectoryClients.delete(oldest);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
// Short resolution: when this directory has no discovery file the caller
|
|
73
|
+
// falls back to asking every local server (see `callSessionRpc`) instead of
|
|
74
|
+
// retrying the miss for fifteen seconds.
|
|
75
|
+
const client = new MagicContextRpcClient(getMagicContextStorageDir(), directory, {
|
|
76
|
+
resolveAttempts: 2,
|
|
77
|
+
reresolveAttempts: 1,
|
|
78
|
+
});
|
|
79
|
+
sessionDirectoryClients.set(directory, client);
|
|
80
|
+
return client;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
/**
|
|
84
|
+
* The server the notification socket should subscribe to: the one that owns
|
|
85
|
+
* the shown session's directory, so a push from the command that session runs
|
|
86
|
+
* (for example `/ctx-status` asking to open its dialog) reaches this TUI. That
|
|
87
|
+
* is the startup directory's server when no session is shown or the session is
|
|
88
|
+
* in the startup directory. A session directory with no discovery file falls
|
|
89
|
+
* back to the server that claims the session, then to the startup server so
|
|
90
|
+
* session-less notifications still arrive.
|
|
91
|
+
*/
|
|
92
|
+
export async function resolveNotificationTarget(
|
|
93
|
+
sessionDirectory: string | null,
|
|
94
|
+
sessionId: string | null,
|
|
95
|
+
): Promise<{
|
|
96
|
+
client: MagicContextRpcClient;
|
|
97
|
+
directory: string;
|
|
98
|
+
endpoint: { port: number; token: string | null; instanceId: string | null };
|
|
99
|
+
} | null> {
|
|
100
|
+
const startup = rpcClient;
|
|
101
|
+
if (!startup) return null;
|
|
102
|
+
const directory = sessionDirectory ?? "";
|
|
103
|
+
let client = clientForDirectory(directory) ?? startup;
|
|
104
|
+
let endpoint = await client.resolveEndpoint();
|
|
105
|
+
if (!endpoint && client !== startup && sessionId) {
|
|
106
|
+
const owner = await MagicContextRpcClient.findSessionOwner(
|
|
107
|
+
getMagicContextStorageDir(),
|
|
108
|
+
sessionId,
|
|
109
|
+
);
|
|
110
|
+
if (owner) {
|
|
111
|
+
sessionDirectoryClients.get(directory)?.reset();
|
|
112
|
+
sessionDirectoryClients.set(directory, owner);
|
|
113
|
+
client = owner;
|
|
114
|
+
endpoint = await owner.resolveEndpoint();
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
if (endpoint) {
|
|
118
|
+
return {
|
|
119
|
+
client,
|
|
120
|
+
directory: client === startup ? (rpcClientDirectory ?? "") : directory,
|
|
121
|
+
endpoint,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
if (client === startup) return null;
|
|
125
|
+
const startupEndpoint = await startup.resolveEndpoint();
|
|
126
|
+
return startupEndpoint
|
|
127
|
+
? { client: startup, directory: rpcClientDirectory ?? "", endpoint: startupEndpoint }
|
|
128
|
+
: null;
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
/** The directory whose server a notification subscription for `sessionDirectory` targets first. */
|
|
132
|
+
export function notificationDirectoryFor(sessionDirectory: string | null): string {
|
|
133
|
+
const directory = sessionDirectory ?? "";
|
|
134
|
+
if (!directory || directory === rpcClientDirectory) return rpcClientDirectory ?? "";
|
|
135
|
+
return directory;
|
|
136
|
+
}
|
|
137
|
+
|
|
138
|
+
/**
|
|
139
|
+
* Call a session-scoped RPC on the server that owns the session's directory.
|
|
140
|
+
* When no server is filed under that directory (the host spelled it in a way
|
|
141
|
+
* the canonical form still does not match), every live local server is asked
|
|
142
|
+
* whether it owns the session, and the owner, if any, answers this call and
|
|
143
|
+
* later ones for the directory. Only when no server claims the session does
|
|
144
|
+
* the call fail as before.
|
|
145
|
+
*/
|
|
146
|
+
async function callSessionRpc<T>(
|
|
147
|
+
directory: string,
|
|
148
|
+
sessionId: string,
|
|
149
|
+
method: string,
|
|
150
|
+
params: Record<string, unknown>,
|
|
151
|
+
): Promise<T> {
|
|
152
|
+
const client = clientForDirectory(directory);
|
|
153
|
+
if (!client) throw new Error("RPC client is not initialized");
|
|
154
|
+
try {
|
|
155
|
+
return await client.call<T>(method, params);
|
|
156
|
+
} catch (error) {
|
|
157
|
+
if (!(error instanceof RpcServerNotFoundError) || client === rpcClient) throw error;
|
|
158
|
+
const owner = await MagicContextRpcClient.findSessionOwner(
|
|
159
|
+
getMagicContextStorageDir(),
|
|
160
|
+
sessionId,
|
|
161
|
+
);
|
|
162
|
+
if (!owner) throw error;
|
|
163
|
+
sessionDirectoryClients.get(directory)?.reset();
|
|
164
|
+
sessionDirectoryClients.set(directory, owner);
|
|
165
|
+
return owner.call<T>(method, params);
|
|
166
|
+
}
|
|
22
167
|
}
|
|
23
168
|
|
|
24
169
|
export function getRpcGeneration(): number {
|
|
@@ -38,6 +183,8 @@ export function closeRpc(): void {
|
|
|
38
183
|
rpcGeneration += 1;
|
|
39
184
|
rpcClient?.reset();
|
|
40
185
|
rpcClient = null;
|
|
186
|
+
rpcClientDirectory = null;
|
|
187
|
+
resetSessionDirectoryClients();
|
|
41
188
|
}
|
|
42
189
|
|
|
43
190
|
const EMPTY_SNAPSHOT: SidebarSnapshot = {
|
|
@@ -134,10 +281,15 @@ export async function loadSidebarSnapshot(
|
|
|
134
281
|
const empty: SidebarSnapshot = { ...EMPTY_SNAPSHOT, sessionId };
|
|
135
282
|
if (!rpcClient) return recallSidebarSnapshot(sessionId, empty);
|
|
136
283
|
try {
|
|
137
|
-
const result = await
|
|
138
|
-
sessionId,
|
|
284
|
+
const result = await callSessionRpc<SidebarSnapshot>(
|
|
139
285
|
directory,
|
|
140
|
-
|
|
286
|
+
sessionId,
|
|
287
|
+
"sidebar-snapshot",
|
|
288
|
+
{
|
|
289
|
+
sessionId,
|
|
290
|
+
directory,
|
|
291
|
+
},
|
|
292
|
+
);
|
|
141
293
|
if ((result as unknown as Record<string, unknown>).error) {
|
|
142
294
|
// Snapshot-build errors are explicit failure envelopes, equivalent to
|
|
143
295
|
// a transport failure: retain the last known-good client snapshot.
|
|
@@ -162,26 +314,29 @@ export async function loadSidebarSnapshot(
|
|
|
162
314
|
}
|
|
163
315
|
}
|
|
164
316
|
|
|
165
|
-
export type StatusDetailResult =
|
|
317
|
+
export type StatusDetailResult = StatusCheck<OpenCodeStatusExtras>;
|
|
166
318
|
|
|
167
|
-
/**
|
|
319
|
+
/**
|
|
320
|
+
* Fetch the status for the `/ctx-status` dialog. Every reply, including a
|
|
321
|
+
* transport failure, comes back as a checked result: either a snapshot the
|
|
322
|
+
* view model can draw, or the reason there is none. The dialog never receives
|
|
323
|
+
* an unchecked payload.
|
|
324
|
+
*/
|
|
168
325
|
export async function loadStatusDetail(
|
|
169
326
|
sessionId: string,
|
|
170
327
|
directory: string,
|
|
171
328
|
modelKey?: string,
|
|
172
329
|
): Promise<StatusDetailResult> {
|
|
173
|
-
if (!rpcClient) return
|
|
330
|
+
if (!rpcClient) return statusRpcFailure("RPC client is not initialized");
|
|
174
331
|
try {
|
|
175
|
-
const
|
|
332
|
+
const reply = await callSessionRpc<unknown>(directory, sessionId, "status-detail", {
|
|
176
333
|
sessionId,
|
|
177
334
|
directory,
|
|
178
335
|
modelKey,
|
|
179
336
|
});
|
|
180
|
-
|
|
181
|
-
if (typeof error === "string") return { ok: false, error };
|
|
182
|
-
return { ok: true, detail: result };
|
|
337
|
+
return checkStatusDetailPayload(reply, pluginPackageVersion() ?? "unknown");
|
|
183
338
|
} catch (error) {
|
|
184
|
-
return
|
|
339
|
+
return statusRpcFailure(error instanceof Error ? error.message : String(error));
|
|
185
340
|
}
|
|
186
341
|
}
|
|
187
342
|
|
|
@@ -199,7 +354,7 @@ const EMPTY_EMBED_DETAIL: EmbedDetail = {
|
|
|
199
354
|
export async function loadEmbedDetail(sessionId: string, directory: string): Promise<EmbedDetail> {
|
|
200
355
|
if (!rpcClient) return EMPTY_EMBED_DETAIL;
|
|
201
356
|
try {
|
|
202
|
-
const result = await
|
|
357
|
+
const result = await callSessionRpc<EmbedDetail>(directory, sessionId, "embed-detail", {
|
|
203
358
|
sessionId,
|
|
204
359
|
directory,
|
|
205
360
|
});
|
|
@@ -221,9 +376,14 @@ export async function getCompartmentCount(
|
|
|
221
376
|
): Promise<CompartmentCountResult> {
|
|
222
377
|
if (!rpcClient) return { ok: false, error: "RPC client is not initialized" };
|
|
223
378
|
try {
|
|
224
|
-
const result = await
|
|
379
|
+
const result = await callSessionRpc<{ count?: number; error?: string }>(
|
|
380
|
+
directory ?? "",
|
|
381
|
+
sessionId,
|
|
225
382
|
"compartment-count",
|
|
226
|
-
{
|
|
383
|
+
{
|
|
384
|
+
sessionId,
|
|
385
|
+
directory,
|
|
386
|
+
},
|
|
227
387
|
);
|
|
228
388
|
if (typeof result.error === "string") return { ok: false, error: result.error };
|
|
229
389
|
if (typeof result.count !== "number" || !Number.isFinite(result.count)) {
|
|
@@ -235,11 +395,17 @@ export async function getCompartmentCount(
|
|
|
235
395
|
}
|
|
236
396
|
}
|
|
237
397
|
|
|
238
|
-
/**
|
|
239
|
-
|
|
398
|
+
/**
|
|
399
|
+
* Send recomp request to server via RPC. `directory` is the session's
|
|
400
|
+
* directory, so the request reaches the server instance that owns the session
|
|
401
|
+
* (the same one the recomp dialog read its compartment count from).
|
|
402
|
+
*/
|
|
403
|
+
export async function requestRecomp(sessionId: string, directory?: string): Promise<boolean> {
|
|
240
404
|
if (!rpcClient) return false;
|
|
241
405
|
try {
|
|
242
|
-
const result = await
|
|
406
|
+
const result = await callSessionRpc<{ ok: boolean }>(directory ?? "", sessionId, "recomp", {
|
|
407
|
+
sessionId,
|
|
408
|
+
});
|
|
243
409
|
return result.ok ?? false;
|
|
244
410
|
} catch {
|
|
245
411
|
return false;
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { afterEach, describe, expect, test } from "bun:test";
|
|
2
|
-
import { mkdirSync,
|
|
2
|
+
import { mkdirSync, rmSync, writeFileSync } from "node:fs";
|
|
3
3
|
import { tmpdir } from "node:os";
|
|
4
4
|
import { dirname, join } from "node:path";
|
|
5
5
|
import {
|
|
@@ -10,6 +10,7 @@ import {
|
|
|
10
10
|
} from "../../shared/rpc-notifications";
|
|
11
11
|
import { MagicContextRpcServer } from "../../shared/rpc-server";
|
|
12
12
|
import { rpcPortFilePath } from "../../shared/rpc-utils";
|
|
13
|
+
import { createTestTempDirFromPath } from "../../shared/test-temp-dir";
|
|
13
14
|
import { closeRpc, initRpcClient } from "./context-db";
|
|
14
15
|
import {
|
|
15
16
|
_resetNotificationSocketStateForTesting,
|
|
@@ -41,7 +42,7 @@ afterEach(() => {
|
|
|
41
42
|
});
|
|
42
43
|
|
|
43
44
|
function makeDataHome(): string {
|
|
44
|
-
const dir =
|
|
45
|
+
const dir = createTestTempDirFromPath(join(tmpdir(), "mc-notification-socket-"));
|
|
45
46
|
tempDirs.push(dir);
|
|
46
47
|
process.env.XDG_DATA_HOME = dir;
|
|
47
48
|
return dir;
|
|
@@ -167,6 +168,52 @@ describe("notification socket", () => {
|
|
|
167
168
|
expect(drainNotifications(0, "ses_hidden", { sessionOnly: true })).toHaveLength(1);
|
|
168
169
|
});
|
|
169
170
|
|
|
171
|
+
test("subscribes to the server of the shown session's directory, not the startup one", async () => {
|
|
172
|
+
// A TUI started in the home directory showing a session from a project
|
|
173
|
+
// directory: the project's server runs that session's commands, so its
|
|
174
|
+
// "show status dialog" push only reaches a socket subscribed to it.
|
|
175
|
+
const dataHome = makeDataHome();
|
|
176
|
+
const home = startLegacyServer(dataHome, "/home-startup", []);
|
|
177
|
+
const project = startLegacyServer(dataHome, "/home-startup/Pictures/project", [
|
|
178
|
+
{
|
|
179
|
+
id: 1,
|
|
180
|
+
type: "action",
|
|
181
|
+
payload: { action: "show-status-dialog" },
|
|
182
|
+
sessionId: "ses_p",
|
|
183
|
+
},
|
|
184
|
+
]);
|
|
185
|
+
initRpcClient("/home-startup");
|
|
186
|
+
const received: SocketNotification[] = [];
|
|
187
|
+
startNotificationSocket({
|
|
188
|
+
getSessionId: () => "ses_p",
|
|
189
|
+
getSessionDirectory: () => "/home-startup/Pictures/project",
|
|
190
|
+
onNotification: (notification) => {
|
|
191
|
+
received.push(notification);
|
|
192
|
+
return true;
|
|
193
|
+
},
|
|
194
|
+
});
|
|
195
|
+
await waitFor(() => received.length === 1, "the project server's push");
|
|
196
|
+
expect(project.sockets.size).toBe(1);
|
|
197
|
+
expect(home.sockets.size).toBe(0);
|
|
198
|
+
});
|
|
199
|
+
|
|
200
|
+
test("moves the socket when the shown session changes directory", async () => {
|
|
201
|
+
const dataHome = makeDataHome();
|
|
202
|
+
const home = startLegacyServer(dataHome, "/home-move", []);
|
|
203
|
+
const project = startLegacyServer(dataHome, "/home-move/project", []);
|
|
204
|
+
initRpcClient("/home-move");
|
|
205
|
+
let sessionDirectory: string | null = null;
|
|
206
|
+
startNotificationSocket({
|
|
207
|
+
getSessionId: () => (sessionDirectory ? "ses_moved" : null),
|
|
208
|
+
getSessionDirectory: () => sessionDirectory,
|
|
209
|
+
onNotification: () => true,
|
|
210
|
+
});
|
|
211
|
+
await waitFor(() => home.sockets.size === 1, "startup subscription");
|
|
212
|
+
sessionDirectory = "/home-move/project";
|
|
213
|
+
await waitFor(() => project.sockets.size === 1, "project subscription", 5_000);
|
|
214
|
+
await waitFor(() => home.sockets.size === 0, "startup socket closed");
|
|
215
|
+
});
|
|
216
|
+
|
|
170
217
|
test("overlapping starts create one socket and one delivery", async () => {
|
|
171
218
|
drainNotifications(Number.MAX_SAFE_INTEGER);
|
|
172
219
|
const dataHome = makeDataHome();
|
|
@@ -18,7 +18,11 @@
|
|
|
18
18
|
* unlike the old poll it does no network work at idle.
|
|
19
19
|
*/
|
|
20
20
|
|
|
21
|
-
import {
|
|
21
|
+
import {
|
|
22
|
+
getRpcGeneration,
|
|
23
|
+
notificationDirectoryFor,
|
|
24
|
+
resolveNotificationTarget,
|
|
25
|
+
} from "./context-db";
|
|
22
26
|
|
|
23
27
|
export interface SocketNotification {
|
|
24
28
|
id: number;
|
|
@@ -30,6 +34,12 @@ export interface SocketNotification {
|
|
|
30
34
|
interface NotificationSocketOptions {
|
|
31
35
|
/** Current active session id (re-read cheaply to follow session switches). */
|
|
32
36
|
getSessionId: () => string | null;
|
|
37
|
+
/**
|
|
38
|
+
* Directory of the active session, when the host reports it. The socket
|
|
39
|
+
* subscribes to that directory's server, because that is the server whose
|
|
40
|
+
* commands push this session's notifications; null means the startup one.
|
|
41
|
+
*/
|
|
42
|
+
getSessionDirectory?: () => string | null;
|
|
33
43
|
/** Handle one delivered notification. Returns true only after it is fully
|
|
34
44
|
* consumed and can be acknowledged. Async because dialog handlers await. */
|
|
35
45
|
onNotification: (notification: SocketNotification) => boolean | Promise<boolean>;
|
|
@@ -47,6 +57,13 @@ let sessionWatchTimer: ReturnType<typeof setInterval> | undefined;
|
|
|
47
57
|
let reconnectAttempt = 0;
|
|
48
58
|
let closed = false;
|
|
49
59
|
let helloedSession: string | null = null;
|
|
60
|
+
/** Directory whose server the open socket is subscribed to. */
|
|
61
|
+
let connectedDirectory: string | null = null;
|
|
62
|
+
/** Last time the socket was moved to follow a session's directory. */
|
|
63
|
+
let lastRetargetAt = 0;
|
|
64
|
+
/** Minimum spacing between moves, so a session whose server is not up yet does
|
|
65
|
+
* not reconnect the socket every watcher tick. */
|
|
66
|
+
const RETARGET_MIN_INTERVAL_MS = 10_000;
|
|
50
67
|
let opts: NotificationSocketOptions | null = null;
|
|
51
68
|
let activeToken: string | null = null;
|
|
52
69
|
/** Generation of the rpc client used by the active socket. */
|
|
@@ -110,6 +127,8 @@ export function stopNotificationSocket(): void {
|
|
|
110
127
|
opts = null;
|
|
111
128
|
activeToken = null;
|
|
112
129
|
helloedSession = null;
|
|
130
|
+
connectedDirectory = null;
|
|
131
|
+
lastRetargetAt = 0;
|
|
113
132
|
reconnectAttempt = 0;
|
|
114
133
|
activeInstanceId = null;
|
|
115
134
|
notificationProtocolMode = null;
|
|
@@ -136,24 +155,22 @@ function scheduleReconnect(): void {
|
|
|
136
155
|
async function connect(): Promise<void> {
|
|
137
156
|
if (closed || socket || inFlightAttemptId !== null) return;
|
|
138
157
|
|
|
139
|
-
const client = getRpcClient();
|
|
140
|
-
if (!client) {
|
|
141
|
-
scheduleReconnect();
|
|
142
|
-
return;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
158
|
const attemptId = ++nextAttemptId;
|
|
146
159
|
const rpcGeneration = getRpcGeneration();
|
|
147
160
|
inFlightAttemptId = attemptId;
|
|
148
|
-
const
|
|
161
|
+
const target = await resolveNotificationTarget(
|
|
162
|
+
opts?.getSessionDirectory?.() ?? null,
|
|
163
|
+
opts?.getSessionId() ?? null,
|
|
164
|
+
);
|
|
149
165
|
if (closed || inFlightAttemptId !== attemptId || getRpcGeneration() !== rpcGeneration) {
|
|
150
166
|
return;
|
|
151
167
|
}
|
|
152
168
|
inFlightAttemptId = null;
|
|
153
|
-
if (!
|
|
169
|
+
if (!target) {
|
|
154
170
|
scheduleReconnect();
|
|
155
171
|
return;
|
|
156
172
|
}
|
|
173
|
+
const { client, endpoint } = target;
|
|
157
174
|
|
|
158
175
|
let ws: WebSocket;
|
|
159
176
|
try {
|
|
@@ -171,6 +188,7 @@ async function connect(): Promise<void> {
|
|
|
171
188
|
return;
|
|
172
189
|
}
|
|
173
190
|
connectGeneration = rpcGeneration;
|
|
191
|
+
connectedDirectory = target.directory;
|
|
174
192
|
activeToken = endpoint.token;
|
|
175
193
|
notificationProtocolMode = null;
|
|
176
194
|
bufferedNotifications.length = 0;
|
|
@@ -457,6 +475,26 @@ export function _resetNotificationSocketStateForTesting(): void {
|
|
|
457
475
|
* actually changes. Reads a property; no network at idle. */
|
|
458
476
|
function watchSession(): void {
|
|
459
477
|
if (closed || !socket || socket.readyState !== WebSocket.OPEN) return;
|
|
478
|
+
// The shown session belongs to another directory's server: move the socket
|
|
479
|
+
// there, or that server's pushes for this session never reach this TUI.
|
|
480
|
+
const wanted = notificationDirectoryFor(opts?.getSessionDirectory?.() ?? null);
|
|
481
|
+
if (wanted !== connectedDirectory && Date.now() - lastRetargetAt >= RETARGET_MIN_INTERVAL_MS) {
|
|
482
|
+
lastRetargetAt = Date.now();
|
|
483
|
+
const previous = socket;
|
|
484
|
+
socket = null;
|
|
485
|
+
activeToken = null;
|
|
486
|
+
helloedSession = null;
|
|
487
|
+
connectedDirectory = null;
|
|
488
|
+
notificationProtocolMode = null;
|
|
489
|
+
bufferedNotifications.length = 0;
|
|
490
|
+
try {
|
|
491
|
+
previous.close();
|
|
492
|
+
} catch {
|
|
493
|
+
// best-effort
|
|
494
|
+
}
|
|
495
|
+
void connect();
|
|
496
|
+
return;
|
|
497
|
+
}
|
|
460
498
|
const current = opts?.getSessionId() ?? null;
|
|
461
499
|
if (current === helloedSession) return;
|
|
462
500
|
// Re-hello with the token authenticated by this socket; no rediscovery or
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The directory whose Magic Context server owns a session.
|
|
3
|
+
*
|
|
4
|
+
* OpenCode starts one Magic Context server instance per directory. The TUI
|
|
5
|
+
* starts in one directory but can show a session from another one (non-git
|
|
6
|
+
* directories share OpenCode's global project, so a TUI started in the home
|
|
7
|
+
* directory lists sessions from any of them). The sidebar and `/ctx-status`
|
|
8
|
+
* must ask the server for the session's directory, not the startup one.
|
|
9
|
+
*
|
|
10
|
+
* `sessionDirectory` is what the host reports for the session (OpenCode 1:
|
|
11
|
+
* `api.state.session.get(id).directory`; OpenCode 2:
|
|
12
|
+
* `context.data.session.get(id).location.directory`). The startup directory is
|
|
13
|
+
* the fallback while the host has not loaded the session yet.
|
|
14
|
+
*/
|
|
15
|
+
export function directoryForSession(sessionDirectory: unknown, startupDirectory: string): string {
|
|
16
|
+
return typeof sessionDirectory === "string" && sessionDirectory.length > 0
|
|
17
|
+
? sessionDirectory
|
|
18
|
+
: startupDirectory;
|
|
19
|
+
}
|