@cortexkit/opencode-magic-context 0.44.4 → 0.45.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (679) hide show
  1. package/dist/agents/hidden-agent-registrations.d.ts +3 -2
  2. package/dist/agents/hidden-agent-registrations.d.ts.map +1 -1
  3. package/dist/agents/magic-context-prompt.d.ts +1 -0
  4. package/dist/agents/magic-context-prompt.d.ts.map +1 -1
  5. package/dist/agents/permissions.d.ts +8 -28
  6. package/dist/agents/permissions.d.ts.map +1 -1
  7. package/dist/{announcement-n8hs7kjw.js → announcement-f75t58v9.js} +4 -2
  8. package/dist/config/index.d.ts.map +1 -1
  9. package/dist/config/project-security.d.ts +48 -0
  10. package/dist/config/project-security.d.ts.map +1 -1
  11. package/dist/config/raw-loader.d.ts.map +1 -1
  12. package/dist/config/schema/magic-context.d.ts +10 -7
  13. package/dist/config/schema/magic-context.d.ts.map +1 -1
  14. package/dist/{conflict-warning-hook-hmpzxep6.js → conflict-warning-hook-5yrz2r24.js} +10 -6
  15. package/dist/{derive-budgets-ncwn1jk9.js → derive-budgets-a63zsm5c.js} +3 -3
  16. package/dist/embedding-worker.js +49 -0
  17. package/dist/emscripten-module-0g8f45e6.js +602 -0
  18. package/dist/emscripten-module-0pekdjxz.js +1532 -0
  19. package/dist/emscripten-module-e67xwsp3.js +503 -0
  20. package/dist/emscripten-module-pj1vyb44.js +4559 -0
  21. package/dist/features/magic-context/compartment-chunk-embedding.d.ts +23 -3
  22. package/dist/features/magic-context/compartment-chunk-embedding.d.ts.map +1 -1
  23. package/dist/features/magic-context/compartment-embedding.d.ts.map +1 -1
  24. package/dist/features/magic-context/compartment-storage.d.ts +14 -3
  25. package/dist/features/magic-context/compartment-storage.d.ts.map +1 -1
  26. package/dist/features/magic-context/context-store-uuid.d.ts +7 -0
  27. package/dist/features/magic-context/context-store-uuid.d.ts.map +1 -0
  28. package/dist/features/magic-context/dreamer/classify.d.ts +1 -3
  29. package/dist/features/magic-context/dreamer/classify.d.ts.map +1 -1
  30. package/dist/features/magic-context/dreamer/cron.d.ts +5 -4
  31. package/dist/features/magic-context/dreamer/cron.d.ts.map +1 -1
  32. package/dist/features/magic-context/dreamer/docs-proposals.d.ts.map +1 -1
  33. package/dist/features/magic-context/dreamer/evaluate-smart-notes.d.ts.map +1 -1
  34. package/dist/features/magic-context/dreamer/expire-memories.d.ts.map +1 -1
  35. package/dist/features/magic-context/dreamer/idle-schedule-prune.d.ts +24 -0
  36. package/dist/features/magic-context/dreamer/idle-schedule-prune.d.ts.map +1 -0
  37. package/dist/features/magic-context/dreamer/manual-summary.d.ts.map +1 -1
  38. package/dist/features/magic-context/dreamer/map-memories.d.ts +5 -5
  39. package/dist/features/magic-context/dreamer/module-apply.d.ts +4 -25
  40. package/dist/features/magic-context/dreamer/module-apply.d.ts.map +1 -1
  41. package/dist/features/magic-context/dreamer/retrospective-learnings.d.ts.map +1 -1
  42. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts +5 -1
  43. package/dist/features/magic-context/dreamer/storage-dream-runs.d.ts.map +1 -1
  44. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts +12 -5
  45. package/dist/features/magic-context/dreamer/storage-task-schedule.d.ts.map +1 -1
  46. package/dist/features/magic-context/dreamer/task-executor.d.ts +6 -0
  47. package/dist/features/magic-context/dreamer/task-executor.d.ts.map +1 -1
  48. package/dist/features/magic-context/dreamer/task-gates.d.ts +34 -0
  49. package/dist/features/magic-context/dreamer/task-gates.d.ts.map +1 -1
  50. package/dist/features/magic-context/dreamer/task-prompts.d.ts +1 -1
  51. package/dist/features/magic-context/dreamer/task-prompts.d.ts.map +1 -1
  52. package/dist/features/magic-context/dreamer/task-registry.d.ts +7 -5
  53. package/dist/features/magic-context/dreamer/task-registry.d.ts.map +1 -1
  54. package/dist/features/magic-context/dreamer/task-scheduler.d.ts +10 -3
  55. package/dist/features/magic-context/dreamer/task-scheduler.d.ts.map +1 -1
  56. package/dist/features/magic-context/dreamer/token-budget.d.ts +3 -0
  57. package/dist/features/magic-context/dreamer/token-budget.d.ts.map +1 -1
  58. package/dist/features/magic-context/dreamer/verify.d.ts +2 -2
  59. package/dist/features/magic-context/dreamer/verify.d.ts.map +1 -1
  60. package/dist/features/magic-context/git-commits/git-log-reader.d.ts +11 -2
  61. package/dist/features/magic-context/git-commits/git-log-reader.d.ts.map +1 -1
  62. package/dist/features/magic-context/git-commits/indexer.d.ts.map +1 -1
  63. package/dist/features/magic-context/git-commits/search-git-commits.d.ts.map +1 -1
  64. package/dist/features/magic-context/git-commits/storage-git-commits.d.ts +2 -0
  65. package/dist/features/magic-context/git-commits/storage-git-commits.d.ts.map +1 -1
  66. package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts +6 -0
  67. package/dist/features/magic-context/legacy-authority-fixture.test-support.d.ts.map +1 -0
  68. package/dist/features/magic-context/lkg-prefix-chunks.d.ts +53 -0
  69. package/dist/features/magic-context/lkg-prefix-chunks.d.ts.map +1 -0
  70. package/dist/features/magic-context/memory/embedding-backfill.d.ts.map +1 -1
  71. package/dist/features/magic-context/memory/embedding-local.d.ts +8 -0
  72. package/dist/features/magic-context/memory/embedding-local.d.ts.map +1 -1
  73. package/dist/features/magic-context/memory/embedding-openai.d.ts.map +1 -1
  74. package/dist/features/magic-context/memory/embedding-worker-client.d.ts +27 -0
  75. package/dist/features/magic-context/memory/embedding-worker-client.d.ts.map +1 -0
  76. package/dist/features/magic-context/memory/embedding-worker.d.ts +2 -0
  77. package/dist/features/magic-context/memory/embedding-worker.d.ts.map +1 -0
  78. package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts +2 -0
  79. package/dist/features/magic-context/memory/embedding-worker.fixture.d.ts.map +1 -0
  80. package/dist/features/magic-context/memory/memory-selection.d.ts.map +1 -1
  81. package/dist/features/magic-context/memory/project-identity-cache.d.ts +4 -3
  82. package/dist/features/magic-context/memory/project-identity-cache.d.ts.map +1 -1
  83. package/dist/features/magic-context/memory/project-identity.d.ts.map +1 -1
  84. package/dist/features/magic-context/memory/storage-memory-fts.d.ts.map +1 -1
  85. package/dist/features/magic-context/memory/visibility.d.ts +1 -1
  86. package/dist/features/magic-context/memory/visibility.d.ts.map +1 -1
  87. package/dist/features/magic-context/message-fts-rowid-map.d.ts +14 -1
  88. package/dist/features/magic-context/message-fts-rowid-map.d.ts.map +1 -1
  89. package/dist/features/magic-context/message-fts-session-filter.d.ts +14 -0
  90. package/dist/features/magic-context/message-fts-session-filter.d.ts.map +1 -0
  91. package/dist/features/magic-context/message-index.d.ts +1 -7
  92. package/dist/features/magic-context/message-index.d.ts.map +1 -1
  93. package/dist/features/magic-context/message-time-backfill.d.ts.map +1 -1
  94. package/dist/features/magic-context/migration-v94-write-split.d.ts +62 -0
  95. package/dist/features/magic-context/migration-v94-write-split.d.ts.map +1 -0
  96. package/dist/features/magic-context/migration-worker-client.d.ts +23 -0
  97. package/dist/features/magic-context/migration-worker-client.d.ts.map +1 -0
  98. package/dist/features/magic-context/migration-worker-protocol.d.ts +30 -0
  99. package/dist/features/magic-context/migration-worker-protocol.d.ts.map +1 -0
  100. package/dist/features/magic-context/migration-worker.d.ts +2 -0
  101. package/dist/features/magic-context/migration-worker.d.ts.map +1 -0
  102. package/dist/features/magic-context/migrations.d.ts +7 -0
  103. package/dist/features/magic-context/migrations.d.ts.map +1 -1
  104. package/dist/features/magic-context/mural/render-mural.d.ts +24 -2
  105. package/dist/features/magic-context/mural/render-mural.d.ts.map +1 -1
  106. package/dist/features/magic-context/mural/render-trigger.d.ts +1 -1
  107. package/dist/features/magic-context/mural/render-trigger.d.ts.map +1 -1
  108. package/dist/features/magic-context/overflow-detection.d.ts +18 -7
  109. package/dist/features/magic-context/overflow-detection.d.ts.map +1 -1
  110. package/dist/features/magic-context/project-embedding-registry.d.ts +2 -0
  111. package/dist/features/magic-context/project-embedding-registry.d.ts.map +1 -1
  112. package/dist/features/magic-context/range-parser.d.ts +2 -3
  113. package/dist/features/magic-context/range-parser.d.ts.map +1 -1
  114. package/dist/features/magic-context/resolve-subagent-fallback.d.ts +2 -0
  115. package/dist/features/magic-context/resolve-subagent-fallback.d.ts.map +1 -1
  116. package/dist/features/magic-context/scheduler.d.ts +2 -0
  117. package/dist/features/magic-context/scheduler.d.ts.map +1 -1
  118. package/dist/features/magic-context/search.d.ts +7 -0
  119. package/dist/features/magic-context/search.d.ts.map +1 -1
  120. package/dist/features/magic-context/session-project-backfill.d.ts.map +1 -1
  121. package/dist/features/magic-context/session-project-storage.d.ts +10 -1
  122. package/dist/features/magic-context/session-project-storage.d.ts.map +1 -1
  123. package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts +1 -1
  124. package/dist/features/magic-context/smart-notes/compiler-prompt.d.ts.map +1 -1
  125. package/dist/features/magic-context/smart-notes/compiler.d.ts +4 -0
  126. package/dist/features/magic-context/smart-notes/compiler.d.ts.map +1 -1
  127. package/dist/features/magic-context/smart-notes/runner.d.ts.map +1 -1
  128. package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts +2 -0
  129. package/dist/features/magic-context/smart-notes/sandbox-runner.d.ts.map +1 -1
  130. package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts +10 -8
  131. package/dist/features/magic-context/smart-notes/ssrf-guard.d.ts.map +1 -1
  132. package/dist/features/magic-context/smart-notes/storage.d.ts +2 -2
  133. package/dist/features/magic-context/smart-notes/storage.d.ts.map +1 -1
  134. package/dist/features/magic-context/smart-notes/types.d.ts +7 -2
  135. package/dist/features/magic-context/smart-notes/types.d.ts.map +1 -1
  136. package/dist/features/magic-context/storage-caveman-rules.d.ts +21 -0
  137. package/dist/features/magic-context/storage-caveman-rules.d.ts.map +1 -0
  138. package/dist/features/magic-context/storage-clone.d.ts.map +1 -1
  139. package/dist/features/magic-context/storage-compartment-history-version.d.ts +4 -0
  140. package/dist/features/magic-context/storage-compartment-history-version.d.ts.map +1 -0
  141. package/dist/features/magic-context/storage-db.d.ts +62 -2
  142. package/dist/features/magic-context/storage-db.d.ts.map +1 -1
  143. package/dist/features/magic-context/storage-identity-merge.d.ts +6 -0
  144. package/dist/features/magic-context/storage-identity-merge.d.ts.map +1 -1
  145. package/dist/features/magic-context/storage-meta-persisted.d.ts +15 -0
  146. package/dist/features/magic-context/storage-meta-persisted.d.ts.map +1 -1
  147. package/dist/features/magic-context/storage-meta-session.d.ts +1 -1
  148. package/dist/features/magic-context/storage-meta-session.d.ts.map +1 -1
  149. package/dist/features/magic-context/storage-meta-shared.d.ts +1 -1
  150. package/dist/features/magic-context/storage-meta-shared.d.ts.map +1 -1
  151. package/dist/features/magic-context/storage-notes.d.ts +2 -2
  152. package/dist/features/magic-context/storage-notes.d.ts.map +1 -1
  153. package/dist/features/magic-context/storage-reasoning-removal.d.ts +30 -0
  154. package/dist/features/magic-context/storage-reasoning-removal.d.ts.map +1 -0
  155. package/dist/features/magic-context/storage-replay-document.d.ts +42 -5
  156. package/dist/features/magic-context/storage-replay-document.d.ts.map +1 -1
  157. package/dist/features/magic-context/storage-session-tables.d.ts.map +1 -1
  158. package/dist/features/magic-context/storage-tags.d.ts +7 -1
  159. package/dist/features/magic-context/storage-tags.d.ts.map +1 -1
  160. package/dist/features/magic-context/storage.d.ts +1 -1
  161. package/dist/features/magic-context/storage.d.ts.map +1 -1
  162. package/dist/features/magic-context/store-generation-rebase.d.ts.map +1 -1
  163. package/dist/features/magic-context/tag-input.d.ts +4 -0
  164. package/dist/features/magic-context/tag-input.d.ts.map +1 -0
  165. package/dist/features/magic-context/transform-decision-log.d.ts.map +1 -1
  166. package/dist/features/magic-context/user-memory/review-user-memories.d.ts.map +1 -1
  167. package/dist/features/magic-context/user-memory/storage-user-memory.d.ts.map +1 -1
  168. package/dist/ffi-3cx1cxpk.js +78 -0
  169. package/dist/ffi-7bqqe4cd.js +91 -0
  170. package/dist/ffi-7e6gryj5.js +91 -0
  171. package/dist/ffi-bpvkebwr.js +78 -0
  172. package/dist/hooks/magic-context/apply-operations.d.ts +9 -1
  173. package/dist/hooks/magic-context/apply-operations.d.ts.map +1 -1
  174. package/dist/hooks/magic-context/auto-search-deadline.d.ts +10 -0
  175. package/dist/hooks/magic-context/auto-search-deadline.d.ts.map +1 -0
  176. package/dist/hooks/magic-context/auto-search-hint.d.ts +3 -0
  177. package/dist/hooks/magic-context/auto-search-hint.d.ts.map +1 -1
  178. package/dist/hooks/magic-context/auto-search-runner.d.ts +3 -0
  179. package/dist/hooks/magic-context/auto-search-runner.d.ts.map +1 -1
  180. package/dist/hooks/magic-context/caveman-cleanup.d.ts +8 -1
  181. package/dist/hooks/magic-context/caveman-cleanup.d.ts.map +1 -1
  182. package/dist/hooks/magic-context/caveman.d.ts +56 -1
  183. package/dist/hooks/magic-context/caveman.d.ts.map +1 -1
  184. package/dist/hooks/magic-context/child-session-spawn.d.ts +2 -0
  185. package/dist/hooks/magic-context/child-session-spawn.d.ts.map +1 -1
  186. package/dist/hooks/magic-context/command-handler.d.ts +1 -1
  187. package/dist/hooks/magic-context/command-handler.d.ts.map +1 -1
  188. package/dist/hooks/magic-context/compaction-marker-manager.d.ts +1 -1
  189. package/dist/hooks/magic-context/compaction-marker-manager.d.ts.map +1 -1
  190. package/dist/hooks/magic-context/compartment-parser.d.ts +3 -3
  191. package/dist/hooks/magic-context/compartment-parser.d.ts.map +1 -1
  192. package/dist/hooks/magic-context/compartment-runner-historian.d.ts.map +1 -1
  193. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts +0 -1
  194. package/dist/hooks/magic-context/compartment-runner-incremental.d.ts.map +1 -1
  195. package/dist/hooks/magic-context/compartment-runner-partial-recomp.d.ts.map +1 -1
  196. package/dist/hooks/magic-context/compartment-runner-recomp.d.ts.map +1 -1
  197. package/dist/hooks/magic-context/compartment-runner-types.d.ts +3 -0
  198. package/dist/hooks/magic-context/compartment-runner-types.d.ts.map +1 -1
  199. package/dist/hooks/magic-context/compartment-runner-validation.d.ts +6 -0
  200. package/dist/hooks/magic-context/compartment-runner-validation.d.ts.map +1 -1
  201. package/dist/hooks/magic-context/compartment-trigger.d.ts.map +1 -1
  202. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts +35 -0
  203. package/dist/hooks/magic-context/degraded-pass-refusal.d.ts.map +1 -0
  204. package/dist/hooks/magic-context/derive-budgets.d.ts.map +1 -1
  205. package/dist/hooks/magic-context/dropped-input-guard.d.ts.map +1 -1
  206. package/dist/hooks/magic-context/embed-history-runner.d.ts.map +1 -1
  207. package/dist/hooks/magic-context/emergency-drop.d.ts +15 -0
  208. package/dist/hooks/magic-context/emergency-drop.d.ts.map +1 -1
  209. package/dist/hooks/magic-context/event-handler.d.ts.map +1 -1
  210. package/dist/hooks/magic-context/execute-status.d.ts +1 -0
  211. package/dist/hooks/magic-context/execute-status.d.ts.map +1 -1
  212. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts +17 -0
  213. package/dist/hooks/magic-context/final-wire-token-estimate.d.ts.map +1 -1
  214. package/dist/hooks/magic-context/heuristic-cleanup.d.ts +2 -0
  215. package/dist/hooks/magic-context/heuristic-cleanup.d.ts.map +1 -1
  216. package/dist/hooks/magic-context/historian-host-runner.d.ts +5 -0
  217. package/dist/hooks/magic-context/historian-host-runner.d.ts.map +1 -1
  218. package/dist/hooks/magic-context/historian-prompt-fit.d.ts +116 -0
  219. package/dist/hooks/magic-context/historian-prompt-fit.d.ts.map +1 -0
  220. package/dist/hooks/magic-context/historian-prompt.generated.d.ts +1 -1
  221. package/dist/hooks/magic-context/historian-prompt.generated.d.ts.map +1 -1
  222. package/dist/hooks/magic-context/history-boundary-repair.d.ts +44 -0
  223. package/dist/hooks/magic-context/history-boundary-repair.d.ts.map +1 -0
  224. package/dist/hooks/magic-context/hook.d.ts +4 -0
  225. package/dist/hooks/magic-context/hook.d.ts.map +1 -1
  226. package/dist/hooks/magic-context/inject-compartments.d.ts +8 -0
  227. package/dist/hooks/magic-context/inject-compartments.d.ts.map +1 -1
  228. package/dist/hooks/magic-context/lkg-persist.d.ts +12 -0
  229. package/dist/hooks/magic-context/lkg-persist.d.ts.map +1 -1
  230. package/dist/hooks/magic-context/lkg-replay-fit.d.ts +104 -0
  231. package/dist/hooks/magic-context/lkg-replay-fit.d.ts.map +1 -0
  232. package/dist/hooks/magic-context/lkg-replay.d.ts +64 -0
  233. package/dist/hooks/magic-context/lkg-replay.d.ts.map +1 -1
  234. package/dist/hooks/magic-context/module-client.d.ts.map +1 -1
  235. package/dist/hooks/magic-context/module-state-sync-timing.d.ts +1 -1
  236. package/dist/hooks/magic-context/module-state-sync-timing.d.ts.map +1 -1
  237. package/dist/hooks/magic-context/module-state-sync.d.ts +6 -68
  238. package/dist/hooks/magic-context/module-state-sync.d.ts.map +1 -1
  239. package/dist/hooks/magic-context/module-tool-backends.d.ts +1 -34
  240. package/dist/hooks/magic-context/module-tool-backends.d.ts.map +1 -1
  241. package/dist/hooks/magic-context/module-transport.d.ts +1 -55
  242. package/dist/hooks/magic-context/module-transport.d.ts.map +1 -1
  243. package/dist/hooks/magic-context/module-wire.d.ts.map +1 -1
  244. package/dist/hooks/magic-context/note-nudger.d.ts +2 -0
  245. package/dist/hooks/magic-context/note-nudger.d.ts.map +1 -1
  246. package/dist/hooks/magic-context/pass-outcome.d.ts +59 -2
  247. package/dist/hooks/magic-context/pass-outcome.d.ts.map +1 -1
  248. package/dist/hooks/magic-context/producer-window-guard.d.ts +6 -0
  249. package/dist/hooks/magic-context/producer-window-guard.d.ts.map +1 -1
  250. package/dist/hooks/magic-context/read-session-chunk.d.ts +13 -2
  251. package/dist/hooks/magic-context/read-session-chunk.d.ts.map +1 -1
  252. package/dist/hooks/magic-context/read-session-formatting.d.ts +11 -0
  253. package/dist/hooks/magic-context/read-session-formatting.d.ts.map +1 -1
  254. package/dist/hooks/magic-context/reasoning-removal.d.ts +60 -0
  255. package/dist/hooks/magic-context/reasoning-removal.d.ts.map +1 -0
  256. package/dist/hooks/magic-context/recomp-orchestrator.d.ts +1 -0
  257. package/dist/hooks/magic-context/recomp-orchestrator.d.ts.map +1 -1
  258. package/dist/hooks/magic-context/reference-retrieval.d.ts +1 -1
  259. package/dist/hooks/magic-context/reference-retrieval.d.ts.map +1 -1
  260. package/dist/hooks/magic-context/reply-pages.d.ts +3 -0
  261. package/dist/hooks/magic-context/reply-pages.d.ts.map +1 -0
  262. package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts +62 -0
  263. package/dist/hooks/magic-context/rust-lkg-freeze-registry.d.ts.map +1 -0
  264. package/dist/hooks/magic-context/rust-mode-transform.d.ts +17 -85
  265. package/dist/hooks/magic-context/rust-mode-transform.d.ts.map +1 -1
  266. package/dist/hooks/magic-context/send-session-notification.d.ts.map +1 -1
  267. package/dist/hooks/magic-context/sentinel.d.ts +35 -0
  268. package/dist/hooks/magic-context/sentinel.d.ts.map +1 -1
  269. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts +28 -0
  270. package/dist/hooks/magic-context/shared-compartment-boundaries.d.ts.map +1 -0
  271. package/dist/hooks/magic-context/single-store-refusal.d.ts +14 -0
  272. package/dist/hooks/magic-context/single-store-refusal.d.ts.map +1 -0
  273. package/dist/hooks/magic-context/storage-busy-refusal.d.ts +7 -0
  274. package/dist/hooks/magic-context/storage-busy-refusal.d.ts.map +1 -1
  275. package/dist/hooks/magic-context/strip-content.d.ts.map +1 -1
  276. package/dist/hooks/magic-context/stripped-command.d.ts +1 -1
  277. package/dist/hooks/magic-context/stripped-command.d.ts.map +1 -1
  278. package/dist/hooks/magic-context/system-injection-stripper.d.ts +7 -0
  279. package/dist/hooks/magic-context/system-injection-stripper.d.ts.map +1 -1
  280. package/dist/hooks/magic-context/system-prompt-hash.d.ts.map +1 -1
  281. package/dist/hooks/magic-context/tag-content-primitives.d.ts.map +1 -1
  282. package/dist/hooks/magic-context/tag-id-fallback.d.ts.map +1 -1
  283. package/dist/hooks/magic-context/tag-messages.d.ts +18 -1
  284. package/dist/hooks/magic-context/tag-messages.d.ts.map +1 -1
  285. package/dist/hooks/magic-context/tail-hygiene-walk.d.ts.map +1 -1
  286. package/dist/hooks/magic-context/tool-drop-target.d.ts.map +1 -1
  287. package/dist/hooks/magic-context/transform-compartment-phase.d.ts +1 -0
  288. package/dist/hooks/magic-context/transform-compartment-phase.d.ts.map +1 -1
  289. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts +37 -4
  290. package/dist/hooks/magic-context/transform-postprocess-phase.d.ts.map +1 -1
  291. package/dist/hooks/magic-context/transform.d.ts +12 -39
  292. package/dist/hooks/magic-context/transform.d.ts.map +1 -1
  293. package/dist/hooks/magic-context/unmanaged-over-window.d.ts +36 -0
  294. package/dist/hooks/magic-context/unmanaged-over-window.d.ts.map +1 -0
  295. package/dist/hooks/magic-context/unresolved-history-boundary.d.ts +15 -0
  296. package/dist/hooks/magic-context/unresolved-history-boundary.d.ts.map +1 -0
  297. package/dist/hooks/magic-context/user-profile-render.d.ts +3 -0
  298. package/dist/hooks/magic-context/user-profile-render.d.ts.map +1 -0
  299. package/dist/hooks/magic-context/wrapup-orchestrator.d.ts.map +1 -1
  300. package/dist/{index-sqp1hz9v.js → index-16ny736w.js} +10190 -25296
  301. package/dist/{index-mrc0twf3.js → index-2aq21j41.js} +1201 -428
  302. package/dist/{index-32b096cc.js → index-2ntg5sd4.js} +6 -2
  303. package/dist/index-4krbw8z9.js +6034 -0
  304. package/dist/{index-33q7s9y2.js → index-75zjgwga.js} +61 -85
  305. package/dist/{index-zx7pmr39.js → index-8fgkmxmy.js} +28 -10
  306. package/dist/index-a4m2b1yv.js +530 -0
  307. package/dist/index-anq4nn6f.js +131 -0
  308. package/dist/index-avwt563y.js +62 -0
  309. package/dist/index-bmzf7zxv.js +445 -0
  310. package/dist/index-e44zzy84.js +10 -0
  311. package/dist/index-en1k8h8m.js +244 -0
  312. package/dist/{index-638hf49n.js → index-f85teqck.js} +15 -6
  313. package/dist/index-fr2z4qy8.js +7810 -0
  314. package/dist/{index-kwe03yde.js → index-fzbvakh0.js} +1 -1
  315. package/dist/{module-asyncify-2EFITU5U-rkqjhjxd.js → index-g20jdh0p.js} +114 -105
  316. package/dist/index-gd5qx1j9.js +398 -0
  317. package/dist/{index-3bygzk2d.js → index-hybnrwq0.js} +169 -4
  318. package/dist/{index-jqcbs2k1.js → index-mc22ayvf.js} +24 -5
  319. package/dist/index-q7yesyk9.js +9118 -0
  320. package/dist/index-remp7e2g.js +214 -0
  321. package/dist/{index-7k55qm8a.js → index-sfpzqvdz.js} +8 -8
  322. package/dist/{index-msqr3x6m.js → index-vvtfyw1z.js} +12 -75
  323. package/dist/index-w9jwmntv.js +202 -0
  324. package/dist/{index-kr5qehbd.js → index-x23gah8c.js} +1 -1
  325. package/dist/{index-jdxxq8cz.js → index-x8a7jmkh.js} +6 -1
  326. package/dist/{index-wprsye9w.js → index-xgt9k6c6.js} +23 -12
  327. package/dist/index-y8v6yerm.js +77 -0
  328. package/dist/index.d.ts.map +1 -1
  329. package/dist/index.js +7519 -8096
  330. package/dist/message-time-backfill-an311pmk.js +124 -0
  331. package/dist/migration-worker.js +53 -0
  332. package/dist/{model-resolution-dxatzjde.js → model-resolution-xhfmyyvy.js} +5 -1
  333. package/dist/module-ES6BEMUI-3cet1pyp.js +12 -0
  334. package/dist/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
  335. package/dist/plugin/boot-deadline.d.ts.map +1 -1
  336. package/dist/plugin/conflict-warning-hook.d.ts.map +1 -1
  337. package/dist/plugin/dream-timer-module-client.d.ts +1 -11
  338. package/dist/plugin/dream-timer-module-client.d.ts.map +1 -1
  339. package/dist/plugin/dream-timer.d.ts.map +1 -1
  340. package/dist/plugin/hooks/create-session-hooks.d.ts +8 -0
  341. package/dist/plugin/hooks/create-session-hooks.d.ts.map +1 -1
  342. package/dist/plugin/messages-transform.d.ts +20 -13
  343. package/dist/plugin/messages-transform.d.ts.map +1 -1
  344. package/dist/plugin/rpc-handlers.d.ts.map +1 -1
  345. package/dist/plugin/stale-build-notice.d.ts +16 -0
  346. package/dist/plugin/stale-build-notice.d.ts.map +1 -0
  347. package/dist/{read-session-chunk-339hg90t.js → read-session-chunk-8rxs0tc9.js} +24 -6
  348. package/dist/recomp-orchestrator-nzamtw29.js +39 -0
  349. package/dist/{rpc-notifications-4amf6mf4.js → rpc-notifications-3hed126v.js} +3 -1
  350. package/dist/{safe-notification-target-50gm9c58.js → safe-notification-target-43r8jsxw.js} +3 -3
  351. package/dist/send-session-notification-nqpv7cne.js +28 -0
  352. package/dist/shared/assistant-message-extractor.d.ts +4 -0
  353. package/dist/shared/assistant-message-extractor.d.ts.map +1 -1
  354. package/dist/shared/background-batch-drain.d.ts +8 -0
  355. package/dist/shared/background-batch-drain.d.ts.map +1 -0
  356. package/dist/{features/builtin-commands/commands.d.ts → shared/builtin-commands.d.ts} +1 -1
  357. package/dist/shared/builtin-commands.d.ts.map +1 -0
  358. package/dist/shared/embedding-activity.d.ts +13 -0
  359. package/dist/shared/embedding-activity.d.ts.map +1 -0
  360. package/dist/shared/historian-tool-expansions.d.ts +5 -0
  361. package/dist/shared/historian-tool-expansions.d.ts.map +1 -0
  362. package/dist/shared/historian-tool-template.d.ts +5 -0
  363. package/dist/shared/historian-tool-template.d.ts.map +1 -0
  364. package/dist/shared/historian-transient-error.d.ts +2 -0
  365. package/dist/shared/historian-transient-error.d.ts.map +1 -0
  366. package/dist/shared/jsonc-edit.d.ts.map +1 -1
  367. package/dist/shared/logger.d.ts +7 -0
  368. package/dist/shared/logger.d.ts.map +1 -1
  369. package/dist/shared/model-suggestion-retry.d.ts +2 -1
  370. package/dist/shared/model-suggestion-retry.d.ts.map +1 -1
  371. package/dist/shared/models-dev-cache.d.ts.map +1 -1
  372. package/dist/shared/off-thread-migration-clock.d.ts +38 -0
  373. package/dist/shared/off-thread-migration-clock.d.ts.map +1 -0
  374. package/dist/shared/plugin-package-version.d.ts +14 -0
  375. package/dist/shared/plugin-package-version.d.ts.map +1 -0
  376. package/dist/shared/project-directory-key.d.ts +26 -0
  377. package/dist/shared/project-directory-key.d.ts.map +1 -0
  378. package/dist/shared/prompt-async-transport.d.ts +4 -0
  379. package/dist/shared/prompt-async-transport.d.ts.map +1 -1
  380. package/dist/shared/prompt-surface-runtime.d.ts +3 -3
  381. package/dist/shared/provider-response-completion.d.ts +12 -0
  382. package/dist/shared/provider-response-completion.d.ts.map +1 -0
  383. package/dist/shared/redaction.d.ts.map +1 -1
  384. package/dist/shared/rpc-client.d.ts +23 -2
  385. package/dist/shared/rpc-client.d.ts.map +1 -1
  386. package/dist/shared/rpc-types.d.ts +19 -0
  387. package/dist/shared/rpc-types.d.ts.map +1 -1
  388. package/dist/shared/rpc-utils.d.ts +34 -0
  389. package/dist/shared/rpc-utils.d.ts.map +1 -1
  390. package/dist/shared/sqlite.d.ts +13 -2
  391. package/dist/shared/sqlite.d.ts.map +1 -1
  392. package/dist/shared/stale-plugin-build.d.ts +21 -0
  393. package/dist/shared/stale-plugin-build.d.ts.map +1 -0
  394. package/dist/shared/status-summary.d.ts +29 -0
  395. package/dist/shared/status-summary.d.ts.map +1 -1
  396. package/dist/shared/status-view-check.d.ts +124 -0
  397. package/dist/shared/status-view-check.d.ts.map +1 -0
  398. package/dist/shared/status-view.d.ts +38 -2
  399. package/dist/shared/status-view.d.ts.map +1 -1
  400. package/dist/shared/tag-owner-id.d.ts +19 -0
  401. package/dist/shared/tag-owner-id.d.ts.map +1 -0
  402. package/dist/shared/tag-transcript.d.ts +2 -1
  403. package/dist/shared/tag-transcript.d.ts.map +1 -1
  404. package/dist/shared/test-temp-dir.d.ts +8 -2
  405. package/dist/shared/test-temp-dir.d.ts.map +1 -1
  406. package/dist/shared/user-facing-codes.d.ts +41 -6
  407. package/dist/shared/user-facing-codes.d.ts.map +1 -1
  408. package/dist/shared/xml-unescape.d.ts +9 -0
  409. package/dist/shared/xml-unescape.d.ts.map +1 -0
  410. package/dist/task-config-v81k8jvk.js +17 -0
  411. package/dist/tools/ctx-expand/constants.d.ts +1 -1
  412. package/dist/tools/ctx-expand/constants.d.ts.map +1 -1
  413. package/dist/tools/ctx-expand/mode.d.ts +4 -0
  414. package/dist/tools/ctx-expand/mode.d.ts.map +1 -1
  415. package/dist/tools/ctx-expand/render.d.ts +5 -1
  416. package/dist/tools/ctx-expand/render.d.ts.map +1 -1
  417. package/dist/tools/ctx-expand/tools.d.ts +2 -0
  418. package/dist/tools/ctx-expand/tools.d.ts.map +1 -1
  419. package/dist/tools/ctx-expand/types.d.ts +1 -0
  420. package/dist/tools/ctx-expand/types.d.ts.map +1 -1
  421. package/dist/tools/ctx-memory/tools.d.ts.map +1 -1
  422. package/dist/tools/ctx-note/render.d.ts +2 -0
  423. package/dist/tools/ctx-note/render.d.ts.map +1 -1
  424. package/dist/tools/ctx-note/tools.d.ts.map +1 -1
  425. package/dist/tools/ctx-reduce/constants.d.ts +1 -1
  426. package/dist/tools/ctx-reduce/constants.d.ts.map +1 -1
  427. package/dist/tools/ctx-search/constants.d.ts +1 -1
  428. package/dist/tools/ctx-search/constants.d.ts.map +1 -1
  429. package/dist/tools/light-descriptions.d.ts +3 -3
  430. package/dist/tools/light-descriptions.d.ts.map +1 -1
  431. package/dist/tools/parameter-descriptions.d.ts +14 -14
  432. package/dist/transform-postprocess-phase-414phndq.js +61 -0
  433. package/dist/tui/data/context-db.d.ts +34 -10
  434. package/dist/tui/data/context-db.d.ts.map +1 -1
  435. package/dist/tui/data/notification-socket.d.ts +6 -0
  436. package/dist/tui/data/notification-socket.d.ts.map +1 -1
  437. package/dist/tui/data/session-directory.d.ts +16 -0
  438. package/dist/tui/data/session-directory.d.ts.map +1 -0
  439. package/dist/tui-compiled/data/context-db.d.ts +34 -10
  440. package/dist/tui-compiled/data/context-db.d.ts.map +1 -1
  441. package/dist/tui-compiled/data/notification-socket.d.ts +6 -0
  442. package/dist/tui-compiled/data/notification-socket.d.ts.map +1 -1
  443. package/dist/tui-compiled/data/session-directory.d.ts +16 -0
  444. package/dist/tui-compiled/data/session-directory.d.ts.map +1 -0
  445. package/dist/v2/derive-budgets-v0krf3t7.js +18 -0
  446. package/dist/v2/embedding-worker.js +47 -0
  447. package/dist/v2/emscripten-module-0g8f45e6.js +602 -0
  448. package/dist/v2/emscripten-module-0pekdjxz.js +1532 -0
  449. package/dist/v2/emscripten-module-e67xwsp3.js +503 -0
  450. package/dist/v2/emscripten-module-pj1vyb44.js +4559 -0
  451. package/dist/v2/ffi-3cx1cxpk.js +78 -0
  452. package/dist/v2/ffi-7bqqe4cd.js +91 -0
  453. package/dist/v2/ffi-7e6gryj5.js +91 -0
  454. package/dist/v2/ffi-bpvkebwr.js +78 -0
  455. package/dist/v2/fold/boundary.d.ts.map +1 -1
  456. package/dist/v2/fork-inheritance.d.ts +101 -0
  457. package/dist/v2/fork-inheritance.d.ts.map +1 -0
  458. package/dist/v2/hidden-child-cleanup.d.ts +11 -0
  459. package/dist/v2/hidden-child-cleanup.d.ts.map +1 -0
  460. package/dist/v2/hidden-child-native.d.ts +29 -0
  461. package/dist/v2/hidden-child-native.d.ts.map +1 -0
  462. package/dist/v2/hidden-child-record.d.ts +135 -0
  463. package/dist/v2/hidden-child-record.d.ts.map +1 -0
  464. package/dist/v2/hidden-completion.d.ts +12 -97
  465. package/dist/v2/hidden-completion.d.ts.map +1 -1
  466. package/dist/v2/hooks/context.d.ts +20 -8
  467. package/dist/v2/hooks/context.d.ts.map +1 -1
  468. package/dist/v2/hooks/dream-manual.d.ts.map +1 -1
  469. package/dist/v2/hooks/dream-trigger.d.ts +5 -0
  470. package/dist/v2/hooks/dream-trigger.d.ts.map +1 -1
  471. package/dist/v2/hooks/generate.d.ts +10 -0
  472. package/dist/v2/hooks/generate.d.ts.map +1 -0
  473. package/dist/v2/hooks/hidden-child.d.ts +33 -2
  474. package/dist/v2/hooks/hidden-child.d.ts.map +1 -1
  475. package/dist/v2/hooks/payload.d.ts +3 -0
  476. package/dist/v2/hooks/payload.d.ts.map +1 -1
  477. package/dist/v2/hooks/session-api-gate.d.ts +4 -0
  478. package/dist/v2/hooks/session-api-gate.d.ts.map +1 -0
  479. package/dist/v2/hooks/storage-gate.d.ts +3 -1
  480. package/dist/v2/hooks/storage-gate.d.ts.map +1 -1
  481. package/dist/v2/hooks/tools.d.ts.map +1 -1
  482. package/dist/v2/hooks/types.d.ts +10 -0
  483. package/dist/v2/hooks/types.d.ts.map +1 -1
  484. package/dist/v2/hooks/update-check.d.ts.map +1 -1
  485. package/dist/v2/hooks/usage-persist.d.ts.map +1 -1
  486. package/dist/v2/hooks/usage-reading.d.ts +4 -0
  487. package/dist/v2/hooks/usage-reading.d.ts.map +1 -1
  488. package/dist/v2/index-6e4mwffh.js +5662 -0
  489. package/dist/v2/index-en1k8h8m.js +244 -0
  490. package/dist/{message-time-backfill-q374fxc5.js → v2/message-time-backfill-0n93vrd7.js} +19 -5
  491. package/dist/v2/migration-worker.js +52 -0
  492. package/dist/v2/model-resolution-xhfmyyvy.js +16 -0
  493. package/dist/v2/module-ES6BEMUI-3cet1pyp.js +12 -0
  494. package/dist/v2/module-asyncify-2EFITU5U-c2razzd9.js +6 -0
  495. package/dist/v2/prompt-context-5y5ms8f9.js +6 -0
  496. package/dist/v2/read-session-chunk-hjza38hr.js +83 -0
  497. package/dist/v2/recomp-orchestrator-1aq7h44c.js +36 -0
  498. package/dist/v2/retrospective-raw-provider.d.ts +21 -0
  499. package/dist/v2/retrospective-raw-provider.d.ts.map +1 -0
  500. package/dist/v2/rpc-notifications-3hed126v.js +16 -0
  501. package/dist/v2/safe-notification-target-wtj0bbc2.js +9 -0
  502. package/dist/{send-session-notification-04hvd54c.js → v2/send-session-notification-mq9frrtm.js} +10 -5
  503. package/dist/v2/server-0jqw05sa.js +803 -0
  504. package/dist/v2/server-5317ykaf.js +40 -0
  505. package/dist/v2/server-a4m2b1yv.js +530 -0
  506. package/dist/v2/server-avwt563y.js +62 -0
  507. package/dist/v2/server-c4g2y1z8.js +28824 -0
  508. package/dist/v2/server-ckpc8pxy.js +662 -0
  509. package/dist/v2/server-e36nf2p1.js +7702 -0
  510. package/dist/v2/server-e44zzy84.js +10 -0
  511. package/dist/v2/server-fgmxwrgy.js +16 -0
  512. package/dist/v2/server-fmsr7v69.js +75 -0
  513. package/dist/v2/server-g20jdh0p.js +1273 -0
  514. package/dist/{index-qm36k34q.js → v2/server-hfjfbg59.js} +796 -737
  515. package/dist/v2/server-n96ag4rk.js +633 -0
  516. package/dist/v2/server-qdjnb2z1.js +181 -0
  517. package/dist/v2/server-qpg6wf72.js +187 -0
  518. package/dist/v2/server-r7cmye3k.js +131 -0
  519. package/dist/v2/server-remp7e2g.js +214 -0
  520. package/dist/v2/server-rhdgxp1t.js +398 -0
  521. package/dist/v2/server-sfpzqvdz.js +137 -0
  522. package/dist/v2/server-syahy8j8.js +50 -0
  523. package/dist/v2/server-v5xgft5v.js +9116 -0
  524. package/dist/v2/server-w99cyt6a.js +361 -0
  525. package/dist/v2/server-x8a7jmkh.js +104 -0
  526. package/dist/v2/server-y8v6yerm.js +77 -0
  527. package/dist/v2/server-z19x7eqz.js +423 -0
  528. package/dist/v2/server.d.ts.map +1 -1
  529. package/dist/v2/server.js +8796 -107376
  530. package/dist/v2/store-reader.d.ts +50 -0
  531. package/dist/v2/store-reader.d.ts.map +1 -1
  532. package/dist/v2/task-config-tbndqyny.js +17 -0
  533. package/dist/v2/transformers-node-wasm.js +26768 -0
  534. package/dist/v2/transformers-web.js +25670 -0
  535. package/dist/v2/transformers.node-hj754h7s.js +29997 -0
  536. package/dist/v2/tui/index.d.ts +10 -1
  537. package/dist/v2/tui/index.d.ts.map +1 -1
  538. package/dist/v2/tui/sidebar-mount.d.ts +6 -0
  539. package/dist/v2/tui/sidebar-mount.d.ts.map +1 -1
  540. package/dist/v2/tui/status-dialog-mount.d.ts +7 -4
  541. package/dist/v2/tui/status-dialog-mount.d.ts.map +1 -1
  542. package/dist/v2/tui/types.d.ts +12 -0
  543. package/dist/v2/tui/types.d.ts.map +1 -1
  544. package/dist/v2/wrapup-orchestrator-tbyx78dz.js +425 -0
  545. package/dist/wrapup-orchestrator-h28bqsy6.js +26 -0
  546. package/package.json +8 -8
  547. package/src/agents/hidden-agent-registrations.ts +24 -16
  548. package/src/agents/magic-context-prompt.test.ts +41 -0
  549. package/src/agents/magic-context-prompt.ts +8 -5
  550. package/src/agents/permissions.test.ts +31 -49
  551. package/src/agents/permissions.ts +8 -28
  552. package/src/config/index.test.ts +60 -20
  553. package/src/config/index.ts +53 -1
  554. package/src/config/live-run-config.test.ts +5 -5
  555. package/src/config/live-snapshot.test.ts +4 -4
  556. package/src/config/migrate-config-location.test.ts +3 -10
  557. package/src/config/project-config-trust-boundary.test.ts +207 -0
  558. package/src/config/project-security.hostile-matrix.test.ts +4 -4
  559. package/src/config/project-security.ts +218 -1
  560. package/src/config/protected-tokens.test.ts +14 -9
  561. package/src/config/raw-loader.test.ts +31 -3
  562. package/src/config/raw-loader.ts +8 -3
  563. package/src/config/schema/magic-context.ts +20 -3
  564. package/src/config/variable.test.ts +3 -2
  565. package/src/features/magic-context/dreamer/cron.ts +30 -9
  566. package/src/features/magic-context/dreamer/task-registry.ts +7 -5
  567. package/src/shared/announcement.test.ts +2 -1
  568. package/src/shared/assistant-message-extractor.test.ts +27 -1
  569. package/src/shared/assistant-message-extractor.ts +27 -0
  570. package/src/shared/background-batch-drain.test.ts +38 -0
  571. package/src/shared/background-batch-drain.ts +29 -0
  572. package/src/shared/builtin-commands.ts +50 -0
  573. package/src/shared/console-diagnostics-fence.test.ts +145 -0
  574. package/src/shared/data-path.test.ts +6 -5
  575. package/src/shared/embedding-activity.test.ts +21 -0
  576. package/src/shared/embedding-activity.ts +36 -0
  577. package/src/shared/historian-tool-defaults.json +13 -0
  578. package/src/shared/historian-tool-expansions.ts +18 -0
  579. package/src/shared/historian-tool-template.ts +248 -0
  580. package/src/shared/historian-transient-error.test.ts +36 -0
  581. package/src/shared/historian-transient-error.ts +22 -0
  582. package/src/shared/jsonc-edit.ts +20 -1
  583. package/src/shared/logger.test.ts +3 -2
  584. package/src/shared/logger.ts +40 -1
  585. package/src/shared/model-suggestion-retry.test.ts +46 -0
  586. package/src/shared/model-suggestion-retry.ts +16 -1
  587. package/src/shared/models-dev-cache.test.ts +74 -2
  588. package/src/shared/models-dev-cache.ts +5 -1
  589. package/src/shared/off-thread-migration-clock.test.ts +55 -0
  590. package/src/shared/off-thread-migration-clock.ts +124 -0
  591. package/src/shared/opencode-db-path.test.ts +3 -2
  592. package/src/shared/plugin-package-version.ts +52 -0
  593. package/src/shared/project-directory-key.test.ts +111 -0
  594. package/src/shared/project-directory-key.ts +54 -0
  595. package/src/shared/prompt-async-transport.test.ts +249 -72
  596. package/src/shared/prompt-async-transport.ts +131 -24
  597. package/src/shared/prompt-surface-a1-golden.md +41 -25
  598. package/src/shared/prompt-surface-runtime.test.ts +3 -3
  599. package/src/shared/provider-response-completion.ts +23 -0
  600. package/src/shared/redaction.test.ts +51 -1
  601. package/src/shared/redaction.ts +33 -0
  602. package/src/shared/rpc-async-probes.test.ts +32 -2
  603. package/src/shared/rpc-client.test.ts +3 -2
  604. package/src/shared/rpc-client.ts +76 -18
  605. package/src/shared/rpc-types.ts +15 -0
  606. package/src/shared/rpc-utils.test.ts +164 -10
  607. package/src/shared/rpc-utils.ts +144 -15
  608. package/src/shared/sqlite-acquisition-routing.test.ts +46 -3
  609. package/src/shared/sqlite-pass-scope.test.ts +3 -2
  610. package/src/shared/sqlite-transaction-mode-guard.test.ts +4 -0
  611. package/src/shared/sqlite-writer-diagnostics.test.ts +134 -0
  612. package/src/shared/sqlite.ts +225 -41
  613. package/src/shared/stale-plugin-build.test.ts +129 -0
  614. package/src/shared/stale-plugin-build.ts +151 -0
  615. package/src/shared/status-summary.ts +40 -13
  616. package/src/shared/status-view-check.test.ts +253 -0
  617. package/src/shared/status-view-check.ts +536 -0
  618. package/src/shared/status-view.test.ts +6 -1
  619. package/src/shared/status-view.ts +176 -4
  620. package/src/shared/storage-busy.test.ts +3 -2
  621. package/src/shared/tag-owner-id.test.ts +33 -0
  622. package/src/shared/tag-owner-id.ts +29 -0
  623. package/src/shared/tag-transcript.ts +13 -2
  624. package/src/shared/test-temp-dir-policy.test.ts +33 -0
  625. package/src/shared/test-temp-dir.test.ts +27 -0
  626. package/src/shared/test-temp-dir.ts +36 -12
  627. package/src/shared/tui-config.test.ts +6 -5
  628. package/src/shared/tui-preferences.test.ts +3 -2
  629. package/src/shared/user-facing-codes.ts +52 -6
  630. package/src/shared/window-geometry.test.ts +3 -2
  631. package/src/shared/write-transaction-attribution.test.ts +11 -7
  632. package/src/shared/write-transaction-hold-clock.test.ts +160 -0
  633. package/src/shared/xml-unescape.ts +19 -0
  634. package/src/tui/data/context-db.test.ts +92 -4
  635. package/src/tui/data/context-db.ts +184 -18
  636. package/src/tui/data/notification-socket.test.ts +49 -2
  637. package/src/tui/data/notification-socket.ts +47 -9
  638. package/src/tui/data/session-directory.ts +19 -0
  639. package/src/tui/dialogs/status-dialog-render.test.ts +284 -0
  640. package/src/tui/dialogs/status-dialog.tsx +41 -38
  641. package/src/tui/index.tsx +30 -18
  642. package/src/tui/slots/sidebar-content.tsx +9 -2
  643. package/src/tui-compiled/data/context-db.ts +184 -18
  644. package/src/tui-compiled/data/notification-socket.ts +47 -9
  645. package/src/tui-compiled/data/session-directory.ts +19 -0
  646. package/src/tui-compiled/dialogs/status-dialog.tsx +38 -29
  647. package/src/tui-compiled/index.tsx +29 -16
  648. package/src/tui-compiled/slots/sidebar-content.tsx +3 -2
  649. package/src/v2/tui/host-contract.test.ts +9 -10
  650. package/src/v2/tui/index.ts +78 -23
  651. package/src/v2/tui/load-compiled-sidebar.d.mts +5 -1
  652. package/src/v2/tui/load-compiled-status-dialog.d.mts +3 -2
  653. package/src/v2/tui/session-directory.test.ts +53 -0
  654. package/src/v2/tui/sidebar-mount.ts +19 -1
  655. package/src/v2/tui/status-dialog-mount.ts +10 -7
  656. package/src/v2/tui/types.ts +10 -0
  657. package/dist/features/builtin-commands/commands.d.ts.map +0 -1
  658. package/dist/features/builtin-commands/types.d.ts +0 -3
  659. package/dist/features/builtin-commands/types.d.ts.map +0 -1
  660. package/dist/features/magic-context/context-authority.d.ts +0 -272
  661. package/dist/features/magic-context/context-authority.d.ts.map +0 -1
  662. package/dist/features/magic-context/memory/mirror-reembed.d.ts +0 -22
  663. package/dist/features/magic-context/memory/mirror-reembed.d.ts.map +0 -1
  664. package/dist/hooks/magic-context/historian-state-file.d.ts +0 -43
  665. package/dist/hooks/magic-context/historian-state-file.d.ts.map +0 -1
  666. package/dist/index-4an2p8qa.js +0 -1056
  667. package/dist/index-rn7gafjr.js +0 -8
  668. package/dist/index-v6t0tg85.js +0 -13
  669. package/dist/plugin/memory-id-translation.d.ts +0 -109
  670. package/dist/plugin/memory-id-translation.d.ts.map +0 -1
  671. package/dist/plugin/rust-note-backend.d.ts +0 -84
  672. package/dist/plugin/rust-note-backend.d.ts.map +0 -1
  673. package/dist/recomp-orchestrator-0ers6smx.js +0 -22
  674. package/dist/task-config-2bm68628.js +0 -9
  675. package/dist/transform-postprocess-phase-ttdkrm6r.js +0 -36
  676. package/dist/v2/host-service.d.ts +0 -66
  677. package/dist/v2/host-service.d.ts.map +0 -1
  678. package/dist/wrapup-orchestrator-x0jvvrqn.js +0 -19
  679. /package/dist/{index-s70wtd8k.js → index-q6hef7fh.js} +0 -0
