@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
|
@@ -10,8 +10,11 @@ import {
|
|
|
10
10
|
classifyProcessKind,
|
|
11
11
|
discoverLivePiProcessIds,
|
|
12
12
|
inspectLivePiProcesses,
|
|
13
|
+
inspectWindowsProcessesSync,
|
|
13
14
|
isPidAlive,
|
|
14
15
|
isPidIdentityPlausible,
|
|
16
|
+
parseTasklistOutput,
|
|
17
|
+
processCannotBeRpcHost,
|
|
15
18
|
type RpcPortFileRecord,
|
|
16
19
|
readProcessProbeEvidence,
|
|
17
20
|
} from "./rpc-utils";
|
|
@@ -441,7 +444,7 @@ describe("isPidAlive", () => {
|
|
|
441
444
|
expect(calls).toEqual([
|
|
442
445
|
{
|
|
443
446
|
file: "tasklist",
|
|
444
|
-
args: ["/FO", "CSV", "/FI", `PID eq ${PID}`],
|
|
447
|
+
args: ["/FO", "CSV", "/NH", "/FI", `PID eq ${PID}`],
|
|
445
448
|
stdio: ["ignore", "pipe", "pipe"],
|
|
446
449
|
},
|
|
447
450
|
]);
|
|
@@ -623,19 +626,195 @@ describe("isPidIdentityPlausible", () => {
|
|
|
623
626
|
});
|
|
624
627
|
|
|
625
628
|
expect(isPidIdentityPlausible(record(0))).toBe("plausible");
|
|
626
|
-
expect(calls).toEqual([
|
|
629
|
+
expect(calls).toEqual([
|
|
630
|
+
{ file: "tasklist", args: ["/FO", "CSV", "/NH", "/FI", `PID eq ${PID}`] },
|
|
631
|
+
]);
|
|
627
632
|
|
|
628
633
|
calls.length = 0;
|
|
634
|
+
// With the start time unreadable, the image is read next: only an image
|
|
635
|
+
// that cannot be a host would prove the record stale, and OpenCode.exe can.
|
|
629
636
|
expect(isPidIdentityPlausible(record(NOW_MS))).toBe("inconclusive");
|
|
630
|
-
expect(calls).toEqual([
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
637
|
+
expect(calls.map((call) => call.file)).toEqual(["powershell", "tasklist"]);
|
|
638
|
+
expect(calls[0]?.args.slice(0, 2)).toEqual(["-NoProfile", "-Command"]);
|
|
639
|
+
expect(String(calls[0]?.args[2])).toContain("Get-CimInstance Win32_Process");
|
|
640
|
+
expect(String(calls[0]?.args[2])).toContain("ToString('o')");
|
|
641
|
+
});
|
|
642
|
+
});
|
|
643
|
+
|
|
644
|
+
test("the synchronous Windows process list allows more output than the 1 MiB default", () => {
|
|
645
|
+
// Bun's execFileSync throws ENOBUFS past 1 MiB, and a Win32_Process listing
|
|
646
|
+
// with command lines passes that on a busy desktop; the snapshot then falls
|
|
647
|
+
// back to tasklist, which has no start times.
|
|
648
|
+
const limits: unknown[] = [];
|
|
649
|
+
__setRpcIdentityTestHooks({
|
|
650
|
+
platform: "win32",
|
|
651
|
+
processListExecFileSync: ((
|
|
652
|
+
_file: string,
|
|
653
|
+
_args: readonly string[],
|
|
654
|
+
options?: { maxBuffer?: number },
|
|
655
|
+
) => {
|
|
656
|
+
limits.push(options?.maxBuffer);
|
|
657
|
+
return JSON.stringify([
|
|
658
|
+
{
|
|
659
|
+
ProcessId: 7,
|
|
660
|
+
ParentProcessId: 1,
|
|
661
|
+
Name: "opencode.exe",
|
|
662
|
+
CommandLine: "opencode",
|
|
663
|
+
CreationDate: "2026-09-30T10:15:00Z",
|
|
664
|
+
},
|
|
665
|
+
]);
|
|
666
|
+
}) as unknown as typeof execFileSync,
|
|
667
|
+
});
|
|
668
|
+
const inspection = inspectWindowsProcessesSync();
|
|
669
|
+
expect(inspection.processSnapshot?.source).toBe("cim");
|
|
670
|
+
expect(limits).toEqual([8 * 1024 * 1024]);
|
|
671
|
+
});
|
|
672
|
+
|
|
673
|
+
test("Spanish tasklist no-match is not running", () => {
|
|
674
|
+
const output =
|
|
675
|
+
"INFORMACIÓN: no hay tareas ejecutándose que coincidan con los\ncriterios especificados.";
|
|
676
|
+
expect(parseTasklistOutput(output)).toEqual([]);
|
|
677
|
+
__setRpcIdentityTestHooks({ platform: "win32", execFileSync: psOutput(output) });
|
|
678
|
+
expect(isPidAlive(PID)).toBe("dead");
|
|
679
|
+
});
|
|
680
|
+
|
|
681
|
+
test("German tasklist no-match is not running", () => {
|
|
682
|
+
expect(
|
|
683
|
+
parseTasklistOutput(
|
|
684
|
+
"INFORMATION: Es werden keine Aufgaben mit den angegebenen Kriterien ausgeführt.",
|
|
685
|
+
),
|
|
686
|
+
).toEqual([]);
|
|
687
|
+
});
|
|
688
|
+
|
|
689
|
+
test("tasklist CSV live process is running", () => {
|
|
690
|
+
expect(parseTasklistOutput('"opencode.exe","1234","Console","1","10,000 K"')).toEqual([
|
|
691
|
+
{ pid: 1234, command: "opencode.exe" },
|
|
692
|
+
]);
|
|
693
|
+
});
|
|
694
|
+
|
|
695
|
+
describe("proving a discovery record stale from the record's own start time", () => {
|
|
696
|
+
// Values from a Windows machine where PIDs from old records had been reused.
|
|
697
|
+
const RECORDED = Date.parse("2026-08-16T22:49:55Z");
|
|
698
|
+
const DAY_MS = 24 * 60 * 60 * 1000;
|
|
699
|
+
const windowsRecord = (startedAt: number): RpcPortFileRecord => ({
|
|
700
|
+
port: 54209,
|
|
701
|
+
pid: 15520,
|
|
702
|
+
started_at: startedAt,
|
|
703
|
+
});
|
|
704
|
+
|
|
705
|
+
test("a PID whose process started after the record was written is a reused PID", () => {
|
|
706
|
+
expect(
|
|
707
|
+
isPidIdentityPlausible(windowsRecord(RECORDED), {
|
|
708
|
+
startTime: RECORDED + 42 * DAY_MS,
|
|
709
|
+
commandLine: "C:\\Windows\\System32\\RuntimeBroker.exe -Embedding",
|
|
710
|
+
imageName: "RuntimeBroker.exe",
|
|
711
|
+
}),
|
|
712
|
+
).toBe("implausible");
|
|
713
|
+
// The start time alone is proof, even when the new process is a runtime a
|
|
714
|
+
// host could use.
|
|
715
|
+
expect(
|
|
716
|
+
isPidIdentityPlausible(windowsRecord(RECORDED), {
|
|
717
|
+
startTime: RECORDED + 42 * DAY_MS,
|
|
718
|
+
commandLine: "node.exe C:\\tools\\unrelated.js",
|
|
719
|
+
imageName: "node.exe",
|
|
720
|
+
}),
|
|
721
|
+
).toBe("implausible");
|
|
722
|
+
});
|
|
723
|
+
|
|
724
|
+
test("a host that started at or before its record is genuine", () => {
|
|
725
|
+
for (const startTime of [RECORDED - 13_000, RECORDED]) {
|
|
726
|
+
expect(
|
|
727
|
+
isPidIdentityPlausible(windowsRecord(RECORDED), {
|
|
728
|
+
startTime,
|
|
729
|
+
commandLine: null,
|
|
730
|
+
imageName: "RuntimeBroker.exe",
|
|
731
|
+
}),
|
|
732
|
+
).toBe("plausible");
|
|
733
|
+
}
|
|
734
|
+
});
|
|
735
|
+
|
|
736
|
+
test("an unreadable start time with an image no host can run is a reused PID", () => {
|
|
737
|
+
for (const imageName of ["svchost.exe", "WinAutomation.UserAgent.exe"]) {
|
|
738
|
+
expect(
|
|
739
|
+
isPidIdentityPlausible(windowsRecord(RECORDED), {
|
|
740
|
+
startTime: null,
|
|
741
|
+
commandLine: imageName,
|
|
742
|
+
imageName,
|
|
743
|
+
}),
|
|
744
|
+
).toBe("implausible");
|
|
745
|
+
}
|
|
746
|
+
});
|
|
747
|
+
|
|
748
|
+
test("an unreadable start time with a host-like image stays inconclusive", () => {
|
|
749
|
+
for (const imageName of [
|
|
750
|
+
"opencode.exe",
|
|
751
|
+
"OpenChamber.exe",
|
|
752
|
+
"pi.exe",
|
|
753
|
+
"omp.exe",
|
|
754
|
+
"bun.exe",
|
|
755
|
+
"node.exe",
|
|
756
|
+
"ck-mc.exe",
|
|
757
|
+
]) {
|
|
758
|
+
expect(
|
|
759
|
+
isPidIdentityPlausible(windowsRecord(RECORDED), {
|
|
760
|
+
startTime: null,
|
|
761
|
+
commandLine: null,
|
|
762
|
+
imageName,
|
|
763
|
+
}),
|
|
764
|
+
).toBe("inconclusive");
|
|
765
|
+
}
|
|
766
|
+
expect(
|
|
767
|
+
isPidIdentityPlausible(windowsRecord(RECORDED), {
|
|
768
|
+
startTime: null,
|
|
769
|
+
commandLine: null,
|
|
770
|
+
imageName: null,
|
|
771
|
+
}),
|
|
772
|
+
).toBe("inconclusive");
|
|
773
|
+
});
|
|
774
|
+
|
|
775
|
+
test("an unreadable start time is resolved from the probed image when no evidence is passed", () => {
|
|
776
|
+
__setRpcIdentityTestHooks({
|
|
777
|
+
platform: "win32",
|
|
778
|
+
execFileSync: ((file: string | URL) => {
|
|
779
|
+
if (String(file) === "powershell") throw new Error("CIM unavailable");
|
|
780
|
+
return tasklistOutput([[15520, "svchost.exe"]]);
|
|
781
|
+
}) as typeof execFileSync,
|
|
782
|
+
});
|
|
783
|
+
expect(isPidIdentityPlausible(windowsRecord(RECORDED))).toBe("implausible");
|
|
784
|
+
});
|
|
785
|
+
|
|
786
|
+
test("a record without a start time is stale only when its image cannot be a host", () => {
|
|
787
|
+
expect(
|
|
788
|
+
isPidIdentityPlausible(windowsRecord(0), {
|
|
789
|
+
startTime: null,
|
|
790
|
+
commandLine: "dllhost.exe",
|
|
791
|
+
imageName: "dllhost.exe",
|
|
792
|
+
}),
|
|
793
|
+
).toBe("implausible");
|
|
794
|
+
expect(
|
|
795
|
+
isPidIdentityPlausible(windowsRecord(0), {
|
|
796
|
+
startTime: null,
|
|
797
|
+
commandLine: "pi.exe",
|
|
798
|
+
imageName: "pi.exe",
|
|
799
|
+
}),
|
|
800
|
+
).toBe("inconclusive");
|
|
801
|
+
});
|
|
802
|
+
|
|
803
|
+
test("host markers are matched in either the image name or the command line", () => {
|
|
804
|
+
expect(processCannotBeRpcHost({ commandLine: null, imageName: "Cherry Studio.exe" })).toBe(
|
|
805
|
+
true,
|
|
806
|
+
);
|
|
807
|
+
expect(
|
|
808
|
+
processCannotBeRpcHost({
|
|
809
|
+
commandLine: "C:\\Users\\a\\.bun\\bin\\omp.exe",
|
|
810
|
+
imageName: "unknown",
|
|
811
|
+
}),
|
|
812
|
+
).toBe(false);
|
|
813
|
+
expect(
|
|
814
|
+
processCannotBeRpcHost({
|
|
815
|
+
commandLine: "/usr/bin/env node /opt/pi-coding-agent/dist/cli.js",
|
|
816
|
+
}),
|
|
817
|
+
).toBe(false);
|
|
818
|
+
expect(processCannotBeRpcHost({ commandLine: " ", imageName: null })).toBe(false);
|
|
640
819
|
});
|
|
641
820
|
});
|
package/src/shared/rpc-utils.ts
CHANGED
|
@@ -5,6 +5,7 @@ import { join } from "node:path";
|
|
|
5
5
|
|
|
6
6
|
import { log } from "./logger";
|
|
7
7
|
import { PI_IMAGE_NAMES, piHarnessKindFromExecutable } from "./pi-executable";
|
|
8
|
+
import { canonicalProjectDirectory } from "./project-directory-key";
|
|
8
9
|
|
|
9
10
|
export type ProcessKind = "OpenCode server" | "OpenCode instance (TUI/CLI)" | "Pi" | "process";
|
|
10
11
|
|
|
@@ -14,6 +15,11 @@ export interface ProcessProbeEvidence {
|
|
|
14
15
|
startTime: number | null;
|
|
15
16
|
/** The raw command line, or null when the platform/probe cannot provide it. */
|
|
16
17
|
commandLine: string | null;
|
|
18
|
+
/**
|
|
19
|
+
* The executable image name when the process list reports it separately
|
|
20
|
+
* from the command line (Windows CIM and tasklist), otherwise absent.
|
|
21
|
+
*/
|
|
22
|
+
imageName?: string | null;
|
|
17
23
|
}
|
|
18
24
|
|
|
19
25
|
export interface RpcPortFileRecord {
|
|
@@ -68,8 +74,27 @@ export function isOwnRpcServerRecord(
|
|
|
68
74
|
/**
|
|
69
75
|
* Stable hash for a project directory — scopes RPC port files per-project
|
|
70
76
|
* so multiple OpenCode instances don't collide.
|
|
77
|
+
*
|
|
78
|
+
* The server that writes a discovery file and the TUI that looks it up often
|
|
79
|
+
* receive the same directory spelled differently (macOS `/var` vs
|
|
80
|
+
* `/private/var`; on Windows drive-letter case, separators, a trailing
|
|
81
|
+
* separator, `\\?\` prefixes, 8.3 short names). Both hash the one canonical
|
|
82
|
+
* spelling from `canonicalProjectDirectory`, so any of those spellings finds the
|
|
83
|
+
* same file.
|
|
71
84
|
*/
|
|
72
85
|
export function projectHash(directory: string): string {
|
|
86
|
+
return createHash("sha256")
|
|
87
|
+
.update(canonicalProjectDirectory(directory))
|
|
88
|
+
.digest("hex")
|
|
89
|
+
.slice(0, 16);
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
/**
|
|
93
|
+
* The hash builds up to 0.44.4 used: the spelling as given, minus trailing
|
|
94
|
+
* slashes. Lookups also read that directory so a TUI can still find an older
|
|
95
|
+
* server (and tell the user it is older).
|
|
96
|
+
*/
|
|
97
|
+
export function legacyProjectHash(directory: string): string {
|
|
73
98
|
const normalized = directory.replace(/\/+$/, "");
|
|
74
99
|
return createHash("sha256").update(normalized).digest("hex").slice(0, 16);
|
|
75
100
|
}
|
|
@@ -79,6 +104,16 @@ export function rpcPortDir(storageDir: string, directory: string): string {
|
|
|
79
104
|
return join(storageDir, "rpc", projectHash(directory));
|
|
80
105
|
}
|
|
81
106
|
|
|
107
|
+
/**
|
|
108
|
+
* Every directory a lookup reads for this project: the canonical one servers
|
|
109
|
+
* write now, and the pre-canonical one older servers wrote.
|
|
110
|
+
*/
|
|
111
|
+
export function rpcPortDirsForLookup(storageDir: string, directory: string): string[] {
|
|
112
|
+
const canonical = rpcPortDir(storageDir, directory);
|
|
113
|
+
const legacy = join(storageDir, "rpc", legacyProjectHash(directory));
|
|
114
|
+
return legacy === canonical ? [canonical] : [canonical, legacy];
|
|
115
|
+
}
|
|
116
|
+
|
|
82
117
|
/** Per-process RPC port file path. */
|
|
83
118
|
export function rpcPortFilePath(
|
|
84
119
|
storageDir: string,
|
|
@@ -92,7 +127,7 @@ export function rpcPortFilePath(
|
|
|
92
127
|
|
|
93
128
|
/** Legacy single-port file used by v0.18.0 and earlier. */
|
|
94
129
|
export function legacyRpcPortFilePath(storageDir: string, directory: string): string {
|
|
95
|
-
return join(
|
|
130
|
+
return join(storageDir, "rpc", legacyProjectHash(directory), "port");
|
|
96
131
|
}
|
|
97
132
|
|
|
98
133
|
export type PidLiveness = "alive" | "dead" | "inconclusive";
|
|
@@ -121,10 +156,21 @@ const WINDOWS_CIM_PROBE_TIMEOUT_MS = 5_000;
|
|
|
121
156
|
const WINDOWS_PROCESS_SNAPSHOT_TTL_MS = 2_000;
|
|
122
157
|
const MAX_ANCESTOR_WALK_DEPTH = 16;
|
|
123
158
|
const OPEN_CODE_COMMAND_MARKERS = ["opencode", "node", "bun", "electron"];
|
|
124
|
-
|
|
125
|
-
|
|
159
|
+
// CreationDate is formatted in the query as an ISO-8601 UTC string. Left as a
|
|
160
|
+
// DateTime, ConvertTo-Json's output depends on the PowerShell edition (Windows
|
|
161
|
+
// PowerShell 5.1 can emit `\/Date(ms)\/` or an object wrapping it; PowerShell 7
|
|
162
|
+
// emits a local-offset string), and a start time the parser cannot read turns
|
|
163
|
+
// every live RPC holder's identity check inconclusive.
|
|
126
164
|
const WINDOWS_CIM_COMMAND =
|
|
127
|
-
"Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,CommandLine
|
|
165
|
+
"Get-CimInstance Win32_Process | Select-Object ProcessId,ParentProcessId,Name,CommandLine,@{Name='CreationDate';Expression={if ($_.CreationDate) { $_.CreationDate.ToUniversalTime().ToString('o') } else { $null }}} | ConvertTo-Json -Compress";
|
|
166
|
+
/**
|
|
167
|
+
* Output limit for process-list commands. A full Win32_Process listing with
|
|
168
|
+
* command lines routinely exceeds the 1 MiB `execFileSync` default (browser and
|
|
169
|
+
* editor processes carry very long command lines); past the limit the call
|
|
170
|
+
* throws ENOBUFS and the probe falls back to tasklist, which reports no start
|
|
171
|
+
* times.
|
|
172
|
+
*/
|
|
173
|
+
const PROCESS_LIST_MAX_BUFFER_BYTES = 8 * 1024 * 1024;
|
|
128
174
|
const PI_HARNESS_ARC_MARKERS = [
|
|
129
175
|
"pi-coding-agent",
|
|
130
176
|
"oh-my-pi",
|
|
@@ -212,6 +258,12 @@ export function readProcessProbeEvidence(pid: number): ProcessProbeEvidence {
|
|
|
212
258
|
};
|
|
213
259
|
}
|
|
214
260
|
|
|
261
|
+
function readCachedWindowsImageName(pid: number): string | null {
|
|
262
|
+
return rpcIdentityPlatform === "win32"
|
|
263
|
+
? (windowsProcessFactsCache?.get(pid)?.imageName ?? null)
|
|
264
|
+
: null;
|
|
265
|
+
}
|
|
266
|
+
|
|
215
267
|
interface ProcessListEntry {
|
|
216
268
|
pid: number;
|
|
217
269
|
command: string;
|
|
@@ -270,34 +322,39 @@ function parseCsvLine(line: string): string[] | null {
|
|
|
270
322
|
return fields;
|
|
271
323
|
}
|
|
272
324
|
|
|
273
|
-
function parseTasklistOutput(output: string): ProcessListEntry[] | null {
|
|
325
|
+
export function parseTasklistOutput(output: string): ProcessListEntry[] | null {
|
|
274
326
|
const entries: ProcessListEntry[] = [];
|
|
275
|
-
|
|
327
|
+
|
|
276
328
|
for (const rawLine of output.split(/\r?\n/)) {
|
|
277
329
|
const line = rawLine.trim();
|
|
278
330
|
if (!line) continue;
|
|
279
|
-
|
|
331
|
+
|
|
280
332
|
const fields = parseCsvLine(line);
|
|
281
333
|
if (!fields) continue;
|
|
282
334
|
if (fields[1]?.trim().toLowerCase() === "pid") {
|
|
283
|
-
sawHeader = true;
|
|
284
335
|
continue;
|
|
285
336
|
}
|
|
286
337
|
const pid = Number(fields[1]);
|
|
287
338
|
if (!Number.isInteger(pid) || pid <= 0 || !fields[0]) continue;
|
|
288
339
|
entries.push({ pid, command: fields[0] });
|
|
289
340
|
}
|
|
290
|
-
|
|
341
|
+
// Successful tasklist commands return localized prose when no PID matches.
|
|
342
|
+
// Only CSV PID fields are evidence of a live process; failures are caught by the caller.
|
|
343
|
+
return entries;
|
|
291
344
|
}
|
|
292
345
|
|
|
293
346
|
function readWindowsProcess(pid: number): { state: PidLiveness; command?: string } {
|
|
294
347
|
try {
|
|
295
|
-
const output = rpcIdentityExecFileSync(
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
348
|
+
const output = rpcIdentityExecFileSync(
|
|
349
|
+
"tasklist",
|
|
350
|
+
["/FO", "CSV", "/NH", "/FI", `PID eq ${pid}`],
|
|
351
|
+
{
|
|
352
|
+
encoding: "utf8",
|
|
353
|
+
timeout: PS_PROBE_TIMEOUT_MS,
|
|
354
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
355
|
+
windowsHide: true,
|
|
356
|
+
},
|
|
357
|
+
);
|
|
301
358
|
const entries = parseTasklistOutput(String(output));
|
|
302
359
|
if (entries === null) return { state: "inconclusive" };
|
|
303
360
|
const process = entries.find((entry) => entry.pid === pid);
|
|
@@ -417,6 +474,50 @@ function commandLooksLikeOpenCode(command: string): boolean {
|
|
|
417
474
|
return OPEN_CODE_COMMAND_MARKERS.some((marker) => normalized.includes(marker));
|
|
418
475
|
}
|
|
419
476
|
|
|
477
|
+
/**
|
|
478
|
+
* Text found in the image name or command line of every process that can write
|
|
479
|
+
* an RPC discovery record: OpenCode (CLI, server, desktop app, the CLI bundled
|
|
480
|
+
* in OpenChamber), Pi and Oh My Pi, ck-mc, and the runtimes they run on. These
|
|
481
|
+
* are matched as substrings, so a renamed or wrapped launch still counts as a
|
|
482
|
+
* possible host. A false match only keeps a record, never deletes one.
|
|
483
|
+
*/
|
|
484
|
+
const RPC_HOST_PROCESS_MARKERS = [
|
|
485
|
+
"opencode",
|
|
486
|
+
"openchamber",
|
|
487
|
+
"ck-mc",
|
|
488
|
+
"magic-context",
|
|
489
|
+
"cortexkit",
|
|
490
|
+
"electron",
|
|
491
|
+
"node",
|
|
492
|
+
"bun",
|
|
493
|
+
"deno",
|
|
494
|
+
"pi-coding-agent",
|
|
495
|
+
"oh-my-pi",
|
|
496
|
+
];
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* Whether the process's image name or command line proves it cannot be a Magic
|
|
500
|
+
* Context host. Pi's image names (`pi`, `omp`) are too short to match as
|
|
501
|
+
* substrings, so they are compared as whole executable names. Missing evidence
|
|
502
|
+
* is never proof: with neither field readable this returns false.
|
|
503
|
+
*/
|
|
504
|
+
export function processCannotBeRpcHost(
|
|
505
|
+
evidence: Pick<ProcessProbeEvidence, "commandLine" | "imageName">,
|
|
506
|
+
): boolean {
|
|
507
|
+
const texts = [evidence.imageName, evidence.commandLine].filter(
|
|
508
|
+
(text): text is string => typeof text === "string" && text.trim().length > 0,
|
|
509
|
+
);
|
|
510
|
+
if (texts.length === 0) return false;
|
|
511
|
+
for (const text of texts) {
|
|
512
|
+
const normalized = text.toLowerCase();
|
|
513
|
+
if (RPC_HOST_PROCESS_MARKERS.some((marker) => normalized.includes(marker))) return false;
|
|
514
|
+
const tokens = commandTokens(text);
|
|
515
|
+
if (commandHasPiExecutable(tokens)) return false;
|
|
516
|
+
if (tokens.some((token) => piHarnessKindFromExecutable(token) !== undefined)) return false;
|
|
517
|
+
}
|
|
518
|
+
return true;
|
|
519
|
+
}
|
|
520
|
+
|
|
420
521
|
/**
|
|
421
522
|
* Verify that a live PID still belongs to the process that wrote a port record.
|
|
422
523
|
*
|
|
@@ -426,6 +527,10 @@ function commandLooksLikeOpenCode(command: string): boolean {
|
|
|
426
527
|
* database-open guard path. Legacy records without a start time use a weaker
|
|
427
528
|
* command-name check. A failed filesystem or process probe is inconclusive,
|
|
428
529
|
* not proof that this port record still belongs to OpenCode.
|
|
530
|
+
*
|
|
531
|
+
* "implausible" is returned only with proof that the live process did not write
|
|
532
|
+
* the record: it started after the record's `started_at`, or its image cannot
|
|
533
|
+
* be any Magic Context host. Callers may delete such a record on every platform.
|
|
429
534
|
*/
|
|
430
535
|
export type PidIdentityPlausibility = "plausible" | "implausible" | "inconclusive";
|
|
431
536
|
|
|
@@ -437,10 +542,22 @@ export function isPidIdentityPlausible(
|
|
|
437
542
|
|
|
438
543
|
if (Number.isFinite(record.started_at) && record.started_at > 0) {
|
|
439
544
|
const processStartTime = evidence ? evidence.startTime : readProcessStartTime(record.pid);
|
|
440
|
-
if (processStartTime
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
545
|
+
if (processStartTime !== null) {
|
|
546
|
+
// A host writes `started_at` after it starts, so a process that started
|
|
547
|
+
// later than the record (beyond clock skew) cannot have written it: the
|
|
548
|
+
// PID was reused and the record is stale.
|
|
549
|
+
return processStartTime <= record.started_at + RPC_IDENTITY_SKEW_TOLERANCE_MS
|
|
550
|
+
? "plausible"
|
|
551
|
+
: "implausible";
|
|
552
|
+
}
|
|
553
|
+
// Some start times cannot be read at all (Windows service hosts such as
|
|
554
|
+
// svchost, when the query is not elevated). Then only an image that no host
|
|
555
|
+
// can run proves the PID was reused; anything else stays unknown.
|
|
556
|
+
const identity = evidence ?? {
|
|
557
|
+
commandLine: readProcessCommand(record.pid),
|
|
558
|
+
imageName: readCachedWindowsImageName(record.pid),
|
|
559
|
+
};
|
|
560
|
+
return processCannotBeRpcHost(identity) ? "implausible" : "inconclusive";
|
|
444
561
|
}
|
|
445
562
|
|
|
446
563
|
const command = evidence
|
|
@@ -451,7 +568,13 @@ export function isPidIdentityPlausible(
|
|
|
451
568
|
? (readWindowsProcess(record.pid).command ?? null)
|
|
452
569
|
: readPsProcessCommand(record.pid);
|
|
453
570
|
if (command === null) return "inconclusive";
|
|
454
|
-
|
|
571
|
+
if (commandLooksLikeOpenCode(command)) return "plausible";
|
|
572
|
+
// A record without a start time carries only a PID. Its process is proven
|
|
573
|
+
// unrelated only when its image cannot be a host (Pi and OpenChamber, for
|
|
574
|
+
// example, do not match the OpenCode markers above).
|
|
575
|
+
return processCannotBeRpcHost({ commandLine: command, imageName: evidence?.imageName })
|
|
576
|
+
? "implausible"
|
|
577
|
+
: "inconclusive";
|
|
455
578
|
}
|
|
456
579
|
|
|
457
580
|
export function __setRpcIdentityTestHooks(hooks: {
|
|
@@ -526,6 +649,7 @@ function execProcessList(
|
|
|
526
649
|
exec(file, [...args], {
|
|
527
650
|
encoding: "utf8",
|
|
528
651
|
timeout,
|
|
652
|
+
maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,
|
|
529
653
|
stdio: ["ignore", "pipe", "pipe"],
|
|
530
654
|
windowsHide: true,
|
|
531
655
|
}),
|
|
@@ -533,6 +657,11 @@ function execProcessList(
|
|
|
533
657
|
}
|
|
534
658
|
|
|
535
659
|
function parseWindowsCreationDate(value: unknown): number | null {
|
|
660
|
+
// Windows PowerShell 5.1 can serialize a DateTime carrying extended
|
|
661
|
+
// properties as { value: "\/Date(ms)\/", DisplayHint, DateTime }.
|
|
662
|
+
if (value !== null && typeof value === "object" && "value" in value) {
|
|
663
|
+
return parseWindowsCreationDate((value as { value: unknown }).value);
|
|
664
|
+
}
|
|
536
665
|
if (typeof value === "number" && Number.isFinite(value)) {
|
|
537
666
|
return value > 1e12 ? value : value * 1_000;
|
|
538
667
|
}
|
|
@@ -632,7 +761,11 @@ function tryReadWindowsCimSnapshot(exec: typeof execFileSync): ProcessSnapshot |
|
|
|
632
761
|
|
|
633
762
|
function tryReadWindowsTasklistSnapshot(): ProcessSnapshot | null {
|
|
634
763
|
try {
|
|
635
|
-
const output = execProcessList(rpcProcessListExecFileSync, "tasklist", [
|
|
764
|
+
const output = execProcessList(rpcProcessListExecFileSync, "tasklist", [
|
|
765
|
+
"/FO",
|
|
766
|
+
"CSV",
|
|
767
|
+
"/NH",
|
|
768
|
+
]);
|
|
636
769
|
const entries = parseTasklistOutput(output);
|
|
637
770
|
if (entries === null) return null;
|
|
638
771
|
const facts = entries.map((entry) => ({
|
|
@@ -873,6 +1006,15 @@ export interface AsyncProcessInspection {
|
|
|
873
1006
|
liveness(pid: number): PidLiveness;
|
|
874
1007
|
}
|
|
875
1008
|
|
|
1009
|
+
/** Process evidence from one snapshot row; the image name is included only when known. */
|
|
1010
|
+
function snapshotEvidence(fact: ProcessFacts | undefined): ProcessProbeEvidence {
|
|
1011
|
+
return {
|
|
1012
|
+
startTime: fact?.startTime ?? null,
|
|
1013
|
+
commandLine: fact?.commandLine ?? fact?.imageName ?? null,
|
|
1014
|
+
...(fact?.imageName ? { imageName: fact.imageName } : {}),
|
|
1015
|
+
};
|
|
1016
|
+
}
|
|
1017
|
+
|
|
876
1018
|
function execProcessListAsync(file: string, args: string[], timeout: number): Promise<string> {
|
|
877
1019
|
return new Promise((resolve, reject) => {
|
|
878
1020
|
execFile(
|
|
@@ -921,7 +1063,11 @@ export function inspectProcessesAsync(forceFresh = false): Promise<AsyncProcessI
|
|
|
921
1063
|
}
|
|
922
1064
|
if (!snapshot) {
|
|
923
1065
|
const entries = parseTasklistOutput(
|
|
924
|
-
await asyncProcessExec(
|
|
1066
|
+
await asyncProcessExec(
|
|
1067
|
+
"tasklist",
|
|
1068
|
+
["/FO", "CSV", "/NH"],
|
|
1069
|
+
PS_PROBE_TIMEOUT_MS,
|
|
1070
|
+
),
|
|
925
1071
|
);
|
|
926
1072
|
if (entries)
|
|
927
1073
|
snapshot = snapshotFromFacts(
|
|
@@ -975,10 +1121,7 @@ export function inspectProcessesAsync(forceFresh = false): Promise<AsyncProcessI
|
|
|
975
1121
|
...(fresh && snapshot
|
|
976
1122
|
? { processSnapshot: { source: snapshot.source, facts: snapshot.facts } }
|
|
977
1123
|
: {}),
|
|
978
|
-
evidence: (pid: number) => (
|
|
979
|
-
startTime: byPid.get(pid)?.startTime ?? null,
|
|
980
|
-
commandLine: byPid.get(pid)?.commandLine ?? byPid.get(pid)?.imageName ?? null,
|
|
981
|
-
}),
|
|
1124
|
+
evidence: (pid: number) => snapshotEvidence(byPid.get(pid)),
|
|
982
1125
|
liveness: (pid: number) => (byPid.has(pid) ? "alive" : fresh ? "dead" : "inconclusive"),
|
|
983
1126
|
} satisfies AsyncProcessInspection;
|
|
984
1127
|
})().finally(() => {
|
|
@@ -986,3 +1129,18 @@ export function inspectProcessesAsync(forceFresh = false): Promise<AsyncProcessI
|
|
|
986
1129
|
});
|
|
987
1130
|
return asyncInspection;
|
|
988
1131
|
}
|
|
1132
|
+
|
|
1133
|
+
/** Take one fresh Windows process snapshot with command time limits for synchronous callers. */
|
|
1134
|
+
export function inspectWindowsProcessesSync(): AsyncProcessInspection {
|
|
1135
|
+
const snapshot =
|
|
1136
|
+
tryReadWindowsCimSnapshot(rpcProcessListExecFileSync) ?? tryReadWindowsTasklistSnapshot();
|
|
1137
|
+
const byPid = new Map(snapshot?.facts.map((fact) => [fact.pid, fact]));
|
|
1138
|
+
return {
|
|
1139
|
+
pi: snapshot ? classifyLivePiSnapshot(snapshot) : { state: "unreadable", processIds: [] },
|
|
1140
|
+
...(snapshot
|
|
1141
|
+
? { processSnapshot: { source: snapshot.source, facts: snapshot.facts } }
|
|
1142
|
+
: {}),
|
|
1143
|
+
evidence: (pid) => snapshotEvidence(byPid.get(pid)),
|
|
1144
|
+
liveness: (pid) => (byPid.has(pid) ? "alive" : snapshot ? "dead" : "inconclusive"),
|
|
1145
|
+
};
|
|
1146
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { 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 {
|
|
@@ -9,10 +9,11 @@ import {
|
|
|
9
9
|
withSqliteTransformPass,
|
|
10
10
|
} from "./sqlite";
|
|
11
11
|
import { startSqliteWriteLocker } from "./sqlite-write-locker-test-support";
|
|
12
|
+
import { createTestTempDirFromPath } from "./test-temp-dir";
|
|
12
13
|
|
|
13
14
|
for (const mode of ["default", "immediate", "exclusive", "literal"] as const) {
|
|
14
15
|
test(`shared SQLite retries ${mode} acquisition before running any writes`, async () => {
|
|
15
|
-
const dir =
|
|
16
|
+
const dir = createTestTempDirFromPath(join(tmpdir(), "mc-routed-acquisition-"));
|
|
16
17
|
const path = join(dir, "context.db");
|
|
17
18
|
const db = new Database(path);
|
|
18
19
|
db.exec(
|
|
@@ -75,7 +76,7 @@ test("routed transactions preserve nesting, receiver, arguments and rollback wit
|
|
|
75
76
|
});
|
|
76
77
|
|
|
77
78
|
test("exhausted routed acquisition never enters the callback or multiplies privileged retries", () => {
|
|
78
|
-
const dir =
|
|
79
|
+
const dir = createTestTempDirFromPath(join(tmpdir(), "mc-routed-exhaustion-"));
|
|
79
80
|
const path = join(dir, "context.db");
|
|
80
81
|
const blocker = new Database(path);
|
|
81
82
|
const db = new Database(path);
|
|
@@ -100,3 +101,45 @@ test("exhausted routed acquisition never enters the callback or multiplies privi
|
|
|
100
101
|
rmSync(dir, { recursive: true, force: true });
|
|
101
102
|
}
|
|
102
103
|
});
|
|
104
|
+
|
|
105
|
+
for (const mode of ["run", "get", "all", "exec"] as const) {
|
|
106
|
+
test(`foreground ${mode} autocommit waits share one turn budget and restore production timeout`, () => {
|
|
107
|
+
const dir = createTestTempDirFromPath(join(tmpdir(), "mc-autocommit-budget-"));
|
|
108
|
+
const path = join(dir, "context.db");
|
|
109
|
+
const db = new Database(path);
|
|
110
|
+
db.exec(
|
|
111
|
+
"PRAGMA journal_mode=WAL; CREATE TABLE result(value TEXT); PRAGMA busy_timeout=5000",
|
|
112
|
+
);
|
|
113
|
+
const blocker = new Database(path);
|
|
114
|
+
blocker.exec("BEGIN IMMEDIATE");
|
|
115
|
+
try {
|
|
116
|
+
const started = performance.now();
|
|
117
|
+
withSqliteTransformPass(() => {
|
|
118
|
+
for (let attempt = 0; attempt < 3; attempt++) {
|
|
119
|
+
// Nested foreground wrappers must reuse the turn's remaining budget.
|
|
120
|
+
expect(() =>
|
|
121
|
+
withSqliteTransformPass(() => {
|
|
122
|
+
if (mode === "exec") db.exec("INSERT INTO result VALUES ('blocked')");
|
|
123
|
+
else
|
|
124
|
+
db.prepare("INSERT INTO result VALUES ('blocked') RETURNING value")[
|
|
125
|
+
mode
|
|
126
|
+
]();
|
|
127
|
+
}),
|
|
128
|
+
).toThrow("acquisition remained busy");
|
|
129
|
+
}
|
|
130
|
+
expect(() => db.exec("BEGIN IMMEDIATE")).toThrow("acquisition remained busy");
|
|
131
|
+
});
|
|
132
|
+
expect(performance.now() - started).toBeLessThan(650);
|
|
133
|
+
expect(db.prepare("PRAGMA busy_timeout").get()).toEqual({ timeout: 5000 });
|
|
134
|
+
expect(db.prepare("SELECT * FROM result").all()).toEqual([]);
|
|
135
|
+
blocker.exec("ROLLBACK");
|
|
136
|
+
withSqliteTransformPass(() => db.prepare("INSERT INTO result VALUES ('free')").run());
|
|
137
|
+
expect(db.prepare("SELECT * FROM result").all()).toEqual([{ value: "free" }]);
|
|
138
|
+
} finally {
|
|
139
|
+
if (blocker.inTransaction) blocker.exec("ROLLBACK");
|
|
140
|
+
blocker.close();
|
|
141
|
+
db.close();
|
|
142
|
+
rmSync(dir, { recursive: true, force: true });
|
|
143
|
+
}
|
|
144
|
+
});
|
|
145
|
+
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { 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 {
|
|
@@ -13,9 +13,10 @@ import {
|
|
|
13
13
|
withSqliteTransformPass,
|
|
14
14
|
} from "./sqlite";
|
|
15
15
|
import { startSqliteWriteLocker } from "./sqlite-write-locker-test-support";
|
|
16
|
+
import { createTestTempDirFromPath } from "./test-temp-dir";
|
|
16
17
|
|
|
17
18
|
function fixture() {
|
|
18
|
-
const dir =
|
|
19
|
+
const dir = createTestTempDirFromPath(join(tmpdir(), "mc-busy-yield-"));
|
|
19
20
|
const path = join(dir, "context.db");
|
|
20
21
|
const db = new Database(path);
|
|
21
22
|
db.exec(
|