@cortexkit/opencode-magic-context 0.47.0 → 0.49.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 (425) 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-kzx4dmk1.js} +12 -10
  13. package/dist/{context-wq4ffwyb.js → context-nj5f293n.js} +2765 -1925
  14. package/dist/{derive-budgets-ke12jnnh.js → derive-budgets-qz5rrr08.js} +4 -3
  15. package/dist/embedding-activity-g1dhes6g.js +10 -0
  16. package/dist/embedding-backfill-aetxv1vt.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/git-commits/search-git-commits.d.ts +2 -0
  30. package/dist/features/magic-context/git-commits/search-git-commits.d.ts.map +1 -1
  31. package/dist/features/magic-context/message-index-async.d.ts +16 -3
  32. package/dist/features/magic-context/message-index-async.d.ts.map +1 -1
  33. package/dist/features/magic-context/message-index-bounded.d.ts +17 -0
  34. package/dist/features/magic-context/message-index-bounded.d.ts.map +1 -0
  35. package/dist/features/magic-context/message-index.d.ts +7 -1
  36. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  37. package/dist/features/magic-context/mural/render-trigger.d.ts +7 -4
  38. package/dist/features/magic-context/mural/render-trigger.d.ts.map +1 -1
  39. package/dist/features/magic-context/pi-content-decisions.d.ts +7 -1
  40. package/dist/features/magic-context/pi-content-decisions.d.ts.map +1 -1
  41. package/dist/features/magic-context/search-rerank.d.ts +35 -0
  42. package/dist/features/magic-context/search-rerank.d.ts.map +1 -0
  43. package/dist/features/magic-context/search.d.ts +40 -0
  44. package/dist/features/magic-context/search.d.ts.map +1 -1
  45. package/dist/features/magic-context/session-activity.d.ts.map +1 -1
  46. package/dist/features/magic-context/smart-notes/runner.d.ts +1 -0
  47. package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
  48. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  49. package/dist/features/magic-context/storage-meta-persisted.d.ts +13 -2
  50. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  51. package/dist/features/magic-context/storage-meta-session.d.ts +7 -1
  52. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  53. package/dist/features/magic-context/storage-meta.d.ts +1 -1
  54. package/dist/features/magic-context/storage-meta.d.ts.map +1 -1
  55. package/dist/features/magic-context/storage-session-tables.d.ts +2 -0
  56. package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
  57. package/dist/features/magic-context/storage-tag-identity-revision.d.ts +50 -0
  58. package/dist/features/magic-context/storage-tag-identity-revision.d.ts.map +1 -0
  59. package/dist/features/magic-context/storage-tags.d.ts +153 -4
  60. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  61. package/dist/features/magic-context/storage.d.ts +1 -1
  62. package/dist/features/magic-context/storage.d.ts.map +1 -1
  63. package/dist/features/magic-context/subagent-token-capture.d.ts.map +1 -1
  64. package/dist/features/magic-context/tagger.d.ts +2 -0
  65. package/dist/features/magic-context/tagger.d.ts.map +1 -1
  66. package/dist/features/magic-context/transform-decision-log.d.ts +4 -1
  67. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
  68. package/dist/harness-e4avh192.js +10 -0
  69. package/dist/hooks/magic-context/active-anthropic-turn.d.ts +2 -0
  70. package/dist/hooks/magic-context/active-anthropic-turn.d.ts.map +1 -1
  71. package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -1
  72. package/dist/hooks/magic-context/auto-search-replay.fixture.d.ts +24 -0
  73. package/dist/hooks/magic-context/auto-search-replay.fixture.d.ts.map +1 -0
  74. package/dist/hooks/magic-context/auto-search-runner.d.ts +1 -1
  75. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  76. package/dist/hooks/magic-context/auto-search-worker-client.d.ts +34 -3
  77. package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -1
  78. package/dist/hooks/magic-context/command-handler.d.ts +3 -0
  79. package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
  80. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
  81. package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
  82. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
  83. package/dist/hooks/magic-context/emergency-fail-closed.d.ts +28 -0
  84. package/dist/hooks/magic-context/emergency-fail-closed.d.ts.map +1 -1
  85. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  86. package/dist/hooks/magic-context/historian-host-runner.d.ts +8 -0
  87. package/dist/hooks/magic-context/historian-host-runner.d.ts.map +1 -1
  88. package/dist/hooks/magic-context/hook.d.ts +3 -2
  89. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  90. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  91. package/dist/hooks/magic-context/latest-thinking-recovery.d.ts +7 -0
  92. package/dist/hooks/magic-context/latest-thinking-recovery.d.ts.map +1 -1
  93. package/dist/hooks/magic-context/lkg-persist.d.ts +4 -3
  94. package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
  95. package/dist/hooks/magic-context/lkg-replay.d.ts +13 -8
  96. package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
  97. package/dist/hooks/magic-context/lkg-slot.d.ts +139 -2
  98. package/dist/hooks/magic-context/lkg-slot.d.ts.map +1 -1
  99. package/dist/hooks/magic-context/message-search-accepting-silent-worker.fixture.d.ts +2 -0
  100. package/dist/hooks/magic-context/message-search-accepting-silent-worker.fixture.d.ts.map +1 -0
  101. package/dist/hooks/magic-context/oc-stall-r2-warmup-worker.fixture.d.ts +2 -0
  102. package/dist/hooks/magic-context/oc-stall-r2-warmup-worker.fixture.d.ts.map +1 -0
  103. package/dist/hooks/magic-context/oc-stall-search-review.fixture.d.ts +2 -0
  104. package/dist/hooks/magic-context/oc-stall-search-review.fixture.d.ts.map +1 -0
  105. package/dist/hooks/magic-context/opencode1-to-model-messages.fixture.d.ts +63 -0
  106. package/dist/hooks/magic-context/opencode1-to-model-messages.fixture.d.ts.map +1 -0
  107. package/dist/hooks/magic-context/pass-outcome.d.ts +1 -0
  108. package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -1
  109. package/dist/hooks/magic-context/provider-visible-parts.d.ts +45 -0
  110. package/dist/hooks/magic-context/provider-visible-parts.d.ts.map +1 -0
  111. package/dist/hooks/magic-context/raw-ordinal-warmup-silent-worker.fixture.d.ts +2 -0
  112. package/dist/hooks/magic-context/raw-ordinal-warmup-silent-worker.fixture.d.ts.map +1 -0
  113. package/dist/hooks/magic-context/raw-ordinal-warmup-worker.d.ts +2 -0
  114. package/dist/hooks/magic-context/raw-ordinal-warmup-worker.d.ts.map +1 -0
  115. package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts +87 -0
  116. package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts.map +1 -0
  117. package/dist/hooks/magic-context/read-session-chunk.d.ts +19 -1
  118. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  119. package/dist/hooks/magic-context/read-session-db.d.ts.map +1 -1
  120. package/dist/hooks/magic-context/read-session-formatting.d.ts +5 -0
  121. package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
  122. package/dist/hooks/magic-context/read-session-raw.d.ts +118 -1
  123. package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -1
  124. package/dist/hooks/magic-context/read-session-true-raw-tokens.d.ts.map +1 -1
  125. package/dist/hooks/magic-context/reasoning-budget.d.ts.map +1 -1
  126. package/dist/hooks/magic-context/rust-mode-transform.d.ts +36 -0
  127. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  128. package/dist/hooks/magic-context/sentinel.d.ts +41 -1
  129. package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
  130. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts +8 -1
  131. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts.map +1 -1
  132. package/dist/hooks/magic-context/strict-thinking-prefix.d.ts +8 -0
  133. package/dist/hooks/magic-context/strict-thinking-prefix.d.ts.map +1 -0
  134. package/dist/hooks/magic-context/strip-content.d.ts +14 -2
  135. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  136. package/dist/hooks/magic-context/system-prompt-hash.d.ts +1 -0
  137. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  138. package/dist/hooks/magic-context/tag-messages.d.ts +8 -0
  139. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  140. package/dist/hooks/magic-context/tag-owner-warmup.d.ts +6 -0
  141. package/dist/hooks/magic-context/tag-owner-warmup.d.ts.map +1 -0
  142. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
  143. package/dist/hooks/magic-context/token-count-exact.d.ts +35 -0
  144. package/dist/hooks/magic-context/token-count-exact.d.ts.map +1 -0
  145. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +13 -0
  146. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  147. package/dist/hooks/magic-context/transform.d.ts +9 -2
  148. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  149. package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
  150. package/dist/{index-q6hef7fh.js → index-0sahzkwr.js} +6 -19
  151. package/dist/{index-k5bdx1bx.js → index-0w56v4fm.js} +3 -5
  152. package/dist/{index-5gq3b2ya.js → index-1bt88epp.js} +227 -205
  153. package/dist/{index-cwf6s3ay.js → index-1g30axtz.js} +3279 -2907
  154. package/dist/{index-5a2r0p9f.js → index-1r0k9js3.js} +20 -13
  155. package/dist/index-2bvekkfy.js +11 -0
  156. package/dist/{index-6d9e1m08.js → index-2jcbj7r1.js} +13301 -13225
  157. package/dist/index-2jgwttpt.js +3269 -0
  158. package/dist/index-4dhv7mqz.js +131 -0
  159. package/dist/{index-sj29b3z2.js → index-4mjhqadz.js} +3 -3
  160. package/dist/{index-0c82743p.js → index-57mrqed8.js} +17 -15
  161. package/dist/{index-b35pxds2.js → index-58e3y90n.js} +1 -18
  162. package/dist/index-7jzrrxap.js +931 -0
  163. package/dist/index-8ajstryz.js +18 -0
  164. package/dist/{index-sfpzqvdz.js → index-8cd2j99z.js} +2 -3
  165. package/dist/{index-6wkcswft.js → index-9qjqq45k.js} +29 -19
  166. package/dist/{index-adwfkpex.js → index-9rt53q79.js} +23 -23
  167. package/dist/index-b7mv1jx3.js +1060 -0
  168. package/dist/index-d9vfe7xq.js +16 -0
  169. package/dist/{index-gg8j07zz.js → index-ezmszwbd.js} +8 -6
  170. package/dist/index-fb3zxn06.js +13 -0
  171. package/dist/index-fr0wbhdn.js +43 -0
  172. package/dist/{index-mc22ayvf.js → index-ghc9f0n7.js} +11 -9
  173. package/dist/index-gzcmtmar.js +171 -0
  174. package/dist/{index-w2t4ah5j.js → index-h2py7207.js} +6762 -7400
  175. package/dist/index-h2wc01qk.js +120 -0
  176. package/dist/index-h5zfkjyk.js +1277 -0
  177. package/dist/{index-92bp57hg.js → index-ha87j7a8.js} +1343 -149
  178. package/dist/index-hj2q50k0.js +856 -0
  179. package/dist/{index-wx8a6bw3.js → index-kb9nn0a0.js} +270 -53
  180. package/dist/index-kmpvemph.js +1314 -0
  181. package/dist/index-kp5qe690.js +3030 -0
  182. package/dist/{index-m5fe6jch.js → index-kq57tdf0.js} +152 -2453
  183. package/dist/{v2/server-fq7kq32k.js → index-mfkzp7qj.js} +1 -16
  184. package/dist/{v2/server-njt3np1k.js → index-nm6a8xpd.js} +220 -961
  185. package/dist/{index-hybnrwq0.js → index-nsjyysj0.js} +137 -130
  186. package/dist/index-nydv6g8r.js +3569 -0
  187. package/dist/index-pavzsdc6.js +17 -0
  188. package/dist/index-peshmj6h.js +152 -0
  189. package/dist/index-pxwp2hjk.js +571 -0
  190. package/dist/{v2/server-yr3zj7e7.js → index-qt1qqasc.js} +6 -7
  191. package/dist/{v2/server-51dv1pr5.js → index-qx53vezw.js} +301 -27
  192. package/dist/{index-rrrsepyw.js → index-s4j7t92z.js} +90 -85
  193. package/dist/{index-9pk9exrb.js → index-stbr4ce6.js} +18 -18
  194. package/dist/{index-fzbvakh0.js → index-tqf7yg27.js} +3 -3
  195. package/dist/index-vkbqdnkj.js +2307 -0
  196. package/dist/{index-8da2zjhz.js → index-z1tjp257.js} +9 -7
  197. package/dist/index.d.ts.map +1 -1
  198. package/dist/index.js +608 -349
  199. package/dist/logger-ewak5q1s.js +20 -0
  200. package/dist/message-index-bounded-h0mrd4pr.js +124 -0
  201. package/dist/{v2/message-time-backfill-1f9tzvcs.js → message-time-backfill-8x06r9kx.js} +8 -6
  202. package/dist/migration-worker.js +25 -18
  203. package/dist/{model-resolution-xhfmyyvy.js → model-resolution-nx97z3x7.js} +1 -1
  204. package/dist/plugin/dream-timer.d.ts +1 -1
  205. package/dist/plugin/dream-timer.d.ts.map +1 -1
  206. package/dist/plugin/hooks/create-session-hooks.d.ts +3 -0
  207. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  208. package/dist/plugin/host-stall-profiler-report.d.ts +1 -66
  209. package/dist/plugin/host-stall-profiler-report.d.ts.map +1 -1
  210. package/dist/plugin/host-stall-profiler.d.ts +2 -95
  211. package/dist/plugin/host-stall-profiler.d.ts.map +1 -1
  212. package/dist/plugin/messages-transform.d.ts +0 -13
  213. package/dist/plugin/messages-transform.d.ts.map +1 -1
  214. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  215. package/dist/plugin/tool-registry.d.ts.map +1 -1
  216. package/dist/project-embedding-registry-rtt0djyb.js +88 -0
  217. package/dist/raw-ordinal-warmup-worker.js +60 -0
  218. package/dist/{read-session-chunk-4jey7hpt.js → read-session-chunk-ty89v75e.js} +17 -9
  219. package/dist/read-session-raw-8sjbc9h0.js +60 -0
  220. package/dist/recomp-orchestrator-4f1yyd1q.js +57 -0
  221. package/dist/{v2/safe-notification-target-eb1n1vfb.js → safe-notification-target-q0cyrx3x.js} +4 -2
  222. package/dist/search-pz4f4wge.js +45 -0
  223. package/dist/{v2/send-session-notification-c0wtscea.js → send-session-notification-38cd5dqt.js} +10 -7
  224. package/dist/shared/auto-search-lifecycle.d.ts +14 -0
  225. package/dist/shared/auto-search-lifecycle.d.ts.map +1 -1
  226. package/dist/shared/conflict-detector.d.ts.map +1 -1
  227. package/dist/shared/host-stall-profiler-bun.d.ts +46 -0
  228. package/dist/shared/host-stall-profiler-bun.d.ts.map +1 -0
  229. package/dist/shared/host-stall-profiler-common.d.ts +58 -0
  230. package/dist/shared/host-stall-profiler-common.d.ts.map +1 -0
  231. package/dist/shared/host-stall-profiler-node.d.ts +36 -0
  232. package/dist/shared/host-stall-profiler-node.d.ts.map +1 -0
  233. package/dist/shared/host-stall-profiler-report.d.ts +68 -0
  234. package/dist/shared/host-stall-profiler-report.d.ts.map +1 -0
  235. package/dist/shared/host-stall-profiler.d.ts +5 -0
  236. package/dist/shared/host-stall-profiler.d.ts.map +1 -0
  237. package/dist/shared/logger.d.ts.map +1 -1
  238. package/dist/shared/model-resolution.d.ts +2 -3
  239. package/dist/shared/model-resolution.d.ts.map +1 -1
  240. package/dist/shared/models-dev-temperature.d.ts +18 -0
  241. package/dist/shared/models-dev-temperature.d.ts.map +1 -0
  242. package/dist/shared/project-directory-key.d.ts +16 -0
  243. package/dist/shared/project-directory-key.d.ts.map +1 -1
  244. package/dist/shared/sqlite.d.ts +30 -0
  245. package/dist/shared/sqlite.d.ts.map +1 -1
  246. package/dist/shared/stable-json.d.ts.map +1 -1
  247. package/dist/shared/subagent-temperature.d.ts +46 -0
  248. package/dist/shared/subagent-temperature.d.ts.map +1 -0
  249. package/dist/shared/user-facing-codes.d.ts +0 -5
  250. package/dist/shared/user-facing-codes.d.ts.map +1 -1
  251. package/dist/sqlite-context-pragmas-mv9jqwjh.js +6 -0
  252. package/dist/sqlite-mhjkerzq.js +46 -0
  253. package/dist/storage-memory-07fx57k6.js +71 -0
  254. package/dist/storage-tags-k0pda32s.js +133 -0
  255. package/dist/{task-config-v81k8jvk.js → task-config-cgpg0nvh.js} +2 -2
  256. package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
  257. package/dist/tools/ctx-note/constants.d.ts +4 -0
  258. package/dist/tools/ctx-note/constants.d.ts.map +1 -1
  259. package/dist/tools/ctx-note/tools.d.ts +1 -0
  260. package/dist/tools/ctx-note/tools.d.ts.map +1 -1
  261. package/dist/tools/ctx-reduce/tools.d.ts.map +1 -1
  262. package/dist/tools/ctx-search/tools.d.ts.map +1 -1
  263. package/dist/tools/ctx-search/types.d.ts +1 -0
  264. package/dist/tools/ctx-search/types.d.ts.map +1 -1
  265. package/dist/tools/parameter-descriptions.d.ts +2 -2
  266. package/dist/tools/parameter-descriptions.d.ts.map +1 -1
  267. package/dist/{transform-postprocess-phase-z5hzpsxv.js → transform-postprocess-phase-tck4g20s.js} +35 -20
  268. package/dist/transformers-node-wasm.js +18415 -18415
  269. package/dist/v2/auto-search-worker.js +27 -30
  270. package/dist/v2/{context-14v1hr8b.js → context-crbt6p1y.js} +4708 -4218
  271. package/dist/v2/{derive-budgets-nc9avxz8.js → derive-budgets-fgej9j46.js} +4 -3
  272. package/dist/v2/embedding-activity-g1dhes6g.js +10 -0
  273. package/dist/v2/embedding-backfill-ph1qfyn3.js +21 -0
  274. package/dist/v2/embedding-cache-mgyr73ef.js +16 -0
  275. package/dist/v2/embedding-worker.js +12 -9
  276. package/dist/v2/fold/host-media.d.ts +4 -0
  277. package/dist/v2/fold/host-media.d.ts.map +1 -1
  278. package/dist/v2/fold/memory-cache.d.ts +70 -0
  279. package/dist/v2/fold/memory-cache.d.ts.map +1 -0
  280. package/dist/v2/fold/native-codec.d.ts +10 -0
  281. package/dist/v2/fold/native-codec.d.ts.map +1 -0
  282. package/dist/v2/fold/native-replay.d.ts +58 -0
  283. package/dist/v2/fold/native-replay.d.ts.map +1 -0
  284. package/dist/v2/fold/policy.d.ts +24 -0
  285. package/dist/v2/fold/policy.d.ts.map +1 -0
  286. package/dist/v2/harness-e4avh192.js +10 -0
  287. package/dist/v2/hidden-child-native.d.ts.map +1 -1
  288. package/dist/v2/hidden-completion.d.ts +7 -0
  289. package/dist/v2/hidden-completion.d.ts.map +1 -1
  290. package/dist/v2/hooks/context.d.ts +2 -2
  291. package/dist/v2/hooks/context.d.ts.map +1 -1
  292. package/dist/v2/hooks/dream-manual.d.ts +1 -1
  293. package/dist/v2/hooks/dream-manual.d.ts.map +1 -1
  294. package/dist/v2/hooks/dream-timer.d.ts.map +1 -1
  295. package/dist/v2/hooks/dream-trigger.d.ts +5 -3
  296. package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
  297. package/dist/v2/hooks/generate.d.ts +9 -2
  298. package/dist/v2/hooks/generate.d.ts.map +1 -1
  299. package/dist/v2/hooks/payload.d.ts.map +1 -1
  300. package/dist/v2/hooks/tools.d.ts.map +1 -1
  301. package/dist/v2/hooks/types.d.ts +6 -0
  302. package/dist/v2/hooks/types.d.ts.map +1 -1
  303. package/dist/v2/logger-pj02s7sr.js +19 -0
  304. package/dist/v2/message-index-bounded-xwqdywxg.js +123 -0
  305. package/dist/{message-time-backfill-r5epkzj3.js → v2/message-time-backfill-cje68egj.js} +7 -7
  306. package/dist/v2/migration-worker.js +24 -17
  307. package/dist/v2/{model-resolution-xhfmyyvy.js → model-resolution-nx97z3x7.js} +1 -1
  308. package/dist/v2/project-embedding-registry-d6m7tyxr.js +86 -0
  309. package/dist/v2/raw-ordinal-warmup-worker.js +60 -0
  310. package/dist/v2/{read-session-chunk-gyyv7w2r.js → read-session-chunk-8p5mdryx.js} +16 -8
  311. package/dist/v2/read-session-raw-j8dvp7f4.js +59 -0
  312. package/dist/v2/recomp-orchestrator-ckfgt6wq.js +57 -0
  313. package/dist/{safe-notification-target-43r8jsxw.js → v2/safe-notification-target-y3p1hce9.js} +3 -3
  314. package/dist/v2/search-ym8rehhz.js +45 -0
  315. package/dist/{send-session-notification-0m68ms3n.js → v2/send-session-notification-5m0yapqx.js} +9 -8
  316. package/dist/v2/{server-rz514f14.js → server-19zjmn02.js} +2044 -2060
  317. package/dist/v2/server-1tk82krw.js +796 -0
  318. package/dist/v2/server-2bvekkfy.js +11 -0
  319. package/dist/v2/{server-ajzeteqw.js → server-2ra6pwf3.js} +1 -18
  320. package/dist/v2/server-2s6ayq3t.js +1048 -0
  321. package/dist/v2/{server-fcdehk1s.js → server-2s9qz6n7.js} +4 -4
  322. package/dist/v2/server-3j4d00kf.js +171 -0
  323. package/dist/v2/{server-14vq4kpm.js → server-3t0q2cqx.js} +3 -3
  324. package/dist/v2/server-4dhv7mqz.js +131 -0
  325. package/dist/v2/server-4ez8mntn.js +3213 -0
  326. package/dist/v2/{server-6r257mf5.js → server-676xw7at.js} +3 -3
  327. package/dist/v2/{server-vs5gpnd4.js → server-6byqfbqf.js} +165 -145
  328. package/dist/v2/server-7ekna9zs.js +120 -0
  329. package/dist/v2/server-7h861yms.js +1272 -0
  330. package/dist/v2/server-7jzrrxap.js +931 -0
  331. package/dist/v2/server-8ajstryz.js +18 -0
  332. package/dist/v2/{server-sfpzqvdz.js → server-8cd2j99z.js} +2 -3
  333. package/dist/v2/{server-cpepxy2q.js → server-8k2agx29.js} +14 -12
  334. package/dist/v2/server-c5rrgrcd.js +3545 -0
  335. package/dist/v2/server-d9vfe7xq.js +16 -0
  336. package/dist/v2/server-fb3zxn06.js +13 -0
  337. package/dist/v2/server-fr0wbhdn.js +43 -0
  338. package/dist/v2/{server-y10vbq6y.js → server-hb6xhh9q.js} +11 -1053
  339. package/dist/v2/server-jvxzm1jy.js +3023 -0
  340. package/dist/v2/{server-wx8a6bw3.js → server-kb9nn0a0.js} +270 -53
  341. package/dist/{index-5eqk6z3s.js → v2/server-kzns2hbz.js} +301 -27
  342. package/dist/{index-rrbbspwh.js → v2/server-mfkzp7qj.js} +1 -16
  343. package/dist/v2/server-pavzsdc6.js +17 -0
  344. package/dist/v2/{server-vd4e7174.js → server-pj4pjv02.js} +21 -17
  345. package/dist/v2/{server-e0c1b7a7.js → server-q4ph9bwn.js} +1340 -148
  346. package/dist/{index-yr3zj7e7.js → v2/server-qt1qqasc.js} +6 -7
  347. package/dist/v2/{server-qdjnb2z1.js → server-r5p3b1wy.js} +11 -9
  348. package/dist/v2/{server-d0sraw7m.js → server-sa8jvrfc.js} +291 -286
  349. package/dist/v2/server-ss95ky04.js +1048 -0
  350. package/dist/v2/{server-1qbnzc80.js → server-t4k4qexw.js} +142 -150
  351. package/dist/{index-x3kwrmqk.js → v2/server-v4mewb78.js} +35 -792
  352. package/dist/v2/server-w32kmdez.js +154 -0
  353. package/dist/v2/{server-nf82q6pt.js → server-x4hscabv.js} +5547 -5449
  354. package/dist/v2/server-xwz4dqh9.js +569 -0
  355. package/dist/v2/{server-efhwzx05.js → server-ycw9qqcy.js} +23 -23
  356. package/dist/v2/{server-50hvkg3v.js → server-zm570tr2.js} +160 -158
  357. package/dist/v2/server-zp53y8js.js +1311 -0
  358. package/dist/v2/server.js +16 -14
  359. package/dist/v2/sqlite-context-pragmas-mv9jqwjh.js +6 -0
  360. package/dist/v2/sqlite-mhjkerzq.js +46 -0
  361. package/dist/v2/storage-memory-07fx57k6.js +71 -0
  362. package/dist/v2/storage-tags-8vw924zn.js +132 -0
  363. package/dist/v2/store-reader.d.ts +24 -2
  364. package/dist/v2/store-reader.d.ts.map +1 -1
  365. package/dist/v2/{task-config-tbndqyny.js → task-config-x0hq3qfd.js} +2 -2
  366. package/dist/v2/transformers-node-wasm.js +18415 -18415
  367. package/dist/v2/tui/index.d.ts.map +1 -1
  368. package/dist/v2/tui/types.d.ts +1 -10
  369. package/dist/v2/tui/types.d.ts.map +1 -1
  370. package/dist/v2/{wrapup-orchestrator-nbz854vc.js → wrapup-orchestrator-a7efxaax.js} +51 -30
  371. package/dist/wrapup-orchestrator-barbc6h9.js +44 -0
  372. package/package.json +4 -3
  373. package/src/agents/magic-context-prompt.ts +27 -2
  374. package/src/agents/smart-notes-enabled.test.ts +294 -0
  375. package/src/agents/smart-notes-on.golden.json +70 -0
  376. package/src/config/index.test.ts +67 -1
  377. package/src/config/index.ts +2 -0
  378. package/src/config/latch-permanence-guard.test.ts +4 -0
  379. package/src/config/mural-model-deprecation.ts +24 -0
  380. package/src/config/project-security.hostile-matrix.test.ts +4 -44
  381. package/src/config/project-security.test.ts +9 -14
  382. package/src/config/project-security.ts +13 -55
  383. package/src/config/schema/magic-context.test.ts +2 -2
  384. package/src/config/schema/magic-context.ts +16 -10
  385. package/src/features/magic-context/dreamer/task-registry.ts +6 -0
  386. package/src/shared/auto-search-lifecycle.ts +43 -0
  387. package/src/shared/conflict-detector.test.ts +56 -0
  388. package/src/shared/conflict-detector.ts +16 -5
  389. package/src/shared/host-stall-profiler-bun.ts +358 -0
  390. package/src/shared/host-stall-profiler-common.ts +159 -0
  391. package/src/shared/host-stall-profiler-node.test.ts +234 -0
  392. package/src/shared/host-stall-profiler-node.ts +274 -0
  393. package/src/shared/host-stall-profiler-report.ts +248 -0
  394. package/src/shared/host-stall-profiler.ts +57 -0
  395. package/src/shared/logger.test.ts +38 -0
  396. package/src/shared/logger.ts +10 -2
  397. package/src/shared/model-resolution.test.ts +54 -17
  398. package/src/shared/model-resolution.ts +6 -17
  399. package/src/shared/models-dev-temperature.ts +107 -0
  400. package/src/shared/project-directory-key.test.ts +59 -0
  401. package/src/shared/project-directory-key.ts +20 -0
  402. package/src/shared/sqlite.test.ts +52 -0
  403. package/src/shared/sqlite.ts +339 -23
  404. package/src/shared/stable-json-linear.test.ts +109 -0
  405. package/src/shared/stable-json.ts +37 -7
  406. package/src/shared/subagent-temperature.test.ts +270 -0
  407. package/src/shared/subagent-temperature.ts +110 -0
  408. package/src/shared/user-facing-codes.ts +2 -6
  409. package/src/shared/write-transaction-attribution.test.ts +2 -2
  410. package/src/v2/tui/host-contract.test.ts +41 -67
  411. package/src/v2/tui/index.ts +6 -214
  412. package/src/v2/tui/types.ts +5 -17
  413. package/dist/features/magic-context/checkout-claim-fake-subc.test-support.d.ts +0 -45
  414. package/dist/features/magic-context/checkout-claim-fake-subc.test-support.d.ts.map +0 -1
  415. package/dist/features/magic-context/checkout-claim.d.ts +0 -155
  416. package/dist/features/magic-context/checkout-claim.d.ts.map +0 -1
  417. package/dist/index-bb36vgr3.js +0 -6608
  418. package/dist/index-fnn5pjtt.js +0 -6554
  419. package/dist/recomp-orchestrator-rervg6q4.js +0 -42
  420. package/dist/v2/recomp-orchestrator-42vjba7p.js +0 -42
  421. package/dist/v2/server-3trjk1hx.js +0 -6360
  422. package/dist/v2/server-nm9n3aqq.js +0 -6461
  423. package/dist/wrapup-orchestrator-b2dztrar.js +0 -29
  424. /package/dist/{index-5prbx026.js → index-2pp04pmg.js} +0 -0
  425. /package/dist/v2/{index-5prbx026.js → index-2pp04pmg.js} +0 -0