@@ -1,1056 +0,0 @@
1
- import {
2
- harnessOwnsOpenCodeStore
3
- } from "./index-s70wtd8k.js";
4
- import {
5
- log
6
- } from "./index-3bygzk2d.js";
7
-
8
- // src/shared/opencode-db-path.ts
9
- import { existsSync, readdirSync, statSync } from "node:fs";
10
- import { homedir } from "node:os";
11
- import { isAbsolute, join, resolve } from "node:path";
12
- var cachedResolution = null;
13
- var lastReadFailure = null;
14
- var claimedDiagnostics = new Set;
15
- function openCodeDataDir(env = process.env, dataHome) {
16
- return join(dataHome ?? env.XDG_DATA_HOME ?? join(homedir(), ".local", "share"), "opencode");
17
- }
18
- function environmentKey(dataDir, hostGeneration, channel, env) {
19
- return [
20
- hostGeneration,
21
- dataDir,
22
- env.OPENCODE_DB ?? "",
23
- env.OPENCODE_DISABLE_CHANNEL_DB ?? "",
24
- channel ?? env.OPENCODE_CHANNEL ?? ""
25
- ].join("\x00");
26
- }
27
- function channelPath(dataDir, channel) {
28
- return ["latest", "beta", "prod"].includes(channel) ? join(dataDir, "opencode.db") : join(dataDir, `opencode-${channel}.db`);
29
- }
30
- function discoveredCandidateNames(dataDir) {
31
- const names = ["opencode.db", "opencode-local.db", "opencode-dev.db"];
32
- try {
33
- const discovered = readdirSync(dataDir, { withFileTypes: true }).filter((entry) => /^opencode-.+\.db$/.test(entry.name) && !names.includes(entry.name)).map((entry) => entry.name).sort();
34
- names.push(...discovered);
35
- } catch {}
36
- return names;
37
- }
38
- function discoverOpenCodeDb(dataDir) {
39
- const candidates = discoveredCandidateNames(dataDir).map((name, order) => {
40
- const path = join(dataDir, name);
41
- try {
42
- const metadata = statSync(path);
43
- return metadata.isFile() ? { path, order, mtimeMs: metadata.mtimeMs } : null;
44
- } catch {
45
- return null;
46
- }
47
- });
48
- const existing = candidates.filter((candidate) => candidate !== null).sort((left, right) => right.mtimeMs - left.mtimeMs || left.order - right.order)[0];
49
- if (!existing) {
50
- return { path: join(dataDir, "opencode.db"), source: "default", channel: null };
51
- }
52
- const name = existing.path.slice(dataDir.length + 1);
53
- const channel = name === "opencode.db" ? null : name.slice("opencode-".length, -".db".length) || null;
54
- return { path: existing.path, source: "discovered", channel };
55
- }
56
- function resolveV1Fresh(dataDir, env = process.env) {
57
- const explicit = env.OPENCODE_DB;
58
- if (explicit !== undefined && explicit.length > 0) {
59
- if (explicit === ":memory:") {
60
- return { path: explicit, source: "OPENCODE_DB", channel: null };
61
- }
62
- return {
63
- path: isAbsolute(explicit) ? explicit : join(dataDir, explicit),
64
- source: "OPENCODE_DB",
65
- channel: null
66
- };
67
- }
68
- const disableChannelDb = env.OPENCODE_DISABLE_CHANNEL_DB;
69
- if (disableChannelDb === "1" || disableChannelDb === "true") {
70
- return { path: join(dataDir, "opencode.db"), source: "default", channel: null };
71
- }
72
- const channel = env.OPENCODE_CHANNEL;
73
- if (channel !== undefined && channel.length > 0) {
74
- return { path: channelPath(dataDir, channel), source: "channel", channel };
75
- }
76
- return discoverOpenCodeDb(dataDir);
77
- }
78
- function sourceOpenCodeDatabaseFilename(hostGeneration, channel, env = process.env) {
79
- if (hostGeneration === "v1") {
80
- const explicit = env.OPENCODE_DB;
81
- if (explicit !== undefined && explicit.length > 0)
82
- return explicit;
83
- if (env.OPENCODE_DISABLE_CHANNEL_DB === "1" || env.OPENCODE_DISABLE_CHANNEL_DB === "true") {
84
- return "opencode.db";
85
- }
86
- return ["latest", "beta", "prod"].includes(channel) ? "opencode.db" : `opencode-${channel}.db`;
87
- }
88
- return env.OPENCODE_DB ?? (["latest", "dev", "beta", "next", "prod"].includes(channel) || env.OPENCODE_DISABLE_CHANNEL_DB === "1" || env.OPENCODE_DISABLE_CHANNEL_DB === "true" ? "opencode.db" : `opencode-${channel.replace(/[^a-zA-Z0-9._-]/g, "")}.db`);
89
- }
90
- function resolveV2Fresh(dataDir, channel, env) {
91
- const filename = sourceOpenCodeDatabaseFilename("v2", channel, env);
92
- const explicit = env.OPENCODE_DB !== undefined;
93
- return {
94
- path: filename === ":memory:" ? filename : resolve(dataDir, filename),
95
- source: explicit ? "OPENCODE_DB" : env.OPENCODE_CHANNEL ? "channel" : "default",
96
- channel: explicit ? null : channel
97
- };
98
- }
99
- function resolveOpenCodeDbPath(hostGeneration = "v1", options = {}) {
100
- const env = options.env ?? process.env;
101
- const dataDir = openCodeDataDir(env, options.dataHome);
102
- const channel = options.channel ?? env.OPENCODE_CHANNEL;
103
- const key = environmentKey(dataDir, hostGeneration, channel, env);
104
- if (cachedResolution?.key === key && (!cachedResolution.existed || existsSync(cachedResolution.resolution.path))) {
105
- if (cachedResolution.existed)
106
- return cachedResolution.resolution;
107
- }
108
- const resolution = hostGeneration === "v2" ? resolveV2Fresh(dataDir, channel ?? "latest", env) : resolveV1Fresh(dataDir, env);
109
- cachedResolution = {
110
- key,
111
- resolution,
112
- existed: resolution.path !== ":memory:" && existsSync(resolution.path)
113
- };
114
- return resolution;
115
- }
116
- function schemaTableNames(db, schema = "main") {
117
- const rows = db.prepare(`SELECT name FROM ${schema}.sqlite_master WHERE type = 'table' AND name IN ('message', 'part', 'session', 'project', 'session_message', 'session_v2')`).all();
118
- return new Set(rows.flatMap((row) => typeof row.name === "string" ? [row.name] : []));
119
- }
120
- function hasV1MessageTables(db, schema = "main") {
121
- const tables = schemaTableNames(db, schema);
122
- return tables.has("message") && tables.has("part");
123
- }
124
- function detectOpenCodeStoreGeneration(db, schema = "main") {
125
- const tables = schemaTableNames(db, schema);
126
- const hasV1Messages = tables.has("message") && tables.has("part");
127
- if (hasV1Messages)
128
- return "v1";
129
- if (tables.has("session_message"))
130
- return "v2";
131
- if (tables.has("session") || tables.has("project"))
132
- return "v1";
133
- return "unknown";
134
- }
135
- function hasMigratedV2Schema(tables) {
136
- return tables.has("session_message") && tables.has("session_v2");
137
- }
138
- function isOpenCodeV2Store(db, schema = "main") {
139
- return detectOpenCodeStoreGeneration(db, schema) === "v2" || hasMigratedV2Schema(schemaTableNames(db, schema));
140
- }
141
- function assertOpenCodeStoreGeneration(db, expected, path, schema = "main") {
142
- const actual = detectOpenCodeStoreGeneration(db, schema);
143
- if (actual === expected)
144
- return;
145
- if (expected === "v2" && isOpenCodeV2Store(db, schema))
146
- return;
147
- if (actual === "unknown")
148
- return;
149
- throw new Error(`OpenCode store generation mismatch at ${path}: expected ${expected}, found ${actual}; refusing generation-specific database access`);
150
- }
151
- function openCodeDbPathExists(resolution = resolveOpenCodeDbPath()) {
152
- return resolution.path !== ":memory:" && existsSync(resolution.path);
153
- }
154
- function getOpenCodeDbProbeDescriptions(resolution = resolveOpenCodeDbPath()) {
155
- if (resolution.source === "OPENCODE_DB")
156
- return [resolution.path];
157
- if (resolution.source === "channel" || process.env.OPENCODE_DISABLE_CHANNEL_DB === "1" || process.env.OPENCODE_DISABLE_CHANNEL_DB === "true") {
158
- return [resolution.path];
159
- }
160
- const dataDir = openCodeDataDir();
161
- return [
162
- join(dataDir, "opencode.db"),
163
- join(dataDir, "opencode-local.db"),
164
- join(dataDir, "opencode-dev.db"),
165
- join(dataDir, "opencode-<channel>.db")
166
- ];
167
- }
168
- function lookedForText(resolution) {
169
- return getOpenCodeDbProbeDescriptions(resolution).join(", ");
170
- }
171
- function formatOpenCodeDbMissingBanner(resolution = resolveOpenCodeDbPath()) {
172
- return `Magic Context cannot find OpenCode's session database (looked for ${lookedForText(resolution)}). History compaction (historian) and the mid-turn valve are disabled until it is found; set OPENCODE_DB if OpenCode stores it elsewhere.`;
173
- }
174
- function formatOpenCodeDbMissingStatusLine(resolution = resolveOpenCodeDbPath()) {
175
- return `OpenCode DB: MISSING (looked for ${lookedForText(resolution)}). History compaction (historian) and the mid-turn valve are disabled; set OPENCODE_DB if OpenCode stores it elsewhere.`;
176
- }
177
- function formatOpenCodeDbReadFailureStatusLine(failure) {
178
- return `OpenCode DB: READ FAILED (path=${failure.path}, source=${failure.source}) — ${failure.message}`;
179
- }
180
- function recordOpenCodeDbReadFailure(resolution, error) {
181
- const message = error instanceof Error ? error.message : String(error);
182
- lastReadFailure = { ...resolution, message };
183
- return lastReadFailure;
184
- }
185
- function clearOpenCodeDbReadFailure(path) {
186
- if (path === undefined || lastReadFailure?.path === path)
187
- lastReadFailure = null;
188
- }
189
- function getOpenCodeDbReadFailure() {
190
- return lastReadFailure;
191
- }
192
- function claimOpenCodeDbDiagnosticOnce(surface, resolution) {
193
- const key = `${surface}\x00${resolution.path}\x00${resolution.source}`;
194
- if (claimedDiagnostics.has(key))
195
- return false;
196
- claimedDiagnostics.add(key);
197
- return true;
198
- }
199
-
200
- // src/shared/sqlite-helpers.ts
201
- function closeQuietly(db) {
202
- if (!db)
203
- return;
204
- try {
205
- db.close();
206
- } catch {}
207
- }
208
-
209
- // src/shared/sqlite.ts
210
- import { AsyncLocalStorage } from "node:async_hooks";
211
- import { statSync as statSync2 } from "node:fs";
212
- var reportSlowPrivilegedWrite;
213
- function registerSlowWriteReporter(reporter) {
214
- reportSlowPrivilegedWrite = reporter;
215
- }
216
- function detectSqliteRuntime() {
217
- const hasBunVersion = typeof process !== "undefined" && typeof process.versions?.bun === "string";
218
- const hasBunGlobal = typeof globalThis !== "undefined" && typeof globalThis.Bun !== "undefined";
219
- return hasBunVersion || hasBunGlobal ? "Bun" : "Node.js";
220
- }
221
- var bunSpec = "bun:" + "sqlite";
222
- var nodeSpec = "node:" + "sqlite";
223
- async function importSqliteModule(specifier) {
224
- return await import(specifier);
225
- }
226
- function isModuleNotFoundError(error, specifier) {
227
- const candidate = error;
228
- const code = typeof candidate?.code === "string" ? candidate.code : "";
229
- const name = typeof candidate?.name === "string" ? candidate.name : "";
230
- const message = error instanceof Error ? error.message : String(error ?? "");
231
- const details = `${code} ${name} ${message}`.toLowerCase();
232
- const mentionsSpecifier = details.includes(specifier.toLowerCase());
233
- if (!mentionsSpecifier)
234
- return false;
235
- return code === "ERR_MODULE_NOT_FOUND" || code === "ERR_UNKNOWN_BUILTIN_MODULE" || code === "MODULE_NOT_FOUND" || name === "ResolveMessage" || details.includes("module not found") || details.includes("cannot find module") || details.includes("cannot find package") || details.includes("no such built-in module");
236
- }
237
-
238
- class SqliteRuntimeUnavailableError extends Error {
239
- runtime;
240
- specifier;
241
- constructor(runtime, specifier, cause) {
242
- const requirement = specifier === nodeSpec ? "Requires Node.js >= 24, or Bun with bun:sqlite — this Bun build lacks node:sqlite." : "Requires Bun with bun:sqlite, or Node.js >= 24 — this Bun build lacks bun:sqlite.";
243
- super(`Magic Context detected ${runtime}, but could not load ${specifier}. ${requirement}`, { cause });
244
- this.name = "SqliteRuntimeUnavailableError";
245
- this.runtime = runtime;
246
- this.specifier = specifier;
247
- }
248
- }
249
- async function loadSqliteModule(runtime = detectSqliteRuntime(), importer = importSqliteModule) {
250
- const specifier = runtime === "Bun" ? bunSpec : nodeSpec;
251
- try {
252
- return await importer(specifier);
253
- } catch (error) {
254
- if (isModuleNotFoundError(error, specifier)) {
255
- throw new SqliteRuntimeUnavailableError(runtime, specifier, error);
256
- }
257
- throw error;
258
- }
259
- }
260
- var detectedRuntime = detectSqliteRuntime();
261
- var isBun = detectedRuntime === "Bun";
262
- var sqliteModule = await loadSqliteModule(detectedRuntime);
263
- var DatabaseImpl = isBun ? sqliteModule.Database : buildNodeSqliteDatabaseClass(sqliteModule.DatabaseSync);
264
- var trackedSqliteConnections = new Map;
265
- var nextSqliteConnectionSequence = 1;
266
- function installTransactionRouting(db, readonly) {
267
- const nativeExec = db.exec.bind(db);
268
- Object.defineProperty(db, "exec", {
269
- configurable: true,
270
- writable: true,
271
- value: (sql) => {
272
- if (/^\s*BEGIN\s+(?:IMMEDIATE|EXCLUSIVE)(?:\s+TRANSACTION)?\s*;?\s*$/i.test(sql)) {
273
- if (transformPassScope.getStore()?.active || backgroundWriterScope.getStore())
274
- acquireShort(db, () => nativeExec(sql), sql.trim());
275
- else
276
- nativeExec(sql);
277
- return db;
278
- }
279
- return nativeExec(sql);
280
- }
281
- });
282
- Object.defineProperty(db, "transaction", {
283
- configurable: true,
284
- writable: true,
285
- value: (fn) => {
286
- const make = (mode) => function(...args) {
287
- const nested = isInTransaction(db);
288
- const savepoint = "mc_tx_sp";
289
- db.exec(nested ? `SAVEPOINT ${savepoint}` : `BEGIN ${mode}`);
290
- try {
291
- const result = fn.apply(this, args);
292
- db.exec(nested ? `RELEASE ${savepoint}` : "COMMIT");
293
- return result;
294
- } catch (error) {
295
- if (isInTransaction(db)) {
296
- if (nested) {
297
- db.exec(`ROLLBACK TO ${savepoint}`);
298
- db.exec(`RELEASE ${savepoint}`);
299
- } else
300
- db.exec("ROLLBACK");
301
- }
302
- throw error;
303
- }
304
- };
305
- const defaultTransaction = make(readonly ? "DEFERRED" : "IMMEDIATE");
306
- const variants = {
307
- default: defaultTransaction,
308
- deferred: make("DEFERRED"),
309
- immediate: make("IMMEDIATE"),
310
- exclusive: make("EXCLUSIVE"),
311
- database: db
312
- };
313
- for (const transaction of [
314
- variants.default,
315
- variants.deferred,
316
- variants.immediate,
317
- variants.exclusive
318
- ]) {
319
- Object.assign(transaction, variants);
320
- }
321
- return defaultTransaction;
322
- }
323
- });
324
- }
325
- function trackSqliteConnection(db, filename, options) {
326
- const originalClose = db.close.bind(db);
327
- const sequence = nextSqliteConnectionSequence++;
328
- const metadata = {
329
- sequence,
330
- filename: typeof filename === "string" ? filename : Buffer.isBuffer(filename) ? "<buffer>" : ":memory:",
331
- readonly: Boolean(options) && typeof options === "object" && (options.readonly === true || options.readOnly === true)
332
- };
333
- installTransactionRouting(db, metadata.readonly);
334
- Object.defineProperty(db, "close", {
335
- configurable: true,
336
- value: (...args) => {
337
- try {
338
- return originalClose(...args);
339
- } finally {
340
- trackedSqliteConnections.delete(sequence);
341
- }
342
- }
343
- });
344
- trackedSqliteConnections.set(sequence, {
345
- ...metadata,
346
- reference: new WeakRef(db)
347
- });
348
- return db;
349
- }
350
- var TrackedDatabase = new Proxy(DatabaseImpl, {
351
- construct(target, args) {
352
- const db = Reflect.construct(target, args, target);
353
- return trackSqliteConnection(db, args[0], args[1]);
354
- }
355
- });
356
- function buildNodeSqliteDatabaseClass(DatabaseSync) {
357
-
358
- class NodeSqliteDatabase extends DatabaseSync {
359
- constructor(filename, options) {
360
- const translated = { ...options };
361
- if (options && "readonly" in options) {
362
- translated.readOnly = options.readonly;
363
- delete translated.readonly;
364
- }
365
- super(typeof filename === "string" ? filename : ":memory:", translated);
366
- }
367
- prepare(sql) {
368
- const stmt = super.prepare(sql);
369
- for (const method of ["run", "get", "all"]) {
370
- const original = stmt[method].bind(stmt);
371
- stmt[method] = (...args) => args.length === 1 && Array.isArray(args[0]) ? original(...args[0]) : original(...args);
372
- }
373
- return stmt;
374
- }
375
- }
376
- return NodeSqliteDatabase;
377
- }
378
- var Database = TrackedDatabase;
379
- function pragmaValue(db, name) {
380
- const row = db.prepare(`PRAGMA ${name}`).get();
381
- if (!row)
382
- return;
383
- return row[name] ?? Object.values(row)[0];
384
- }
385
- function pragmaNumber(db, name) {
386
- try {
387
- const value = pragmaValue(db, name);
388
- return typeof value === "number" && Number.isFinite(value) ? value : null;
389
- } catch {
390
- return null;
391
- }
392
- }
393
- function pragmaString(db, name) {
394
- try {
395
- const value = pragmaValue(db, name);
396
- return typeof value === "string" ? value : null;
397
- } catch {
398
- return null;
399
- }
400
- }
401
- function sqliteSidecarBytes(filename, suffix) {
402
- if (filename === ":memory:" || filename === "<buffer>")
403
- return 0;
404
- try {
405
- return statSync2(`${filename}${suffix}`).size;
406
- } catch (error) {
407
- return error.code === "ENOENT" ? 0 : null;
408
- }
409
- }
410
- function fts5TableCount(db) {
411
- try {
412
- const row = db.prepare("SELECT COUNT(*) AS count FROM sqlite_master WHERE type = 'table' AND sql LIKE '%USING fts5%'").get();
413
- return typeof row?.count === "number" ? row.count : null;
414
- } catch {
415
- return null;
416
- }
417
- }
418
- function getSqliteMemoryStats() {
419
- const connections = [];
420
- for (const [sequence, tracked] of trackedSqliteConnections) {
421
- const db = tracked.reference.deref();
422
- if (!db) {
423
- trackedSqliteConnections.delete(sequence);
424
- continue;
425
- }
426
- const pageSize = pragmaNumber(db, "page_size");
427
- const cacheSize = pragmaNumber(db, "cache_size");
428
- const cacheSizeUnit = cacheSize === null ? null : cacheSize < 0 ? "kib" : "pages";
429
- const cacheUpperBoundBytes = cacheSize === null ? null : cacheSize < 0 ? Math.abs(cacheSize) * 1024 : pageSize === null ? null : cacheSize * pageSize;
430
- connections.push({
431
- sequence: tracked.sequence,
432
- filename: tracked.filename,
433
- readonly: tracked.readonly,
434
- pageSize,
435
- pageCount: pragmaNumber(db, "page_count"),
436
- freelistCount: pragmaNumber(db, "freelist_count"),
437
- cacheSize,
438
- cacheSizeUnit,
439
- cacheUpperBoundBytes,
440
- mmapSizeBytes: pragmaNumber(db, "mmap_size"),
441
- walFileBytes: sqliteSidecarBytes(tracked.filename, "-wal"),
442
- shmFileBytes: sqliteSidecarBytes(tracked.filename, "-shm"),
443
- fts5TableCount: fts5TableCount(db),
444
- journalMode: pragmaString(db, "journal_mode")
445
- });
446
- }
447
- const sumKnown = (select) => connections.reduce((sum, connection) => sum + (select(connection) ?? 0), 0);
448
- return {
449
- connectionCount: connections.length,
450
- cacheUpperBoundBytes: sumKnown((connection) => connection.cacheUpperBoundBytes),
451
- mmapUpperBoundBytes: sumKnown((connection) => connection.mmapSizeBytes),
452
- walFileBytes: sumKnown((connection) => connection.walFileBytes),
453
- shmFileBytes: sumKnown((connection) => connection.shmFileBytes),
454
- sqliteStatusApi: "unavailable",
455
- connections
456
- };
457
- }
458
- var privilegeDepth = new WeakMap;
459
- var transformPassScope = new AsyncLocalStorage;
460
- var admissionScope = new AsyncLocalStorage;
461
- var backgroundWriterScope = new AsyncLocalStorage;
462
- function withSqliteBackgroundWriter(operation) {
463
- return backgroundWriterScope.run(true, operation);
464
- }
465
- function withSqliteTransformPass(operation) {
466
- const lease = { active: true };
467
- return transformPassScope.run(lease, () => {
468
- try {
469
- const result = operation();
470
- if (result && typeof result.then === "function") {
471
- return Promise.resolve(result).finally(() => {
472
- lease.active = false;
473
- });
474
- }
475
- lease.active = false;
476
- return result;
477
- } catch (error) {
478
- lease.active = false;
479
- throw error;
480
- }
481
- });
482
- }
483
- function withoutSqliteTransformPass(operation) {
484
- return transformPassScope.run(undefined, operation);
485
- }
486
- function isTransientSqliteError(error) {
487
- if (!error || typeof error !== "object")
488
- return false;
489
- const value = error;
490
- return typeof value.code === "string" && /^(SQLITE_BUSY|SQLITE_LOCKED)(_|$)/.test(value.code) || typeof value.errcode === "number" && [5, 6].includes(value.errcode & 255);
491
- }
492
-
493
- class SqliteAcquisitionBusyError extends Error {
494
- code = "SQLITE_BUSY";
495
- stage;
496
- constructor(cause, stage = "BEGIN IMMEDIATE") {
497
- super("SQLite writer acquisition remained busy", { cause });
498
- this.name = "SqliteAcquisitionBusyError";
499
- this.stage = stage;
500
- }
501
- }
502
- var SHORT_BUSY_TIMEOUT_MS = 25;
503
- var FOREGROUND_IN_PASS_BUSY_TIMEOUT_MS = 250;
504
- var FOREGROUND_ACQUISITION_BUDGET_MS = 16500;
505
- function acquireShort(db, acquire, site) {
506
- const started = performance.now();
507
- const previous = pragmaNumber(db, "busy_timeout");
508
- let acquired = false;
509
- try {
510
- const timeout = transformPassScope.getStore()?.active && !admissionScope.getStore() && !backgroundWriterScope.getStore() ? FOREGROUND_IN_PASS_BUSY_TIMEOUT_MS : SHORT_BUSY_TIMEOUT_MS;
511
- db.exec(`PRAGMA busy_timeout=${timeout}`);
512
- acquire();
513
- acquired = true;
514
- } catch (error) {
515
- if (transformPassScope.getStore()?.active && isTransientSqliteError(error))
516
- throw new SqliteAcquisitionBusyError(error, site);
517
- throw error;
518
- } finally {
519
- if (previous !== null)
520
- db.exec(`PRAGMA busy_timeout=${previous}`);
521
- const elapsed = performance.now() - started;
522
- if (elapsed >= 250)
523
- console.warn(`[${new Date().toISOString()}] [magic-context] sqlite acquisition site=${site} lane=${transformPassScope.getStore()?.active ? "foreground" : "background"} elapsed=${Math.round(elapsed)}ms attempts=1 outcome=${acquired ? "acquired" : "busy"}`);
524
- }
525
- }
526
- async function beginSqliteWriterAsync(db, site) {
527
- const started = performance.now();
528
- let attempts = 0;
529
- for (;; ) {
530
- attempts++;
531
- try {
532
- withSqliteBackgroundWriter(() => db.exec("BEGIN IMMEDIATE"));
533
- const elapsed = performance.now() - started;
534
- if (elapsed >= 250)
535
- console.warn(`[${new Date().toISOString()}] [magic-context] sqlite acquisition site=${site} lane=background elapsed=${Math.round(elapsed)}ms attempts=${attempts} outcome=acquired`);
536
- return;
537
- } catch (error) {
538
- if (!isTransientSqliteError(error))
539
- throw error;
540
- const elapsed = performance.now() - started;
541
- if (elapsed >= FOREGROUND_ACQUISITION_BUDGET_MS) {
542
- console.warn(`[${new Date().toISOString()}] [magic-context] sqlite acquisition site=${site} lane=background elapsed=${Math.round(elapsed)}ms attempts=${attempts} outcome=busy`);
543
- throw error;
544
- }
545
- await new Promise((resolve) => setTimeout(resolve, Math.min(attempts === 1 ? 500 : 1000, FOREGROUND_ACQUISITION_BUDGET_MS - elapsed)));
546
- }
547
- }
548
- }
549
- async function withAsyncPrivilegedWriter(db, operation) {
550
- const started = performance.now();
551
- let attempts = 0;
552
- for (;; ) {
553
- attempts++;
554
- try {
555
- const result = admissionScope.run(true, () => withSqliteTransformPass(() => withPrivilegedWriter(db, operation)));
556
- const elapsed = performance.now() - started;
557
- if (elapsed >= 250)
558
- console.warn(`[${new Date().toISOString()}] [magic-context] sqlite acquisition site=privileged_writer lane=foreground elapsed=${Math.round(elapsed)}ms attempts=${attempts} outcome=acquired`);
559
- return result;
560
- } catch (error) {
561
- if (!(error instanceof SqliteAcquisitionBusyError))
562
- throw error;
563
- const elapsed = performance.now() - started;
564
- if (elapsed >= FOREGROUND_ACQUISITION_BUDGET_MS) {
565
- if (elapsed >= 250)
566
- console.warn(`[${new Date().toISOString()}] [magic-context] sqlite acquisition site=privileged_writer lane=foreground elapsed=${Math.round(elapsed)}ms attempts=${attempts} outcome=busy`);
567
- throw error instanceof SqliteAcquisitionBusyError ? error : new SqliteAcquisitionBusyError(error);
568
- }
569
- await new Promise((resolve) => setTimeout(resolve, Math.min(attempts === 1 ? 500 : 1000, FOREGROUND_ACQUISITION_BUDGET_MS - elapsed)));
570
- }
571
- }
572
- }
573
- function isInTransaction(db) {
574
- const candidate = db;
575
- return candidate.inTransaction === true || candidate.isTransaction === true;
576
- }
577
- function withPrivilegedWriter(db, operation) {
578
- const previousDepth = privilegeDepth.get(db) ?? 0;
579
- const nested = isInTransaction(db);
580
- const savepoint = "mc_privilege_scope";
581
- const transactionStartedAt = nested ? undefined : performance.now();
582
- if (nested) {
583
- db.exec(`SAVEPOINT ${savepoint}`);
584
- } else {
585
- try {
586
- db.exec("BEGIN IMMEDIATE");
587
- } catch (error) {
588
- if (transformPassScope.getStore()?.active && isTransientSqliteError(error))
589
- throw new SqliteAcquisitionBusyError(error);
590
- throw error;
591
- }
592
- }
593
- privilegeDepth.set(db, previousDepth + 1);
594
- try {
595
- db.prepare("INSERT INTO context_privilege_state(id, enabled) VALUES (1, 1) ON CONFLICT(id) DO UPDATE SET enabled = 1").run();
596
- const result = operation();
597
- if (previousDepth === 0) {
598
- db.prepare("UPDATE context_privilege_state SET enabled = 0 WHERE id = 1").run();
599
- }
600
- if (nested) {
601
- db.exec(`RELEASE ${savepoint}`);
602
- } else {
603
- db.exec("COMMIT");
604
- if (transactionStartedAt !== undefined) {
605
- reportSlowPrivilegedWrite?.("privileged_writer", transactionStartedAt);
606
- }
607
- }
608
- if (previousDepth > 0)
609
- privilegeDepth.set(db, previousDepth);
610
- else
611
- privilegeDepth.delete(db);
612
- return result;
613
- } catch (error) {
614
- try {
615
- if (nested) {
616
- db.exec(`ROLLBACK TO ${savepoint}`);
617
- db.exec(`RELEASE ${savepoint}`);
618
- } else {
619
- db.exec("ROLLBACK");
620
- }
621
- } finally {
622
- if (previousDepth > 0)
623
- privilegeDepth.set(db, previousDepth);
624
- else
625
- privilegeDepth.delete(db);
626
- }
627
- throw error;
628
- }
629
- }
630
-
631
- // src/hooks/magic-context/read-session-db.ts
632
- function openCodeDbExists() {
633
- return harnessOwnsOpenCodeStore() && openCodeDbPathExists(resolveOpenCodeDbPath());
634
- }
635
- var cachedReadOnlyDb = null;
636
- function closeCachedReadOnlyDb() {
637
- if (!cachedReadOnlyDb) {
638
- return;
639
- }
640
- try {
641
- closeQuietly(cachedReadOnlyDb.db);
642
- } catch (error) {
643
- log("[magic-context] failed to close cached OpenCode read-only DB:", error);
644
- } finally {
645
- cachedReadOnlyDb = null;
646
- }
647
- }
648
- function getReadOnlySessionDb() {
649
- if (!harnessOwnsOpenCodeStore()) {
650
- throw new Error("OpenCode session database is not readable from a Pi-compatible process; its history lives in Pi sessions");
651
- }
652
- const resolution = resolveOpenCodeDbPath();
653
- const dbPath = resolution.path;
654
- if (!openCodeDbPathExists(resolution)) {
655
- throw new Error(`OpenCode session database is unavailable at ${dbPath} (source=${resolution.source})`);
656
- }
657
- if (cachedReadOnlyDb?.path === dbPath) {
658
- return cachedReadOnlyDb.db;
659
- }
660
- closeCachedReadOnlyDb();
661
- const db = new Database(dbPath, { readonly: true });
662
- try {
663
- assertOpenCodeStoreGeneration(db, "v1", dbPath);
664
- } catch (error) {
665
- closeQuietly(db);
666
- throw error;
667
- }
668
- cachedReadOnlyDb = { path: dbPath, db };
669
- clearOpenCodeDbReadFailure();
670
- return db;
671
- }
672
- function withReadOnlySessionDb(fn) {
673
- return fn(getReadOnlySessionDb());
674
- }
675
- function getRawSessionMessageCountFromDb(db, sessionId) {
676
- const row = db.prepare(`SELECT COUNT(*) as count FROM message WHERE session_id = ?
677
- AND NOT (COALESCE(json_extract(data, '$.summary'), 0) = 1
678
- AND COALESCE(json_extract(data, '$.finish'), '') = 'stop')`).get(sessionId);
679
- return typeof row?.count === "number" ? row.count : 0;
680
- }
681
- var trackedSessions = new Map;
682
- var pendingParts = new Map;
683
- var probeLogObserverForTests;
684
- function asRecord(value) {
685
- return value !== null && typeof value === "object" ? value : null;
686
- }
687
- function truthyStoredFlag(value) {
688
- return value === true || value === 1 || value === "true";
689
- }
690
- function isMachineGeneratedPart(value) {
691
- const part = asRecord(value);
692
- if (!part)
693
- return false;
694
- const metadata = asRecord(part.metadata);
695
- const marker = asRecord(metadata?.marker);
696
- return truthyStoredFlag(part.synthetic) || truthyStoredFlag(part.ignored) || marker !== null && marker.kind !== null && marker.kind !== undefined;
697
- }
698
- function messageTimeCreated(message, fallback) {
699
- const time = asRecord(message.info.time);
700
- return typeof time?.created === "number" ? time.created : fallback;
701
- }
702
- function latestMessageByRole(messages, role, realUserOnly = false) {
703
- let latest = null;
704
- for (const [index, message] of messages.entries()) {
705
- if (message.info.role !== role)
706
- continue;
707
- if (realUserOnly && message.parts.length > 0 && message.parts.every(isMachineGeneratedPart)) {
708
- continue;
709
- }
710
- const timeCreated = messageTimeCreated(message, index);
711
- if (latest === null || timeCreated > latest.timeCreated || timeCreated === latest.timeCreated && index > latest.index) {
712
- latest = { message, timeCreated, index };
713
- }
714
- }
715
- return latest;
716
- }
717
- function assistantAwaitingToolsFromMessages(messages) {
718
- const latestAssistant = latestMessageByRole(messages, "assistant");
719
- if (!latestAssistant)
720
- return false;
721
- const assistantTime = asRecord(latestAssistant.message.info.time);
722
- if (typeof assistantTime?.created !== "number")
723
- return false;
724
- const latestRealUser = latestMessageByRole(messages, "user", true);
725
- if (latestRealUser && latestRealUser.timeCreated > latestAssistant.timeCreated)
726
- return false;
727
- if (latestAssistant.message.info.finish === "tool-calls")
728
- return true;
729
- return latestAssistant.message.parts.some((value) => {
730
- const part = asRecord(value);
731
- return part?.type === "tool" && part.providerExecuted !== true;
732
- });
733
- }
734
- function shouldHoldIgnoredNotificationFromMessages(messages) {
735
- if (assistantAwaitingToolsFromMessages(messages))
736
- return true;
737
- const latestAssistant = latestMessageByRole(messages, "assistant");
738
- if (latestAssistant) {
739
- const finish = latestAssistant.message.info.finish;
740
- if (typeof finish !== "string" || finish.length === 0)
741
- return true;
742
- if (finish === "tool-calls" || finish === "unknown")
743
- return true;
744
- }
745
- const latestRealUser = latestMessageByRole(messages, "user", true);
746
- return latestRealUser !== null && latestRealUser.timeCreated > (latestAssistant?.timeCreated ?? -1);
747
- }
748
- function trackedMessages(session) {
749
- return [...session.messages.values()].sort((left, right) => left.timeCreated - right.timeCreated).map((message) => ({
750
- info: {
751
- id: message.id,
752
- role: message.role,
753
- time: { created: message.timeCreated },
754
- ...message.finish === undefined ? {} : { finish: message.finish }
755
- },
756
- parts: [...message.parts.values()]
757
- }));
758
- }
759
- function pendingMessageParts(sessionId, messageId) {
760
- return pendingParts.get(sessionId)?.get(messageId) ?? new Map;
761
- }
762
- function observeOpenCodeTurnEvent(type, properties) {
763
- const props = asRecord(properties);
764
- if (!props)
765
- return;
766
- if (type === "message.part.updated") {
767
- const part = asRecord(props.part);
768
- if (!part || typeof part.sessionID !== "string" || typeof part.messageID !== "string" || typeof part.id !== "string") {
769
- return;
770
- }
771
- const tracked = trackedSessions.get(part.sessionID)?.messages.get(part.messageID);
772
- if (tracked) {
773
- tracked.parts.set(part.id, part);
774
- return;
775
- }
776
- let byMessage = pendingParts.get(part.sessionID);
777
- if (!byMessage) {
778
- byMessage = new Map;
779
- pendingParts.set(part.sessionID, byMessage);
780
- }
781
- let parts = byMessage.get(part.messageID);
782
- if (!parts) {
783
- parts = new Map;
784
- byMessage.set(part.messageID, parts);
785
- }
786
- parts.set(part.id, part);
787
- return;
788
- }
789
- if (type === "message.updated") {
790
- const info = asRecord(props.info);
791
- const time = asRecord(info?.time);
792
- if (!info || info.role !== "assistant" && info.role !== "user" || typeof info.sessionID !== "string" || typeof info.id !== "string") {
793
- return;
794
- }
795
- let session = trackedSessions.get(info.sessionID);
796
- if (!session) {
797
- session = { messages: new Map, sequence: 0 };
798
- trackedSessions.set(info.sessionID, session);
799
- }
800
- session.sequence += 1;
801
- const existing = session.messages.get(info.id);
802
- session.messages.set(info.id, {
803
- id: info.id,
804
- role: info.role,
805
- timeCreated: typeof time?.created === "number" ? time.created : existing?.timeCreated ?? session.sequence,
806
- ...typeof info.finish === "string" ? { finish: info.finish } : {},
807
- parts: existing?.parts ?? pendingMessageParts(info.sessionID, info.id)
808
- });
809
- pendingParts.get(info.sessionID)?.delete(info.id);
810
- return;
811
- }
812
- if (type === "message.removed") {
813
- if (typeof props.sessionID === "string" && typeof props.messageID === "string") {
814
- trackedSessions.get(props.sessionID)?.messages.delete(props.messageID);
815
- pendingParts.get(props.sessionID)?.delete(props.messageID);
816
- }
817
- return;
818
- }
819
- if (type === "session.deleted" && typeof props.sessionID === "string") {
820
- clearTrackedOpenCodeSession(props.sessionID);
821
- }
822
- }
823
- function clearTrackedOpenCodeSession(sessionId) {
824
- trackedSessions.delete(sessionId);
825
- pendingParts.delete(sessionId);
826
- }
827
- function logProbeFailureOnce(resolution, error) {
828
- const failure = recordOpenCodeDbReadFailure(resolution, error);
829
- if (!claimOpenCodeDbDiagnosticOnce("session-state-probe", resolution))
830
- return;
831
- const message = `[magic-context] OpenCode DB probe failed: path=${resolution.path} source=${resolution.source} cause=${failure.message}`;
832
- probeLogObserverForTests?.(message);
833
- log(message);
834
- }
835
- function resolvedDbIsAvailable() {
836
- const resolution = resolveOpenCodeDbPath();
837
- if (!harnessOwnsOpenCodeStore())
838
- return { resolution, available: false };
839
- const available = openCodeDbPathExists(resolution);
840
- if (available)
841
- clearOpenCodeDbReadFailure(resolution.path);
842
- else
843
- logProbeFailureOnce(resolution, "opencode_db_missing");
844
- return { resolution, available };
845
- }
846
- function assistantAwaitingTools(_deps, sessionId) {
847
- const availability = resolvedDbIsAvailable();
848
- const tracked = trackedSessions.get(sessionId);
849
- if (tracked)
850
- return assistantAwaitingToolsFromMessages(trackedMessages(tracked));
851
- if (!availability.available)
852
- return false;
853
- try {
854
- return withReadOnlySessionDb((db) => assistantAwaitingToolsFromOpenCodeDb(db, sessionId));
855
- } catch (error) {
856
- logProbeFailureOnce(availability.resolution, error);
857
- return false;
858
- }
859
- }
860
- function shouldHoldIgnoredNotificationFromOpenCodeDb(db, sessionId) {
861
- if (assistantAwaitingToolsFromOpenCodeDb(db, sessionId))
862
- return true;
863
- if (hasUnfinishedAssistant(db, sessionId))
864
- return true;
865
- if (hasUnansweredRealUser(db, sessionId))
866
- return true;
867
- return false;
868
- }
869
- function shouldHoldIgnoredNotification(sessionId) {
870
- if (process.env.MAGIC_CONTEXT_NOTICE_GATE === "bypass")
871
- return false;
872
- if (process.env.MAGIC_CONTEXT_NOTICE_GATE === "hold")
873
- return true;
874
- const availability = resolvedDbIsAvailable();
875
- const tracked = trackedSessions.get(sessionId);
876
- if (tracked)
877
- return shouldHoldIgnoredNotificationFromMessages(trackedMessages(tracked));
878
- if (!availability.available)
879
- return false;
880
- try {
881
- return withReadOnlySessionDb((db) => shouldHoldIgnoredNotificationFromOpenCodeDb(db, sessionId));
882
- } catch (error) {
883
- logProbeFailureOnce(availability.resolution, error);
884
- return false;
885
- }
886
- }
887
- function assistantAwaitingToolsFromOpenCodeDb(db, sessionId) {
888
- const latestAssistant = latestAssistantRow(db, sessionId);
889
- if (typeof latestAssistant?.id !== "string")
890
- return false;
891
- if (hasNewerRealUserMessage(db, sessionId, latestAssistant.timeCreated))
892
- return false;
893
- if (latestAssistant.finish === "tool-calls")
894
- return true;
895
- const partRows = db.prepare("SELECT data FROM part WHERE +session_id = ? AND likelihood(message_id = ?, 0.000001)").all(sessionId, latestAssistant.id);
896
- return partRows.some((row) => {
897
- if (typeof row.data !== "string" || row.data.length === 0)
898
- return false;
899
- try {
900
- const part = JSON.parse(row.data);
901
- return part.type === "tool" && part.providerExecuted !== true;
902
- } catch {
903
- return false;
904
- }
905
- });
906
- }
907
- function latestPersistedMessageForRecovery(sessionId) {
908
- return withReadOnlySessionDb((db) => {
909
- const row = db.prepare(`SELECT id, data
910
- FROM message
911
- WHERE session_id = ?
912
- ORDER BY time_created DESC, id DESC
913
- LIMIT 1`).get(sessionId);
914
- if (typeof row?.id !== "string" || typeof row.data !== "string")
915
- return null;
916
- try {
917
- const data = JSON.parse(row.data);
918
- if (typeof data.role !== "string")
919
- return null;
920
- const time = data.time && typeof data.time === "object" ? data.time : null;
921
- return {
922
- id: row.id,
923
- role: data.role,
924
- ...typeof data.parentID === "string" ? { parentID: data.parentID } : {},
925
- ...typeof time?.completed === "number" ? { completedAt: time.completed } : {},
926
- ...data.error === undefined ? {} : { error: data.error }
927
- };
928
- } catch {
929
- return null;
930
- }
931
- });
932
- }
933
- function hasNewerRealUserMessage(db, sessionId, latestAssistantTimeCreated) {
934
- if (typeof latestAssistantTimeCreated !== "number")
935
- return false;
936
- const row = db.prepare(`SELECT 1 as one
937
- FROM message m
938
- WHERE m.session_id = ?
939
- AND m.time_created > ?
940
- AND json_extract(m.data, '$.role') = 'user'
941
- AND NOT (
942
- EXISTS (SELECT 1 FROM part p WHERE p.message_id = m.id)
943
- AND NOT EXISTS (
944
- SELECT 1 FROM part p
945
- WHERE p.message_id = m.id
946
- AND COALESCE(json_extract(p.data, '$.synthetic'), 0) NOT IN (1, 'true')
947
- AND json_extract(p.data, '$.metadata.marker.kind') IS NULL
948
- AND COALESCE(json_extract(p.data, '$.ignored'), 0) NOT IN (1, 'true')
949
- )
950
- )
951
- LIMIT 1`).get(sessionId, latestAssistantTimeCreated);
952
- return row?.one === 1;
953
- }
954
- function latestAssistantRow(db, sessionId) {
955
- return db.prepare(`SELECT id,
956
- json_extract(data, '$.finish') as finish,
957
- time_created as timeCreated
958
- FROM message
959
- WHERE session_id = ?
960
- AND json_extract(data, '$.role') = 'assistant'
961
- ORDER BY time_created DESC
962
- LIMIT 1`).get(sessionId);
963
- }
964
- function hasUnfinishedAssistant(db, sessionId) {
965
- const latestAssistant = latestAssistantRow(db, sessionId);
966
- if (typeof latestAssistant?.id !== "string")
967
- return false;
968
- const finish = latestAssistant.finish;
969
- if (typeof finish !== "string" || finish.length === 0)
970
- return true;
971
- return finish === "tool-calls" || finish === "unknown";
972
- }
973
- function hasUnansweredRealUser(db, sessionId) {
974
- const latestAssistant = latestAssistantRow(db, sessionId);
975
- const latestAssistantTime = typeof latestAssistant?.timeCreated === "number" ? latestAssistant.timeCreated : -1;
976
- return hasNewerRealUserMessage(db, sessionId, latestAssistantTime);
977
- }
978
- function getMessageTimesFromOpenCodeDb(sessionId, messageIds) {
979
- const result = new Map;
980
- if (messageIds.length === 0 || !harnessOwnsOpenCodeStore())
981
- return result;
982
- try {
983
- withReadOnlySessionDb((db) => {
984
- const placeholders = messageIds.map(() => "?").join(",");
985
- const rows = db.prepare(`SELECT id, time_created FROM message WHERE session_id = ? AND id IN (${placeholders})`).all(sessionId, ...messageIds);
986
- for (const row of rows) {
987
- if (typeof row.id === "string" && typeof row.time_created === "number") {
988
- result.set(row.id, row.time_created);
989
- }
990
- }
991
- });
992
- } catch (error) {
993
- logProbeFailureOnce(resolveOpenCodeDbPath(), error);
994
- }
995
- return result;
996
- }
997
- function findLastAssistantModelFromOpenCodeDb(sessionId) {
998
- if (!harnessOwnsOpenCodeStore())
999
- return null;
1000
- const resolution = resolveOpenCodeDbPath();
1001
- try {
1002
- if (!openCodeDbPathExists(resolution)) {
1003
- throw new Error(`OpenCode session database is unavailable at ${resolution.path}`);
1004
- }
1005
- const db = new Database(resolution.path, { readonly: true });
1006
- try {
1007
- const queryV2 = () => db.prepare(`SELECT json_extract(data, '$.model.providerID') as providerID,
1008
- json_extract(data, '$.model.id') as modelID,
1009
- json_extract(data, '$.agent') as agent
1010
- FROM session_message
1011
- WHERE session_id = ?
1012
- AND type = 'assistant'
1013
- AND json_extract(data, '$.model.providerID') IS NOT NULL
1014
- AND json_extract(data, '$.model.id') IS NOT NULL
1015
- ORDER BY seq DESC
1016
- LIMIT 1`).get(sessionId);
1017
- const queryV1 = () => db.prepare(`SELECT json_extract(data, '$.providerID') as providerID,
1018
- json_extract(data, '$.modelID') as modelID,
1019
- json_extract(data, '$.agent') as agent
1020
- FROM message
1021
- WHERE session_id = ?
1022
- AND json_extract(data, '$.role') = 'assistant'
1023
- AND json_extract(data, '$.providerID') IS NOT NULL
1024
- AND json_extract(data, '$.modelID') IS NOT NULL
1025
- ORDER BY time_created DESC
1026
- LIMIT 1`).get(sessionId);
1027
- let row = null;
1028
- try {
1029
- assertOpenCodeStoreGeneration(db, "v2", resolution.path);
1030
- row = queryV2();
1031
- } catch {}
1032
- if (!row) {
1033
- try {
1034
- assertOpenCodeStoreGeneration(db, "v1", resolution.path);
1035
- row = queryV1();
1036
- } catch {}
1037
- }
1038
- if (!row || typeof row.providerID !== "string" || typeof row.modelID !== "string") {
1039
- return null;
1040
- }
1041
- const agent = typeof row.agent === "string" && row.agent.length > 0 ? row.agent : undefined;
1042
- return {
1043
- providerID: row.providerID,
1044
- modelID: row.modelID,
1045
- ...agent ? { agent } : {}
1046
- };
1047
- } finally {
1048
- closeQuietly(db);
1049
- }
1050
- } catch (error) {
1051
- logProbeFailureOnce(resolution, error);
1052
- return null;
1053
- }
1054
- }
1055
-
1056
- export { resolveOpenCodeDbPath, hasV1MessageTables, assertOpenCodeStoreGeneration, openCodeDbPathExists, getOpenCodeDbProbeDescriptions, formatOpenCodeDbMissingBanner, formatOpenCodeDbMissingStatusLine, formatOpenCodeDbReadFailureStatusLine, recordOpenCodeDbReadFailure, clearOpenCodeDbReadFailure, getOpenCodeDbReadFailure, claimOpenCodeDbDiagnosticOnce, registerSlowWriteReporter, detectSqliteRuntime, Database, getSqliteMemoryStats, withSqliteBackgroundWriter, withSqliteTransformPass, withoutSqliteTransformPass, isTransientSqliteError, SqliteAcquisitionBusyError, beginSqliteWriterAsync, withAsyncPrivilegedWriter, withPrivilegedWriter, closeQuietly, openCodeDbExists, withReadOnlySessionDb, getRawSessionMessageCountFromDb, observeOpenCodeTurnEvent, clearTrackedOpenCodeSession, assistantAwaitingTools, shouldHoldIgnoredNotification, latestPersistedMessageForRecovery, getMessageTimesFromOpenCodeDb, findLastAssistantModelFromOpenCodeDb };