@cortexkit/opencode-magic-context 0.47.0 → 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.
Files changed (366) hide show
  1. package/dist/agents/magic-context-prompt.d.ts +1 -1
  2. package/dist/agents/magic-context-prompt.d.ts.map +1 -1
  3. package/dist/{announcement-y35wzg2r.js → announcement-fp14dw0n.js} +3 -2
  4. package/dist/auto-search-worker.js +27 -30
  5. package/dist/config/index.d.ts.map +1 -1
  6. package/dist/config/mural-model-deprecation.d.ts +15 -0
  7. package/dist/config/mural-model-deprecation.d.ts.map +1 -0
  8. package/dist/config/project-security.d.ts +0 -3
  9. package/dist/config/project-security.d.ts.map +1 -1
  10. package/dist/config/schema/magic-context.d.ts +10 -6
  11. package/dist/config/schema/magic-context.d.ts.map +1 -1
  12. package/dist/{conflict-warning-hook-z44ynfz7.js → conflict-warning-hook-w8cykrnf.js} +12 -10
  13. package/dist/{context-wq4ffwyb.js → context-m0cy262m.js} +2690 -1903
  14. package/dist/{derive-budgets-ke12jnnh.js → derive-budgets-sg0xsq7s.js} +4 -3
  15. package/dist/embedding-activity-g1dhes6g.js +10 -0
  16. package/dist/embedding-backfill-9rcm1mfy.js +21 -0
  17. package/dist/embedding-cache-mgyr73ef.js +16 -0
  18. package/dist/embedding-worker.js +11 -9
  19. package/dist/features/magic-context/compaction-marker.d.ts.map +1 -1
  20. package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts +1 -0
  21. package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
  22. package/dist/features/magic-context/dreamer/task-config.d.ts +3 -3
  23. package/dist/features/magic-context/dreamer/task-config.d.ts.map +1 -1
  24. package/dist/features/magic-context/dreamer/task-executor.d.ts +1 -1
  25. package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
  26. package/dist/features/magic-context/dreamer/task-registry.d.ts +1 -0
  27. package/dist/features/magic-context/dreamer/task-registry.d.ts.map +1 -1
  28. package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
  29. package/dist/features/magic-context/message-index-async.d.ts +16 -3
  30. package/dist/features/magic-context/message-index-async.d.ts.map +1 -1
  31. package/dist/features/magic-context/message-index-bounded.d.ts +17 -0
  32. package/dist/features/magic-context/message-index-bounded.d.ts.map +1 -0
  33. package/dist/features/magic-context/message-index.d.ts +7 -1
  34. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  35. package/dist/features/magic-context/mural/render-trigger.d.ts +7 -4
  36. package/dist/features/magic-context/mural/render-trigger.d.ts.map +1 -1
  37. package/dist/features/magic-context/pi-content-decisions.d.ts +7 -1
  38. package/dist/features/magic-context/pi-content-decisions.d.ts.map +1 -1
  39. package/dist/features/magic-context/search.d.ts +29 -0
  40. package/dist/features/magic-context/search.d.ts.map +1 -1
  41. package/dist/features/magic-context/session-activity.d.ts.map +1 -1
  42. package/dist/features/magic-context/smart-notes/runner.d.ts +1 -0
  43. package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
  44. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  45. package/dist/features/magic-context/storage-meta-session.d.ts +6 -0
  46. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  47. package/dist/features/magic-context/storage-tag-identity-revision.d.ts +30 -0
  48. package/dist/features/magic-context/storage-tag-identity-revision.d.ts.map +1 -0
  49. package/dist/features/magic-context/storage-tags.d.ts +144 -4
  50. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  51. package/dist/features/magic-context/subagent-token-capture.d.ts.map +1 -1
  52. package/dist/features/magic-context/transform-decision-log.d.ts +1 -1
  53. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
  54. package/dist/harness-e4avh192.js +10 -0
  55. package/dist/hooks/magic-context/active-anthropic-turn.d.ts +2 -0
  56. package/dist/hooks/magic-context/active-anthropic-turn.d.ts.map +1 -1
  57. package/dist/hooks/magic-context/auto-search-worker-client.d.ts +32 -3
  58. package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -1
  59. package/dist/hooks/magic-context/command-handler.d.ts +1 -0
  60. package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
  61. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
  62. package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
  63. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
  64. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  65. package/dist/hooks/magic-context/hook.d.ts +1 -1
  66. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  67. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  68. package/dist/hooks/magic-context/lkg-persist.d.ts +4 -3
  69. package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
  70. package/dist/hooks/magic-context/lkg-replay.d.ts +13 -8
  71. package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
  72. package/dist/hooks/magic-context/lkg-slot.d.ts +139 -2
  73. package/dist/hooks/magic-context/lkg-slot.d.ts.map +1 -1
  74. package/dist/hooks/magic-context/message-search-accepting-silent-worker.fixture.d.ts +2 -0
  75. package/dist/hooks/magic-context/message-search-accepting-silent-worker.fixture.d.ts.map +1 -0
  76. package/dist/hooks/magic-context/oc-stall-r2-warmup-worker.fixture.d.ts +2 -0
  77. package/dist/hooks/magic-context/oc-stall-r2-warmup-worker.fixture.d.ts.map +1 -0
  78. package/dist/hooks/magic-context/oc-stall-search-review.fixture.d.ts +2 -0
  79. package/dist/hooks/magic-context/oc-stall-search-review.fixture.d.ts.map +1 -0
  80. package/dist/hooks/magic-context/opencode1-to-model-messages.fixture.d.ts +63 -0
  81. package/dist/hooks/magic-context/opencode1-to-model-messages.fixture.d.ts.map +1 -0
  82. package/dist/hooks/magic-context/provider-visible-parts.d.ts +45 -0
  83. package/dist/hooks/magic-context/provider-visible-parts.d.ts.map +1 -0
  84. package/dist/hooks/magic-context/raw-ordinal-warmup-silent-worker.fixture.d.ts +2 -0
  85. package/dist/hooks/magic-context/raw-ordinal-warmup-silent-worker.fixture.d.ts.map +1 -0
  86. package/dist/hooks/magic-context/raw-ordinal-warmup-worker.d.ts +2 -0
  87. package/dist/hooks/magic-context/raw-ordinal-warmup-worker.d.ts.map +1 -0
  88. package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts +87 -0
  89. package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts.map +1 -0
  90. package/dist/hooks/magic-context/read-session-chunk.d.ts +12 -0
  91. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  92. package/dist/hooks/magic-context/read-session-db.d.ts.map +1 -1
  93. package/dist/hooks/magic-context/read-session-formatting.d.ts +5 -0
  94. package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
  95. package/dist/hooks/magic-context/read-session-raw.d.ts +83 -1
  96. package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -1
  97. package/dist/hooks/magic-context/read-session-true-raw-tokens.d.ts.map +1 -1
  98. package/dist/hooks/magic-context/reasoning-budget.d.ts.map +1 -1
  99. package/dist/hooks/magic-context/sentinel.d.ts +41 -1
  100. package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
  101. package/dist/hooks/magic-context/strip-content.d.ts +14 -2
  102. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  103. package/dist/hooks/magic-context/system-prompt-hash.d.ts +1 -0
  104. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  105. package/dist/hooks/magic-context/tag-messages.d.ts +8 -0
  106. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  107. package/dist/hooks/magic-context/tag-owner-warmup.d.ts +6 -0
  108. package/dist/hooks/magic-context/tag-owner-warmup.d.ts.map +1 -0
  109. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
  110. package/dist/hooks/magic-context/token-count-exact.d.ts +35 -0
  111. package/dist/hooks/magic-context/token-count-exact.d.ts.map +1 -0
  112. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  113. package/dist/hooks/magic-context/transform.d.ts +8 -2
  114. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  115. package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
  116. package/dist/{index-w2t4ah5j.js → index-0an7742d.js} +14072 -14286
  117. package/dist/index-0qhce371.js +120 -0
  118. package/dist/{index-q6hef7fh.js → index-0sahzkwr.js} +6 -19
  119. package/dist/{index-k5bdx1bx.js → index-0w56v4fm.js} +3 -5
  120. package/dist/index-14cjxt20.js +819 -0
  121. package/dist/{v2/server-51dv1pr5.js → index-1qb0z7wa.js} +301 -27
  122. package/dist/index-2bvekkfy.js +11 -0
  123. package/dist/{index-sj29b3z2.js → index-2y0s2hep.js} +3 -3
  124. package/dist/index-4dhv7mqz.js +131 -0
  125. package/dist/{index-b35pxds2.js → index-58e3y90n.js} +1 -18
  126. package/dist/index-5zygecde.js +152 -0
  127. package/dist/{index-6d9e1m08.js → index-692jzy0p.js} +17775 -17450
  128. package/dist/index-72nhv486.js +2307 -0
  129. package/dist/index-7jzrrxap.js +931 -0
  130. package/dist/{v2/server-njt3np1k.js → index-7mx8v0pw.js} +220 -961
  131. package/dist/index-8ajstryz.js +18 -0
  132. package/dist/{index-sfpzqvdz.js → index-8cd2j99z.js} +2 -3
  133. package/dist/{index-hybnrwq0.js → index-8j7gqj40.js} +131 -128
  134. package/dist/index-bdckkfw6.js +3261 -0
  135. package/dist/{index-m5fe6jch.js → index-bhvjj0ys.js} +152 -2453
  136. package/dist/index-c43kr12f.js +3030 -0
  137. package/dist/index-cb7emxgj.js +984 -0
  138. package/dist/index-d9vfe7xq.js +16 -0
  139. package/dist/{index-5gq3b2ya.js → index-db7zwa3v.js} +147 -209
  140. package/dist/index-dhwzyd54.js +1142 -0
  141. package/dist/{index-8da2zjhz.js → index-eeezr5zz.js} +9 -7
  142. package/dist/{index-cwf6s3ay.js → index-f0h6xwqm.js} +2828 -2618
  143. package/dist/index-fb3zxn06.js +13 -0
  144. package/dist/index-fbv1dn35.js +171 -0
  145. package/dist/index-fr0wbhdn.js +43 -0
  146. package/dist/{index-mc22ayvf.js → index-ghc9f0n7.js} +11 -9
  147. package/dist/{index-fzbvakh0.js → index-jcbd3znx.js} +3 -3
  148. package/dist/{index-5a2r0p9f.js → index-k1xb52kd.js} +20 -13
  149. package/dist/index-k9nnwad5.js +3532 -0
  150. package/dist/{index-wx8a6bw3.js → index-kb9nn0a0.js} +270 -53
  151. package/dist/index-knh4y330.js +566 -0
  152. package/dist/{v2/server-fq7kq32k.js → index-mfkzp7qj.js} +1 -16
  153. package/dist/{index-gg8j07zz.js → index-mmyh6d8f.js} +4 -4
  154. package/dist/index-pavzsdc6.js +17 -0
  155. package/dist/{index-0c82743p.js → index-pdecwzrd.js} +17 -15
  156. package/dist/index-pg50n748.js +1060 -0
  157. package/dist/{index-92bp57hg.js → index-q2tqeqde.js} +123 -80
  158. package/dist/{index-rrrsepyw.js → index-q7h7csab.js} +90 -85
  159. package/dist/{v2/server-yr3zj7e7.js → index-qt1qqasc.js} +6 -7
  160. package/dist/{index-6wkcswft.js → index-ty64eqcn.js} +28 -18
  161. package/dist/{index-adwfkpex.js → index-yq8n9qcb.js} +23 -23
  162. package/dist/{index-9pk9exrb.js → index-z8e0psj8.js} +18 -18
  163. package/dist/index.d.ts.map +1 -1
  164. package/dist/index.js +586 -344
  165. package/dist/logger-d3wex3dz.js +20 -0
  166. package/dist/message-index-bounded-7ezbgddp.js +124 -0
  167. package/dist/{v2/message-time-backfill-1f9tzvcs.js → message-time-backfill-brbd63hv.js} +8 -6
  168. package/dist/migration-worker.js +25 -18
  169. package/dist/{model-resolution-xhfmyyvy.js → model-resolution-nx97z3x7.js} +1 -1
  170. package/dist/plugin/dream-timer.d.ts +1 -1
  171. package/dist/plugin/dream-timer.d.ts.map +1 -1
  172. package/dist/plugin/hooks/create-session-hooks.d.ts +1 -0
  173. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  174. package/dist/plugin/host-stall-profiler-report.d.ts +1 -66
  175. package/dist/plugin/host-stall-profiler-report.d.ts.map +1 -1
  176. package/dist/plugin/host-stall-profiler.d.ts +2 -95
  177. package/dist/plugin/host-stall-profiler.d.ts.map +1 -1
  178. package/dist/plugin/messages-transform.d.ts +0 -13
  179. package/dist/plugin/messages-transform.d.ts.map +1 -1
  180. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  181. package/dist/plugin/tool-registry.d.ts.map +1 -1
  182. package/dist/project-embedding-registry-7qzptcw7.js +88 -0
  183. package/dist/raw-ordinal-warmup-worker.js +60 -0
  184. package/dist/{read-session-chunk-4jey7hpt.js → read-session-chunk-6k83m4fj.js} +15 -9
  185. package/dist/read-session-raw-3g9qy1xa.js +58 -0
  186. package/dist/recomp-orchestrator-d3fp1cy0.js +57 -0
  187. package/dist/{v2/safe-notification-target-eb1n1vfb.js → safe-notification-target-5ffqq32m.js} +4 -2
  188. package/dist/search-epax1ecv.js +45 -0
  189. package/dist/{v2/send-session-notification-c0wtscea.js → send-session-notification-erecz4y4.js} +10 -7
  190. package/dist/shared/conflict-detector.d.ts.map +1 -1
  191. package/dist/shared/host-stall-profiler-bun.d.ts +46 -0
  192. package/dist/shared/host-stall-profiler-bun.d.ts.map +1 -0
  193. package/dist/shared/host-stall-profiler-common.d.ts +58 -0
  194. package/dist/shared/host-stall-profiler-common.d.ts.map +1 -0
  195. package/dist/shared/host-stall-profiler-node.d.ts +36 -0
  196. package/dist/shared/host-stall-profiler-node.d.ts.map +1 -0
  197. package/dist/shared/host-stall-profiler-report.d.ts +68 -0
  198. package/dist/shared/host-stall-profiler-report.d.ts.map +1 -0
  199. package/dist/shared/host-stall-profiler.d.ts +5 -0
  200. package/dist/shared/host-stall-profiler.d.ts.map +1 -0
  201. package/dist/shared/model-resolution.d.ts +2 -3
  202. package/dist/shared/model-resolution.d.ts.map +1 -1
  203. package/dist/shared/sqlite.d.ts +30 -0
  204. package/dist/shared/sqlite.d.ts.map +1 -1
  205. package/dist/shared/stable-json.d.ts.map +1 -1
  206. package/dist/shared/user-facing-codes.d.ts +0 -5
  207. package/dist/shared/user-facing-codes.d.ts.map +1 -1
  208. package/dist/sqlite-context-pragmas-mv9jqwjh.js +6 -0
  209. package/dist/sqlite-mhjkerzq.js +46 -0
  210. package/dist/storage-memory-07fx57k6.js +71 -0
  211. package/dist/storage-tags-d3b0v2ss.js +131 -0
  212. package/dist/{task-config-v81k8jvk.js → task-config-cgpg0nvh.js} +2 -2
  213. package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
  214. package/dist/tools/ctx-note/constants.d.ts +4 -0
  215. package/dist/tools/ctx-note/constants.d.ts.map +1 -1
  216. package/dist/tools/ctx-note/tools.d.ts +1 -0
  217. package/dist/tools/ctx-note/tools.d.ts.map +1 -1
  218. package/dist/tools/ctx-search/tools.d.ts.map +1 -1
  219. package/dist/tools/parameter-descriptions.d.ts +2 -2
  220. package/dist/tools/parameter-descriptions.d.ts.map +1 -1
  221. package/dist/{transform-postprocess-phase-z5hzpsxv.js → transform-postprocess-phase-spcy2qre.js} +35 -20
  222. package/dist/transformers-node-wasm.js +18415 -18415
  223. package/dist/v2/auto-search-worker.js +27 -30
  224. package/dist/v2/{context-14v1hr8b.js → context-sf98kstd.js} +3737 -3004
  225. package/dist/v2/{derive-budgets-nc9avxz8.js → derive-budgets-3vc0y84t.js} +4 -3
  226. package/dist/v2/embedding-activity-g1dhes6g.js +10 -0
  227. package/dist/v2/embedding-backfill-vn8g1nh1.js +21 -0
  228. package/dist/v2/embedding-cache-mgyr73ef.js +16 -0
  229. package/dist/v2/embedding-worker.js +12 -9
  230. package/dist/v2/fold/host-media.d.ts +4 -0
  231. package/dist/v2/fold/host-media.d.ts.map +1 -1
  232. package/dist/v2/fold/memory-cache.d.ts +70 -0
  233. package/dist/v2/fold/memory-cache.d.ts.map +1 -0
  234. package/dist/v2/fold/native-codec.d.ts +10 -0
  235. package/dist/v2/fold/native-codec.d.ts.map +1 -0
  236. package/dist/v2/fold/native-replay.d.ts +58 -0
  237. package/dist/v2/fold/native-replay.d.ts.map +1 -0
  238. package/dist/v2/fold/policy.d.ts +24 -0
  239. package/dist/v2/fold/policy.d.ts.map +1 -0
  240. package/dist/v2/harness-e4avh192.js +10 -0
  241. package/dist/v2/hooks/context.d.ts +2 -2
  242. package/dist/v2/hooks/context.d.ts.map +1 -1
  243. package/dist/v2/hooks/dream-manual.d.ts +1 -1
  244. package/dist/v2/hooks/dream-manual.d.ts.map +1 -1
  245. package/dist/v2/hooks/dream-timer.d.ts.map +1 -1
  246. package/dist/v2/hooks/dream-trigger.d.ts +1 -2
  247. package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
  248. package/dist/v2/hooks/payload.d.ts.map +1 -1
  249. package/dist/v2/hooks/tools.d.ts.map +1 -1
  250. package/dist/v2/hooks/types.d.ts +6 -0
  251. package/dist/v2/hooks/types.d.ts.map +1 -1
  252. package/dist/v2/logger-mxd0ym09.js +19 -0
  253. package/dist/v2/message-index-bounded-dy3s2k1e.js +123 -0
  254. package/dist/{message-time-backfill-r5epkzj3.js → v2/message-time-backfill-gtx1pwk1.js} +7 -7
  255. package/dist/v2/migration-worker.js +24 -17
  256. package/dist/v2/{model-resolution-xhfmyyvy.js → model-resolution-nx97z3x7.js} +1 -1
  257. package/dist/v2/project-embedding-registry-1tgba5dv.js +86 -0
  258. package/dist/v2/raw-ordinal-warmup-worker.js +60 -0
  259. package/dist/v2/{read-session-chunk-gyyv7w2r.js → read-session-chunk-rh4khdkv.js} +14 -8
  260. package/dist/v2/read-session-raw-bsbmf0vj.js +57 -0
  261. package/dist/v2/recomp-orchestrator-az61rfcg.js +57 -0
  262. package/dist/{safe-notification-target-43r8jsxw.js → v2/safe-notification-target-73ax1p5v.js} +3 -3
  263. package/dist/v2/search-nzkwrc6n.js +45 -0
  264. package/dist/{send-session-notification-0m68ms3n.js → v2/send-session-notification-6km439kn.js} +9 -8
  265. package/dist/{index-5eqk6z3s.js → v2/server-1r6pmz4f.js} +301 -27
  266. package/dist/v2/server-2bvekkfy.js +11 -0
  267. package/dist/v2/server-2fbhp79z.js +3205 -0
  268. package/dist/v2/{server-ajzeteqw.js → server-2ra6pwf3.js} +1 -18
  269. package/dist/v2/server-4dhv7mqz.js +131 -0
  270. package/dist/v2/{server-y10vbq6y.js → server-4k748ke6.js} +11 -1053
  271. package/dist/v2/{server-vs5gpnd4.js → server-52awr2mw.js} +81 -145
  272. package/dist/v2/{server-1qbnzc80.js → server-5m3dt5r1.js} +136 -148
  273. package/dist/v2/server-686jg6eb.js +3508 -0
  274. package/dist/v2/server-7jzrrxap.js +931 -0
  275. package/dist/v2/server-7wwc2nga.js +3023 -0
  276. package/dist/v2/server-8ajstryz.js +18 -0
  277. package/dist/v2/{server-sfpzqvdz.js → server-8cd2j99z.js} +2 -3
  278. package/dist/v2/{server-d0sraw7m.js → server-8pyt7hev.js} +291 -286
  279. package/dist/v2/server-8tqanswc.js +984 -0
  280. package/dist/v2/{server-14vq4kpm.js → server-aan4q8mx.js} +3 -3
  281. package/dist/v2/server-d9vfe7xq.js +16 -0
  282. package/dist/{index-x3kwrmqk.js → v2/server-e0vdaae2.js} +35 -792
  283. package/dist/v2/server-ezhze64f.js +1048 -0
  284. package/dist/v2/server-fb3zxn06.js +13 -0
  285. package/dist/v2/server-fr0wbhdn.js +43 -0
  286. package/dist/v2/server-g5r0n3b6.js +1137 -0
  287. package/dist/v2/server-gjcr4w98.js +154 -0
  288. package/dist/v2/server-k228xhjg.js +171 -0
  289. package/dist/v2/{server-nf82q6pt.js → server-k8x2rbxc.js} +5946 -5602
  290. package/dist/v2/{server-wx8a6bw3.js → server-kb9nn0a0.js} +270 -53
  291. package/dist/{index-rrbbspwh.js → v2/server-mfkzp7qj.js} +1 -16
  292. package/dist/v2/server-pavzsdc6.js +17 -0
  293. package/dist/v2/{server-e0c1b7a7.js → server-psqc7e9n.js} +122 -79
  294. package/dist/{index-yr3zj7e7.js → v2/server-qt1qqasc.js} +6 -7
  295. package/dist/v2/server-qye6ykf7.js +120 -0
  296. package/dist/v2/{server-qdjnb2z1.js → server-r5p3b1wy.js} +11 -9
  297. package/dist/v2/server-sggvvzhb.js +759 -0
  298. package/dist/v2/{server-cpepxy2q.js → server-v06jcv0w.js} +14 -12
  299. package/dist/v2/server-vqpf3167.js +1048 -0
  300. package/dist/v2/{server-rz514f14.js → server-x2g40a71.js} +2044 -2060
  301. package/dist/v2/{server-vd4e7174.js → server-xdfwt6kh.js} +20 -16
  302. package/dist/v2/{server-efhwzx05.js → server-xxm59eww.js} +23 -23
  303. package/dist/v2/server-yczc713m.js +564 -0
  304. package/dist/v2/{server-fcdehk1s.js → server-z2037m6z.js} +4 -4
  305. package/dist/v2/{server-50hvkg3v.js → server-zm570tr2.js} +160 -158
  306. package/dist/v2/{server-6r257mf5.js → server-zxhgvsf9.js} +3 -3
  307. package/dist/v2/server.js +16 -14
  308. package/dist/v2/sqlite-context-pragmas-mv9jqwjh.js +6 -0
  309. package/dist/v2/sqlite-mhjkerzq.js +46 -0
  310. package/dist/v2/storage-memory-07fx57k6.js +71 -0
  311. package/dist/v2/storage-tags-w4tv77sn.js +130 -0
  312. package/dist/v2/store-reader.d.ts +16 -0
  313. package/dist/v2/store-reader.d.ts.map +1 -1
  314. package/dist/v2/{task-config-tbndqyny.js → task-config-x0hq3qfd.js} +2 -2
  315. package/dist/v2/transformers-node-wasm.js +18415 -18415
  316. package/dist/v2/tui/index.d.ts.map +1 -1
  317. package/dist/v2/tui/types.d.ts +1 -10
  318. package/dist/v2/tui/types.d.ts.map +1 -1
  319. package/dist/v2/{wrapup-orchestrator-nbz854vc.js → wrapup-orchestrator-mz7efs7w.js} +51 -30
  320. package/dist/wrapup-orchestrator-amzta1t4.js +44 -0
  321. package/package.json +4 -3
  322. package/src/agents/magic-context-prompt.ts +27 -2
  323. package/src/agents/smart-notes-enabled.test.ts +294 -0
  324. package/src/agents/smart-notes-on.golden.json +70 -0
  325. package/src/config/index.test.ts +67 -1
  326. package/src/config/index.ts +2 -0
  327. package/src/config/latch-permanence-guard.test.ts +4 -0
  328. package/src/config/mural-model-deprecation.ts +24 -0
  329. package/src/config/project-security.hostile-matrix.test.ts +4 -44
  330. package/src/config/project-security.test.ts +9 -14
  331. package/src/config/project-security.ts +13 -55
  332. package/src/config/schema/magic-context.test.ts +2 -2
  333. package/src/config/schema/magic-context.ts +16 -10
  334. package/src/features/magic-context/dreamer/task-registry.ts +6 -0
  335. package/src/shared/conflict-detector.test.ts +56 -0
  336. package/src/shared/conflict-detector.ts +16 -5
  337. package/src/shared/host-stall-profiler-bun.ts +358 -0
  338. package/src/shared/host-stall-profiler-common.ts +159 -0
  339. package/src/shared/host-stall-profiler-node.test.ts +234 -0
  340. package/src/shared/host-stall-profiler-node.ts +274 -0
  341. package/src/shared/host-stall-profiler-report.ts +248 -0
  342. package/src/shared/host-stall-profiler.ts +57 -0
  343. package/src/shared/model-resolution.test.ts +54 -17
  344. package/src/shared/model-resolution.ts +6 -17
  345. package/src/shared/sqlite.test.ts +52 -0
  346. package/src/shared/sqlite.ts +339 -23
  347. package/src/shared/stable-json-linear.test.ts +109 -0
  348. package/src/shared/stable-json.ts +37 -7
  349. package/src/shared/user-facing-codes.ts +2 -6
  350. package/src/shared/write-transaction-attribution.test.ts +2 -2
  351. package/src/v2/tui/host-contract.test.ts +41 -67
  352. package/src/v2/tui/index.ts +6 -214
  353. package/src/v2/tui/types.ts +5 -17
  354. package/dist/features/magic-context/checkout-claim-fake-subc.test-support.d.ts +0 -45
  355. package/dist/features/magic-context/checkout-claim-fake-subc.test-support.d.ts.map +0 -1
  356. package/dist/features/magic-context/checkout-claim.d.ts +0 -155
  357. package/dist/features/magic-context/checkout-claim.d.ts.map +0 -1
  358. package/dist/index-bb36vgr3.js +0 -6608
  359. package/dist/index-fnn5pjtt.js +0 -6554
  360. package/dist/recomp-orchestrator-rervg6q4.js +0 -42
  361. package/dist/v2/recomp-orchestrator-42vjba7p.js +0 -42
  362. package/dist/v2/server-3trjk1hx.js +0 -6360
  363. package/dist/v2/server-nm9n3aqq.js +0 -6461
  364. package/dist/wrapup-orchestrator-b2dztrar.js +0 -29
  365. /package/dist/{index-5prbx026.js → index-2pp04pmg.js} +0 -0
  366. /package/dist/v2/{index-5prbx026.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("uses mural model between compress-cues task and harness default", () => {
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: { model: "pi/default", thinking_level: "high" },
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: "mural/model", qualifier: "default-variant" },
257
+ primary: { model: "open/default", qualifier: "default-variant" },
258
258
  fallbacks: [],
259
+ schedule: "0 4 * * *",
259
260
  });
