@cortexkit/opencode-magic-context 0.44.4 → 0.45.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/agents/hidden-agent-registrations.d.ts +3 -2
- package/dist/agents/hidden-agent-registrations.d.ts.map +1 -1
- package/dist/agents/magic-context-prompt.d.ts +1 -0
- package/dist/agents/magic-context-prompt.d.ts.map +1 -1
- package/dist/agents/permissions.d.ts +8 -28
- package/dist/agents/permissions.d.ts.map +1 -1
- package/dist/{announcement-n8hs7kjw.js → announcement-f75t58v9.js} +4 -2
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/project-security.d.ts +48 -0
- package/dist/config/project-security.d.ts.map +1 -1
- package/dist/config/raw-loader.d.ts.map +1 -1
- package/dist/config/schema/magic-context.d.ts +10 -7
- package/dist/config/schema/magic-context.d.ts.map +1 -1
- package/dist/{conflict-warning-hook-hmpzxep6.js → conflict-warning-hook-5yrz2r24.js} +10 -6
- package/dist/{derive-budgets-ncwn1jk9.js → derive-budgets-a63zsm5c.js} +3 -3
- package/dist/embedding-worker.js +49 -0
- package/dist/emscripten-module-0g8f45e6.js +602 -0
- package/dist/emscripten-module-0pekdjxz.js +1532 -0
- package/dist/emscripten-module-e67xwsp3.js +503 -0
- package/dist/emscripten-module-pj1vyb44.js +4559 -0
- package/dist/features/magic-context/compartment-chunk-embedding.d.ts +23 -3
- package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
- package/dist/features/magic-context/compartment-embedding.d.ts.map +1 -1
- package/dist/features/magic-context/compartment-storage.d.ts +14 -3
- package/dist/features/magic-context/compartment-storage.d.ts.map +1 -1
- package/dist/features/magic-context/context-store-uuid.d.ts +7 -0
- package/dist/features/magic-context/context-store-uuid.d.ts.map +1 -0
- package/dist/features/magic-context/dreamer/classify.d.ts +1 -3
- package/dist/features/magic-context/dreamer/classify.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/cron.d.ts +5 -4
- package/dist/features/magic-context/dreamer/cron.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/docs-proposals.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/expire-memories.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/idle-schedule-prune.d.ts +24 -0
- package/dist/features/magic-context/dreamer/idle-schedule-prune.d.ts.map +1 -0
- package/dist/features/magic-context/dreamer/manual-summary.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/map-memories.d.ts +5 -5
- package/dist/features/magic-context/dreamer/module-apply.d.ts +4 -25
- package/dist/features/magic-context/dreamer/module-apply.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/retrospective-learnings.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts +5 -1
- package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts +12 -5
- package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-executor.d.ts +6 -0
- package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-gates.d.ts +34 -0
- package/dist/features/magic-context/dreamer/task-gates.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-prompts.d.ts +1 -1
- package/dist/features/magic-context/dreamer/task-prompts.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-registry.d.ts +7 -5
- package/dist/features/magic-context/dreamer/task-registry.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-scheduler.d.ts +10 -3
- package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/token-budget.d.ts +3 -0
- package/dist/features/magic-context/dreamer/token-budget.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/verify.d.ts +2 -2
- package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
- package/dist/features/magic-context/git-commits/git-log-reader.d.ts +11 -2
- package/dist/features/magic-context/git-commits/git-log-reader.d.ts.map +1 -1
- package/dist/features/magic-context/git-commits/indexer.d.ts.map +1 -1
- package/dist/features/magic-context/git-commits/search-git-commits.d.ts.map +1 -1
- package/dist/features/magic-context/git-commits/storage-git-commits.d.ts +2 -0
- package/dist/features/magic-context/git-commits/storage-git-commits.d.ts.map +1 -1
- package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts +6 -0
- package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts.map +1 -0
- package/dist/features/magic-context/lkg-prefix-chunks.d.ts +53 -0
- package/dist/features/magic-context/lkg-prefix-chunks.d.ts.map +1 -0
- package/dist/features/magic-context/memory/embedding-backfill.d.ts.map +1 -1
- package/dist/features/magic-context/memory/embedding-local.d.ts +8 -0
- package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
- package/dist/features/magic-context/memory/embedding-openai.d.ts.map +1 -1
- package/dist/features/magic-context/memory/embedding-worker-client.d.ts +27 -0
- package/dist/features/magic-context/memory/embedding-worker-client.d.ts.map +1 -0
- package/dist/features/magic-context/memory/embedding-worker.d.ts +2 -0
- package/dist/features/magic-context/memory/embedding-worker.d.ts.map +1 -0
- package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts +2 -0
- package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts.map +1 -0
- package/dist/features/magic-context/memory/memory-selection.d.ts.map +1 -1
- package/dist/features/magic-context/memory/project-identity-cache.d.ts +4 -3
- package/dist/features/magic-context/memory/project-identity-cache.d.ts.map +1 -1
- package/dist/features/magic-context/memory/project-identity.d.ts.map +1 -1
- package/dist/features/magic-context/memory/storage-memory-fts.d.ts.map +1 -1
- package/dist/features/magic-context/memory/visibility.d.ts +1 -1
- package/dist/features/magic-context/memory/visibility.d.ts.map +1 -1
- package/dist/features/magic-context/message-fts-rowid-map.d.ts +14 -1
- package/dist/features/magic-context/message-fts-rowid-map.d.ts.map +1 -1
- package/dist/features/magic-context/message-fts-session-filter.d.ts +14 -0
- package/dist/features/magic-context/message-fts-session-filter.d.ts.map +1 -0
- package/dist/features/magic-context/message-index.d.ts +1 -7
- package/dist/features/magic-context/message-index.d.ts.map +1 -1
- package/dist/features/magic-context/message-time-backfill.d.ts.map +1 -1
- package/dist/features/magic-context/migration-v94-write-split.d.ts +62 -0
- package/dist/features/magic-context/migration-v94-write-split.d.ts.map +1 -0
- package/dist/features/magic-context/migration-worker-client.d.ts +23 -0
- package/dist/features/magic-context/migration-worker-client.d.ts.map +1 -0
- package/dist/features/magic-context/migration-worker-protocol.d.ts +30 -0
- package/dist/features/magic-context/migration-worker-protocol.d.ts.map +1 -0
- package/dist/features/magic-context/migration-worker.d.ts +2 -0
- package/dist/features/magic-context/migration-worker.d.ts.map +1 -0
- package/dist/features/magic-context/migrations.d.ts +7 -0
- package/dist/features/magic-context/migrations.d.ts.map +1 -1
- package/dist/features/magic-context/mural/render-mural.d.ts +24 -2
- package/dist/features/magic-context/mural/render-mural.d.ts.map +1 -1
- package/dist/features/magic-context/mural/render-trigger.d.ts +1 -1
- package/dist/features/magic-context/mural/render-trigger.d.ts.map +1 -1
- package/dist/features/magic-context/overflow-detection.d.ts +18 -7
- package/dist/features/magic-context/overflow-detection.d.ts.map +1 -1
- package/dist/features/magic-context/project-embedding-registry.d.ts +2 -0
- package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
- package/dist/features/magic-context/range-parser.d.ts +2 -3
- package/dist/features/magic-context/range-parser.d.ts.map +1 -1
- package/dist/features/magic-context/resolve-subagent-fallback.d.ts +2 -0
- package/dist/features/magic-context/resolve-subagent-fallback.d.ts.map +1 -1
- package/dist/features/magic-context/scheduler.d.ts +2 -0
- package/dist/features/magic-context/scheduler.d.ts.map +1 -1
- package/dist/features/magic-context/search.d.ts +7 -0
- package/dist/features/magic-context/search.d.ts.map +1 -1
- package/dist/features/magic-context/session-project-backfill.d.ts.map +1 -1
- package/dist/features/magic-context/session-project-storage.d.ts +10 -1
- package/dist/features/magic-context/session-project-storage.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts +1 -1
- package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/compiler.d.ts +4 -0
- package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts +2 -0
- package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts +10 -8
- package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/storage.d.ts +2 -2
- package/dist/features/magic-context/smart-notes/storage.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/types.d.ts +7 -2
- package/dist/features/magic-context/smart-notes/types.d.ts.map +1 -1
- package/dist/features/magic-context/storage-caveman-rules.d.ts +21 -0
- package/dist/features/magic-context/storage-caveman-rules.d.ts.map +1 -0
- package/dist/features/magic-context/storage-clone.d.ts.map +1 -1
- package/dist/features/magic-context/storage-compartment-history-version.d.ts +4 -0
- package/dist/features/magic-context/storage-compartment-history-version.d.ts.map +1 -0
- package/dist/features/magic-context/storage-db.d.ts +62 -2
- package/dist/features/magic-context/storage-db.d.ts.map +1 -1
- package/dist/features/magic-context/storage-identity-merge.d.ts +6 -0
- package/dist/features/magic-context/storage-identity-merge.d.ts.map +1 -1
- package/dist/features/magic-context/storage-meta-persisted.d.ts +15 -0
- package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
- package/dist/features/magic-context/storage-meta-session.d.ts +1 -1
- package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
- package/dist/features/magic-context/storage-meta-shared.d.ts +1 -1
- package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -1
- package/dist/features/magic-context/storage-notes.d.ts +2 -2
- package/dist/features/magic-context/storage-notes.d.ts.map +1 -1
- package/dist/features/magic-context/storage-reasoning-removal.d.ts +30 -0
- package/dist/features/magic-context/storage-reasoning-removal.d.ts.map +1 -0
- package/dist/features/magic-context/storage-replay-document.d.ts +42 -5
- package/dist/features/magic-context/storage-replay-document.d.ts.map +1 -1
- package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
- package/dist/features/magic-context/storage-tags.d.ts +7 -1
- package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
- package/dist/features/magic-context/storage.d.ts +1 -1
- package/dist/features/magic-context/storage.d.ts.map +1 -1
- package/dist/features/magic-context/store-generation-rebase.d.ts.map +1 -1
- package/dist/features/magic-context/tag-input.d.ts +4 -0
- package/dist/features/magic-context/tag-input.d.ts.map +1 -0
- package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
- package/dist/features/magic-context/user-memory/review-user-memories.d.ts.map +1 -1
- package/dist/features/magic-context/user-memory/storage-user-memory.d.ts.map +1 -1
- package/dist/ffi-3cx1cxpk.js +78 -0
- package/dist/ffi-7bqqe4cd.js +91 -0
- package/dist/ffi-7e6gryj5.js +91 -0
- package/dist/ffi-bpvkebwr.js +78 -0
- package/dist/hooks/magic-context/apply-operations.d.ts +9 -1
- package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-search-deadline.d.ts +10 -0
- package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -0
- package/dist/hooks/magic-context/auto-search-hint.d.ts +3 -0
- package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-search-runner.d.ts +3 -0
- package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
- package/dist/hooks/magic-context/caveman-cleanup.d.ts +8 -1
- package/dist/hooks/magic-context/caveman-cleanup.d.ts.map +1 -1
- package/dist/hooks/magic-context/caveman.d.ts +56 -1
- package/dist/hooks/magic-context/caveman.d.ts.map +1 -1
- package/dist/hooks/magic-context/child-session-spawn.d.ts +2 -0
- package/dist/hooks/magic-context/child-session-spawn.d.ts.map +1 -1
- package/dist/hooks/magic-context/command-handler.d.ts +1 -1
- package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
- package/dist/hooks/magic-context/compaction-marker-manager.d.ts +1 -1
- package/dist/hooks/magic-context/compaction-marker-manager.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-parser.d.ts +3 -3
- package/dist/hooks/magic-context/compartment-parser.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-incremental.d.ts +0 -1
- package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-partial-recomp.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-types.d.ts +3 -0
- package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-validation.d.ts +6 -0
- package/dist/hooks/magic-context/compartment-runner-validation.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
- package/dist/hooks/magic-context/degraded-pass-refusal.d.ts +35 -0
- package/dist/hooks/magic-context/degraded-pass-refusal.d.ts.map +1 -0
- package/dist/hooks/magic-context/derive-budgets.d.ts.map +1 -1
- package/dist/hooks/magic-context/dropped-input-guard.d.ts.map +1 -1
- package/dist/hooks/magic-context/embed-history-runner.d.ts.map +1 -1
- package/dist/hooks/magic-context/emergency-drop.d.ts +15 -0
- package/dist/hooks/magic-context/emergency-drop.d.ts.map +1 -1
- package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
- package/dist/hooks/magic-context/execute-status.d.ts +1 -0
- package/dist/hooks/magic-context/execute-status.d.ts.map +1 -1
- package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +17 -0
- package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
- package/dist/hooks/magic-context/heuristic-cleanup.d.ts +2 -0
- package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -1
- package/dist/hooks/magic-context/historian-host-runner.d.ts +5 -0
- package/dist/hooks/magic-context/historian-host-runner.d.ts.map +1 -1
- package/dist/hooks/magic-context/historian-prompt-fit.d.ts +116 -0
- package/dist/hooks/magic-context/historian-prompt-fit.d.ts.map +1 -0
- package/dist/hooks/magic-context/historian-prompt.generated.d.ts +1 -1
- package/dist/hooks/magic-context/historian-prompt.generated.d.ts.map +1 -1
- package/dist/hooks/magic-context/history-boundary-repair.d.ts +44 -0
- package/dist/hooks/magic-context/history-boundary-repair.d.ts.map +1 -0
- package/dist/hooks/magic-context/hook.d.ts +4 -0
- package/dist/hooks/magic-context/hook.d.ts.map +1 -1
- package/dist/hooks/magic-context/inject-compartments.d.ts +8 -0
- package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-persist.d.ts +12 -0
- package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-replay-fit.d.ts +104 -0
- package/dist/hooks/magic-context/lkg-replay-fit.d.ts.map +1 -0
- package/dist/hooks/magic-context/lkg-replay.d.ts +64 -0
- package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-client.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-state-sync-timing.d.ts +1 -1
- package/dist/hooks/magic-context/module-state-sync-timing.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-state-sync.d.ts +6 -68
- package/dist/hooks/magic-context/module-state-sync.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-tool-backends.d.ts +1 -34
- package/dist/hooks/magic-context/module-tool-backends.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-transport.d.ts +1 -55
- package/dist/hooks/magic-context/module-transport.d.ts.map +1 -1
- package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
- package/dist/hooks/magic-context/note-nudger.d.ts +2 -0
- package/dist/hooks/magic-context/note-nudger.d.ts.map +1 -1
- package/dist/hooks/magic-context/pass-outcome.d.ts +59 -2
- package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -1
- package/dist/hooks/magic-context/producer-window-guard.d.ts +6 -0
- package/dist/hooks/magic-context/producer-window-guard.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-chunk.d.ts +13 -2
- package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-formatting.d.ts +11 -0
- package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
- package/dist/hooks/magic-context/reasoning-removal.d.ts +60 -0
- package/dist/hooks/magic-context/reasoning-removal.d.ts.map +1 -0
- package/dist/hooks/magic-context/recomp-orchestrator.d.ts +1 -0
- package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -1
- package/dist/hooks/magic-context/reference-retrieval.d.ts +1 -1
- package/dist/hooks/magic-context/reference-retrieval.d.ts.map +1 -1
- package/dist/hooks/magic-context/reply-pages.d.ts +3 -0
- package/dist/hooks/magic-context/reply-pages.d.ts.map +1 -0
- package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts +62 -0
- package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts.map +1 -0
- package/dist/hooks/magic-context/rust-mode-transform.d.ts +17 -85
- package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
- package/dist/hooks/magic-context/send-session-notification.d.ts.map +1 -1
- package/dist/hooks/magic-context/sentinel.d.ts +35 -0
- package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
- package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts +28 -0
- package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts.map +1 -0
- package/dist/hooks/magic-context/single-store-refusal.d.ts +14 -0
- package/dist/hooks/magic-context/single-store-refusal.d.ts.map +1 -0
- package/dist/hooks/magic-context/storage-busy-refusal.d.ts +7 -0
- package/dist/hooks/magic-context/storage-busy-refusal.d.ts.map +1 -1
- package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
- package/dist/hooks/magic-context/stripped-command.d.ts +1 -1
- package/dist/hooks/magic-context/stripped-command.d.ts.map +1 -1
- package/dist/hooks/magic-context/system-injection-stripper.d.ts +7 -0
- package/dist/hooks/magic-context/system-injection-stripper.d.ts.map +1 -1
- package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
- package/dist/hooks/magic-context/tag-content-primitives.d.ts.map +1 -1
- package/dist/hooks/magic-context/tag-id-fallback.d.ts.map +1 -1
- package/dist/hooks/magic-context/tag-messages.d.ts +18 -1
- package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
- package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
- package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform-compartment-phase.d.ts +1 -0
- package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +37 -4
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform.d.ts +12 -39
- package/dist/hooks/magic-context/transform.d.ts.map +1 -1
- package/dist/hooks/magic-context/unmanaged-over-window.d.ts +36 -0
- package/dist/hooks/magic-context/unmanaged-over-window.d.ts.map +1 -0
- package/dist/hooks/magic-context/unresolved-history-boundary.d.ts +15 -0
- package/dist/hooks/magic-context/unresolved-history-boundary.d.ts.map +1 -0
- package/dist/hooks/magic-context/user-profile-render.d.ts +3 -0
- package/dist/hooks/magic-context/user-profile-render.d.ts.map +1 -0
- package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
- package/dist/{index-sqp1hz9v.js → index-16ny736w.js} +10190 -25296
- package/dist/{index-mrc0twf3.js → index-2aq21j41.js} +1201 -428
- package/dist/{index-32b096cc.js → index-2ntg5sd4.js} +6 -2
- package/dist/index-4krbw8z9.js +6034 -0
- package/dist/{index-33q7s9y2.js → index-75zjgwga.js} +61 -85
- package/dist/{index-zx7pmr39.js → index-8fgkmxmy.js} +28 -10
- package/dist/index-a4m2b1yv.js +530 -0
- package/dist/index-anq4nn6f.js +131 -0
- package/dist/index-avwt563y.js +62 -0
- package/dist/index-bmzf7zxv.js +445 -0
- package/dist/index-e44zzy84.js +10 -0
- package/dist/index-en1k8h8m.js +244 -0
- package/dist/{index-638hf49n.js → index-f85teqck.js} +15 -6
- package/dist/index-fr2z4qy8.js +7810 -0
- package/dist/{index-kwe03yde.js → index-fzbvakh0.js} +1 -1
- package/dist/{module-asyncify-2EFITU5U-rkqjhjxd.js → index-g20jdh0p.js} +114 -105
- package/dist/index-gd5qx1j9.js +398 -0
- package/dist/{index-3bygzk2d.js → index-hybnrwq0.js} +169 -4
- package/dist/{index-jqcbs2k1.js → index-mc22ayvf.js} +24 -5
- package/dist/index-q7yesyk9.js +9118 -0
- package/dist/index-remp7e2g.js +214 -0
- package/dist/{index-7k55qm8a.js → index-sfpzqvdz.js} +8 -8
- package/dist/{index-msqr3x6m.js → index-vvtfyw1z.js} +12 -75
- package/dist/index-w9jwmntv.js +202 -0
- package/dist/{index-kr5qehbd.js → index-x23gah8c.js} +1 -1
- package/dist/{index-jdxxq8cz.js → index-x8a7jmkh.js} +6 -1
- package/dist/{index-wprsye9w.js → index-xgt9k6c6.js} +23 -12
- package/dist/index-y8v6yerm.js +77 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +7519 -8096
- package/dist/message-time-backfill-an311pmk.js +124 -0
- package/dist/migration-worker.js +53 -0
- package/dist/{model-resolution-dxatzjde.js → model-resolution-xhfmyyvy.js} +5 -1
- package/dist/module-ES6BEMUI-3cet1pyp.js +12 -0
- package/dist/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
- package/dist/plugin/boot-deadline.d.ts.map +1 -1
- package/dist/plugin/conflict-warning-hook.d.ts.map +1 -1
- package/dist/plugin/dream-timer-module-client.d.ts +1 -11
- package/dist/plugin/dream-timer-module-client.d.ts.map +1 -1
- package/dist/plugin/dream-timer.d.ts.map +1 -1
- package/dist/plugin/hooks/create-session-hooks.d.ts +8 -0
- package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
- package/dist/plugin/messages-transform.d.ts +20 -13
- package/dist/plugin/messages-transform.d.ts.map +1 -1
- package/dist/plugin/rpc-handlers.d.ts.map +1 -1
- package/dist/plugin/stale-build-notice.d.ts +16 -0
- package/dist/plugin/stale-build-notice.d.ts.map +1 -0
- package/dist/{read-session-chunk-339hg90t.js → read-session-chunk-8rxs0tc9.js} +24 -6
- package/dist/recomp-orchestrator-nzamtw29.js +39 -0
- package/dist/{rpc-notifications-4amf6mf4.js → rpc-notifications-3hed126v.js} +3 -1
- package/dist/{safe-notification-target-50gm9c58.js → safe-notification-target-43r8jsxw.js} +3 -3
- package/dist/send-session-notification-nqpv7cne.js +28 -0
- package/dist/shared/assistant-message-extractor.d.ts +4 -0
- package/dist/shared/assistant-message-extractor.d.ts.map +1 -1
- package/dist/shared/background-batch-drain.d.ts +8 -0
- package/dist/shared/background-batch-drain.d.ts.map +1 -0
- package/dist/{features/builtin-commands/commands.d.ts → shared/builtin-commands.d.ts} +1 -1
- package/dist/shared/builtin-commands.d.ts.map +1 -0
- package/dist/shared/embedding-activity.d.ts +13 -0
- package/dist/shared/embedding-activity.d.ts.map +1 -0
- package/dist/shared/historian-tool-expansions.d.ts +5 -0
- package/dist/shared/historian-tool-expansions.d.ts.map +1 -0
- package/dist/shared/historian-tool-template.d.ts +5 -0
- package/dist/shared/historian-tool-template.d.ts.map +1 -0
- package/dist/shared/historian-transient-error.d.ts +2 -0
- package/dist/shared/historian-transient-error.d.ts.map +1 -0
- package/dist/shared/jsonc-edit.d.ts.map +1 -1
- package/dist/shared/logger.d.ts +7 -0
- package/dist/shared/logger.d.ts.map +1 -1
- package/dist/shared/model-suggestion-retry.d.ts +2 -1
- package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
- package/dist/shared/models-dev-cache.d.ts.map +1 -1
- package/dist/shared/off-thread-migration-clock.d.ts +38 -0
- package/dist/shared/off-thread-migration-clock.d.ts.map +1 -0
- package/dist/shared/plugin-package-version.d.ts +14 -0
- package/dist/shared/plugin-package-version.d.ts.map +1 -0
- package/dist/shared/project-directory-key.d.ts +26 -0
- package/dist/shared/project-directory-key.d.ts.map +1 -0
- package/dist/shared/prompt-async-transport.d.ts +4 -0
- package/dist/shared/prompt-async-transport.d.ts.map +1 -1
- package/dist/shared/prompt-surface-runtime.d.ts +3 -3
- package/dist/shared/provider-response-completion.d.ts +12 -0
- package/dist/shared/provider-response-completion.d.ts.map +1 -0
- package/dist/shared/redaction.d.ts.map +1 -1
- package/dist/shared/rpc-client.d.ts +23 -2
- package/dist/shared/rpc-client.d.ts.map +1 -1
- package/dist/shared/rpc-types.d.ts +19 -0
- package/dist/shared/rpc-types.d.ts.map +1 -1
- package/dist/shared/rpc-utils.d.ts +34 -0
- package/dist/shared/rpc-utils.d.ts.map +1 -1
- package/dist/shared/sqlite.d.ts +13 -2
- package/dist/shared/sqlite.d.ts.map +1 -1
- package/dist/shared/stale-plugin-build.d.ts +21 -0
- package/dist/shared/stale-plugin-build.d.ts.map +1 -0
- package/dist/shared/status-summary.d.ts +29 -0
- package/dist/shared/status-summary.d.ts.map +1 -1
- package/dist/shared/status-view-check.d.ts +124 -0
- package/dist/shared/status-view-check.d.ts.map +1 -0
- package/dist/shared/status-view.d.ts +38 -2
- package/dist/shared/status-view.d.ts.map +1 -1
- package/dist/shared/tag-owner-id.d.ts +19 -0
- package/dist/shared/tag-owner-id.d.ts.map +1 -0
- package/dist/shared/tag-transcript.d.ts +2 -1
- package/dist/shared/tag-transcript.d.ts.map +1 -1
- package/dist/shared/test-temp-dir.d.ts +8 -2
- package/dist/shared/test-temp-dir.d.ts.map +1 -1
- package/dist/shared/user-facing-codes.d.ts +41 -6
- package/dist/shared/user-facing-codes.d.ts.map +1 -1
- package/dist/shared/xml-unescape.d.ts +9 -0
- package/dist/shared/xml-unescape.d.ts.map +1 -0
- package/dist/task-config-v81k8jvk.js +17 -0
- package/dist/tools/ctx-expand/constants.d.ts +1 -1
- package/dist/tools/ctx-expand/constants.d.ts.map +1 -1
- package/dist/tools/ctx-expand/mode.d.ts +4 -0
- package/dist/tools/ctx-expand/mode.d.ts.map +1 -1
- package/dist/tools/ctx-expand/render.d.ts +5 -1
- package/dist/tools/ctx-expand/render.d.ts.map +1 -1
- package/dist/tools/ctx-expand/tools.d.ts +2 -0
- package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
- package/dist/tools/ctx-expand/types.d.ts +1 -0
- package/dist/tools/ctx-expand/types.d.ts.map +1 -1
- package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
- package/dist/tools/ctx-note/render.d.ts +2 -0
- package/dist/tools/ctx-note/render.d.ts.map +1 -1
- package/dist/tools/ctx-note/tools.d.ts.map +1 -1
- package/dist/tools/ctx-reduce/constants.d.ts +1 -1
- package/dist/tools/ctx-reduce/constants.d.ts.map +1 -1
- package/dist/tools/ctx-search/constants.d.ts +1 -1
- package/dist/tools/ctx-search/constants.d.ts.map +1 -1
- package/dist/tools/light-descriptions.d.ts +3 -3
- package/dist/tools/light-descriptions.d.ts.map +1 -1
- package/dist/tools/parameter-descriptions.d.ts +14 -14
- package/dist/transform-postprocess-phase-414phndq.js +61 -0
- package/dist/tui/data/context-db.d.ts +34 -10
- package/dist/tui/data/context-db.d.ts.map +1 -1
- package/dist/tui/data/notification-socket.d.ts +6 -0
- package/dist/tui/data/notification-socket.d.ts.map +1 -1
- package/dist/tui/data/session-directory.d.ts +16 -0
- package/dist/tui/data/session-directory.d.ts.map +1 -0
- package/dist/tui-compiled/data/context-db.d.ts +34 -10
- package/dist/tui-compiled/data/context-db.d.ts.map +1 -1
- package/dist/tui-compiled/data/notification-socket.d.ts +6 -0
- package/dist/tui-compiled/data/notification-socket.d.ts.map +1 -1
- package/dist/tui-compiled/data/session-directory.d.ts +16 -0
- package/dist/tui-compiled/data/session-directory.d.ts.map +1 -0
- package/dist/v2/derive-budgets-v0krf3t7.js +18 -0
- package/dist/v2/embedding-worker.js +47 -0
- package/dist/v2/emscripten-module-0g8f45e6.js +602 -0
- package/dist/v2/emscripten-module-0pekdjxz.js +1532 -0
- package/dist/v2/emscripten-module-e67xwsp3.js +503 -0
- package/dist/v2/emscripten-module-pj1vyb44.js +4559 -0
- package/dist/v2/ffi-3cx1cxpk.js +78 -0
- package/dist/v2/ffi-7bqqe4cd.js +91 -0
- package/dist/v2/ffi-7e6gryj5.js +91 -0
- package/dist/v2/ffi-bpvkebwr.js +78 -0
- package/dist/v2/fold/boundary.d.ts.map +1 -1
- package/dist/v2/fork-inheritance.d.ts +101 -0
- package/dist/v2/fork-inheritance.d.ts.map +1 -0
- package/dist/v2/hidden-child-cleanup.d.ts +11 -0
- package/dist/v2/hidden-child-cleanup.d.ts.map +1 -0
- package/dist/v2/hidden-child-native.d.ts +29 -0
- package/dist/v2/hidden-child-native.d.ts.map +1 -0
- package/dist/v2/hidden-child-record.d.ts +135 -0
- package/dist/v2/hidden-child-record.d.ts.map +1 -0
- package/dist/v2/hidden-completion.d.ts +12 -97
- package/dist/v2/hidden-completion.d.ts.map +1 -1
- package/dist/v2/hooks/context.d.ts +20 -8
- package/dist/v2/hooks/context.d.ts.map +1 -1
- package/dist/v2/hooks/dream-manual.d.ts.map +1 -1
- package/dist/v2/hooks/dream-trigger.d.ts +5 -0
- package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
- package/dist/v2/hooks/generate.d.ts +10 -0
- package/dist/v2/hooks/generate.d.ts.map +1 -0
- package/dist/v2/hooks/hidden-child.d.ts +33 -2
- package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
- package/dist/v2/hooks/payload.d.ts +3 -0
- package/dist/v2/hooks/payload.d.ts.map +1 -1
- package/dist/v2/hooks/session-api-gate.d.ts +4 -0
- package/dist/v2/hooks/session-api-gate.d.ts.map +1 -0
- package/dist/v2/hooks/storage-gate.d.ts +3 -1
- package/dist/v2/hooks/storage-gate.d.ts.map +1 -1
- package/dist/v2/hooks/tools.d.ts.map +1 -1
- package/dist/v2/hooks/types.d.ts +10 -0
- package/dist/v2/hooks/types.d.ts.map +1 -1
- package/dist/v2/hooks/update-check.d.ts.map +1 -1
- package/dist/v2/hooks/usage-persist.d.ts.map +1 -1
- package/dist/v2/hooks/usage-reading.d.ts +4 -0
- package/dist/v2/hooks/usage-reading.d.ts.map +1 -1
- package/dist/v2/index-6e4mwffh.js +5662 -0
- package/dist/v2/index-en1k8h8m.js +244 -0
- package/dist/{message-time-backfill-q374fxc5.js → v2/message-time-backfill-0n93vrd7.js} +19 -5
- package/dist/v2/migration-worker.js +52 -0
- package/dist/v2/model-resolution-xhfmyyvy.js +16 -0
- package/dist/v2/module-ES6BEMUI-3cet1pyp.js +12 -0
- package/dist/v2/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
- package/dist/v2/prompt-context-5y5ms8f9.js +6 -0
- package/dist/v2/read-session-chunk-hjza38hr.js +83 -0
- package/dist/v2/recomp-orchestrator-1aq7h44c.js +36 -0
- package/dist/v2/retrospective-raw-provider.d.ts +21 -0
- package/dist/v2/retrospective-raw-provider.d.ts.map +1 -0
- package/dist/v2/rpc-notifications-3hed126v.js +16 -0
- package/dist/v2/safe-notification-target-wtj0bbc2.js +9 -0
- package/dist/{send-session-notification-04hvd54c.js → v2/send-session-notification-mq9frrtm.js} +10 -5
- package/dist/v2/server-0jqw05sa.js +803 -0
- package/dist/v2/server-5317ykaf.js +40 -0
- package/dist/v2/server-a4m2b1yv.js +530 -0
- package/dist/v2/server-avwt563y.js +62 -0
- package/dist/v2/server-c4g2y1z8.js +28824 -0
- package/dist/v2/server-ckpc8pxy.js +662 -0
- package/dist/v2/server-e36nf2p1.js +7702 -0
- package/dist/v2/server-e44zzy84.js +10 -0
- package/dist/v2/server-fgmxwrgy.js +16 -0
- package/dist/v2/server-fmsr7v69.js +75 -0
- package/dist/v2/server-g20jdh0p.js +1273 -0
- package/dist/{index-qm36k34q.js → v2/server-hfjfbg59.js} +796 -737
- package/dist/v2/server-n96ag4rk.js +633 -0
- package/dist/v2/server-qdjnb2z1.js +181 -0
- package/dist/v2/server-qpg6wf72.js +187 -0
- package/dist/v2/server-r7cmye3k.js +131 -0
- package/dist/v2/server-remp7e2g.js +214 -0
- package/dist/v2/server-rhdgxp1t.js +398 -0
- package/dist/v2/server-sfpzqvdz.js +137 -0
- package/dist/v2/server-syahy8j8.js +50 -0
- package/dist/v2/server-v5xgft5v.js +9116 -0
- package/dist/v2/server-w99cyt6a.js +361 -0
- package/dist/v2/server-x8a7jmkh.js +104 -0
- package/dist/v2/server-y8v6yerm.js +77 -0
- package/dist/v2/server-z19x7eqz.js +423 -0
- package/dist/v2/server.d.ts.map +1 -1
- package/dist/v2/server.js +8796 -107376
- package/dist/v2/store-reader.d.ts +50 -0
- package/dist/v2/store-reader.d.ts.map +1 -1
- package/dist/v2/task-config-tbndqyny.js +17 -0
- package/dist/v2/transformers-node-wasm.js +26768 -0
- package/dist/v2/transformers-web.js +25670 -0
- package/dist/v2/transformers.node-hj754h7s.js +29997 -0
- package/dist/v2/tui/index.d.ts +10 -1
- package/dist/v2/tui/index.d.ts.map +1 -1
- package/dist/v2/tui/sidebar-mount.d.ts +6 -0
- package/dist/v2/tui/sidebar-mount.d.ts.map +1 -1
- package/dist/v2/tui/status-dialog-mount.d.ts +7 -4
- package/dist/v2/tui/status-dialog-mount.d.ts.map +1 -1
- package/dist/v2/tui/types.d.ts +12 -0
- package/dist/v2/tui/types.d.ts.map +1 -1
- package/dist/v2/wrapup-orchestrator-tbyx78dz.js +425 -0
- package/dist/wrapup-orchestrator-h28bqsy6.js +26 -0
- package/package.json +8 -8
- package/src/agents/hidden-agent-registrations.ts +24 -16
- package/src/agents/magic-context-prompt.test.ts +41 -0
- package/src/agents/magic-context-prompt.ts +8 -5
- package/src/agents/permissions.test.ts +31 -49
- package/src/agents/permissions.ts +8 -28
- package/src/config/index.test.ts +60 -20
- package/src/config/index.ts +53 -1
- package/src/config/live-run-config.test.ts +5 -5
- package/src/config/live-snapshot.test.ts +4 -4
- package/src/config/migrate-config-location.test.ts +3 -10
- package/src/config/project-config-trust-boundary.test.ts +207 -0
- package/src/config/project-security.hostile-matrix.test.ts +4 -4
- package/src/config/project-security.ts +218 -1
- package/src/config/protected-tokens.test.ts +14 -9
- package/src/config/raw-loader.test.ts +31 -3
- package/src/config/raw-loader.ts +8 -3
- package/src/config/schema/magic-context.ts +20 -3
- package/src/config/variable.test.ts +3 -2
- package/src/features/magic-context/dreamer/cron.ts +30 -9
- package/src/features/magic-context/dreamer/task-registry.ts +7 -5
- package/src/shared/announcement.test.ts +2 -1
- package/src/shared/assistant-message-extractor.test.ts +27 -1
- package/src/shared/assistant-message-extractor.ts +27 -0
- package/src/shared/background-batch-drain.test.ts +38 -0
- package/src/shared/background-batch-drain.ts +29 -0
- package/src/shared/builtin-commands.ts +50 -0
- package/src/shared/console-diagnostics-fence.test.ts +145 -0
- package/src/shared/data-path.test.ts +6 -5
- package/src/shared/embedding-activity.test.ts +21 -0
- package/src/shared/embedding-activity.ts +36 -0
- package/src/shared/historian-tool-defaults.json +13 -0
- package/src/shared/historian-tool-expansions.ts +18 -0
- package/src/shared/historian-tool-template.ts +248 -0
- package/src/shared/historian-transient-error.test.ts +36 -0
- package/src/shared/historian-transient-error.ts +22 -0
- package/src/shared/jsonc-edit.ts +20 -1
- package/src/shared/logger.test.ts +3 -2
- package/src/shared/logger.ts +40 -1
- package/src/shared/model-suggestion-retry.test.ts +46 -0
- package/src/shared/model-suggestion-retry.ts +16 -1
- package/src/shared/models-dev-cache.test.ts +74 -2
- package/src/shared/models-dev-cache.ts +5 -1
- package/src/shared/off-thread-migration-clock.test.ts +55 -0
- package/src/shared/off-thread-migration-clock.ts +124 -0
- package/src/shared/opencode-db-path.test.ts +3 -2
- package/src/shared/plugin-package-version.ts +52 -0
- package/src/shared/project-directory-key.test.ts +111 -0
- package/src/shared/project-directory-key.ts +54 -0
- package/src/shared/prompt-async-transport.test.ts +249 -72
- package/src/shared/prompt-async-transport.ts +131 -24
- package/src/shared/prompt-surface-a1-golden.md +41 -25
- package/src/shared/prompt-surface-runtime.test.ts +3 -3
- package/src/shared/provider-response-completion.ts +23 -0
- package/src/shared/redaction.test.ts +51 -1
- package/src/shared/redaction.ts +33 -0
- package/src/shared/rpc-async-probes.test.ts +32 -2
- package/src/shared/rpc-client.test.ts +3 -2
- package/src/shared/rpc-client.ts +76 -18
- package/src/shared/rpc-types.ts +15 -0
- package/src/shared/rpc-utils.test.ts +164 -10
- package/src/shared/rpc-utils.ts +144 -15
- package/src/shared/sqlite-acquisition-routing.test.ts +46 -3
- package/src/shared/sqlite-pass-scope.test.ts +3 -2
- package/src/shared/sqlite-transaction-mode-guard.test.ts +4 -0
- package/src/shared/sqlite-writer-diagnostics.test.ts +134 -0
- package/src/shared/sqlite.ts +225 -41
- package/src/shared/stale-plugin-build.test.ts +129 -0
- package/src/shared/stale-plugin-build.ts +151 -0
- package/src/shared/status-summary.ts +40 -13
- package/src/shared/status-view-check.test.ts +253 -0
- package/src/shared/status-view-check.ts +536 -0
- package/src/shared/status-view.test.ts +6 -1
- package/src/shared/status-view.ts +176 -4
- package/src/shared/storage-busy.test.ts +3 -2
- package/src/shared/tag-owner-id.test.ts +33 -0
- package/src/shared/tag-owner-id.ts +29 -0
- package/src/shared/tag-transcript.ts +13 -2
- package/src/shared/test-temp-dir-policy.test.ts +33 -0
- package/src/shared/test-temp-dir.test.ts +27 -0
- package/src/shared/test-temp-dir.ts +36 -12
- package/src/shared/tui-config.test.ts +6 -5
- package/src/shared/tui-preferences.test.ts +3 -2
- package/src/shared/user-facing-codes.ts +52 -6
- package/src/shared/window-geometry.test.ts +3 -2
- package/src/shared/write-transaction-attribution.test.ts +11 -7
- package/src/shared/write-transaction-hold-clock.test.ts +160 -0
- package/src/shared/xml-unescape.ts +19 -0
- package/src/tui/data/context-db.test.ts +92 -4
- package/src/tui/data/context-db.ts +184 -18
- package/src/tui/data/notification-socket.test.ts +49 -2
- package/src/tui/data/notification-socket.ts +47 -9
- package/src/tui/data/session-directory.ts +19 -0
- package/src/tui/dialogs/status-dialog-render.test.ts +284 -0
- package/src/tui/dialogs/status-dialog.tsx +41 -38
- package/src/tui/index.tsx +30 -18
- package/src/tui/slots/sidebar-content.tsx +9 -2
- package/src/tui-compiled/data/context-db.ts +184 -18
- package/src/tui-compiled/data/notification-socket.ts +47 -9
- package/src/tui-compiled/data/session-directory.ts +19 -0
- package/src/tui-compiled/dialogs/status-dialog.tsx +38 -29
- package/src/tui-compiled/index.tsx +29 -16
- package/src/tui-compiled/slots/sidebar-content.tsx +3 -2
- package/src/v2/tui/host-contract.test.ts +9 -10
- package/src/v2/tui/index.ts +78 -23
- package/src/v2/tui/load-compiled-sidebar.d.mts +5 -1
- package/src/v2/tui/load-compiled-status-dialog.d.mts +3 -2
- package/src/v2/tui/session-directory.test.ts +53 -0
- package/src/v2/tui/sidebar-mount.ts +19 -1
- package/src/v2/tui/status-dialog-mount.ts +10 -7
- package/src/v2/tui/types.ts +10 -0
- package/dist/features/builtin-commands/commands.d.ts.map +0 -1
- package/dist/features/builtin-commands/types.d.ts +0 -3
- package/dist/features/builtin-commands/types.d.ts.map +0 -1
- package/dist/features/magic-context/context-authority.d.ts +0 -272
- package/dist/features/magic-context/context-authority.d.ts.map +0 -1
- package/dist/features/magic-context/memory/mirror-reembed.d.ts +0 -22
- package/dist/features/magic-context/memory/mirror-reembed.d.ts.map +0 -1
- package/dist/hooks/magic-context/historian-state-file.d.ts +0 -43
- package/dist/hooks/magic-context/historian-state-file.d.ts.map +0 -1
- package/dist/index-4an2p8qa.js +0 -1056
- package/dist/index-rn7gafjr.js +0 -8
- package/dist/index-v6t0tg85.js +0 -13
- package/dist/plugin/memory-id-translation.d.ts +0 -109
- package/dist/plugin/memory-id-translation.d.ts.map +0 -1
- package/dist/plugin/rust-note-backend.d.ts +0 -84
- package/dist/plugin/rust-note-backend.d.ts.map +0 -1
- package/dist/recomp-orchestrator-0ers6smx.js +0 -22
- package/dist/task-config-2bm68628.js +0 -9
- package/dist/transform-postprocess-phase-ttdkrm6r.js +0 -36
- package/dist/v2/host-service.d.ts +0 -66
- package/dist/v2/host-service.d.ts.map +0 -1
- package/dist/wrapup-orchestrator-x0jvvrqn.js +0 -19
- /package/dist/{index-s70wtd8k.js → index-q6hef7fh.js} +0 -0
|
@@ -10,9 +10,11 @@ import {
|
|
|
10
10
|
classifyProcessKind,
|
|
11
11
|
discoverLivePiProcessIds,
|
|
12
12
|
inspectLivePiProcesses,
|
|
13
|
+
inspectWindowsProcessesSync,
|
|
13
14
|
isPidAlive,
|
|
14
15
|
isPidIdentityPlausible,
|
|
15
16
|
parseTasklistOutput,
|
|
17
|
+
processCannotBeRpcHost,
|
|
16
18
|
type RpcPortFileRecord,
|
|
17
19
|
readProcessProbeEvidence,
|
|
18
20
|
} from "./rpc-utils";
|
|
@@ -629,18 +631,43 @@ describe("isPidIdentityPlausible", () => {
|
|
|
629
631
|
]);
|
|
630
632
|
|
|
631
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.
|
|
632
636
|
expect(isPidIdentityPlausible(record(NOW_MS))).toBe("inconclusive");
|
|
633
|
-
expect(calls).toEqual([
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
640
|
-
|
|
641
|
-
|
|
642
|
-
|
|
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,
|
|
643
667
|
});
|
|
668
|
+
const inspection = inspectWindowsProcessesSync();
|
|
669
|
+
expect(inspection.processSnapshot?.source).toBe("cim");
|
|
670
|
+
expect(limits).toEqual([8 * 1024 * 1024]);
|
|
644
671
|
});
|
|
645
672
|
|
|
646
673
|
test("Spanish tasklist no-match is not running", () => {
|
|
@@ -664,3 +691,130 @@ test("tasklist CSV live process is running", () => {
|
|
|
664
691
|
{ pid: 1234, command: "opencode.exe" },
|
|
665
692
|
]);
|
|
666
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);
|
|
819
|
+
});
|
|
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,8 +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"];
|
|
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.
|
|
124
164
|
const WINDOWS_CIM_COMMAND =
|
|
125
|
-
"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;
|
|
126
174
|
const PI_HARNESS_ARC_MARKERS = [
|
|
127
175
|
"pi-coding-agent",
|
|
128
176
|
"oh-my-pi",
|
|
@@ -210,6 +258,12 @@ export function readProcessProbeEvidence(pid: number): ProcessProbeEvidence {
|
|
|
210
258
|
};
|
|
211
259
|
}
|
|
212
260
|
|
|
261
|
+
function readCachedWindowsImageName(pid: number): string | null {
|
|
262
|
+
return rpcIdentityPlatform === "win32"
|
|
263
|
+
? (windowsProcessFactsCache?.get(pid)?.imageName ?? null)
|
|
264
|
+
: null;
|
|
265
|
+
}
|
|
266
|
+
|
|
213
267
|
interface ProcessListEntry {
|
|
214
268
|
pid: number;
|
|
215
269
|
command: string;
|
|
@@ -420,6 +474,50 @@ function commandLooksLikeOpenCode(command: string): boolean {
|
|
|
420
474
|
return OPEN_CODE_COMMAND_MARKERS.some((marker) => normalized.includes(marker));
|
|
421
475
|
}
|
|
422
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
|
+
|
|
423
521
|
/**
|
|
424
522
|
* Verify that a live PID still belongs to the process that wrote a port record.
|
|
425
523
|
*
|
|
@@ -429,6 +527,10 @@ function commandLooksLikeOpenCode(command: string): boolean {
|
|
|
429
527
|
* database-open guard path. Legacy records without a start time use a weaker
|
|
430
528
|
* command-name check. A failed filesystem or process probe is inconclusive,
|
|
431
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.
|
|
432
534
|
*/
|
|
433
535
|
export type PidIdentityPlausibility = "plausible" | "implausible" | "inconclusive";
|
|
434
536
|
|
|
@@ -440,10 +542,22 @@ export function isPidIdentityPlausible(
|
|
|
440
542
|
|
|
441
543
|
if (Number.isFinite(record.started_at) && record.started_at > 0) {
|
|
442
544
|
const processStartTime = evidence ? evidence.startTime : readProcessStartTime(record.pid);
|
|
443
|
-
if (processStartTime
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
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";
|
|
447
561
|
}
|
|
448
562
|
|
|
449
563
|
const command = evidence
|
|
@@ -454,7 +568,13 @@ export function isPidIdentityPlausible(
|
|
|
454
568
|
? (readWindowsProcess(record.pid).command ?? null)
|
|
455
569
|
: readPsProcessCommand(record.pid);
|
|
456
570
|
if (command === null) return "inconclusive";
|
|
457
|
-
|
|
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";
|
|
458
578
|
}
|
|
459
579
|
|
|
460
580
|
export function __setRpcIdentityTestHooks(hooks: {
|
|
@@ -529,6 +649,7 @@ function execProcessList(
|
|
|
529
649
|
exec(file, [...args], {
|
|
530
650
|
encoding: "utf8",
|
|
531
651
|
timeout,
|
|
652
|
+
maxBuffer: PROCESS_LIST_MAX_BUFFER_BYTES,
|
|
532
653
|
stdio: ["ignore", "pipe", "pipe"],
|
|
533
654
|
windowsHide: true,
|
|
534
655
|
}),
|
|
@@ -536,6 +657,11 @@ function execProcessList(
|
|
|
536
657
|
}
|
|
537
658
|
|
|
538
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
|
+
}
|
|
539
665
|
if (typeof value === "number" && Number.isFinite(value)) {
|
|
540
666
|
return value > 1e12 ? value : value * 1_000;
|
|
541
667
|
}
|
|
@@ -880,6 +1006,15 @@ export interface AsyncProcessInspection {
|
|
|
880
1006
|
liveness(pid: number): PidLiveness;
|
|
881
1007
|
}
|
|
882
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
|
+
|
|
883
1018
|
function execProcessListAsync(file: string, args: string[], timeout: number): Promise<string> {
|
|
884
1019
|
return new Promise((resolve, reject) => {
|
|
885
1020
|
execFile(
|
|
@@ -986,10 +1121,7 @@ export function inspectProcessesAsync(forceFresh = false): Promise<AsyncProcessI
|
|
|
986
1121
|
...(fresh && snapshot
|
|
987
1122
|
? { processSnapshot: { source: snapshot.source, facts: snapshot.facts } }
|
|
988
1123
|
: {}),
|
|
989
|
-
evidence: (pid: number) => (
|
|
990
|
-
startTime: byPid.get(pid)?.startTime ?? null,
|
|
991
|
-
commandLine: byPid.get(pid)?.commandLine ?? byPid.get(pid)?.imageName ?? null,
|
|
992
|
-
}),
|
|
1124
|
+
evidence: (pid: number) => snapshotEvidence(byPid.get(pid)),
|
|
993
1125
|
liveness: (pid: number) => (byPid.has(pid) ? "alive" : fresh ? "dead" : "inconclusive"),
|
|
994
1126
|
} satisfies AsyncProcessInspection;
|
|
995
1127
|
})().finally(() => {
|
|
@@ -1008,10 +1140,7 @@ export function inspectWindowsProcessesSync(): AsyncProcessInspection {
|
|
|
1008
1140
|
...(snapshot
|
|
1009
1141
|
? { processSnapshot: { source: snapshot.source, facts: snapshot.facts } }
|
|
1010
1142
|
: {}),
|
|
1011
|
-
evidence: (pid) => (
|
|
1012
|
-
startTime: byPid.get(pid)?.startTime ?? null,
|
|
1013
|
-
commandLine: byPid.get(pid)?.commandLine ?? byPid.get(pid)?.imageName ?? null,
|
|
1014
|
-
}),
|
|
1143
|
+
evidence: (pid) => snapshotEvidence(byPid.get(pid)),
|
|
1015
1144
|
liveness: (pid) => (byPid.has(pid) ? "alive" : snapshot ? "dead" : "inconclusive"),
|
|
1016
1145
|
};
|
|
1017
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(
|
|
@@ -23,6 +23,10 @@ const READ_ONLY_DEFERRED_TRANSACTIONS: Record<string, string> = {
|
|
|
23
23
|
"reads the latest compaction and the rows after it as one consistent snapshot of the OpenCode 2 store; never writes",
|
|
24
24
|
"packages/pi-plugin/src/inject-compartments-pi.ts#readFrozenM0InputsPi":
|
|
25
25
|
"reads the m[0] render sources and their watermarks as one consistent snapshot; never writes",
|
|
26
|
+
"packages/plugin/src/features/magic-context/message-fts-session-filter.ts#withMessageFtsSessionFilter":
|
|
27
|
+
"pins one read snapshot so the session's rowid coverage proof and the filtered message search see the same rows; never writes (read-only connections use it too)",
|
|
28
|
+
"packages/plugin/src/hooks/magic-context/lkg-persist.ts#loadPersistedLkgSlot":
|
|
29
|
+
"reads an LKG slot row and its prefix slices as one consistent snapshot; never writes (a failed verification clears the slot afterwards, outside this transaction)",
|
|
26
30
|
};
|
|
27
31
|
|
|
28
32
|
const REPOSITORY_ROOT = resolve(import.meta.dir, "../../../..");
|