@@ -0,0 +1,109 @@
1
+ /// <reference types="bun-types" />
2
+
3
+ import { describe, expect, it } from "bun:test";
4
+ import { stableStringify } from "./stable-json";
5
+
6
+ /** stableStringify as it was before it collected pieces: joins at every level. */
7
+ function frozenStableStringify(value: unknown, seen = new WeakSet<object>()): string {
8
+ if (value === undefined) return "undefined";
9
+ if (value === null || typeof value !== "object") return JSON.stringify(value) ?? String(value);
10
+ if (seen.has(value)) return '"[Circular]"';
11
+ seen.add(value);
12
+ if (Array.isArray(value)) {
13
+ return `[${value.map((item) => frozenStableStringify(item, seen)).join(",")}]`;
14
+ }
15
+ const entries = Object.entries(value as Record<string, unknown>).sort(([a], [b]) => {
16
+ if (a < b) return -1;
17
+ if (a > b) return 1;
18
+ return 0;
19
+ });
20
+ return `{${entries
21
+ .map(([key, child]) => `${JSON.stringify(key)}:${frozenStableStringify(child, seen)}`)
22
+ .join(",")}}`;
23
+ }
24
+
25
+ function rng(seed: number): () => number {
26
+ let state = seed >>> 0 || 1;
27
+ return () => {
28
+ state ^= state << 13;
29
+ state >>>= 0;
30
+ state ^= state >>> 17;
31
+ state ^= state << 5;
32
+ state >>>= 0;
33
+ return state / 0x100000000;
34
+ };
35
+ }
36
+
37
+ function randomValue(random: () => number, depth: number, shared: object[]): unknown {
38
+ const roll = random();
39
+ if (depth > 4 || roll < 0.35) {
40
+ const leaves: unknown[] = [
41
+ "plain",
42
+ 'quote " and \\ backslash',
43
+ "ünï 日本 😀 \u2028",
44
+ 0,
45
+ -0,
46
+ 1.5,
47
+ Number.NaN,
48
+ Number.POSITIVE_INFINITY,
49
+ true,
50
+ false,
51
+ null,
52
+ undefined,
53
+ () => 1,
54
+ Symbol("s"),
55
+ ];
56
+ return leaves[Math.floor(random() * leaves.length)];
57
+ }
58
+ if (roll < 0.45 && shared.length > 0) return shared[Math.floor(random() * shared.length)];
59
+ if (roll < 0.7) {
60
+ const array: unknown[] = [];
61
+ const length = Math.floor(random() * 5);
62
+ for (let index = 0; index < length; index += 1) {
63
+ if (random() < 0.15) continue; // leaves a hole
64
+ array[index] = randomValue(random, depth + 1, shared);
65
+ }
66
+ array.length = length;
67
+ if (random() < 0.2) shared.push(array);
68
+ return array;
69
+ }
70
+ const object: Record<string, unknown> = {};
71
+ for (let index = Math.floor(random() * 5); index > 0; index -= 1) {
72
+ const key = ["b", "a", "10", "2", "é", "Z", "key with space"][
73
+ Math.floor(random() * 7)
74
+ ] as string;
75
+ object[key] = randomValue(random, depth + 1, shared);
76
+ }
77
+ if (random() < 0.2) shared.push(object);
78
+ if (random() < 0.1) object.self = object;
79
+ return object;
80
+ }
81
+
82
+ describe("stableStringify", () => {
83
+ it("writes exactly what it wrote when it joined at every level", () => {
84
+ const random = rng(653);
85
+ let circular = 0;
86
+ let holes = 0;
87
+ for (let sample = 0; sample < 2_000; sample += 1) {
88
+ const value = randomValue(random, 0, []);
89
+ const text = stableStringify(value);
90
+ expect(text).toBe(frozenStableStringify(value));
91
+ if (text.includes('"[Circular]"')) circular += 1;
92
+ if (/\[,|,,|,\]/.test(text)) holes += 1;
93
+ }
94
+ // Shared and cyclic references and array holes were among the samples.
95
+ expect(circular).toBeGreaterThan(50);
96
+ expect(holes).toBeGreaterThan(50);
97
+ });
98
+
99
+ it("copies a deeply nested value once, not once per level", () => {
100
+ // 3,000 levels around a 2 MB string: joining at every level copied about
101
+ // 6 GB of text (over a second); one copy takes a few milliseconds.
102
+ let node: unknown = { body: "x".repeat(2_000_000) };
103
+ for (let depth = 0; depth < 3_000; depth += 1) node = { child: node, depth };
104
+ const started = performance.now();
105
+ const text = stableStringify(node);
106
+ expect(text.length).toBeGreaterThan(2_000_000);
107
+ expect(performance.now() - started).toBeLessThan(300);
108
+ }, 30_000);
109
+ });
@@ -18,12 +18,38 @@
18
18
  * signing), build a separate utility — do NOT widen this contract.
