@cortexkit/opencode-magic-context 0.46.1 → 0.48.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (462) 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 +112 -0
  5. package/dist/config/index.d.ts.map +1 -1
  6. package/dist/config/live-run-config.d.ts.map +1 -1
  7. package/dist/config/migrate-config-location.d.ts.map +1 -1
  8. package/dist/config/mural-model-deprecation.d.ts +15 -0
  9. package/dist/config/mural-model-deprecation.d.ts.map +1 -0
  10. package/dist/config/project-security.d.ts +0 -3
  11. package/dist/config/project-security.d.ts.map +1 -1
  12. package/dist/config/schema/magic-context.d.ts +21 -9
  13. package/dist/config/schema/magic-context.d.ts.map +1 -1
  14. package/dist/{conflict-warning-hook-7fj2b9jw.js → conflict-warning-hook-w8cykrnf.js} +12 -9
  15. package/dist/{context-sh2m2vde.js → context-m0cy262m.js} +1785 -913
  16. package/dist/{derive-budgets-7nj7r1rv.js → derive-budgets-sg0xsq7s.js} +4 -3
  17. package/dist/embedding-activity-g1dhes6g.js +10 -0
  18. package/dist/embedding-backfill-9rcm1mfy.js +21 -0
  19. package/dist/embedding-cache-mgyr73ef.js +16 -0
  20. package/dist/embedding-worker.js +11 -9
  21. package/dist/features/magic-context/compaction-marker.d.ts.map +1 -1
  22. package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts +1 -0
  23. package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
  24. package/dist/features/magic-context/dreamer/task-config.d.ts +3 -3
  25. package/dist/features/magic-context/dreamer/task-config.d.ts.map +1 -1
  26. package/dist/features/magic-context/dreamer/task-executor.d.ts +1 -1
  27. package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
  28. package/dist/features/magic-context/dreamer/task-gates.d.ts.map +1 -1
  29. package/dist/features/magic-context/dreamer/task-registry.d.ts +1 -0
  30. package/dist/features/magic-context/dreamer/task-registry.d.ts.map +1 -1
  31. package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
  32. package/dist/features/magic-context/message-index-async.d.ts +16 -3
  33. package/dist/features/magic-context/message-index-async.d.ts.map +1 -1
  34. package/dist/features/magic-context/message-index-bounded.d.ts +17 -0
  35. package/dist/features/magic-context/message-index-bounded.d.ts.map +1 -0
  36. package/dist/features/magic-context/message-index.d.ts +7 -1
  37. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  38. package/dist/features/magic-context/mural/render-trigger.d.ts +7 -4
  39. package/dist/features/magic-context/mural/render-trigger.d.ts.map +1 -1
  40. package/dist/features/magic-context/overflow-detection.d.ts +2 -0
  41. package/dist/features/magic-context/overflow-detection.d.ts.map +1 -1
  42. package/dist/features/magic-context/pi-content-decisions.d.ts +7 -1
  43. package/dist/features/magic-context/pi-content-decisions.d.ts.map +1 -1
  44. package/dist/features/magic-context/project-embedding-registry.d.ts +7 -0
  45. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  46. package/dist/features/magic-context/search.d.ts +31 -0
  47. package/dist/features/magic-context/search.d.ts.map +1 -1
  48. package/dist/features/magic-context/session-activity.d.ts.map +1 -1
  49. package/dist/features/magic-context/session-project-storage.d.ts +8 -2
  50. package/dist/features/magic-context/session-project-storage.d.ts.map +1 -1
  51. package/dist/features/magic-context/smart-notes/runner.d.ts +1 -0
  52. package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
  53. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  54. package/dist/features/magic-context/storage-historian-runs.d.ts +2 -5
  55. package/dist/features/magic-context/storage-historian-runs.d.ts.map +1 -1
  56. package/dist/features/magic-context/storage-meta-persisted.d.ts +12 -0
  57. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  58. package/dist/features/magic-context/storage-meta-session.d.ts +6 -0
  59. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  60. package/dist/features/magic-context/storage-tag-identity-revision.d.ts +30 -0
  61. package/dist/features/magic-context/storage-tag-identity-revision.d.ts.map +1 -0
  62. package/dist/features/magic-context/storage-tags.d.ts +148 -3
  63. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  64. package/dist/features/magic-context/storage.d.ts +1 -0
  65. package/dist/features/magic-context/storage.d.ts.map +1 -1
  66. package/dist/features/magic-context/subagent-token-capture.d.ts.map +1 -1
  67. package/dist/features/magic-context/transform-decision-log.d.ts +4 -2
  68. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
  69. package/dist/harness-e4avh192.js +10 -0
  70. package/dist/hooks/magic-context/active-anthropic-turn.d.ts +10 -0
  71. package/dist/hooks/magic-context/active-anthropic-turn.d.ts.map +1 -0
  72. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  73. package/dist/hooks/magic-context/auto-search-blocking.fixture.d.ts +2 -0
  74. package/dist/hooks/magic-context/auto-search-blocking.fixture.d.ts.map +1 -0
  75. package/dist/hooks/magic-context/auto-search-deadline.d.ts +7 -0
  76. package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -1
  77. package/dist/hooks/magic-context/auto-search-host-review.fixture.d.ts +3 -0
  78. package/dist/hooks/magic-context/auto-search-host-review.fixture.d.ts.map +1 -0
  79. package/dist/hooks/magic-context/auto-search-lock-review.fixture.d.ts +2 -0
  80. package/dist/hooks/magic-context/auto-search-lock-review.fixture.d.ts.map +1 -0
  81. package/dist/hooks/magic-context/auto-search-long-lock-review.fixture.d.ts +2 -0
  82. package/dist/hooks/magic-context/auto-search-long-lock-review.fixture.d.ts.map +1 -0
  83. package/dist/hooks/magic-context/auto-search-omp-host-review.fixture.d.ts +4 -0
  84. package/dist/hooks/magic-context/auto-search-omp-host-review.fixture.d.ts.map +1 -0
  85. package/dist/hooks/magic-context/auto-search-omp-loader.fixture.d.ts +3 -0
  86. package/dist/hooks/magic-context/auto-search-omp-loader.fixture.d.ts.map +1 -0
  87. package/dist/hooks/magic-context/auto-search-runner.d.ts +1 -1
  88. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  89. package/dist/hooks/magic-context/auto-search-snapshot.fixture.d.ts +4 -0
  90. package/dist/hooks/magic-context/auto-search-snapshot.fixture.d.ts.map +1 -0
  91. package/dist/hooks/magic-context/auto-search-worker-client.d.ts +98 -0
  92. package/dist/hooks/magic-context/auto-search-worker-client.d.ts.map +1 -0
  93. package/dist/hooks/magic-context/auto-search-worker.d.ts +2 -0
  94. package/dist/hooks/magic-context/auto-search-worker.d.ts.map +1 -0
  95. package/dist/hooks/magic-context/caveman-cleanup.d.ts.map +1 -1
  96. package/dist/hooks/magic-context/command-handler.d.ts +1 -0
  97. package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
  98. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
  99. package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
  100. package/dist/hooks/magic-context/compartment-runner-types.d.ts +3 -5
  101. package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
  102. package/dist/hooks/magic-context/compartment-runner.d.ts +2 -1
  103. package/dist/hooks/magic-context/compartment-runner.d.ts.map +1 -1
  104. package/dist/hooks/magic-context/compartment-trigger.d.ts +3 -1
  105. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
  106. package/dist/hooks/magic-context/event-handler.d.ts +1 -1
  107. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  108. package/dist/hooks/magic-context/event-resolvers.d.ts.map +1 -1
  109. package/dist/hooks/magic-context/execute-status.d.ts.map +1 -1
  110. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +2 -0
  111. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
  112. package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -1
  113. package/dist/hooks/magic-context/historian-drain-gate.d.ts +11 -0
  114. package/dist/hooks/magic-context/historian-drain-gate.d.ts.map +1 -0
  115. package/dist/hooks/magic-context/hook.d.ts +3 -2
  116. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  117. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  118. package/dist/hooks/magic-context/latest-assistant-turn.d.ts +25 -0
  119. package/dist/hooks/magic-context/latest-assistant-turn.d.ts.map +1 -0
  120. package/dist/hooks/magic-context/latest-thinking-recovery.d.ts +61 -0
  121. package/dist/hooks/magic-context/latest-thinking-recovery.d.ts.map +1 -0
  122. package/dist/hooks/magic-context/lkg-persist.d.ts +4 -3
  123. package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
  124. package/dist/hooks/magic-context/lkg-replay.d.ts +13 -8
  125. package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
  126. package/dist/hooks/magic-context/lkg-slot.d.ts +139 -2
  127. package/dist/hooks/magic-context/lkg-slot.d.ts.map +1 -1
  128. package/dist/hooks/magic-context/message-search-accepting-silent-worker.fixture.d.ts +2 -0
  129. package/dist/hooks/magic-context/message-search-accepting-silent-worker.fixture.d.ts.map +1 -0
  130. package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
  131. package/dist/hooks/magic-context/oc-stall-r2-warmup-worker.fixture.d.ts +2 -0
  132. package/dist/hooks/magic-context/oc-stall-r2-warmup-worker.fixture.d.ts.map +1 -0
  133. package/dist/hooks/magic-context/oc-stall-search-review.fixture.d.ts +2 -0
  134. package/dist/hooks/magic-context/oc-stall-search-review.fixture.d.ts.map +1 -0
  135. package/dist/hooks/magic-context/opencode-proven-floor.d.ts +6 -0
  136. package/dist/hooks/magic-context/opencode-proven-floor.d.ts.map +1 -0
  137. package/dist/hooks/magic-context/opencode1-to-model-messages.fixture.d.ts +63 -0
  138. package/dist/hooks/magic-context/opencode1-to-model-messages.fixture.d.ts.map +1 -0
  139. package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -1
  140. package/dist/hooks/magic-context/protected-tail-boundary.d.ts.map +1 -1
  141. package/dist/hooks/magic-context/provider-visible-parts.d.ts +45 -0
  142. package/dist/hooks/magic-context/provider-visible-parts.d.ts.map +1 -0
  143. package/dist/hooks/magic-context/raw-ordinal-warmup-silent-worker.fixture.d.ts +2 -0
  144. package/dist/hooks/magic-context/raw-ordinal-warmup-silent-worker.fixture.d.ts.map +1 -0
  145. package/dist/hooks/magic-context/raw-ordinal-warmup-worker.d.ts +2 -0
  146. package/dist/hooks/magic-context/raw-ordinal-warmup-worker.d.ts.map +1 -0
  147. package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts +87 -0
  148. package/dist/hooks/magic-context/raw-ordinal-warmup.d.ts.map +1 -0
  149. package/dist/hooks/magic-context/read-session-chunk.d.ts +12 -0
  150. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  151. package/dist/hooks/magic-context/read-session-db.d.ts.map +1 -1
  152. package/dist/hooks/magic-context/read-session-formatting.d.ts +5 -0
  153. package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
  154. package/dist/hooks/magic-context/read-session-raw.d.ts +83 -1
  155. package/dist/hooks/magic-context/read-session-raw.d.ts.map +1 -1
  156. package/dist/hooks/magic-context/read-session-true-raw-tokens.d.ts.map +1 -1
  157. package/dist/hooks/magic-context/reasoning-budget-status.d.ts +15 -0
  158. package/dist/hooks/magic-context/reasoning-budget-status.d.ts.map +1 -0
  159. package/dist/hooks/magic-context/reasoning-budget.d.ts +40 -0
  160. package/dist/hooks/magic-context/reasoning-budget.d.ts.map +1 -0
  161. package/dist/hooks/magic-context/reasoning-removal.d.ts +6 -6
  162. package/dist/hooks/magic-context/reasoning-removal.d.ts.map +1 -1
  163. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  164. package/dist/hooks/magic-context/sentinel.d.ts +45 -1
  165. package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
  166. package/dist/hooks/magic-context/strip-content.d.ts +21 -5
  167. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  168. package/dist/hooks/magic-context/system-prompt-hash.d.ts +1 -0
  169. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  170. package/dist/hooks/magic-context/tag-messages.d.ts +21 -0
  171. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  172. package/dist/hooks/magic-context/tag-owner-warmup.d.ts +6 -0
  173. package/dist/hooks/magic-context/tag-owner-warmup.d.ts.map +1 -0
  174. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
  175. package/dist/hooks/magic-context/token-count-exact.d.ts +35 -0
  176. package/dist/hooks/magic-context/token-count-exact.d.ts.map +1 -0
  177. package/dist/hooks/magic-context/tool-drop-target.d.ts +5 -0
  178. package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
  179. package/dist/hooks/magic-context/transform-compartment-phase.d.ts +3 -28
  180. package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
  181. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +28 -6
  182. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  183. package/dist/hooks/magic-context/transform.d.ts +11 -3
  184. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  185. package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
  186. package/dist/{index-hpecdzec.js → index-0an7742d.js} +6820 -6587
  187. package/dist/index-0qhce371.js +120 -0
  188. package/dist/{index-q6hef7fh.js → index-0sahzkwr.js} +6 -19
  189. package/dist/{index-k5bdx1bx.js → index-0w56v4fm.js} +3 -5
  190. package/dist/index-14cjxt20.js +819 -0
  191. package/dist/{v2/server-51dv1pr5.js → index-1qb0z7wa.js} +301 -27
  192. package/dist/index-2bvekkfy.js +11 -0
  193. package/dist/{index-sj29b3z2.js → index-2y0s2hep.js} +3 -3
  194. package/dist/index-4dhv7mqz.js +131 -0
  195. package/dist/{index-b35pxds2.js → index-58e3y90n.js} +1 -18
  196. package/dist/index-5zygecde.js +152 -0
  197. package/dist/{index-sjthx78w.js → index-692jzy0p.js} +16879 -22907
  198. package/dist/index-72nhv486.js +2307 -0
  199. package/dist/index-7jzrrxap.js +931 -0
  200. package/dist/index-7mx8v0pw.js +3591 -0
  201. package/dist/index-8ajstryz.js +18 -0
  202. package/dist/{index-sfpzqvdz.js → index-8cd2j99z.js} +2 -3
  203. package/dist/{index-hybnrwq0.js → index-8j7gqj40.js} +131 -128
  204. package/dist/index-bdckkfw6.js +3261 -0
  205. package/dist/{index-8x2v7gg9.js → index-bhvjj0ys.js} +158 -2455
  206. package/dist/index-c43kr12f.js +3030 -0
  207. package/dist/index-cb7emxgj.js +984 -0
  208. package/dist/index-d9vfe7xq.js +16 -0
  209. package/dist/{index-5gq3b2ya.js → index-db7zwa3v.js} +147 -209
  210. package/dist/index-dhwzyd54.js +1142 -0
  211. package/dist/{index-8da2zjhz.js → index-eeezr5zz.js} +9 -7
  212. package/dist/{index-pkbcrdqs.js → index-f0h6xwqm.js} +3412 -4552
  213. package/dist/index-fb3zxn06.js +13 -0
  214. package/dist/index-fbv1dn35.js +171 -0
  215. package/dist/index-fr0wbhdn.js +43 -0
  216. package/dist/{index-mc22ayvf.js → index-ghc9f0n7.js} +11 -9
  217. package/dist/{index-fzbvakh0.js → index-jcbd3znx.js} +3 -3
  218. package/dist/{index-5p8jdswx.js → index-k1xb52kd.js} +20 -13
  219. package/dist/index-k9nnwad5.js +3532 -0
  220. package/dist/{v2/server-fg34g6a5.js → index-kb9nn0a0.js} +309 -52
  221. package/dist/index-knh4y330.js +566 -0
  222. package/dist/{index-q4yp4b52.js → index-mfkzp7qj.js} +28 -28
  223. package/dist/{index-sgthv3f7.js → index-mmyh6d8f.js} +4 -4
  224. package/dist/index-pavzsdc6.js +17 -0
  225. package/dist/{index-0d3g3461.js → index-pdecwzrd.js} +19 -16
  226. package/dist/index-pg50n748.js +1060 -0
  227. package/dist/index-q2tqeqde.js +2106 -0
  228. package/dist/index-q7h7csab.js +3469 -0
  229. package/dist/index-qt1qqasc.js +22 -0
  230. package/dist/{index-majxda46.js → index-ty64eqcn.js} +28 -18
  231. package/dist/{index-7qw742ev.js → index-yq8n9qcb.js} +25 -44
  232. package/dist/{index-sfnj6h8h.js → index-z8e0psj8.js} +20 -20
  233. package/dist/index.d.ts.map +1 -1
  234. package/dist/index.js +1061 -260
  235. package/dist/logger-d3wex3dz.js +20 -0
  236. package/dist/message-index-bounded-7ezbgddp.js +124 -0
  237. package/dist/{v2/message-time-backfill-r6qkem1x.js → message-time-backfill-brbd63hv.js} +8 -6
  238. package/dist/migration-worker.js +25 -16
  239. package/dist/{model-resolution-xhfmyyvy.js → model-resolution-nx97z3x7.js} +1 -1
  240. package/dist/plugin/dream-timer.d.ts +1 -1
  241. package/dist/plugin/dream-timer.d.ts.map +1 -1
  242. package/dist/plugin/hooks/create-session-hooks.d.ts +3 -1
  243. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  244. package/dist/plugin/host-stall-profiler-report.d.ts +2 -0
  245. package/dist/plugin/host-stall-profiler-report.d.ts.map +1 -0
  246. package/dist/plugin/host-stall-profiler.d.ts +3 -0
  247. package/dist/plugin/host-stall-profiler.d.ts.map +1 -0
  248. package/dist/plugin/messages-transform.d.ts +21 -19
  249. package/dist/plugin/messages-transform.d.ts.map +1 -1
  250. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  251. package/dist/plugin/tool-registry.d.ts.map +1 -1
  252. package/dist/project-embedding-registry-7qzptcw7.js +88 -0
  253. package/dist/raw-ordinal-warmup-worker.js +60 -0
  254. package/dist/{read-session-chunk-egz7r68d.js → read-session-chunk-6k83m4fj.js} +15 -9
  255. package/dist/read-session-raw-3g9qy1xa.js +58 -0
  256. package/dist/recomp-orchestrator-d3fp1cy0.js +57 -0
  257. package/dist/{v2/safe-notification-target-eb1n1vfb.js → safe-notification-target-5ffqq32m.js} +4 -2
  258. package/dist/search-epax1ecv.js +45 -0
  259. package/dist/{v2/send-session-notification-qs0j78v6.js → send-session-notification-erecz4y4.js} +10 -6
  260. package/dist/shared/auto-search-lifecycle.d.ts +7 -0
  261. package/dist/shared/auto-search-lifecycle.d.ts.map +1 -0
  262. package/dist/shared/conflict-detector.d.ts.map +1 -1
  263. package/dist/shared/historian-tool-expansions.d.ts +1 -1
  264. package/dist/shared/historian-tool-expansions.d.ts.map +1 -1
  265. package/dist/shared/historian-tool-template.d.ts +2 -2
  266. package/dist/shared/historian-tool-template.d.ts.map +1 -1
  267. package/dist/shared/host-stall-profiler-bun.d.ts +46 -0
  268. package/dist/shared/host-stall-profiler-bun.d.ts.map +1 -0
  269. package/dist/shared/host-stall-profiler-common.d.ts +58 -0
  270. package/dist/shared/host-stall-profiler-common.d.ts.map +1 -0
  271. package/dist/shared/host-stall-profiler-node.d.ts +36 -0
  272. package/dist/shared/host-stall-profiler-node.d.ts.map +1 -0
  273. package/dist/shared/host-stall-profiler-report.d.ts +68 -0
  274. package/dist/shared/host-stall-profiler-report.d.ts.map +1 -0
  275. package/dist/shared/host-stall-profiler.d.ts +5 -0
  276. package/dist/shared/host-stall-profiler.d.ts.map +1 -0
  277. package/dist/shared/model-resolution.d.ts +2 -3
  278. package/dist/shared/model-resolution.d.ts.map +1 -1
  279. package/dist/shared/sqlite.d.ts +46 -1
  280. package/dist/shared/sqlite.d.ts.map +1 -1
  281. package/dist/shared/stable-json.d.ts.map +1 -1
  282. package/dist/shared/status-view.d.ts.map +1 -1
  283. package/dist/shared/user-facing-codes.d.ts +0 -5
  284. package/dist/shared/user-facing-codes.d.ts.map +1 -1
  285. package/dist/shared/window-geometry.d.ts +4 -0
  286. package/dist/shared/window-geometry.d.ts.map +1 -1
  287. package/dist/sqlite-context-pragmas-mv9jqwjh.js +6 -0
  288. package/dist/sqlite-mhjkerzq.js +46 -0
  289. package/dist/storage-memory-07fx57k6.js +71 -0
  290. package/dist/storage-tags-d3b0v2ss.js +131 -0
  291. package/dist/{task-config-v81k8jvk.js → task-config-cgpg0nvh.js} +2 -2
  292. package/dist/tools/ctx-expand/render.d.ts.map +1 -1
  293. package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
  294. package/dist/tools/ctx-note/constants.d.ts +4 -0
  295. package/dist/tools/ctx-note/constants.d.ts.map +1 -1
  296. package/dist/tools/ctx-note/tools.d.ts +1 -0
  297. package/dist/tools/ctx-note/tools.d.ts.map +1 -1
  298. package/dist/tools/ctx-search/tools.d.ts.map +1 -1
  299. package/dist/tools/parameter-descriptions.d.ts +2 -2
  300. package/dist/tools/parameter-descriptions.d.ts.map +1 -1
  301. package/dist/{transform-postprocess-phase-bqhz6vdr.js → transform-postprocess-phase-spcy2qre.js} +35 -17
  302. package/dist/transformers-node-wasm.js +18415 -18415
  303. package/dist/v2/auto-search-worker.js +112 -0
  304. package/dist/v2/{context-zecmzk5s.js → context-sf98kstd.js} +8378 -8530
  305. package/dist/v2/{derive-budgets-kdgp4s3r.js → derive-budgets-3vc0y84t.js} +4 -3
  306. package/dist/v2/embedding-activity-g1dhes6g.js +10 -0
  307. package/dist/v2/embedding-backfill-vn8g1nh1.js +21 -0
  308. package/dist/v2/embedding-cache-mgyr73ef.js +16 -0
  309. package/dist/v2/embedding-worker.js +12 -9
  310. package/dist/v2/fold/host-media.d.ts +4 -0
  311. package/dist/v2/fold/host-media.d.ts.map +1 -1
  312. package/dist/v2/fold/memory-cache.d.ts +70 -0
  313. package/dist/v2/fold/memory-cache.d.ts.map +1 -0
  314. package/dist/v2/fold/native-codec.d.ts +10 -0
  315. package/dist/v2/fold/native-codec.d.ts.map +1 -0
  316. package/dist/v2/fold/native-replay.d.ts +58 -0
  317. package/dist/v2/fold/native-replay.d.ts.map +1 -0
  318. package/dist/v2/fold/policy.d.ts +24 -0
  319. package/dist/v2/fold/policy.d.ts.map +1 -0
  320. package/dist/v2/harness-e4avh192.js +10 -0
  321. package/dist/v2/hidden-completion.d.ts.map +1 -1
  322. package/dist/v2/hooks/context.d.ts +2 -2
  323. package/dist/v2/hooks/context.d.ts.map +1 -1
  324. package/dist/v2/hooks/dream-manual.d.ts +1 -1
  325. package/dist/v2/hooks/dream-manual.d.ts.map +1 -1
  326. package/dist/v2/hooks/dream-timer.d.ts.map +1 -1
  327. package/dist/v2/hooks/dream-trigger.d.ts +1 -2
  328. package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
  329. package/dist/v2/hooks/payload.d.ts.map +1 -1
  330. package/dist/v2/hooks/tools.d.ts.map +1 -1
  331. package/dist/v2/hooks/types.d.ts +6 -0
  332. package/dist/v2/hooks/types.d.ts.map +1 -1
  333. package/dist/v2/logger-mxd0ym09.js +19 -0
  334. package/dist/v2/message-index-bounded-dy3s2k1e.js +123 -0
  335. package/dist/{message-time-backfill-68gj6t3e.js → v2/message-time-backfill-gtx1pwk1.js} +7 -7
  336. package/dist/v2/migration-worker.js +24 -15
  337. package/dist/v2/{model-resolution-xhfmyyvy.js → model-resolution-nx97z3x7.js} +1 -1
  338. package/dist/v2/project-embedding-registry-1tgba5dv.js +86 -0
  339. package/dist/v2/raw-ordinal-warmup-worker.js +60 -0
  340. package/dist/v2/{read-session-chunk-8vjp6581.js → read-session-chunk-rh4khdkv.js} +14 -8
  341. package/dist/v2/read-session-raw-bsbmf0vj.js +57 -0
  342. package/dist/v2/recomp-orchestrator-az61rfcg.js +57 -0
  343. package/dist/{safe-notification-target-43r8jsxw.js → v2/safe-notification-target-73ax1p5v.js} +3 -3
  344. package/dist/v2/search-nzkwrc6n.js +45 -0
  345. package/dist/{send-session-notification-dyw42dtr.js → v2/send-session-notification-6km439kn.js} +9 -7
  346. package/dist/{index-5eqk6z3s.js → v2/server-1r6pmz4f.js} +301 -27
  347. package/dist/v2/server-2bvekkfy.js +11 -0
  348. package/dist/v2/server-2fbhp79z.js +3205 -0
  349. package/dist/v2/{server-ajzeteqw.js → server-2ra6pwf3.js} +1 -18
  350. package/dist/v2/server-4dhv7mqz.js +131 -0
  351. package/dist/v2/{server-xa4xe3rv.js → server-4k748ke6.js} +11 -1053
  352. package/dist/v2/{server-vs5gpnd4.js → server-52awr2mw.js} +81 -145
  353. package/dist/v2/{server-1qbnzc80.js → server-5m3dt5r1.js} +136 -148
  354. package/dist/v2/server-686jg6eb.js +3508 -0
  355. package/dist/v2/server-7jzrrxap.js +931 -0
  356. package/dist/v2/server-7wwc2nga.js +3023 -0
  357. package/dist/v2/server-8ajstryz.js +18 -0
  358. package/dist/v2/{server-sfpzqvdz.js → server-8cd2j99z.js} +2 -3
  359. package/dist/v2/server-8pyt7hev.js +3408 -0
  360. package/dist/v2/server-8tqanswc.js +984 -0
  361. package/dist/v2/{server-14vq4kpm.js → server-aan4q8mx.js} +3 -3
  362. package/dist/v2/server-d9vfe7xq.js +16 -0
  363. package/dist/v2/server-e0vdaae2.js +3591 -0
  364. package/dist/v2/server-ezhze64f.js +1048 -0
  365. package/dist/v2/server-fb3zxn06.js +13 -0
  366. package/dist/v2/server-fr0wbhdn.js +43 -0
  367. package/dist/v2/server-g5r0n3b6.js +1137 -0
  368. package/dist/v2/server-gjcr4w98.js +154 -0
  369. package/dist/v2/server-k228xhjg.js +171 -0
  370. package/dist/v2/{server-jc7y02q0.js → server-k8x2rbxc.js} +5119 -10948
  371. package/dist/{index-fg34g6a5.js → v2/server-kb9nn0a0.js} +309 -52
  372. package/dist/v2/{server-g0fjrkta.js → server-mfkzp7qj.js} +28 -28
  373. package/dist/v2/server-pavzsdc6.js +17 -0
  374. package/dist/v2/server-psqc7e9n.js +2106 -0
  375. package/dist/v2/server-qt1qqasc.js +22 -0
  376. package/dist/v2/server-qye6ykf7.js +120 -0
  377. package/dist/v2/{server-qdjnb2z1.js → server-r5p3b1wy.js} +11 -9
  378. package/dist/v2/server-sggvvzhb.js +759 -0
  379. package/dist/v2/{server-y8maxeft.js → server-v06jcv0w.js} +16 -13
  380. package/dist/v2/server-vqpf3167.js +1048 -0
  381. package/dist/v2/{server-c5gz8wph.js → server-x2g40a71.js} +2048 -2059
  382. package/dist/v2/{server-wvjvfhck.js → server-xdfwt6kh.js} +20 -16
  383. package/dist/v2/{server-mcfawjgc.js → server-xxm59eww.js} +25 -44
  384. package/dist/v2/server-yczc713m.js +564 -0
  385. package/dist/v2/{server-3n4q9xme.js → server-z2037m6z.js} +4 -4
  386. package/dist/v2/{server-e29d7p7c.js → server-zm570tr2.js} +166 -160
  387. package/dist/v2/{server-6r257mf5.js → server-zxhgvsf9.js} +3 -3
  388. package/dist/v2/server.js +16 -14
  389. package/dist/v2/sqlite-context-pragmas-mv9jqwjh.js +6 -0
  390. package/dist/v2/sqlite-mhjkerzq.js +46 -0
  391. package/dist/v2/storage-memory-07fx57k6.js +71 -0
  392. package/dist/v2/storage-tags-w4tv77sn.js +130 -0
  393. package/dist/v2/store-reader.d.ts +16 -0
  394. package/dist/v2/store-reader.d.ts.map +1 -1
  395. package/dist/v2/{task-config-tbndqyny.js → task-config-x0hq3qfd.js} +2 -2
  396. package/dist/v2/transformers-node-wasm.js +18415 -18415
  397. package/dist/v2/tui/index.d.ts.map +1 -1
  398. package/dist/v2/tui/types.d.ts +1 -10
  399. package/dist/v2/tui/types.d.ts.map +1 -1
  400. package/dist/v2/{wrapup-orchestrator-0snhvwcv.js → wrapup-orchestrator-mz7efs7w.js} +51 -27
  401. package/dist/wrapup-orchestrator-amzta1t4.js +44 -0
  402. package/package.json +4 -3
  403. package/src/agents/magic-context-prompt.ts +27 -2
  404. package/src/agents/smart-notes-enabled.test.ts +294 -0
  405. package/src/agents/smart-notes-on.golden.json +70 -0
  406. package/src/config/index.test.ts +67 -1
  407. package/src/config/index.ts +8 -0
  408. package/src/config/latch-permanence-guard.test.ts +4 -0
  409. package/src/config/live-run-config.test.ts +37 -1
  410. package/src/config/live-run-config.ts +28 -0
  411. package/src/config/migrate-config-location.ts +10 -3
  412. package/src/config/mural-model-deprecation.ts +24 -0
  413. package/src/config/project-security.hostile-matrix.test.ts +4 -44
  414. package/src/config/project-security.test.ts +9 -14
  415. package/src/config/project-security.ts +13 -55
  416. package/src/config/schema/magic-context.test.ts +6 -5
  417. package/src/config/schema/magic-context.ts +34 -16
  418. package/src/features/magic-context/dreamer/task-registry.ts +6 -0
  419. package/src/shared/auto-search-lifecycle.ts +27 -0
  420. package/src/shared/conflict-detector.test.ts +56 -0
  421. package/src/shared/conflict-detector.ts +16 -5
  422. package/src/shared/historian-tool-defaults.json +6 -6
  423. package/src/shared/historian-tool-expansions.ts +65 -8
  424. package/src/shared/historian-tool-preview-defaults.json +13 -0
  425. package/src/shared/historian-tool-template.ts +48 -14
  426. package/src/shared/host-stall-profiler-bun.ts +358 -0
  427. package/src/shared/host-stall-profiler-common.ts +159 -0
  428. package/src/shared/host-stall-profiler-node.test.ts +234 -0
  429. package/src/shared/host-stall-profiler-node.ts +274 -0
  430. package/src/shared/host-stall-profiler-report.ts +248 -0
  431. package/src/shared/host-stall-profiler.ts +57 -0
  432. package/src/shared/model-resolution.test.ts +54 -17
  433. package/src/shared/model-resolution.ts +6 -17
  434. package/src/shared/sqlite-640-review-r2.test.ts +136 -0
  435. package/src/shared/sqlite-640-review.test.ts +183 -0
  436. package/src/shared/sqlite-acquisition-routing.test.ts +18 -0
  437. package/src/shared/sqlite.test.ts +52 -0
  438. package/src/shared/sqlite.ts +423 -37
  439. package/src/shared/stable-json-linear.test.ts +109 -0
  440. package/src/shared/stable-json.ts +37 -7
  441. package/src/shared/status-view.test.ts +6 -1
  442. package/src/shared/status-view.ts +15 -1
  443. package/src/shared/tag-transcript.ts +6 -0
  444. package/src/shared/user-facing-codes.ts +2 -6
  445. package/src/shared/window-geometry.ts +10 -0
  446. package/src/shared/write-transaction-attribution.test.ts +2 -2
  447. package/src/v2/tui/host-contract.test.ts +41 -67
  448. package/src/v2/tui/index.ts +6 -214
  449. package/src/v2/tui/types.ts +5 -17
  450. package/dist/features/magic-context/checkout-claim-fake-subc.test-support.d.ts +0 -45
  451. package/dist/features/magic-context/checkout-claim-fake-subc.test-support.d.ts.map +0 -1
  452. package/dist/features/magic-context/checkout-claim.d.ts +0 -155
  453. package/dist/features/magic-context/checkout-claim.d.ts.map +0 -1
  454. package/dist/index-3h0ybwah.js +0 -6540
  455. package/dist/index-r5hmbx3t.js +0 -7773
  456. package/dist/recomp-orchestrator-y15j0rb9.js +0 -39
  457. package/dist/v2/recomp-orchestrator-8ejxvrzz.js +0 -39
  458. package/dist/v2/server-frbm99q5.js +0 -7698
  459. package/dist/v2/server-qp5hx1ad.js +0 -6366
  460. package/dist/wrapup-orchestrator-39amhv9s.js +0 -26
  461. /package/dist/{index-en1k8h8m.js → index-2pp04pmg.js} +0 -0
  462. /package/dist/v2/{index-en1k8h8m.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
  }
