@cortexkit/opencode-magic-context 0.46.1 → 0.48.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/magic-context-prompt.d.ts +1 -1
- package/dist/agents/magic-context-prompt.d.ts.map +1 -1
- package/dist/{announcement-y35wzg2r.js → announcement-fp14dw0n.js} +3 -2
- package/dist/auto-search-worker.js +112 -0
- package/dist/config/index.d.ts.map +1 -1
- package/dist/config/live-run-config.d.ts.map +1 -1
- package/dist/config/migrate-config-location.d.ts.map +1 -1
- package/dist/config/mural-model-deprecation.d.ts +15 -0
- package/dist/config/mural-model-deprecation.d.ts.map +1 -0
- package/dist/config/project-security.d.ts +0 -3
- package/dist/config/project-security.d.ts.map +1 -1
- package/dist/config/schema/magic-context.d.ts +21 -9
- package/dist/config/schema/magic-context.d.ts.map +1 -1
- package/dist/{conflict-warning-hook-7fj2b9jw.js → conflict-warning-hook-w8cykrnf.js} +12 -9
- package/dist/{context-sh2m2vde.js → context-m0cy262m.js} +1785 -913
- package/dist/{derive-budgets-7nj7r1rv.js → derive-budgets-sg0xsq7s.js} +4 -3
- package/dist/embedding-activity-g1dhes6g.js +10 -0
- package/dist/embedding-backfill-9rcm1mfy.js +21 -0
- package/dist/embedding-cache-mgyr73ef.js +16 -0
- package/dist/embedding-worker.js +11 -9
- package/dist/features/magic-context/compaction-marker.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts +1 -0
- package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-config.d.ts +3 -3
- package/dist/features/magic-context/dreamer/task-config.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-executor.d.ts +1 -1
- package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-gates.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/task-registry.d.ts +1 -0
- package/dist/features/magic-context/dreamer/task-registry.d.ts.map +1 -1
- package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
- package/dist/features/magic-context/message-index-async.d.ts +16 -3
- package/dist/features/magic-context/message-index-async.d.ts.map +1 -1
- package/dist/features/magic-context/message-index-bounded.d.ts +17 -0
- package/dist/features/magic-context/message-index-bounded.d.ts.map +1 -0
- package/dist/features/magic-context/message-index.d.ts +7 -1
- package/dist/features/magic-context/message-index.d.ts.map +1 -1
- package/dist/features/magic-context/mural/render-trigger.d.ts +7 -4
- package/dist/features/magic-context/mural/render-trigger.d.ts.map +1 -1
- package/dist/features/magic-context/overflow-detection.d.ts +2 -0
- package/dist/features/magic-context/overflow-detection.d.ts.map +1 -1
- package/dist/features/magic-context/pi-content-decisions.d.ts +7 -1
- package/dist/features/magic-context/pi-content-decisions.d.ts.map +1 -1
- package/dist/features/magic-context/project-embedding-registry.d.ts +7 -0
- package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
- package/dist/features/magic-context/search.d.ts +31 -0
- package/dist/features/magic-context/search.d.ts.map +1 -1
- package/dist/features/magic-context/session-activity.d.ts.map +1 -1
- package/dist/features/magic-context/session-project-storage.d.ts +8 -2
- package/dist/features/magic-context/session-project-storage.d.ts.map +1 -1
- package/dist/features/magic-context/smart-notes/runner.d.ts +1 -0
- package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
- package/dist/features/magic-context/storage-db.d.ts.map +1 -1
- package/dist/features/magic-context/storage-historian-runs.d.ts +2 -5
- package/dist/features/magic-context/storage-historian-runs.d.ts.map +1 -1
- package/dist/features/magic-context/storage-meta-persisted.d.ts +12 -0
- package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
- package/dist/features/magic-context/storage-meta-session.d.ts +6 -0
- package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
- package/dist/features/magic-context/storage-tag-identity-revision.d.ts +30 -0
- package/dist/features/magic-context/storage-tag-identity-revision.d.ts.map +1 -0
- package/dist/features/magic-context/storage-tags.d.ts +148 -3
- package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
- package/dist/features/magic-context/storage.d.ts +1 -0
- package/dist/features/magic-context/storage.d.ts.map +1 -1
- package/dist/features/magic-context/subagent-token-capture.d.ts.map +1 -1
- package/dist/features/magic-context/transform-decision-log.d.ts +4 -2
- package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
- package/dist/harness-e4avh192.js +10 -0
- package/dist/hooks/magic-context/active-anthropic-turn.d.ts +10 -0
- package/dist/hooks/magic-context/active-anthropic-turn.d.ts.map +1 -0
- package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-search-blocking.fixture.d.ts +2 -0
- package/dist/hooks/magic-context/auto-search-blocking.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/auto-search-deadline.d.ts +7 -0
- package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-search-host-review.fixture.d.ts +3 -0
- package/dist/hooks/magic-context/auto-search-host-review.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/auto-search-lock-review.fixture.d.ts +2 -0
- package/dist/hooks/magic-context/auto-search-lock-review.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/auto-search-long-lock-review.fixture.d.ts +2 -0
- package/dist/hooks/magic-context/auto-search-long-lock-review.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/auto-search-omp-host-review.fixture.d.ts +4 -0
- package/dist/hooks/magic-context/auto-search-omp-host-review.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/auto-search-omp-loader.fixture.d.ts +3 -0
- package/dist/hooks/magic-context/auto-search-omp-loader.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/auto-search-runner.d.ts +1 -1
- package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
- package/dist/hooks/magic-context/auto-search-snapshot.fixture.d.ts +4 -0
- package/dist/hooks/magic-context/auto-search-snapshot.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/auto-search-worker-client.d.ts +98 -0
- package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -0
- package/dist/hooks/magic-context/auto-search-worker.d.ts +2 -0
- package/dist/hooks/magic-context/auto-search-worker.d.ts.map +1 -0
- package/dist/hooks/magic-context/caveman-cleanup.d.ts.map +1 -1
- package/dist/hooks/magic-context/command-handler.d.ts +1 -0
- package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner-incremental.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 -5
- package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-runner.d.ts +2 -1
- package/dist/hooks/magic-context/compartment-runner.d.ts.map +1 -1
- package/dist/hooks/magic-context/compartment-trigger.d.ts +3 -1
- package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
- package/dist/hooks/magic-context/event-handler.d.ts +1 -1
- package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
- package/dist/hooks/magic-context/event-resolvers.d.ts.map +1 -1
- package/dist/hooks/magic-context/execute-status.d.ts.map +1 -1
- package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +2 -0
- package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
- package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -1
- package/dist/hooks/magic-context/historian-drain-gate.d.ts +11 -0
- package/dist/hooks/magic-context/historian-drain-gate.d.ts.map +1 -0
- package/dist/hooks/magic-context/hook.d.ts +3 -2
- package/dist/hooks/magic-context/hook.d.ts.map +1 -1
- package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
- package/dist/hooks/magic-context/latest-assistant-turn.d.ts +25 -0
- package/dist/hooks/magic-context/latest-assistant-turn.d.ts.map +1 -0
- package/dist/hooks/magic-context/latest-thinking-recovery.d.ts +61 -0
- package/dist/hooks/magic-context/latest-thinking-recovery.d.ts.map +1 -0
- package/dist/hooks/magic-context/lkg-persist.d.ts +4 -3
- package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-replay.d.ts +13 -8
- package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
- package/dist/hooks/magic-context/lkg-slot.d.ts +139 -2
- package/dist/hooks/magic-context/lkg-slot.d.ts.map +1 -1
- package/dist/hooks/magic-context/message-search-accepting-silent-worker.fixture.d.ts +2 -0
- package/dist/hooks/magic-context/message-search-accepting-silent-worker.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
- package/dist/hooks/magic-context/oc-stall-r2-warmup-worker.fixture.d.ts +2 -0
- package/dist/hooks/magic-context/oc-stall-r2-warmup-worker.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/oc-stall-search-review.fixture.d.ts +2 -0
- package/dist/hooks/magic-context/oc-stall-search-review.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/opencode-proven-floor.d.ts +6 -0
- package/dist/hooks/magic-context/opencode-proven-floor.d.ts.map +1 -0
- package/dist/hooks/magic-context/opencode1-to-model-messages.fixture.d.ts +63 -0
- package/dist/hooks/magic-context/opencode1-to-model-messages.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -1
- package/dist/hooks/magic-context/protected-tail-boundary.d.ts.map +1 -1
- package/dist/hooks/magic-context/provider-visible-parts.d.ts +45 -0
- package/dist/hooks/magic-context/provider-visible-parts.d.ts.map +1 -0
- package/dist/hooks/magic-context/raw-ordinal-warmup-silent-worker.fixture.d.ts +2 -0
- package/dist/hooks/magic-context/raw-ordinal-warmup-silent-worker.fixture.d.ts.map +1 -0
- package/dist/hooks/magic-context/raw-ordinal-warmup-worker.d.ts +2 -0
- package/dist/hooks/magic-context/raw-ordinal-warmup-worker.d.ts.map +1 -0
- package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts +87 -0
- package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts.map +1 -0
- package/dist/hooks/magic-context/read-session-chunk.d.ts +12 -0
- package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-db.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-formatting.d.ts +5 -0
- package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-raw.d.ts +83 -1
- package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -1
- package/dist/hooks/magic-context/read-session-true-raw-tokens.d.ts.map +1 -1
- package/dist/hooks/magic-context/reasoning-budget-status.d.ts +15 -0
- package/dist/hooks/magic-context/reasoning-budget-status.d.ts.map +1 -0
- package/dist/hooks/magic-context/reasoning-budget.d.ts +40 -0
- package/dist/hooks/magic-context/reasoning-budget.d.ts.map +1 -0
- package/dist/hooks/magic-context/reasoning-removal.d.ts +6 -6
- package/dist/hooks/magic-context/reasoning-removal.d.ts.map +1 -1
- package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
- package/dist/hooks/magic-context/sentinel.d.ts +45 -1
- package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
- package/dist/hooks/magic-context/strip-content.d.ts +21 -5
- package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
- package/dist/hooks/magic-context/system-prompt-hash.d.ts +1 -0
- package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
- package/dist/hooks/magic-context/tag-messages.d.ts +21 -0
- package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
- package/dist/hooks/magic-context/tag-owner-warmup.d.ts +6 -0
- package/dist/hooks/magic-context/tag-owner-warmup.d.ts.map +1 -0
- package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
- package/dist/hooks/magic-context/token-count-exact.d.ts +35 -0
- package/dist/hooks/magic-context/token-count-exact.d.ts.map +1 -0
- package/dist/hooks/magic-context/tool-drop-target.d.ts +5 -0
- package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform-compartment-phase.d.ts +3 -28
- package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +28 -6
- package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
- package/dist/hooks/magic-context/transform.d.ts +11 -3
- package/dist/hooks/magic-context/transform.d.ts.map +1 -1
- package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
- package/dist/{index-hpecdzec.js → index-0an7742d.js} +6820 -6587
- package/dist/index-0qhce371.js +120 -0
- package/dist/{index-q6hef7fh.js → index-0sahzkwr.js} +6 -19
- package/dist/{index-k5bdx1bx.js → index-0w56v4fm.js} +3 -5
- package/dist/index-14cjxt20.js +819 -0
- package/dist/{v2/server-51dv1pr5.js → index-1qb0z7wa.js} +301 -27
- package/dist/index-2bvekkfy.js +11 -0
- package/dist/{index-sj29b3z2.js → index-2y0s2hep.js} +3 -3
- package/dist/index-4dhv7mqz.js +131 -0
- package/dist/{index-b35pxds2.js → index-58e3y90n.js} +1 -18
- package/dist/index-5zygecde.js +152 -0
- package/dist/{index-sjthx78w.js → index-692jzy0p.js} +16879 -22907
- package/dist/index-72nhv486.js +2307 -0
- package/dist/index-7jzrrxap.js +931 -0
- package/dist/index-7mx8v0pw.js +3591 -0
- package/dist/index-8ajstryz.js +18 -0
- package/dist/{index-sfpzqvdz.js → index-8cd2j99z.js} +2 -3
- package/dist/{index-hybnrwq0.js → index-8j7gqj40.js} +131 -128
- package/dist/index-bdckkfw6.js +3261 -0
- package/dist/{index-8x2v7gg9.js → index-bhvjj0ys.js} +158 -2455
- package/dist/index-c43kr12f.js +3030 -0
- package/dist/index-cb7emxgj.js +984 -0
- package/dist/index-d9vfe7xq.js +16 -0
- package/dist/{index-5gq3b2ya.js → index-db7zwa3v.js} +147 -209
- package/dist/index-dhwzyd54.js +1142 -0
- package/dist/{index-8da2zjhz.js → index-eeezr5zz.js} +9 -7
- package/dist/{index-pkbcrdqs.js → index-f0h6xwqm.js} +3412 -4552
- package/dist/index-fb3zxn06.js +13 -0
- package/dist/index-fbv1dn35.js +171 -0
- package/dist/index-fr0wbhdn.js +43 -0
- package/dist/{index-mc22ayvf.js → index-ghc9f0n7.js} +11 -9
- package/dist/{index-fzbvakh0.js → index-jcbd3znx.js} +3 -3
- package/dist/{index-5p8jdswx.js → index-k1xb52kd.js} +20 -13
- package/dist/index-k9nnwad5.js +3532 -0
- package/dist/{v2/server-fg34g6a5.js → index-kb9nn0a0.js} +309 -52
- package/dist/index-knh4y330.js +566 -0
- package/dist/{index-q4yp4b52.js → index-mfkzp7qj.js} +28 -28
- package/dist/{index-sgthv3f7.js → index-mmyh6d8f.js} +4 -4
- package/dist/index-pavzsdc6.js +17 -0
- package/dist/{index-0d3g3461.js → index-pdecwzrd.js} +19 -16
- package/dist/index-pg50n748.js +1060 -0
- package/dist/index-q2tqeqde.js +2106 -0
- package/dist/index-q7h7csab.js +3469 -0
- package/dist/index-qt1qqasc.js +22 -0
- package/dist/{index-majxda46.js → index-ty64eqcn.js} +28 -18
- package/dist/{index-7qw742ev.js → index-yq8n9qcb.js} +25 -44
- package/dist/{index-sfnj6h8h.js → index-z8e0psj8.js} +20 -20
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1061 -260
- package/dist/logger-d3wex3dz.js +20 -0
- package/dist/message-index-bounded-7ezbgddp.js +124 -0
- package/dist/{v2/message-time-backfill-r6qkem1x.js → message-time-backfill-brbd63hv.js} +8 -6
- package/dist/migration-worker.js +25 -16
- package/dist/{model-resolution-xhfmyyvy.js → model-resolution-nx97z3x7.js} +1 -1
- package/dist/plugin/dream-timer.d.ts +1 -1
- package/dist/plugin/dream-timer.d.ts.map +1 -1
- package/dist/plugin/hooks/create-session-hooks.d.ts +3 -1
- package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
- package/dist/plugin/host-stall-profiler-report.d.ts +2 -0
- package/dist/plugin/host-stall-profiler-report.d.ts.map +1 -0
- package/dist/plugin/host-stall-profiler.d.ts +3 -0
- package/dist/plugin/host-stall-profiler.d.ts.map +1 -0
- package/dist/plugin/messages-transform.d.ts +21 -19
- package/dist/plugin/messages-transform.d.ts.map +1 -1
- package/dist/plugin/rpc-handlers.d.ts.map +1 -1
- package/dist/plugin/tool-registry.d.ts.map +1 -1
- package/dist/project-embedding-registry-7qzptcw7.js +88 -0
- package/dist/raw-ordinal-warmup-worker.js +60 -0
- package/dist/{read-session-chunk-egz7r68d.js → read-session-chunk-6k83m4fj.js} +15 -9
- package/dist/read-session-raw-3g9qy1xa.js +58 -0
- package/dist/recomp-orchestrator-d3fp1cy0.js +57 -0
- package/dist/{v2/safe-notification-target-eb1n1vfb.js → safe-notification-target-5ffqq32m.js} +4 -2
- package/dist/search-epax1ecv.js +45 -0
- package/dist/{v2/send-session-notification-qs0j78v6.js → send-session-notification-erecz4y4.js} +10 -6
- package/dist/shared/auto-search-lifecycle.d.ts +7 -0
- package/dist/shared/auto-search-lifecycle.d.ts.map +1 -0
- package/dist/shared/conflict-detector.d.ts.map +1 -1
- package/dist/shared/historian-tool-expansions.d.ts +1 -1
- package/dist/shared/historian-tool-expansions.d.ts.map +1 -1
- package/dist/shared/historian-tool-template.d.ts +2 -2
- package/dist/shared/historian-tool-template.d.ts.map +1 -1
- package/dist/shared/host-stall-profiler-bun.d.ts +46 -0
- package/dist/shared/host-stall-profiler-bun.d.ts.map +1 -0
- package/dist/shared/host-stall-profiler-common.d.ts +58 -0
- package/dist/shared/host-stall-profiler-common.d.ts.map +1 -0
- package/dist/shared/host-stall-profiler-node.d.ts +36 -0
- package/dist/shared/host-stall-profiler-node.d.ts.map +1 -0
- package/dist/shared/host-stall-profiler-report.d.ts +68 -0
- package/dist/shared/host-stall-profiler-report.d.ts.map +1 -0
- package/dist/shared/host-stall-profiler.d.ts +5 -0
- package/dist/shared/host-stall-profiler.d.ts.map +1 -0
- package/dist/shared/model-resolution.d.ts +2 -3
- package/dist/shared/model-resolution.d.ts.map +1 -1
- package/dist/shared/sqlite.d.ts +46 -1
- package/dist/shared/sqlite.d.ts.map +1 -1
- package/dist/shared/stable-json.d.ts.map +1 -1
- package/dist/shared/status-view.d.ts.map +1 -1
- package/dist/shared/user-facing-codes.d.ts +0 -5
- package/dist/shared/user-facing-codes.d.ts.map +1 -1
- package/dist/shared/window-geometry.d.ts +4 -0
- package/dist/shared/window-geometry.d.ts.map +1 -1
- package/dist/sqlite-context-pragmas-mv9jqwjh.js +6 -0
- package/dist/sqlite-mhjkerzq.js +46 -0
- package/dist/storage-memory-07fx57k6.js +71 -0
- package/dist/storage-tags-d3b0v2ss.js +131 -0
- package/dist/{task-config-v81k8jvk.js → task-config-cgpg0nvh.js} +2 -2
- package/dist/tools/ctx-expand/render.d.ts.map +1 -1
- package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
- package/dist/tools/ctx-note/constants.d.ts +4 -0
- package/dist/tools/ctx-note/constants.d.ts.map +1 -1
- package/dist/tools/ctx-note/tools.d.ts +1 -0
- package/dist/tools/ctx-note/tools.d.ts.map +1 -1
- package/dist/tools/ctx-search/tools.d.ts.map +1 -1
- package/dist/tools/parameter-descriptions.d.ts +2 -2
- package/dist/tools/parameter-descriptions.d.ts.map +1 -1
- package/dist/{transform-postprocess-phase-bqhz6vdr.js → transform-postprocess-phase-spcy2qre.js} +35 -17
- package/dist/transformers-node-wasm.js +18415 -18415
- package/dist/v2/auto-search-worker.js +112 -0
- package/dist/v2/{context-zecmzk5s.js → context-sf98kstd.js} +8378 -8530
- package/dist/v2/{derive-budgets-kdgp4s3r.js → derive-budgets-3vc0y84t.js} +4 -3
- package/dist/v2/embedding-activity-g1dhes6g.js +10 -0
- package/dist/v2/embedding-backfill-vn8g1nh1.js +21 -0
- package/dist/v2/embedding-cache-mgyr73ef.js +16 -0
- package/dist/v2/embedding-worker.js +12 -9
- package/dist/v2/fold/host-media.d.ts +4 -0
- package/dist/v2/fold/host-media.d.ts.map +1 -1
- package/dist/v2/fold/memory-cache.d.ts +70 -0
- package/dist/v2/fold/memory-cache.d.ts.map +1 -0
- package/dist/v2/fold/native-codec.d.ts +10 -0
- package/dist/v2/fold/native-codec.d.ts.map +1 -0
- package/dist/v2/fold/native-replay.d.ts +58 -0
- package/dist/v2/fold/native-replay.d.ts.map +1 -0
- package/dist/v2/fold/policy.d.ts +24 -0
- package/dist/v2/fold/policy.d.ts.map +1 -0
- package/dist/v2/harness-e4avh192.js +10 -0
- package/dist/v2/hidden-completion.d.ts.map +1 -1
- package/dist/v2/hooks/context.d.ts +2 -2
- package/dist/v2/hooks/context.d.ts.map +1 -1
- package/dist/v2/hooks/dream-manual.d.ts +1 -1
- package/dist/v2/hooks/dream-manual.d.ts.map +1 -1
- package/dist/v2/hooks/dream-timer.d.ts.map +1 -1
- package/dist/v2/hooks/dream-trigger.d.ts +1 -2
- package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
- package/dist/v2/hooks/payload.d.ts.map +1 -1
- package/dist/v2/hooks/tools.d.ts.map +1 -1
- package/dist/v2/hooks/types.d.ts +6 -0
- package/dist/v2/hooks/types.d.ts.map +1 -1
- package/dist/v2/logger-mxd0ym09.js +19 -0
- package/dist/v2/message-index-bounded-dy3s2k1e.js +123 -0
- package/dist/{message-time-backfill-68gj6t3e.js → v2/message-time-backfill-gtx1pwk1.js} +7 -7
- package/dist/v2/migration-worker.js +24 -15
- package/dist/v2/{model-resolution-xhfmyyvy.js → model-resolution-nx97z3x7.js} +1 -1
- package/dist/v2/project-embedding-registry-1tgba5dv.js +86 -0
- package/dist/v2/raw-ordinal-warmup-worker.js +60 -0
- package/dist/v2/{read-session-chunk-8vjp6581.js → read-session-chunk-rh4khdkv.js} +14 -8
- package/dist/v2/read-session-raw-bsbmf0vj.js +57 -0
- package/dist/v2/recomp-orchestrator-az61rfcg.js +57 -0
- package/dist/{safe-notification-target-43r8jsxw.js → v2/safe-notification-target-73ax1p5v.js} +3 -3
- package/dist/v2/search-nzkwrc6n.js +45 -0
- package/dist/{send-session-notification-dyw42dtr.js → v2/send-session-notification-6km439kn.js} +9 -7
- package/dist/{index-5eqk6z3s.js → v2/server-1r6pmz4f.js} +301 -27
- package/dist/v2/server-2bvekkfy.js +11 -0
- package/dist/v2/server-2fbhp79z.js +3205 -0
- package/dist/v2/{server-ajzeteqw.js → server-2ra6pwf3.js} +1 -18
- package/dist/v2/server-4dhv7mqz.js +131 -0
- package/dist/v2/{server-xa4xe3rv.js → server-4k748ke6.js} +11 -1053
- package/dist/v2/{server-vs5gpnd4.js → server-52awr2mw.js} +81 -145
- package/dist/v2/{server-1qbnzc80.js → server-5m3dt5r1.js} +136 -148
- package/dist/v2/server-686jg6eb.js +3508 -0
- package/dist/v2/server-7jzrrxap.js +931 -0
- package/dist/v2/server-7wwc2nga.js +3023 -0
- package/dist/v2/server-8ajstryz.js +18 -0
- package/dist/v2/{server-sfpzqvdz.js → server-8cd2j99z.js} +2 -3
- package/dist/v2/server-8pyt7hev.js +3408 -0
- package/dist/v2/server-8tqanswc.js +984 -0
- package/dist/v2/{server-14vq4kpm.js → server-aan4q8mx.js} +3 -3
- package/dist/v2/server-d9vfe7xq.js +16 -0
- package/dist/v2/server-e0vdaae2.js +3591 -0
- package/dist/v2/server-ezhze64f.js +1048 -0
- package/dist/v2/server-fb3zxn06.js +13 -0
- package/dist/v2/server-fr0wbhdn.js +43 -0
- package/dist/v2/server-g5r0n3b6.js +1137 -0
- package/dist/v2/server-gjcr4w98.js +154 -0
- package/dist/v2/server-k228xhjg.js +171 -0
- package/dist/v2/{server-jc7y02q0.js → server-k8x2rbxc.js} +5119 -10948
- package/dist/{index-fg34g6a5.js → v2/server-kb9nn0a0.js} +309 -52
- package/dist/v2/{server-g0fjrkta.js → server-mfkzp7qj.js} +28 -28
- package/dist/v2/server-pavzsdc6.js +17 -0
- package/dist/v2/server-psqc7e9n.js +2106 -0
- package/dist/v2/server-qt1qqasc.js +22 -0
- package/dist/v2/server-qye6ykf7.js +120 -0
- package/dist/v2/{server-qdjnb2z1.js → server-r5p3b1wy.js} +11 -9
- package/dist/v2/server-sggvvzhb.js +759 -0
- package/dist/v2/{server-y8maxeft.js → server-v06jcv0w.js} +16 -13
- package/dist/v2/server-vqpf3167.js +1048 -0
- package/dist/v2/{server-c5gz8wph.js → server-x2g40a71.js} +2048 -2059
- package/dist/v2/{server-wvjvfhck.js → server-xdfwt6kh.js} +20 -16
- package/dist/v2/{server-mcfawjgc.js → server-xxm59eww.js} +25 -44
- package/dist/v2/server-yczc713m.js +564 -0
- package/dist/v2/{server-3n4q9xme.js → server-z2037m6z.js} +4 -4
- package/dist/v2/{server-e29d7p7c.js → server-zm570tr2.js} +166 -160
- package/dist/v2/{server-6r257mf5.js → server-zxhgvsf9.js} +3 -3
- package/dist/v2/server.js +16 -14
- package/dist/v2/sqlite-context-pragmas-mv9jqwjh.js +6 -0
- package/dist/v2/sqlite-mhjkerzq.js +46 -0
- package/dist/v2/storage-memory-07fx57k6.js +71 -0
- package/dist/v2/storage-tags-w4tv77sn.js +130 -0
- package/dist/v2/store-reader.d.ts +16 -0
- package/dist/v2/store-reader.d.ts.map +1 -1
- package/dist/v2/{task-config-tbndqyny.js → task-config-x0hq3qfd.js} +2 -2
- package/dist/v2/transformers-node-wasm.js +18415 -18415
- package/dist/v2/tui/index.d.ts.map +1 -1
- package/dist/v2/tui/types.d.ts +1 -10
- package/dist/v2/tui/types.d.ts.map +1 -1
- package/dist/v2/{wrapup-orchestrator-0snhvwcv.js → wrapup-orchestrator-mz7efs7w.js} +51 -27
- package/dist/wrapup-orchestrator-amzta1t4.js +44 -0
- package/package.json +4 -3
- package/src/agents/magic-context-prompt.ts +27 -2
- package/src/agents/smart-notes-enabled.test.ts +294 -0
- package/src/agents/smart-notes-on.golden.json +70 -0
- package/src/config/index.test.ts +67 -1
- package/src/config/index.ts +8 -0
- package/src/config/latch-permanence-guard.test.ts +4 -0
- package/src/config/live-run-config.test.ts +37 -1
- package/src/config/live-run-config.ts +28 -0
- package/src/config/migrate-config-location.ts +10 -3
- package/src/config/mural-model-deprecation.ts +24 -0
- package/src/config/project-security.hostile-matrix.test.ts +4 -44
- package/src/config/project-security.test.ts +9 -14
- package/src/config/project-security.ts +13 -55
- package/src/config/schema/magic-context.test.ts +6 -5
- package/src/config/schema/magic-context.ts +34 -16
- package/src/features/magic-context/dreamer/task-registry.ts +6 -0
- package/src/shared/auto-search-lifecycle.ts +27 -0
- package/src/shared/conflict-detector.test.ts +56 -0
- package/src/shared/conflict-detector.ts +16 -5
- package/src/shared/historian-tool-defaults.json +6 -6
- package/src/shared/historian-tool-expansions.ts +65 -8
- package/src/shared/historian-tool-preview-defaults.json +13 -0
- package/src/shared/historian-tool-template.ts +48 -14
- package/src/shared/host-stall-profiler-bun.ts +358 -0
- package/src/shared/host-stall-profiler-common.ts +159 -0
- package/src/shared/host-stall-profiler-node.test.ts +234 -0
- package/src/shared/host-stall-profiler-node.ts +274 -0
- package/src/shared/host-stall-profiler-report.ts +248 -0
- package/src/shared/host-stall-profiler.ts +57 -0
- package/src/shared/model-resolution.test.ts +54 -17
- package/src/shared/model-resolution.ts +6 -17
- package/src/shared/sqlite-640-review-r2.test.ts +136 -0
- package/src/shared/sqlite-640-review.test.ts +183 -0
- package/src/shared/sqlite-acquisition-routing.test.ts +18 -0
- package/src/shared/sqlite.test.ts +52 -0
- package/src/shared/sqlite.ts +423 -37
- package/src/shared/stable-json-linear.test.ts +109 -0
- package/src/shared/stable-json.ts +37 -7
- package/src/shared/status-view.test.ts +6 -1
- package/src/shared/status-view.ts +15 -1
- package/src/shared/tag-transcript.ts +6 -0
- package/src/shared/user-facing-codes.ts +2 -6
- package/src/shared/window-geometry.ts +10 -0
- package/src/shared/write-transaction-attribution.test.ts +2 -2
- package/src/v2/tui/host-contract.test.ts +41 -67
- package/src/v2/tui/index.ts +6 -214
- package/src/v2/tui/types.ts +5 -17
- package/dist/features/magic-context/checkout-claim-fake-subc.test-support.d.ts +0 -45
- package/dist/features/magic-context/checkout-claim-fake-subc.test-support.d.ts.map +0 -1
- package/dist/features/magic-context/checkout-claim.d.ts +0 -155
- package/dist/features/magic-context/checkout-claim.d.ts.map +0 -1
- package/dist/index-3h0ybwah.js +0 -6540
- package/dist/index-r5hmbx3t.js +0 -7773
- package/dist/recomp-orchestrator-y15j0rb9.js +0 -39
- package/dist/v2/recomp-orchestrator-8ejxvrzz.js +0 -39
- package/dist/v2/server-frbm99q5.js +0 -7698
- package/dist/v2/server-qp5hx1ad.js +0 -6366
- package/dist/wrapup-orchestrator-39amhv9s.js +0 -26
- /package/dist/{index-en1k8h8m.js → index-2pp04pmg.js} +0 -0
- /package/dist/v2/{index-en1k8h8m.js → index-2pp04pmg.js} +0 -0
|
@@ -0,0 +1,248 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared host stall report helpers. Both JavaScriptCore and V8 samples use
|
|
3
|
+
* innermost-first frames so native calls can be attributed to their JS caller.
|
|
4
|
+
*
|
|
5
|
+
* Kept separate from runtime backends so attribution can be tested without
|
|
6
|
+
* running watchdog timers or starting a sampling profiler.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { readFileSync } from "node:fs";
|
|
10
|
+
import * as path from "node:path";
|
|
11
|
+
|
|
12
|
+
/** One frame from Bun's JavaScriptCore sampling API; V8 frames are normalized to this shape. */
|
|
13
|
+
export interface JscSampleFrame {
|
|
14
|
+
name?: string;
|
|
15
|
+
sourceURL?: string;
|
|
16
|
+
line?: number;
|
|
17
|
+
column?: number;
|
|
18
|
+
category?: string;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
/** One sample: `frames[0]` is the innermost (currently executing) frame. */
|
|
22
|
+
export interface JscSampleTrace {
|
|
23
|
+
/** Monotonic seconds. JSC has a separate origin; V8 conversion uses the watchdog clock. */
|
|
24
|
+
timestamp?: number;
|
|
25
|
+
frames?: JscSampleFrame[];
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/** Deepest stack kept per sample; deeper frames are folded into one marker. */
|
|
29
|
+
export const MAX_STACK_DEPTH = 64;
|
|
30
|
+
export const TOP_STACK_COUNT = 30;
|
|
31
|
+
export const TOP_FRAME_COUNT = 30;
|
|
32
|
+
|
|
33
|
+
/** JSC uses UINT32_MAX for "no line/column known". */
|
|
34
|
+
const UNKNOWN_POSITION = 4294967295;
|
|
35
|
+
|
|
36
|
+
/**
|
|
37
|
+
* Owners that never explain a stall by themselves: a native host function is
|
|
38
|
+
* attributed to its JavaScript caller, and host-core/runtime frames sit below
|
|
39
|
+
* every plugin hook. A sample is attributed to the innermost frame whose owner
|
|
40
|
+
* is NOT one of these, so a plugin calling a blocking native API is blamed,
|
|
41
|
+
* not the native API or the host that invoked the plugin.
|
|
42
|
+
*/
|
|
43
|
+
const BACKGROUND_OWNERS = new Set(["native", "runtime", "opencode", "pi", "omp"]);
|
|
44
|
+
|
|
45
|
+
const packageNameCache = new Map<string, string | null>();
|
|
46
|
+
|
|
47
|
+
function urlToPath(url: string): string {
|
|
48
|
+
if (url.startsWith("file://")) {
|
|
49
|
+
try {
|
|
50
|
+
return decodeURIComponent(new URL(url).pathname);
|
|
51
|
+
} catch {
|
|
52
|
+
return url.slice("file://".length);
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
return url;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Nearest `package.json` name above a source file, memoized per directory.
|
|
60
|
+
* Only reached for sources outside `node_modules` (a plugin loaded from a
|
|
61
|
+
* local checkout), and only after a stall has ended, so the bounded
|
|
62
|
+
* synchronous reads never run on a hot path.
|
|
63
|
+
*/
|
|
64
|
+
function nearestPackageName(filePath: string): string | null {
|
|
65
|
+
let dir = path.dirname(filePath);
|
|
66
|
+
const visited: string[] = [];
|
|
67
|
+
for (let depth = 0; depth < 12; depth++) {
|
|
68
|
+
const cached = packageNameCache.get(dir);
|
|
69
|
+
if (cached !== undefined) {
|
|
70
|
+
for (const seen of visited) packageNameCache.set(seen, cached);
|
|
71
|
+
return cached;
|
|
72
|
+
}
|
|
73
|
+
visited.push(dir);
|
|
74
|
+
try {
|
|
75
|
+
const parsed = JSON.parse(readFileSync(path.join(dir, "package.json"), "utf8")) as {
|
|
76
|
+
name?: unknown;
|
|
77
|
+
};
|
|
78
|
+
const name = typeof parsed.name === "string" && parsed.name ? parsed.name : null;
|
|
79
|
+
if (name) {
|
|
80
|
+
for (const seen of visited) packageNameCache.set(seen, name);
|
|
81
|
+
return name;
|
|
82
|
+
}
|
|
83
|
+
} catch {
|
|
84
|
+
// No readable package.json at this level; keep walking up.
|
|
85
|
+
}
|
|
86
|
+
const parent = path.dirname(dir);
|
|
87
|
+
if (parent === dir) break;
|
|
88
|
+
dir = parent;
|
|
89
|
+
}
|
|
90
|
+
for (const seen of visited) packageNameCache.set(seen, null);
|
|
91
|
+
return null;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
/**
|
|
95
|
+
* Map a frame's source URL to the code that owns it.
|
|
96
|
+
*
|
|
97
|
+
* - no URL: `native` (a host function such as a SQLite `get` or `readFileSync`)
|
|
98
|
+
* - Bun/Node builtin modules: `runtime`
|
|
99
|
+
* - the compiled OpenCode binary's embedded filesystem (`$bunfs`, `~BUN`): `opencode`
|
|
100
|
+
* - anything under `node_modules/<pkg>`: `npm:<pkg>` (the innermost package)
|
|
101
|
+
* - Pi/OMP core packages: `pi` / `omp`; agent extensions: package name or `extension:<entry>`
|
|
102
|
+
* - a file in an OpenCode `plugin/` or `plugins/` directory: `plugin:<file>`
|
|
103
|
+
* - any other file: `pkg:<name>` from the nearest package.json, else `file:<path>`
|
|
104
|
+
*/
|
|
105
|
+
export function sourceOwner(sourceURL: string | undefined): string {
|
|
106
|
+
if (!sourceURL) return "native";
|
|
107
|
+
if (/^(?:node|bun|builtin|internal):/.test(sourceURL)) return "runtime";
|
|
108
|
+
if (sourceURL.includes("$bunfs") || sourceURL.includes("~BUN")) return "opencode";
|
|
109
|
+
const filePath = urlToPath(sourceURL).replaceAll("\\", "/");
|
|
110
|
+
const modules = [...filePath.matchAll(/\/node_modules\/((?:@[^/]+\/)?[^/]+)/g)];
|
|
111
|
+
const innermost = modules.at(-1);
|
|
112
|
+
if (innermost) {
|
|
113
|
+
const name = innermost[1];
|
|
114
|
+
if (name === "@cortexkit/pi-magic-context") return `pkg:${name}`;
|
|
115
|
+
if (/^@(?:earendil-works|mariozechner)\/pi-(?:coding-agent|agent-core|ai|tui)$/.test(name))
|
|
116
|
+
return "pi";
|
|
117
|
+
if (/^@oh-my-pi\/pi-(?:coding-agent|agent-core|ai|tui)$/.test(name)) return "omp";
|
|
118
|
+
return `npm:${name}`;
|
|
119
|
+
}
|
|
120
|
+
const extension = filePath.match(/\/(?:\.pi|\.omp)\/agent\/extensions\/([^/]+)/);
|
|
121
|
+
if (extension) {
|
|
122
|
+
const name = nearestPackageName(filePath);
|
|
123
|
+
return name ? `pkg:${name}` : `extension:${extension[1]}`;
|
|
124
|
+
}
|
|
125
|
+
const pluginDir = filePath.match(/\/plugins?\/([^/]+)$/);
|
|
126
|
+
if (pluginDir && /\/(?:\.?opencode)\/plugins?\//.test(filePath)) {
|
|
127
|
+
return `plugin:${pluginDir[1]}`;
|
|
128
|
+
}
|
|
129
|
+
const name = nearestPackageName(filePath);
|
|
130
|
+
return name ? `pkg:${name}` : `file:${filePath}`;
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
function frameLabel(frame: JscSampleFrame): string {
|
|
134
|
+
const name = frame.name && frame.name.length > 0 ? frame.name : "(anonymous)";
|
|
135
|
+
if (!frame.sourceURL) return `${name} [native]`;
|
|
136
|
+
const line =
|
|
137
|
+
typeof frame.line === "number" && frame.line !== UNKNOWN_POSITION ? `:${frame.line}` : "";
|
|
138
|
+
return `${name} ${frame.sourceURL}${line}`;
|
|
139
|
+
}
|
|
140
|
+
|
|
141
|
+
export interface OwnedFrame {
|
|
142
|
+
label: string;
|
|
143
|
+
owner: string;
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
/** Prefer the innermost plugin/extension frame over native, runtime or host-core callers. */
|
|
147
|
+
export function attributeSample(frames: OwnedFrame[]): string {
|
|
148
|
+
for (const frame of frames) {
|
|
149
|
+
if (!BACKGROUND_OWNERS.has(frame.owner)) return frame.owner;
|
|
150
|
+
}
|
|
151
|
+
for (const frame of frames) {
|
|
152
|
+
if (frame.owner !== "native") return frame.owner;
|
|
153
|
+
}
|
|
154
|
+
return "native";
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
export interface CountedFrame {
|
|
158
|
+
frame: string;
|
|
159
|
+
owner: string;
|
|
160
|
+
samples: number;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
export interface CountedStack {
|
|
164
|
+
samples: number;
|
|
165
|
+
owner: string;
|
|
166
|
+
frames: string[];
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
export interface StallAggregate {
|
|
170
|
+
samples: number;
|
|
171
|
+
owners: Array<{ owner: string; samples: number; percent: number }>;
|
|
172
|
+
/** Innermost frame of each sample, native host functions included. */
|
|
173
|
+
top_frames: CountedFrame[];
|
|
174
|
+
/** Innermost frame that has JavaScript source, i.e. the JS caller of any native frame. */
|
|
175
|
+
top_js_frames: CountedFrame[];
|
|
176
|
+
top_stacks: CountedStack[];
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
function bump<T>(map: Map<string, T & { samples: number }>, key: string, init: () => T): void {
|
|
180
|
+
const existing = map.get(key);
|
|
181
|
+
if (existing) existing.samples += 1;
|
|
182
|
+
else map.set(key, { ...init(), samples: 1 });
|
|
183
|
+
}
|
|
184
|
+
|
|
185
|
+
function topBySamples<T extends { samples: number }>(values: Iterable<T>, limit: number): T[] {
|
|
186
|
+
return [...values].sort((a, b) => b.samples - a.samples).slice(0, limit);
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
export function aggregateTraces(traces: JscSampleTrace[]): StallAggregate {
|
|
190
|
+
const ownerOf = new Map<string, string>();
|
|
191
|
+
const owned = (frame: JscSampleFrame): OwnedFrame => {
|
|
192
|
+
const url = frame.sourceURL ?? "";
|
|
193
|
+
let owner = ownerOf.get(url);
|
|
194
|
+
if (owner === undefined) {
|
|
195
|
+
owner = sourceOwner(frame.sourceURL);
|
|
196
|
+
ownerOf.set(url, owner);
|
|
197
|
+
}
|
|
198
|
+
return { label: frameLabel(frame), owner };
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
const owners = new Map<string, { owner: string; samples: number }>();
|
|
202
|
+
const topFrames = new Map<string, CountedFrame>();
|
|
203
|
+
const topJsFrames = new Map<string, CountedFrame>();
|
|
204
|
+
const stacks = new Map<string, CountedStack>();
|
|
205
|
+
let samples = 0;
|
|
206
|
+
|
|
207
|
+
for (const trace of traces) {
|
|
208
|
+
const raw = Array.isArray(trace.frames) ? trace.frames : [];
|
|
209
|
+
if (raw.length === 0) continue;
|
|
210
|
+
samples += 1;
|
|
211
|
+
const frames = raw.slice(0, MAX_STACK_DEPTH).map(owned);
|
|
212
|
+
const owner = attributeSample(frames);
|
|
213
|
+
bump(owners, owner, () => ({ owner }));
|
|
214
|
+
|
|
215
|
+
const leaf = frames[0];
|
|
216
|
+
bump(topFrames, `${leaf.owner}\u0000${leaf.label}`, () => ({
|
|
217
|
+
frame: leaf.label,
|
|
218
|
+
owner: leaf.owner,
|
|
219
|
+
}));
|
|
220
|
+
const jsIndex = raw.findIndex(
|
|
221
|
+
(frame, index) => index < MAX_STACK_DEPTH && !!frame.sourceURL,
|
|
222
|
+
);
|
|
223
|
+
if (jsIndex >= 0) {
|
|
224
|
+
const js = frames[jsIndex];
|
|
225
|
+
bump(topJsFrames, `${js.owner}\u0000${js.label}`, () => ({
|
|
226
|
+
frame: js.label,
|
|
227
|
+
owner: js.owner,
|
|
228
|
+
}));
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
const labels = frames.map((frame) => `${frame.label} (${frame.owner})`);
|
|
232
|
+
if (raw.length > MAX_STACK_DEPTH) {
|
|
233
|
+
labels.push(`… ${raw.length - MAX_STACK_DEPTH} outer frames omitted`);
|
|
234
|
+
}
|
|
235
|
+
bump(stacks, labels.join("\n"), () => ({ owner, frames: labels }));
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
return {
|
|
239
|
+
samples,
|
|
240
|
+
owners: topBySamples(owners.values(), Number.POSITIVE_INFINITY).map((entry) => ({
|
|
241
|
+
...entry,
|
|
242
|
+
percent: samples === 0 ? 0 : Math.round((entry.samples / samples) * 1000) / 10,
|
|
243
|
+
})),
|
|
244
|
+
top_frames: topBySamples(topFrames.values(), TOP_FRAME_COUNT),
|
|
245
|
+
top_js_frames: topBySamples(topJsFrames.values(), TOP_FRAME_COUNT),
|
|
246
|
+
top_stacks: topBySamples(stacks.values(), TOP_STACK_COUNT),
|
|
247
|
+
};
|
|
248
|
+
}
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import { getMagicContextStorageDir } from "./data-path";
|
|
3
|
+
import { createHostStallProfiler } from "./host-stall-profiler-bun";
|
|
4
|
+
import {
|
|
5
|
+
HOST_PROFILER_DIRNAME,
|
|
6
|
+
type HostStallProfilerHandle,
|
|
7
|
+
type ProfilerRuntimeDeps,
|
|
8
|
+
} from "./host-stall-profiler-common";
|
|
9
|
+
import { createNodeHostStallProfiler, type InspectorSession } from "./host-stall-profiler-node";
|
|
10
|
+
import { log } from "./logger";
|
|
11
|
+
|
|
12
|
+
export * from "./host-stall-profiler-common";
|
|
13
|
+
|
|
14
|
+
export function hostStallProfilerDir(): string {
|
|
15
|
+
return path.join(getMagicContextStorageDir(), HOST_PROFILER_DIRNAME);
|
|
16
|
+
}
|
|
17
|
+
|
|
18
|
+
const PROCESS_PROFILER_KEY = Symbol.for("cortexkit.magic-context.host-stall-profiler");
|
|
19
|
+
// Resolve at runtime: Node-only consumers do not install Bun's type declarations.
|
|
20
|
+
const jscModule: string = "bun:jsc";
|
|
21
|
+
|
|
22
|
+
/** All plugin/project instances watch the same main thread and share one sampler. */
|
|
23
|
+
export function startHostStallProfilerSwitch(): void {
|
|
24
|
+
try {
|
|
25
|
+
const holder = globalThis as unknown as Record<symbol, HostStallProfilerHandle | undefined>;
|
|
26
|
+
if (holder[PROCESS_PROFILER_KEY]) return;
|
|
27
|
+
const deps: ProfilerRuntimeDeps = {
|
|
28
|
+
profilerDir: hostStallProfilerDir,
|
|
29
|
+
now: () => performance.now(),
|
|
30
|
+
wallNow: () => Date.now(),
|
|
31
|
+
setInterval: (callback, ms) => {
|
|
32
|
+
const handle = setInterval(callback, ms);
|
|
33
|
+
(handle as { unref?: () => void }).unref?.();
|
|
34
|
+
return handle;
|
|
35
|
+
},
|
|
36
|
+
clearInterval: (handle) => clearInterval(handle as ReturnType<typeof setInterval>),
|
|
37
|
+
rss: () => process.memoryUsage.rss(),
|
|
38
|
+
log,
|
|
39
|
+
pid: process.pid,
|
|
40
|
+
bunVersion: process.versions.bun ?? null,
|
|
41
|
+
};
|
|
42
|
+
const handle = process.versions.bun
|
|
43
|
+
? createHostStallProfiler({ ...deps, loadJsc: () => import(jscModule) })
|
|
44
|
+
: createNodeHostStallProfiler({
|
|
45
|
+
...deps,
|
|
46
|
+
createSession: async () => {
|
|
47
|
+
const { Session } = await import("node:inspector");
|
|
48
|
+
return new Session() as unknown as InspectorSession;
|
|
49
|
+
},
|
|
50
|
+
memoryUsage: () => process.memoryUsage(),
|
|
51
|
+
});
|
|
52
|
+
holder[PROCESS_PROFILER_KEY] = handle;
|
|
53
|
+
handle.start();
|
|
54
|
+
} catch (error) {
|
|
55
|
+
log("[magic-context] host stall profiler: could not start the enable-file switch", error);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
@@ -231,41 +231,78 @@ describe("model-resolution", () => {
|
|
|
231
231
|
});
|
|
232
232
|
});
|
|
233
233
|
|
|
234
|
-
test("
|
|
234
|
+
test("resolves compress-cues to each harness's dreamer default and ignores mural.model", () => {
|
|
235
|
+
// The retired shared mural.model sits in the same config to prove it
|
|
236
|
+
// no longer feeds resolution on any harness.
|
|
235
237
|
const config = {
|
|
238
|
+
mural: { enabled: true, model: "google/antigravity-gemini-3.8-flash" },
|
|
236
239
|
dreamer: {
|
|
237
240
|
tasks: { "compress-cues": { schedule: "0 4 * * *" } },
|
|
238
241
|
opencode: {
|
|
239
242
|
model: { model: "open/default", variant: "default-variant" },
|
|
240
|
-
tasks: { "compress-cues": { variant: "task-local-must-not-leak" } },
|
|
241
243
|
},
|
|
242
244
|
pi: {
|
|
243
|
-
model: {
|
|
245
|
+
model: {
|
|
246
|
+
model: "google-antigravity/antigravity-gemini-3.8-flash",
|
|
247
|
+
thinking_level: "high",
|
|
248
|
+
},
|
|
244
249
|
tasks: { "compress-cues": {} },
|
|
245
250
|
},
|
|
246
251
|
},
|
|
247
252
|
};
|
|
248
253
|
|
|
249
254
|
expect(
|
|
250
|
-
resolveDreamerTaskModel({
|
|
251
|
-
config,
|
|
252
|
-
harness: "opencode",
|
|
253
|
-
task: "compress-cues",
|
|
254
|
-
muralModel: "mural/model",
|
|
255
|
-
}),
|
|
255
|
+
resolveDreamerTaskModel({ config, harness: "opencode", task: "compress-cues" }),
|
|
256
256
|
).toMatchObject({
|
|
257
|
-
primary: { model: "
|
|
257
|
+
primary: { model: "open/default", qualifier: "default-variant" },
|
|
258
258
|
fallbacks: [],
|
|
259
|
+
schedule: "0 4 * * *",
|
|
259
260
|
});
|
|
260
261
|
expect(
|
|
261
|
-
resolveDreamerTaskModel({
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
}
|
|
262
|
+
resolveDreamerTaskModel({ config, harness: "pi", task: "compress-cues" }),
|
|
263
|
+
).toMatchObject({
|
|
264
|
+
primary: {
|
|
265
|
+
model: "google-antigravity/antigravity-gemini-3.8-flash",
|
|
266
|
+
qualifier: "high",
|
|
267
|
+
},
|
|
268
|
+
fallbacks: [],
|
|
269
|
+
schedule: "0 4 * * *",
|
|
270
|
+
});
|
|
271
|
+
});
|
|
272
|
+
|
|
273
|
+
test("a per-harness compress-cues task override wins over the harness default", () => {
|
|
274
|
+
const config = {
|
|
275
|
+
mural: { enabled: true, model: "shared/must-not-win" },
|
|
276
|
+
dreamer: {
|
|
277
|
+
opencode: {
|
|
278
|
+
model: "open/default",
|
|
279
|
+
fallback_models: ["open/default-fallback"],
|
|
280
|
+
tasks: {
|
|
281
|
+
"compress-cues": {
|
|
282
|
+
model: { model: "open/cues", variant: "low" },
|
|
283
|
+
fallback_models: ["open/cues-fallback"],
|
|
284
|
+
},
|
|
285
|
+
},
|
|
286
|
+
},
|
|
287
|
+
pi: {
|
|
288
|
+
model: "pi/default",
|
|
289
|
+
thinking_level: "high",
|
|
290
|
+
tasks: { "compress-cues": { model: "pi/cues" } },
|
|
291
|
+
},
|
|
292
|
+
},
|
|
293
|
+
};
|
|
294
|
+
|
|
295
|
+
expect(
|
|
296
|
+
resolveDreamerTaskModel({ config, harness: "opencode", task: "compress-cues" }),
|
|
297
|
+
).toMatchObject({
|
|
298
|
+
primary: { model: "open/cues", qualifier: "low" },
|
|
299
|
+
fallbacks: [{ model: "open/cues-fallback" }],
|
|
300
|
+
});
|
|
301
|
+
// A task override without its own qualifier uses the harness default's qualifier.
|
|
302
|
+
expect(
|
|
303
|
+
resolveDreamerTaskModel({ config, harness: "pi", task: "compress-cues" }),
|
|
267
304
|
).toMatchObject({
|
|
268
|
-
primary: { model: "
|
|
305
|
+
primary: { model: "pi/cues", qualifier: "high" },
|
|
269
306
|
fallbacks: [],
|
|
270
307
|
});
|
|
271
308
|
});
|
|
@@ -137,14 +137,13 @@ export interface ResolvedDreamerTaskModel {
|
|
|
137
137
|
|
|
138
138
|
/**
|
|
139
139
|
* Resolve a dreamer task from one harness subtree. Model selection is task →
|
|
140
|
-
* harness default,
|
|
141
|
-
*
|
|
140
|
+
* harness default for every task, compress-cues included. Scheduling remains
|
|
141
|
+
* at dreamer.tasks.<task>.
|
|
142
142
|
*/
|
|
143
143
|
export function resolveDreamerTaskModel(args: {
|
|
144
144
|
config: unknown;
|
|
145
145
|
harness: ModelHarness;
|
|
146
146
|
task: string;
|
|
147
|
-
muralModel?: unknown;
|
|
148
147
|
}): ResolvedDreamerTaskModel {
|
|
149
148
|
const dreamer = asRecord(asRecord(args.config)?.dreamer);
|
|
150
149
|
const harnessBlock = resolveHarnessBlock(dreamer, args.harness);
|
|
@@ -166,19 +165,13 @@ export function resolveDreamerTaskModel(args: {
|
|
|
166
165
|
}
|
|
167
166
|
|
|
168
167
|
const taskQualifier = taskBlock?.[args.harness === "opencode" ? "variant" : "thinking_level"];
|
|
169
|
-
// A
|
|
170
|
-
// qualifier
|
|
168
|
+
// A task override without its own qualifier borrows the harness default's
|
|
169
|
+
// qualifier, whether written beside `model` or inside the default entry object.
|
|
171
170
|
const harnessQualifier =
|
|
172
171
|
harnessBlock[args.harness === "opencode" ? "variant" : "thinking_level"] ??
|
|
173
172
|
normalizeModelEntry(harnessBlock.model, args.harness)?.qualifier;
|
|
174
173
|
const taskHasModel = taskBlock !== undefined && hasOwn(taskBlock, "model");
|
|
175
|
-
const
|
|
176
|
-
!taskHasModel && args.task === "compress-cues" && Boolean(readString(args.muralModel));
|
|
177
|
-
const primarySource = taskHasModel
|
|
178
|
-
? taskBlock?.model
|
|
179
|
-
: usesMuralModel
|
|
180
|
-
? args.muralModel
|
|
181
|
-
: harnessBlock.model;
|
|
174
|
+
const primarySource = taskHasModel ? taskBlock?.model : harnessBlock.model;
|
|
182
175
|
const fallbackSource =
|
|
183
176
|
taskBlock !== undefined && hasOwn(taskBlock, "fallback_models")
|
|
184
177
|
? taskBlock.fallback_models
|
|
@@ -187,11 +180,7 @@ export function resolveDreamerTaskModel(args: {
|
|
|
187
180
|
return {
|
|
188
181
|
primary: resolvePrimaryEntry({
|
|
189
182
|
entry: primarySource,
|
|
190
|
-
|
|
191
|
-
// executing harness default rather than a task-local default.
|
|
192
|
-
defaultQualifier: usesMuralModel
|
|
193
|
-
? harnessQualifier
|
|
194
|
-
: (taskQualifier ?? harnessQualifier),
|
|
183
|
+
defaultQualifier: taskQualifier ?? harnessQualifier,
|
|
195
184
|
harness: args.harness,
|
|
196
185
|
}),
|
|
197
186
|
fallbacks: resolveFallbackEntries(fallbackSource, args.harness),
|
|
@@ -0,0 +1,136 @@
|
|
|
1
|
+
import { expect, spyOn, test } from "bun:test";
|
|
2
|
+
import { openDatabase } from "../features/magic-context/storage-db";
|
|
3
|
+
import { getOrCreateSessionMeta, updateSessionMeta } from "../features/magic-context/storage-meta";
|
|
4
|
+
import { captureLkgSlot, replayLkg } from "../hooks/magic-context/lkg-replay";
|
|
5
|
+
import { resetLkgSlotsForTest } from "../hooks/magic-context/lkg-slot";
|
|
6
|
+
import type { RustLkgReplayParticipant } from "../hooks/magic-context/rust-lkg-freeze-registry";
|
|
7
|
+
import type { MessageLike } from "../hooks/magic-context/transform-operations";
|
|
8
|
+
import { createMessagesTransformHandler } from "../plugin/messages-transform";
|
|
9
|
+
|
|
10
|
+
for (const change of ["content", "reorder", "interior deletion"] as const) {
|
|
11
|
+
test(`r2: OpenCode admission validates current ${change} after a backed-off wait`, async () => {
|
|
12
|
+
resetLkgSlotsForTest();
|
|
13
|
+
const db = openDatabase();
|
|
14
|
+
if (!db) throw new Error("throwaway database unavailable");
|
|
15
|
+
const sessionId = `r2-stale-${change}`;
|
|
16
|
+
getOrCreateSessionMeta(db, sessionId);
|
|
17
|
+
const model = { providerID: "openai", modelID: "gpt-4.1" };
|
|
18
|
+
const raw = ["u0", "u1", "u2"].map((id) => ({
|
|
19
|
+
info: { id, role: "user", sessionID: sessionId, model },
|
|
20
|
+
parts: [{ type: "text", text: id }],
|
|
21
|
+
})) as MessageLike[];
|
|
22
|
+
const saved = structuredClone(raw);
|
|
23
|
+
(saved[0].parts[0] as { text: string }).text = "§1§ saved managed prefix";
|
|
24
|
+
const capture = () =>
|
|
25
|
+
captureLkgSlot({
|
|
26
|
+
sessionId,
|
|
27
|
+
input: raw,
|
|
28
|
+
output: saved,
|
|
29
|
+
modelKey: "openai/gpt-4.1",
|
|
30
|
+
providerKey: "openai",
|
|
31
|
+
});
|
|
32
|
+
expect(capture()).toBe(true);
|
|
33
|
+
const output = { messages: structuredClone(raw) };
|
|
34
|
+
let fits = 0;
|
|
35
|
+
let callbacks = 0;
|
|
36
|
+
let changed: MessageLike[] | undefined;
|
|
37
|
+
const participant: RustLkgReplayParticipant = {
|
|
38
|
+
lastPassStamp: () => 1,
|
|
39
|
+
enterFreezeFromExternalServe: () => {},
|
|
40
|
+
emergencyFailClosed: () => false,
|
|
41
|
+
stripPersistedReasoning: () => {},
|
|
42
|
+
replayFits: () => ++fits > 1,
|
|
43
|
+
};
|
|
44
|
+
const exec = db.exec.bind(db);
|
|
45
|
+
let attempts = 0;
|
|
46
|
+
const spy = spyOn(db, "exec").mockImplementation((sql) => {
|
|
47
|
+
if (sql === "BEGIN IMMEDIATE" && ++attempts <= 2) {
|
|
48
|
+
if (attempts === 1)
|
|
49
|
+
setImmediate(() => {
|
|
50
|
+
if (change === "content")
|
|
51
|
+
(output.messages[0].parts[0] as { text: string }).text =
|
|
52
|
+
"history edited while waiting";
|
|
53
|
+
else if (change === "reorder")
|
|
54
|
+
[output.messages[0], output.messages[1]] = [
|
|
55
|
+
output.messages[1],
|
|
56
|
+
output.messages[0],
|
|
57
|
+
];
|
|
58
|
+
else output.messages.splice(1, 1);
|
|
59
|
+
changed = structuredClone(output.messages);
|
|
60
|
+
});
|
|
61
|
+
throw Object.assign(new Error("writer busy"), { code: "SQLITE_BUSY" });
|
|
62
|
+
}
|
|
63
|
+
return exec(sql);
|
|
64
|
+
});
|
|
65
|
+
try {
|
|
66
|
+
const handler = createMessagesTransformHandler({
|
|
67
|
+
rustReplayParticipant: () => participant,
|
|
68
|
+
magicContext: {
|
|
69
|
+
"experimental.chat.messages.transform": async () => {
|
|
70
|
+
callbacks++;
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
});
|
|
74
|
+
await handler({}, output as Parameters<typeof handler>[1]);
|
|
75
|
+
expect(changed).toBeDefined();
|
|
76
|
+
// A fresh validator rejects this exact input, independently of the wrapper's snapshot.
|
|
77
|
+
expect(capture()).toBe(true);
|
|
78
|
+
expect(
|
|
79
|
+
replayLkg({
|
|
80
|
+
sessionId,
|
|
81
|
+
messages: changed!,
|
|
82
|
+
modelKey: "openai/gpt-4.1",
|
|
83
|
+
providerKey: "openai",
|
|
84
|
+
}).ok,
|
|
85
|
+
).toBe(false);
|
|
86
|
+
expect(callbacks).toBe(1);
|
|
87
|
+
expect(output.messages).toEqual(changed!);
|
|
88
|
+
} finally {
|
|
89
|
+
spy.mockRestore();
|
|
90
|
+
resetLkgSlotsForTest();
|
|
91
|
+
}
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
test("r2: writer callback runs once after three failed acquisitions with no saved request", async () => {
|
|
96
|
+
resetLkgSlotsForTest();
|
|
97
|
+
const db = openDatabase();
|
|
98
|
+
if (!db) throw new Error("throwaway database unavailable");
|
|
99
|
+
getOrCreateSessionMeta(db, "r2-three-busy");
|
|
100
|
+
updateSessionMeta(db, "r2-three-busy", { systemPromptTokens: 100 });
|
|
101
|
+
const exec = db.exec.bind(db);
|
|
102
|
+
let attempts = 0;
|
|
103
|
+
let callbacks = 0;
|
|
104
|
+
const spy = spyOn(db, "exec").mockImplementation((sql) => {
|
|
105
|
+
if (sql === "BEGIN IMMEDIATE" && ++attempts <= 3)
|
|
106
|
+
throw Object.assign(new Error("busy"), { code: "SQLITE_BUSY" });
|
|
107
|
+
return exec(sql);
|
|
108
|
+
});
|
|
109
|
+
try {
|
|
110
|
+
const handler = createMessagesTransformHandler({
|
|
111
|
+
magicContext: {
|
|
112
|
+
"experimental.chat.messages.transform": async () => {
|
|
113
|
+
callbacks++;
|
|
114
|
+
},
|
|
115
|
+
},
|
|
116
|
+
});
|
|
117
|
+
const output = {
|
|
118
|
+
messages: [
|
|
119
|
+
{
|
|
120
|
+
info: { id: "u", sessionID: "r2-three-busy", role: "user" },
|
|
121
|
+
parts: [{ type: "text", text: "§1§ managed" }],
|
|
122
|
+
},
|
|
123
|
+
],
|
|
124
|
+
};
|
|
125
|
+
const bytes = JSON.stringify(output);
|
|
126
|
+
await handler({}, output as Parameters<typeof handler>[1]);
|
|
127
|
+
expect({ attempts, callbacks, bytes: JSON.stringify(output) }).toEqual({
|
|
128
|
+
attempts: 4,
|
|
129
|
+
callbacks: 1,
|
|
130
|
+
bytes,
|
|
131
|
+
});
|
|
132
|
+
} finally {
|
|
133
|
+
spy.mockRestore();
|
|
134
|
+
resetLkgSlotsForTest();
|
|
135
|
+
}
|
|
136
|
+
});
|