260
261
  expect(
261
- resolveDreamerTaskModel({
262
- config,
263
- harness: "pi",
264
- task: "compress-cues",
265
- muralModel: "mural/model",
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: "mural/model", qualifier: "high" },
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, except compress-cues inserts its harness-independent mural
141
- * string between those two rungs. Scheduling remains at dreamer.tasks.<task>.
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 mural string borrows the harness default's qualifier whether that
170
- // qualifier is written beside `model` or inside the default entry object.
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 usesMuralModel =
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
- // mural.model is a plain string, so its qualifier is always the
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),
@@ -1,12 +1,64 @@
1
1
  import { describe, expect, it } from "bun:test";
2
+ import { spawnSync } from "node:child_process";
2
3
  import {
3
4
  Database,
5
+ detectSqliteRuntime,
4
6
  getSqliteMemoryStats,
5
7
  loadSqliteModule,
6
8
  SqliteRuntimeUnavailableError,
7
9
  } from "./sqlite";
8
10
 
9
11
  describe("SQLite runtime selector", () => {
12
+ it("suppresses only the node:sqlite experimental warning in a real Node process", () => {
13
+ // Node 24.21 no longer emits this warning, so inject it during loading
14
+ // to keep the suppression assertion load-bearing on newer runtimes.
15
+ const selectorUrl = new URL("./sqlite.ts", import.meta.url).href;
16
+ const script = `
17
+ import { loadSqliteModule } from ${JSON.stringify(selectorUrl)};
18
+ const originalEmitWarning = process.emitWarning;
19
+ let listenerSawX = false;
20
+ process.on("warning", (warning) => {
21
+ if (warning.message === "x") listenerSawX = true;
22
+ });
23
+ await loadSqliteModule("Node.js", async (specifier) => {
24
+ if (specifier !== "node:sqlite") throw new Error("unexpected backend: " + specifier);
25
+ process.emitWarning("SQLite is an experimental feature and might change at any time", "ExperimentalWarning");
26
+ process.emitWarning("x", "ExperimentalWarning");
27
+ return {};
28
+ });
29
+ if (process.emitWarning !== originalEmitWarning) throw new Error("emitWarning was not restored");
30
+ process.emitWarning("after", "ExperimentalWarning");
31
+ await new Promise((resolve) => setImmediate(resolve));
32
+ if (!listenerSawX) throw new Error("the original warning listener was not called");
33
+ `;
34
+ const child = spawnSync("node", ["--trace-warnings", "--input-type=module", "-e", script], {
35
+ encoding: "utf8",
36
+ windowsHide: true,
37
+ });
38
+
39
+ expect(child.error).toBeUndefined();
40
+ expect(child.status).toBe(0);
41
+ expect(child.stderr).not.toContain("SQLite is an experimental feature");
42
+ expect(child.stderr).toContain("ExperimentalWarning: x");
43
+ expect(child.stderr).toContain("ExperimentalWarning: after");
44
+ expect(child.stderr).toMatch(/ExperimentalWarning: x[\s\S]*?\n\s+at /);
45
+ });
46
+
47
+ it("leaves Bun and OpenCode warning emission untouched", async () => {
48
+ expect(detectSqliteRuntime()).toBe("Bun");
49
+ const originalEmitWarning = process.emitWarning;
50
+ let requestedSpecifier = "";
51
+
52
+ await loadSqliteModule("Bun", async (specifier) => {
53
+ requestedSpecifier = specifier;
54
+ expect(process.emitWarning).toBe(originalEmitWarning);
55
+ return {};
56
+ });
57
+
58
+ expect(requestedSpecifier).toBe("bun:sqlite");
59
+ expect(process.emitWarning).toBe(originalEmitWarning);
60
+ });
61
+
10
62
  it("reports live connection PRAGMAs and removes closed handles", () => {
11
63
  const before = getSqliteMemoryStats().connectionCount;
12
64
  const db = new Database(":memory:");