19
19
  */
20
20
  export function stableStringify(value: unknown, seen = new WeakSet<object>()): string {
21
- if (value === undefined) return "undefined";
22
- if (value === null || typeof value !== "object") return JSON.stringify(value) ?? String(value);
23
- if (seen.has(value)) return '"[Circular]"';
21
+ // Collect pieces and join once. Joining at every level copied each nested
22
+ // value's text once per enclosing level, so a large value N levels deep cost
23
+ // N copies of itself.
24
+ const pieces: string[] = [];
25
+ writeStable(value, seen, pieces);
26
+ return pieces.join("");
27
+ }
28
+
29
+ function writeStable(value: unknown, seen: WeakSet<object>, pieces: string[]): void {
30
+ if (value === undefined) {
31
+ pieces.push("undefined");
32
+ return;
33
+ }
34
+ if (value === null || typeof value !== "object") {
35
+ pieces.push(JSON.stringify(value) ?? String(value));
36
+ return;
37
+ }
38
+ // Any object met a second time, shared or cyclic, is written as "[Circular]".
39
+ if (seen.has(value)) {
40
+ pieces.push('"[Circular]"');
41
+ return;
42
+ }
24
43
  seen.add(value);
25
44
  if (Array.isArray(value)) {
26
- return `[${value.map((item) => stableStringify(item, seen)).join(",")}]`;
45
+ pieces.push("[");
46
+ for (let index = 0; index < value.length; index += 1) {
47
+ if (index > 0) pieces.push(",");
48
+ // A hole writes nothing between its commas, as joining a mapped array did.
49
+ if (index in value) writeStable(value[index], seen, pieces);
50
+ }
51
+ pieces.push("]");
52
+ return;
27
53
  }
28
54
  // Code-point sort (NOT localeCompare). Stable across runtimes/locales.
29
55
  const entries = Object.entries(value as Record<string, unknown>).sort(([a], [b]) => {
@@ -31,7 +57,11 @@ export function stableStringify(value: unknown, seen = new WeakSet<object>()): s
31
57
  if (a > b) return 1;
32
58
  return 0;
33
59
  });
34
- return `{${entries
35
- .map(([key, child]) => `${JSON.stringify(key)}:${stableStringify(child, seen)}`)
36
- .join(",")}}`;
60
+ pieces.push("{");
61
+ entries.forEach(([key, child], index) => {
62
+ if (index > 0) pieces.push(",");
63
+ pieces.push(JSON.stringify(key), ":");
64
+ writeStable(child, seen, pieces);
65
+ });
66
+ pieces.push("}");
37
67
  }