@@ -118,7 +118,12 @@ describe("status view model", () => {
118
118
  expect(rowLabels("Tags")).toEqual(["Active", "Dropped", "Total"]);
119
119
  expect(rowLabels("Reductions")).toEqual(["Execute threshold", "Last reduce anchor"]);
120
120
  expect(rowLabels("Pending Queue")).toEqual(["Drops", "Marker"]);
121
- expect(rowLabels("Context Details")).toEqual(["Protected tags", "Subagent"]);
121
+ expect(rowLabels("Context Details")).toEqual([
122
+ "Protected tags",
123
+ "Subagent",
124
+ "Denominator",
125
+ "Window source",
126
+ ]);
122
127
  expect(rowLabels("Cache TTL")).toEqual([
123
128
  "Configured",
124
129
  "Last response",
@@ -31,7 +31,11 @@ import {
31
31
  type UserFacingFailureKey,
32
32
  userFacingFailureCode,
33
33
  } from "./user-facing-codes";
34
- import { formatWindowDerivationLine, type WindowGeometryResult } from "./window-geometry";
34
+ import {
35
+ formatWindowDerivationLine,
36
+ formatWindowSource,
37
+ type WindowGeometryResult,
38
+ } from "./window-geometry";
35
39
 
36
40
  /** Theme-independent colour role; each host maps these onto its own palette. */
37
41
  export type StatusTone = "accent" | "text" | "muted" | "warning" | "error";
@@ -656,6 +660,16 @@ function statusSections(source: StatusViewSource, now: number): StatusSection[]
656
660
  tone: "muted",
657
661
  },
658
662
  { label: "Subagent", value: source.isSubagent ? "yes" : "no", tone: "muted" },
663
+ {
664
+ label: "Denominator",
665
+ value: `${Math.round(source.contextLimit)} tokens`,
666
+ tone: "muted",
667
+ },
668
+ {
669
+ label: "Window source",
670
+ value: formatWindowSource(source.windowGeometry),
671
+ tone: "muted",
672
+ },
659
673
  ],
660
674
  },
661
675
  { title: "Cache TTL", labelWidth: 14, rows: cacheRows(source, now) },
@@ -1157,6 +1157,10 @@ function buildAggregateTarget(
1157
1157
  };
1158
1158
 
1159
1159
  return {
1160
+ mutationParts: occurrences.map((occ) => ({
1161
+ message: { info: occ.message.info, parts: [] },
1162
+ part: occ.part,
1163
+ })),
1160
1164
  measureReclaim(skeleton) {
1161
1165
  let beforeTools = 0;
1162
1166
  let afterTools = 0;
@@ -1319,6 +1323,7 @@ function buildTextTarget(
1319
1323
  textPrefix: string,
1320
1324
  ): TagTarget {
1321
1325
  return {
1326
+ mutationParts: [{ message: { info: message.info, parts: [] }, part }],
1322
1327
  textPrefix,
1323
1328
  setContent(content: string): boolean {
1324
1329
  return part.setText(content);
@@ -1351,6 +1356,7 @@ function buildToolTarget(
1351
1356
  tagId: number,
1352
1357
  ): TagTarget {
1353
1358
  return {
1359
+ mutationParts: [{ message: { info: message.info, parts: [] }, part }],
1354
1360
  setContent(content: string): boolean {
1355
1361
  return setToolContentOrText(part, content);
1356
1362
  },
@@ -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.",
@@ -89,6 +89,8 @@ export interface WindowDerivation {
89
89
  geometry: WindowGeometry;
90
90
  windowSource: WindowLimitSource;
91
91
  absoluteWall: number;
92
+ /** Accepted provider input used to raise the usable denominator above metadata. */
93
+ provenInputTokens?: number;
92
94
  }
93
95
 
94
96
  export interface WindowGeometryResult {
@@ -691,6 +693,7 @@ export function applyProvenInputFloor(
691
693
  absoluteWall: trustedAbsoluteWall
692
694
  ? geometry.derivation.absoluteWall
693
695
  : Math.max(geometry.derivation.absoluteWall, provenInputTokens),
696
+ provenInputTokens,
694
697
  },
695
698
  },
696
699
  };
@@ -715,6 +718,13 @@ export function formatWindowDerivationLine(
715
718
  return `${formatCompactTokens(inputTokens)} / ${formatCompactTokens(result.usableSoft)} usable · window ${formatCompactTokens(result.derivation.window)} · ${formatCompactTokens(result.derivation.reserve)} ${reserveLabel}`;
716
719
  }
717
720
 
721
+ /** Distinguish metadata from a denominator raised by an accepted input measurement. */
722
+ export function formatWindowSource(result: WindowGeometryResult | undefined): string {
723
+ return result?.derivation.provenInputTokens
724
+ ? `provider-measured floor (${result.derivation.windowSource})`
725
+ : (result?.derivation.windowSource ?? "unknown");
726
+ }
727
+
718
728
  export function formatCompactTokens(value: number): string {
719
729
  if (Math.abs(value) >= 1_000_000) {
720
730
  return `${(value / 1_000_000).toFixed(1).replace(/\.0$/, "")}m`;
@@ -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;
@@ -1,10 +1,12 @@
1
- import { afterEach, expect, spyOn, test } from "bun:test";
1
+ import { afterEach, expect, test } from "bun:test";
2
2
  import { rmSync } from "node:fs";
3
3
  import { tmpdir } from "node:os";
4
4
  import { resolve } from "node:path";
5
5
  import { Host } from "@opencode/plugin/host";
6
- import * as logger from "../../shared/logger";
6
+ import type { MagicContextRpcServer } from "../../shared/rpc-server";
7
7
  import { createTestTempDirFromPath } from "../../shared/test-temp-dir";
8
+ import { registerV2Commands } from "../hooks/commands";
9
+ import type { V2CommandDomain } from "../hooks/types";
8
10
  import { setupWithJsx } from "./index";
9
11
  import type { V2SidebarState, V2SlotClaim, V2TuiContext } from "./types";
10
12
 
@@ -110,7 +112,7 @@ function v1Api(directory: string) {
110
112
  };
111
113
  }
112
114
 
113
- test("GA 2.0.5 resolves ./tui and executes the union setup contract", async () => {
115
+ test("GA 2.0.5 registers each /ctx-* command once on the server, not the TUI keymap", async () => {
114
116
  const packageRoot = resolve(import.meta.dir, "../../..");
115
117
  const entrypoints = Host.resolve({
116
118
  name: "@cortexkit/opencode-magic-context",
@@ -125,76 +127,48 @@ test("GA 2.0.5 resolves ./tui and executes the union setup contract", async () =
125
127
  };
126
128
  };
127
129
  expect(typeof loaded.default.setup).toBe("function");
128
- const fixture = v2Context();
129
- const cleanup = await setupWithJsx(fixture.context, (type, props) => ({ type, props }));
130
- expect(fixture.claims.map((claim) => claim.append)).toEqual(["sidebar.content"]);
131
- const sidebarClaim = fixture.claims[0]!;
132
- if (sidebarClaim.append !== "sidebar.content") throw new Error("expected the sidebar claim");
133
- expect(sidebarClaim.render({ sessionID: "ses-v2-tui" })).toEqual({
134
- type: "text",
135
- props: { children: expect.stringContaining("Magic Context") },
136
- });
137
- expect(fixture.layers[0]!.commands.map((command) => command.slash.name)).toEqual([
138
- "ctx-status",
139
- "ctx-recomp",
140
- "ctx-dream",
141
- "ctx-flush",
142
- "ctx-embed",
143
- "ctx-wrapup",
144
- ]);
145
- cleanup();
146
- });
147
-
148
- test("GA 2.0.5 registers the keymap layer from the app slot when setup runs outside the provider", async () => {
149
- const fixture = v2Context();
150
- let providerAvailable = false;
151
- Object.assign(fixture.context.keymap, {
152
- layer: (input: () => unknown) => {
153
- if (!providerAvailable) throw new Error("Keymap.Provider is missing");
154
- fixture.layers.push(input() as never);
130
+ const serverCommands: string[] = [];
131
+ const commandDomain: V2CommandDomain = {
132
+ async transform(callback) {
133
+ callback({ add: (definition) => serverCommands.push(definition.name) });
155
134
  },
135
+ async reload() {},
136
+ };
137
+ const serverRegistered = await registerV2Commands({
138
+ command: commandDomain,
139
+ rpc: { dispatch: async () => ({}) } as unknown as MagicContextRpcServer,
140
+ directory: process.cwd(),
141
+ compactionEnabled: true,
156
142
  });
157
- const cleanup = await setupWithJsx(fixture.context, (type, props) => ({ type, props }));
158
- expect(fixture.claims.map((claim) => claim.append)).toEqual(["sidebar.content", "app"]);
159
- expect(fixture.layers).toHaveLength(0);
143
+ expect(serverRegistered).toBe(true);
160
144
 
161
- // The app slot render executes inside the component tree, where the provider resolves.
162
- providerAvailable = true;
163
- const appClaim = fixture.claims.find((claim) => claim.append === "app");
164
- if (appClaim?.append !== "app") throw new Error("expected the app slot claim");
165
- appClaim.render({});
166
- expect(
167
- fixture.layers.map((layer) => layer.commands.map((command) => command.slash.name)),
168
- ).toEqual([["ctx-status", "ctx-recomp", "ctx-dream", "ctx-flush", "ctx-embed", "ctx-wrapup"]]);
169
- // Repeated renders must not stack duplicate layers.
170
- appClaim.render({});
171
- expect(fixture.layers).toHaveLength(1);
172
- cleanup();
173
- });
174
-
175
- test("GA 2.0.5 keeps the sidebar when the app-slot keymap registration also fails", async () => {
176
145
  const fixture = v2Context();
177
- Object.assign(fixture.context.keymap, {
178
- layer: () => {
179
- throw new Error("Keymap.Provider is missing");
180
- },
181
- });
182
- // The gap is recorded in the plugin log; the TUI host drops console output.
183
- const logged = spyOn(logger, "log");
146
+ const cleanup = await setupWithJsx(fixture.context, (type, props) => ({ type, props }));
184
147
  try {
185
- const cleanup = await setupWithJsx(fixture.context, (type, props) => ({ type, props }));
186
- expect(fixture.claims.map((claim) => claim.append)).toEqual(["sidebar.content", "app"]);
187
- const appClaim = fixture.claims.find((claim) => claim.append === "app");
188
- if (appClaim?.append !== "app") throw new Error("expected the app slot claim");
189
- appClaim.render({});
190
- appClaim.render({});
191
- expect(fixture.layers).toHaveLength(0);
192
- expect(
193
- logged.mock.calls.filter(([line]) => line.includes("keymap.layer is unavailable")),
194
- ).toHaveLength(1);
195
- cleanup();
148
+ expect(fixture.claims.map((claim) => claim.append)).toEqual(["sidebar.content"]);
149
+ const sidebarClaim = fixture.claims[0]!;
150
+ if (sidebarClaim.append !== "sidebar.content")
151
+ throw new Error("expected the sidebar claim");
152
+ expect(sidebarClaim.render({ sessionID: "ses-v2-tui" })).toEqual({
153
+ type: "text",
154
+ props: { children: expect.stringContaining("Magic Context") },
155
+ });
156
+ const tuiCommands = fixture.layers.flatMap((layer) =>
157
+ layer.commands.map((command) => command.slash.name),
158
+ );
159
+ const allRegistrations = [...serverCommands, ...tuiCommands].sort();
160
+ const expectedCommands = [
161
+ "ctx-dream",
162
+ "ctx-embed",
163
+ "ctx-flush",
164
+ "ctx-recomp",
165
+ "ctx-status",
166
+ "ctx-wrapup",
167
+ ];
168
+ expect(allRegistrations).toEqual(expectedCommands);
169
+ expect(new Set(allRegistrations).size).toBe(expectedCommands.length);
196
170
  } finally {
197
- logged.mockRestore();
171
+ cleanup();
198
172
  }
199
173
  });
200
174