@@ -0,0 +1,270 @@
1
+ import { afterAll, beforeEach, describe, expect, test } from "bun:test";
2
+ import { mkdirSync, rmSync, writeFileSync } from "node:fs";
3
+ import { tmpdir } from "node:os";
4
+ import { join } from "node:path";
5
+ import { modelsDevCatalogPath } from "./models-dev-temperature";
6
+ import {
7
+ __temperatureTest,
8
+ applyHiddenSubagentTemperature,
9
+ resolveTemperatureCapability,
10
+ subagentTemperature,
11
+ } from "./subagent-temperature";
12
+ import { cleanupTestTempDir, createTestTempDirFromPath } from "./test-temp-dir";
13
+
14
+ // Every test reads a catalog it wrote itself, never the machine's OpenCode cache.
15
+ const cacheRoot = createTestTempDirFromPath(join(tmpdir(), "mc-temperature-catalog-"));
16
+ const savedEnv = {
17
+ XDG_CACHE_HOME: process.env.XDG_CACHE_HOME,
18
+ OPENCODE_MODELS_PATH: process.env.OPENCODE_MODELS_PATH,
19
+ };
20
+
21
+ /** Shape of OpenCode's cached models.dev api.json, trimmed to the fields that matter. */
22
+ const CATALOG = {
23
+ google: {
24
+ id: "google",
25
+ models: {
26
+ "gemini-3.8-flash": { id: "gemini-3.8-flash", temperature: true, reasoning: true },
27
+ },
28
+ },
29
+ openrouter: {
30
+ id: "openrouter",
31
+ models: {
32
+ "google/gemini-3.8-flash": { temperature: true, reasoning: true },
33
+ "openai/gpt-6.1-sol": { temperature: false, reasoning: true },
34
+ },
35
+ },
36
+ openai: { id: "openai", models: { "gpt-6.1-sol": { temperature: false, reasoning: true } } },
37
+ opencode: { id: "opencode", models: { "gemini-3.8-flash": { temperature: true } } },
38
+ broken: { id: "broken", models: { "no-flag": { reasoning: true } } },
39
+ };
40
+
41
+ function writeCatalog(contents: string = JSON.stringify(CATALOG)): void {
42
+ const path = join(cacheRoot, "opencode", "models.json");
43
+ mkdirSync(join(cacheRoot, "opencode"), { recursive: true });
44
+ writeFileSync(path, contents);
45
+ }
46
+
47
+ function removeCatalog(): void {
48
+ rmSync(join(cacheRoot, "opencode"), { recursive: true, force: true });
49
+ }
50
+
51
+ beforeEach(() => {
52
+ process.env.XDG_CACHE_HOME = cacheRoot;
53
+ delete process.env.OPENCODE_MODELS_PATH;
54
+ removeCatalog();
55
+ __temperatureTest.reset();
56
+ });
57
+
58
+ afterAll(() => {
59
+ for (const [key, value] of Object.entries(savedEnv)) {
60
+ if (value === undefined) delete process.env[key];
61
+ else process.env[key] = value;
62
+ }
63
+ cleanupTestTempDir(cacheRoot);
64
+ });
65
+
66
+ describe("subagent sampling metadata", () => {
67
+ for (const [host, yes, no] of [
68
+ [
69
+ "OpenCode 1",
70
+ { capabilities: { temperature: true } },
71
+ { capabilities: { temperature: false } },
72
+ ],
73
+ ["OpenCode 2", { temperature: true }, { temperature: false }],
74
+ [
75
+ "Pi",
76
+ { compat: { supportsTemperature: true } },
77
+ { compat: { supportsTemperature: false } },
78
+ ],
79
+ [
80
+ "OMP",
81
+ { compat: { supportsSamplingParams: true } },
82
+ { compat: { supportsSamplingParams: false } },
83
+ ],
84
+ ] as const) {
85
+ test(`${host} requires affirmative metadata and preserves explicit zero`, () => {
86
+ const logs: string[] = [];
87
+ const note = (line: string) => logs.push(line);
88
+ expect(subagentTemperature("provider/yes", yes, 0.1, note)).toBe(0.1);
89
+ expect(subagentTemperature("provider/yes", yes, 0, note)).toBe(0);
90
+ expect(subagentTemperature("provider/no", no, 0.1, note)).toBeUndefined();
91
+ expect(
92
+ subagentTemperature("provider/missing", { reasoning: false }, 0.1, note),
93
+ ).toBeUndefined();
94
+ expect(
95
+ subagentTemperature("provider/unknown", { temperature: "yes" }, 0.1, note),
96
+ ).toBeUndefined();
97
+ expect(subagentTemperature("provider/unset", yes, undefined, note)).toBeUndefined();
98
+ expect(logs).toEqual([
99
+ "Subagent temperature sent for provider/yes: host model metadata says yes",
100
+ "Subagent temperature omitted for provider/no: host model metadata says no",
101
+ "Subagent temperature omitted for provider/missing: no host or models.dev metadata",
102
+ "Subagent temperature omitted for provider/unknown: no host or models.dev metadata",
103
+ ]);
104
+ });
105
+ }
106
+
107
+ test("decision logging is once per model and decision, and does not remember a denial as a capability", () => {
108
+ const logs: string[] = [];
109
+ const note = (line: string) => logs.push(line);
110
+ expect(subagentTemperature("p/m", undefined, 0.1, note)).toBeUndefined();
111
+ expect(subagentTemperature("p/m", undefined, 0.1, note)).toBeUndefined();
112
+ expect(subagentTemperature("p/m", { temperature: true }, 0.1, note)).toBe(0.1);
113
+ expect(subagentTemperature("p/m", { temperature: true }, 0.1, note)).toBe(0.1);
114
+ expect(logs).toEqual([
115
+ "Subagent temperature omitted for p/m: no host or models.dev metadata",
116
+ "Subagent temperature sent for p/m: host model metadata says yes",
117
+ ]);
118
+ });
119
+
120
+ test("OpenCode 1 guards historian, dreamer and compiler per resolved model, not unrelated agents", () => {
121
+ const yes = { providerID: "p", id: "flash", capabilities: { temperature: true } };
122
+ const no = { providerID: "p", id: "fallback", capabilities: { temperature: false } };
123
+ for (const agent of [
124
+ "historian",
125
+ "historian-editor",
126
+ "historian-recomp",
127
+ "dreamer",
128
+ "dreamer-classifier",
129
+ "smart-note-compiler",
130
+ ]) {
131
+ const output: { temperature?: number } = { temperature: 0 };
132
+ applyHiddenSubagentTemperature({ agent, model: yes }, output, () => {});
133
+ expect(output).toEqual({ temperature: 0 });
134
+ applyHiddenSubagentTemperature({ agent, model: no }, output, () => {});
135
+ expect(output).toEqual({});
136
+ output.temperature = 0.1;
137
+ applyHiddenSubagentTemperature({ agent }, output, () => {});
138
+ expect(output).toEqual({});
139
+ }
140
+ const output = { temperature: 0.4 };
141
+ applyHiddenSubagentTemperature({ agent: "build", model: no }, output, () => {});
142
+ expect(output.temperature).toBe(0.4);
143
+ });
144
+ });
145
+
146
+ describe("models.dev catalog fallback when the host is silent", () => {
147
+ test("resolves the cached catalog by provider and exact model id", () => {
148
+ writeCatalog();
149
+ const logs: string[] = [];
150
+ const note = (line: string) => logs.push(line);
151
+ // Pi and OpenCode 2 rows carry no temperature field.
152
+ const silent = { reasoning: true, compat: { thinkingFormat: "openrouter" } };
153
+ expect(subagentTemperature("openrouter/google/gemini-3.8-flash", silent, 0.1, note)).toBe(
154
+ 0.1,
155
+ );
156
+ expect(subagentTemperature("google/gemini-3.8-flash", silent, 0, note)).toBe(0);
157
+ expect(subagentTemperature("opencode-zen/gemini-3.8-flash", silent, 0.1, note)).toBe(0.1);
158
+ expect(subagentTemperature("openai/gpt-6.1-sol", silent, 0.1, note)).toBeUndefined();
159
+ expect(
160
+ subagentTemperature("openrouter/openai/gpt-6.1-sol", silent, 0.1, note),
161
+ ).toBeUndefined();
162
+ expect(logs).toEqual([
163
+ "Subagent temperature sent for openrouter/google/gemini-3.8-flash: models.dev cache entry openrouter/google/gemini-3.8-flash says yes",
164
+ "Subagent temperature sent for google/gemini-3.8-flash: models.dev cache entry google/gemini-3.8-flash says yes",
165
+ "Subagent temperature sent for opencode-zen/gemini-3.8-flash: models.dev cache entry opencode/gemini-3.8-flash says yes",
166
+ "Subagent temperature omitted for openai/gpt-6.1-sol: models.dev cache entry openai/gpt-6.1-sol says no",
167
+ "Subagent temperature omitted for openrouter/openai/gpt-6.1-sol: models.dev cache entry openrouter/openai/gpt-6.1-sol says no",
168
+ ]);
169
+ });
170
+
171
+ test("both Antigravity spellings map to the underlying Gemini entry", () => {
172
+ writeCatalog();
173
+ for (const model of [
174
+ "google/antigravity-gemini-3.8-flash",
175
+ "google-antigravity/gemini-3.8-flash",
176
+ "google-antigravity/antigravity-gemini-3.8-flash",
177
+ ]) {
178
+ expect(resolveTemperatureCapability(model, {})).toEqual({
179
+ supported: true,
180
+ source: "catalog",
181
+ entry: "google/gemini-3.8-flash",
182
+ });
183
+ }
184
+ // The prefix is only an Antigravity spelling on Google, not a general rewrite.
185
+ expect(resolveTemperatureCapability("openrouter/antigravity-gemini-3.8-flash", {})).toEqual(
186
+ {
187
+ supported: undefined,
188
+ source: "none",
189
+ },
190
+ );
191
+ });
192
+
193
+ test("Codex and unmatched models stay unknown, so temperature is omitted", () => {
194
+ writeCatalog();
195
+ for (const model of [
196
+ "openai-codex/gpt-6.1-sol",
197
+ "google/gemini-3.8-flash-preview",
198
+ "google/claude-opus-4-6-thinking",
199
+ "broken/no-flag",
200
+ "unknown/unknown",
201
+ "no-slash",
202
+ ]) {
203
+ expect(resolveTemperatureCapability(model, undefined)).toEqual({
204
+ supported: undefined,
205
+ source: "none",
206
+ });
207
+ expect(subagentTemperature(model, undefined, 0.1, () => {})).toBeUndefined();
208
+ }
209
+ });
210
+
211
+ test("host metadata outranks the catalog in both directions", () => {
212
+ writeCatalog();
213
+ expect(
214
+ subagentTemperature(
215
+ "google/gemini-3.8-flash",
216
+ { capabilities: { temperature: false } },
217
+ 0.1,
218
+ () => {},
219
+ ),
220
+ ).toBeUndefined();
221
+ expect(
222
+ subagentTemperature(
223
+ "openai/gpt-6.1-sol",
224
+ { compat: { supportsSamplingParams: true } },
225
+ 0.1,
226
+ () => {},
227
+ ),
228
+ ).toBe(0.1);
229
+ });
230
+
231
+ test("a missing, empty or partially written catalog is not evidence", () => {
232
+ const silent = {};
233
+ expect(
234
+ subagentTemperature("google/gemini-3.8-flash", silent, 0.1, () => {}),
235
+ ).toBeUndefined();
236
+ writeCatalog(JSON.stringify(CATALOG).slice(0, 200));
237
+ expect(
238
+ subagentTemperature("google/gemini-3.8-flash", silent, 0.1, () => {}),
239
+ ).toBeUndefined();
240
+ writeCatalog("[]");
241
+ expect(
242
+ subagentTemperature("google/gemini-3.8-flash", silent, 0.1, () => {}),
243
+ ).toBeUndefined();
244
+ });
245
+
246
+ test("a rewritten catalog is re-read rather than served from memory", () => {
247
+ writeCatalog();
248
+ expect(resolveTemperatureCapability("google/gemini-3.8-flash", {}).supported).toBe(true);
249
+ writeCatalog(
250
+ JSON.stringify({
251
+ google: { models: { "gemini-3.8-flash": { temperature: false, note: "changed" } } },
252
+ }),
253
+ );
254
+ expect(resolveTemperatureCapability("google/gemini-3.8-flash", {}).supported).toBe(false);
255
+ });
256
+
257
+ test("OPENCODE_MODELS_PATH takes precedence over the cache, as it does for OpenCode", () => {
258
+ writeCatalog();
259
+ const override = join(cacheRoot, "override.json");
260
+ writeFileSync(
261
+ override,
262
+ JSON.stringify({ google: { models: { "gemini-3.8-flash": { temperature: false } } } }),
263
+ );
264
+ process.env.OPENCODE_MODELS_PATH = override;
265
+ expect(modelsDevCatalogPath()).toBe(override);
266
+ expect(resolveTemperatureCapability("google/gemini-3.8-flash", {}).supported).toBe(false);
267
+ delete process.env.OPENCODE_MODELS_PATH;
268
+ expect(modelsDevCatalogPath()).toBe(join(cacheRoot, "opencode", "models.json"));
269
+ });
270
+ });
@@ -0,0 +1,110 @@
1
+ import { __catalogTest, catalogTemperature } from "./models-dev-temperature";
2
+
3
+ export type TemperatureMetadata = {
4
+ temperature?: boolean;
5
+ capabilities?: { temperature?: boolean };
6
+ compat?: { supportsTemperature?: boolean; supportsSamplingParams?: boolean };
7
+ };
8
+
9
+ const loggedDecisions = new Set<string>();
10
+
11
+ export function temperatureCapability(metadata: unknown): boolean | undefined {
12
+ if (!metadata || typeof metadata !== "object") return undefined;
13
+ const model = metadata as TemperatureMetadata;
14
+ const supported =
15
+ model.capabilities?.temperature ??
16
+ model.temperature ??
17
+ model.compat?.supportsTemperature ??
18
+ model.compat?.supportsSamplingParams;
19
+ return typeof supported === "boolean" ? supported : undefined;
20
+ }
21
+
22
+ /**
23
+ * Where a temperature decision came from: the host's own model metadata, the models.dev
24
+ * catalog OpenCode caches on disk, or nothing (which omits temperature).
25
+ */
26
+ export type TemperatureSource = "host" | "catalog" | "none";
27
+
28
+ export interface TemperatureDecision {
29
+ supported: boolean | undefined;
30
+ source: TemperatureSource;
31
+ /** The models.dev entry (`provider/model`) when the catalog decided. */
32
+ entry?: string;
33
+ }
34
+
35
+ /**
36
+ * Host metadata wins whenever it states a boolean. Only when the host is silent do we
37
+ * consult the cached models.dev catalog, matched by provider and model id.
38
+ */
39
+ export function resolveTemperatureCapability(
40
+ model: string,
41
+ metadata: unknown,
42
+ ): TemperatureDecision {
43
+ const host = temperatureCapability(metadata);
44
+ if (host !== undefined) return { supported: host, source: "host" };
45
+ const catalog = catalogTemperature(model);
46
+ if (catalog) return { supported: catalog.temperature, source: "catalog", entry: catalog.entry };
47
+ return { supported: undefined, source: "none" };
48
+ }
49
+
50
+ export function describeTemperatureDecision(model: string, decision: TemperatureDecision): string {
51
+ const verdict = decision.supported === true ? "sent" : "omitted";
52
+ const answer = decision.supported === true ? "yes" : "no";
53
+ const reason =
54
+ decision.source === "host"
55
+ ? `host model metadata says ${answer}`
56
+ : decision.source === "catalog"
57
+ ? `models.dev cache entry ${decision.entry ?? "unknown"} says ${answer}`
58
+ : "no host or models.dev metadata";
59
+ return `Subagent temperature ${verdict} for ${model}: ${reason}`;
60
+ }
61
+
62
+ /** Log each model's decision once per process, and again only if the decision changes. */
63
+ export function logTemperatureDecision(
64
+ model: string,
65
+ decision: TemperatureDecision,
66
+ log: (message: string, decision: TemperatureDecision) => void,
67
+ ): void {
68
+ const key = `${model}\u0000${decision.source}\u0000${decision.supported}\u0000${decision.entry ?? ""}`;
69
+ if (loggedDecisions.has(key)) return;
70
+ loggedDecisions.add(key);
71
+ log(describeTemperatureDecision(model, decision), decision);
72
+ }
73
+
74
+ /** Only a positive capability permits sampling; reasoning alone is not evidence. */
75
+ export function subagentTemperature(
76
+ model: string,
77
+ metadata: unknown,
78
+ temperature: number | undefined,
79
+ log: (message: string, decision: TemperatureDecision) => void,
80
+ ): number | undefined {
81
+ if (temperature === undefined) return undefined;
82
+ const decision = resolveTemperatureCapability(model, metadata);
83
+ logTemperatureDecision(model, decision, log);
84
+ return decision.supported === true ? temperature : undefined;
85
+ }
86
+
87
+ /** OpenCode 1 computes agent sampling before chat.params resolves the final model. */
88
+ export function applyHiddenSubagentTemperature(
89
+ input: { agent: string; model?: TemperatureMetadata & { providerID?: string; id?: string } },
90
+ output: { temperature?: number },
91
+ log: (message: string) => void,
92
+ ): void {
93
+ if (!/^(?:historian(?:-|$)|dreamer(?:-|$)|smart-note-compiler$)/.test(input.agent)) return;
94
+ const temperature = subagentTemperature(
95
+ `${input.model?.providerID ?? "unknown"}/${input.model?.id ?? "unknown"}`,
96
+ input.model,
97
+ output.temperature,
98
+ // Host loggers treat a second argument as structured data; the message says it all.
99
+ (message) => log(message),
100
+ );
101
+ if (temperature === undefined) delete output.temperature;
102
+ else output.temperature = temperature;
103
+ }
104
+
105
+ export const __temperatureTest = {
106
+ reset(): void {
107
+ loggedDecisions.clear();
108
+ __catalogTest.reset();
109
+ },
110
+ };
@@ -245,12 +245,8 @@ export const USER_FACING_FAILURES = {
245
245
  sentence: "Magic Context has no context.db.",
246
246
  action: "Run `npx @cortexkit/magic-context doctor store init`, then restart ck-mc.",
247
247
  },
248
- checkout_claim_held_elsewhere: {
249
- code: "MC-C16",
250
- sentence:
251
- "This request was not sent: this agent is checked out on another machine, so Magic Context will not work on its sessions here.",
252
- action: "Move the agent back to this machine, then send your message again.",
253
- },
248
+ // MC-C16 is retired: released builds showed it when a turn was refused because
249
+ // another machine held the session's agent. Do not reuse it for a new failure.
254
250
  single_store_migration_required: {
255
251
  code: "MC-C14",
256
252
  sentence: "Magic Context's Rust mode needs a one-time migration of its store.",
@@ -87,7 +87,7 @@ const fencedSources: Array<{ path: string; sites: string[]; reporterCalls?: stri
87
87
  },
88
88
  {
89
89
  path: "packages/pi-plugin/src/context-handler.ts",
90
- sites: ["pi_compaction_queue"],
90
+ sites: ["pi_fallback_adoption"],
91
91
  },
92
92
  ];
93
93
 
@@ -149,7 +149,7 @@ const newlyCoveredSites = [
149
149
  "pi_materialize_cache",
150
150
  "pi_soft_refresh_cache",
151
151
  "pi_historian_publish",
152
- "pi_compaction_queue",
152
+ "pi_fallback_adoption",
153
153
  "note_nudge_trigger",
154
154
  "user_memory_candidate_insert",
155
155
  ] as const;