@xrkseek/harness 0.6.23 → 0.7.0-rc.2

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 (738) hide show
  1. package/node_modules/@xrkseek/a2a/README.md +45 -45
  2. package/node_modules/@xrkseek/attachment/README.md +23 -23
  3. package/node_modules/@xrkseek/attachment-local/README.md +6 -6
  4. package/node_modules/@xrkseek/attachment-local/package.json +26 -26
  5. package/node_modules/@xrkseek/checkpoint/README.md +90 -90
  6. package/node_modules/@xrkseek/checkpoint/dist/process-git.d.ts +5 -0
  7. package/node_modules/@xrkseek/checkpoint/dist/process-git.d.ts.map +1 -1
  8. package/node_modules/@xrkseek/checkpoint/dist/process-git.js +59 -2
  9. package/node_modules/@xrkseek/checkpoint/dist/process-git.js.map +1 -1
  10. package/node_modules/@xrkseek/checkpoint/dist/store.d.ts +45 -0
  11. package/node_modules/@xrkseek/checkpoint/dist/store.d.ts.map +1 -1
  12. package/node_modules/@xrkseek/checkpoint/dist/store.js +221 -60
  13. package/node_modules/@xrkseek/checkpoint/dist/store.js.map +1 -1
  14. package/node_modules/@xrkseek/checkpoint/package.json +26 -26
  15. package/node_modules/@xrkseek/claude-code-mods/README.md +152 -0
  16. package/node_modules/@xrkseek/claude-code-mods/README.zh.md +172 -0
  17. package/node_modules/@xrkseek/claude-code-mods/dist/api.d.ts +36 -0
  18. package/node_modules/@xrkseek/claude-code-mods/dist/api.d.ts.map +1 -0
  19. package/node_modules/@xrkseek/claude-code-mods/dist/api.js +215 -0
  20. package/node_modules/@xrkseek/claude-code-mods/dist/api.js.map +1 -0
  21. package/node_modules/@xrkseek/claude-code-mods/dist/attach.d.ts +92 -0
  22. package/node_modules/@xrkseek/claude-code-mods/dist/attach.d.ts.map +1 -0
  23. package/node_modules/@xrkseek/claude-code-mods/dist/attach.js +106 -0
  24. package/node_modules/@xrkseek/claude-code-mods/dist/attach.js.map +1 -0
  25. package/node_modules/@xrkseek/claude-code-mods/dist/chain.d.ts +105 -0
  26. package/node_modules/@xrkseek/claude-code-mods/dist/chain.d.ts.map +1 -0
  27. package/node_modules/@xrkseek/claude-code-mods/dist/chain.js +324 -0
  28. package/node_modules/@xrkseek/claude-code-mods/dist/chain.js.map +1 -0
  29. package/node_modules/@xrkseek/claude-code-mods/dist/define-mod.d.ts +39 -0
  30. package/node_modules/@xrkseek/claude-code-mods/dist/define-mod.d.ts.map +1 -0
  31. package/node_modules/@xrkseek/claude-code-mods/dist/define-mod.js +39 -0
  32. package/node_modules/@xrkseek/claude-code-mods/dist/define-mod.js.map +1 -0
  33. package/node_modules/@xrkseek/claude-code-mods/dist/elements.d.ts +96 -0
  34. package/node_modules/@xrkseek/claude-code-mods/dist/elements.d.ts.map +1 -0
  35. package/node_modules/@xrkseek/claude-code-mods/dist/elements.js +171 -0
  36. package/node_modules/@xrkseek/claude-code-mods/dist/elements.js.map +1 -0
  37. package/node_modules/@xrkseek/claude-code-mods/dist/engine.d.ts +155 -0
  38. package/node_modules/@xrkseek/claude-code-mods/dist/engine.d.ts.map +1 -0
  39. package/node_modules/@xrkseek/claude-code-mods/dist/engine.js +356 -0
  40. package/node_modules/@xrkseek/claude-code-mods/dist/engine.js.map +1 -0
  41. package/node_modules/@xrkseek/claude-code-mods/dist/host-ops.d.ts +72 -0
  42. package/node_modules/@xrkseek/claude-code-mods/dist/host-ops.d.ts.map +1 -0
  43. package/node_modules/@xrkseek/claude-code-mods/dist/host-ops.js +603 -0
  44. package/node_modules/@xrkseek/claude-code-mods/dist/host-ops.js.map +1 -0
  45. package/node_modules/@xrkseek/claude-code-mods/dist/index.d.ts +112 -0
  46. package/node_modules/@xrkseek/claude-code-mods/dist/index.d.ts.map +1 -0
  47. package/node_modules/@xrkseek/claude-code-mods/dist/index.js +654 -0
  48. package/node_modules/@xrkseek/claude-code-mods/dist/index.js.map +1 -0
  49. package/node_modules/@xrkseek/claude-code-mods/dist/matcher.d.ts +45 -0
  50. package/node_modules/@xrkseek/claude-code-mods/dist/matcher.d.ts.map +1 -0
  51. package/node_modules/@xrkseek/claude-code-mods/dist/matcher.js +195 -0
  52. package/node_modules/@xrkseek/claude-code-mods/dist/matcher.js.map +1 -0
  53. package/node_modules/@xrkseek/claude-code-mods/dist/module.d.ts +74 -0
  54. package/node_modules/@xrkseek/claude-code-mods/dist/module.d.ts.map +1 -0
  55. package/node_modules/@xrkseek/claude-code-mods/dist/module.js +167 -0
  56. package/node_modules/@xrkseek/claude-code-mods/dist/module.js.map +1 -0
  57. package/node_modules/@xrkseek/claude-code-mods/dist/native-import.d.ts +31 -0
  58. package/node_modules/@xrkseek/claude-code-mods/dist/native-import.d.ts.map +1 -0
  59. package/node_modules/@xrkseek/claude-code-mods/dist/native-import.js +32 -0
  60. package/node_modules/@xrkseek/claude-code-mods/dist/native-import.js.map +1 -0
  61. package/node_modules/@xrkseek/claude-code-mods/dist/plugin-dir.d.ts +70 -0
  62. package/node_modules/@xrkseek/claude-code-mods/dist/plugin-dir.d.ts.map +1 -0
  63. package/node_modules/@xrkseek/claude-code-mods/dist/plugin-dir.js +167 -0
  64. package/node_modules/@xrkseek/claude-code-mods/dist/plugin-dir.js.map +1 -0
  65. package/node_modules/@xrkseek/claude-code-mods/dist/product-agent.d.ts +57 -0
  66. package/node_modules/@xrkseek/claude-code-mods/dist/product-agent.d.ts.map +1 -0
  67. package/node_modules/@xrkseek/claude-code-mods/dist/product-agent.js +85 -0
  68. package/node_modules/@xrkseek/claude-code-mods/dist/product-agent.js.map +1 -0
  69. package/node_modules/@xrkseek/claude-code-mods/dist/runtime.d.ts +117 -0
  70. package/node_modules/@xrkseek/claude-code-mods/dist/runtime.d.ts.map +1 -0
  71. package/node_modules/@xrkseek/claude-code-mods/dist/runtime.js +252 -0
  72. package/node_modules/@xrkseek/claude-code-mods/dist/runtime.js.map +1 -0
  73. package/node_modules/@xrkseek/claude-code-mods/dist/storage-domain.d.ts +68 -0
  74. package/node_modules/@xrkseek/claude-code-mods/dist/storage-domain.d.ts.map +1 -0
  75. package/node_modules/@xrkseek/claude-code-mods/dist/storage-domain.js +104 -0
  76. package/node_modules/@xrkseek/claude-code-mods/dist/storage-domain.js.map +1 -0
  77. package/node_modules/@xrkseek/claude-code-mods/dist/surfaces.d.ts +82 -0
  78. package/node_modules/@xrkseek/claude-code-mods/dist/surfaces.d.ts.map +1 -0
  79. package/node_modules/@xrkseek/claude-code-mods/dist/surfaces.js +243 -0
  80. package/node_modules/@xrkseek/claude-code-mods/dist/surfaces.js.map +1 -0
  81. package/node_modules/@xrkseek/claude-code-mods/dist/testing.d.ts +157 -0
  82. package/node_modules/@xrkseek/claude-code-mods/dist/testing.d.ts.map +1 -0
  83. package/node_modules/@xrkseek/claude-code-mods/dist/testing.js +266 -0
  84. package/node_modules/@xrkseek/claude-code-mods/dist/testing.js.map +1 -0
  85. package/node_modules/@xrkseek/claude-code-mods/dist/tool-names.d.ts +21 -0
  86. package/node_modules/@xrkseek/claude-code-mods/dist/tool-names.d.ts.map +1 -0
  87. package/node_modules/@xrkseek/claude-code-mods/dist/tool-names.js +37 -0
  88. package/node_modules/@xrkseek/claude-code-mods/dist/tool-names.js.map +1 -0
  89. package/node_modules/@xrkseek/claude-code-mods/dist/types.d.ts +592 -0
  90. package/node_modules/@xrkseek/claude-code-mods/dist/types.d.ts.map +1 -0
  91. package/node_modules/@xrkseek/claude-code-mods/dist/types.js +10 -0
  92. package/node_modules/@xrkseek/claude-code-mods/dist/types.js.map +1 -0
  93. package/node_modules/@xrkseek/claude-code-mods/dist/values.d.ts +58 -0
  94. package/node_modules/@xrkseek/claude-code-mods/dist/values.d.ts.map +1 -0
  95. package/node_modules/@xrkseek/claude-code-mods/dist/values.js +75 -0
  96. package/node_modules/@xrkseek/claude-code-mods/dist/values.js.map +1 -0
  97. package/node_modules/@xrkseek/claude-code-mods/dist/working-directory.d.ts +45 -0
  98. package/node_modules/@xrkseek/claude-code-mods/dist/working-directory.d.ts.map +1 -0
  99. package/node_modules/@xrkseek/claude-code-mods/dist/working-directory.js +29 -0
  100. package/node_modules/@xrkseek/claude-code-mods/dist/working-directory.js.map +1 -0
  101. package/node_modules/@xrkseek/claude-code-mods/package.json +47 -0
  102. package/node_modules/@xrkseek/code-runtime/README.md +20 -20
  103. package/node_modules/@xrkseek/core-agent/dist/index.d.ts +87 -0
  104. package/node_modules/@xrkseek/core-agent/dist/index.d.ts.map +1 -1
  105. package/node_modules/@xrkseek/core-agent/dist/index.js.map +1 -1
  106. package/node_modules/@xrkseek/core-agent-loop/dist/index.d.ts.map +1 -1
  107. package/node_modules/@xrkseek/core-agent-loop/dist/index.js +62 -32
  108. package/node_modules/@xrkseek/core-agent-loop/dist/index.js.map +1 -1
  109. package/node_modules/@xrkseek/core-agent-loop/package.json +42 -42
  110. package/node_modules/@xrkseek/core-session/README.md +35 -35
  111. package/node_modules/@xrkseek/core-session/dist/compaction.d.ts +46 -2
  112. package/node_modules/@xrkseek/core-session/dist/compaction.d.ts.map +1 -1
  113. package/node_modules/@xrkseek/core-session/dist/compaction.js +124 -49
  114. package/node_modules/@xrkseek/core-session/dist/compaction.js.map +1 -1
  115. package/node_modules/@xrkseek/core-session/dist/freeze.d.ts +6 -0
  116. package/node_modules/@xrkseek/core-session/dist/freeze.d.ts.map +1 -1
  117. package/node_modules/@xrkseek/core-session/dist/freeze.js +9 -0
  118. package/node_modules/@xrkseek/core-session/dist/freeze.js.map +1 -1
  119. package/node_modules/@xrkseek/core-session/dist/index.d.ts +20 -4
  120. package/node_modules/@xrkseek/core-session/dist/index.d.ts.map +1 -1
  121. package/node_modules/@xrkseek/core-session/dist/index.js +55 -14
  122. package/node_modules/@xrkseek/core-session/dist/index.js.map +1 -1
  123. package/node_modules/@xrkseek/core-session/dist/list-hints.d.ts.map +1 -1
  124. package/node_modules/@xrkseek/core-session/dist/list-hints.js +14 -4
  125. package/node_modules/@xrkseek/core-session/dist/list-hints.js.map +1 -1
  126. package/node_modules/@xrkseek/core-session/dist/repair-open-turn.d.ts +8 -1
  127. package/node_modules/@xrkseek/core-session/dist/repair-open-turn.d.ts.map +1 -1
  128. package/node_modules/@xrkseek/core-session/dist/repair-open-turn.js +14 -4
  129. package/node_modules/@xrkseek/core-session/dist/repair-open-turn.js.map +1 -1
  130. package/node_modules/@xrkseek/core-session/dist/sqlite-store.d.ts +55 -0
  131. package/node_modules/@xrkseek/core-session/dist/sqlite-store.d.ts.map +1 -1
  132. package/node_modules/@xrkseek/core-session/dist/sqlite-store.js +670 -92
  133. package/node_modules/@xrkseek/core-session/dist/sqlite-store.js.map +1 -1
  134. package/node_modules/@xrkseek/core-session/dist/store.d.ts +38 -0
  135. package/node_modules/@xrkseek/core-session/dist/store.d.ts.map +1 -1
  136. package/node_modules/@xrkseek/core-session/dist/surface-estimate.d.ts +6 -0
  137. package/node_modules/@xrkseek/core-session/dist/surface-estimate.d.ts.map +1 -1
  138. package/node_modules/@xrkseek/core-session/dist/surface-estimate.js +23 -0
  139. package/node_modules/@xrkseek/core-session/dist/surface-estimate.js.map +1 -1
  140. package/node_modules/@xrkseek/core-session/dist/surface-fold.d.ts.map +1 -1
  141. package/node_modules/@xrkseek/core-session/dist/surface-fold.js +5 -7
  142. package/node_modules/@xrkseek/core-session/dist/surface-fold.js.map +1 -1
  143. package/node_modules/@xrkseek/core-session/package.json +34 -34
  144. package/node_modules/@xrkseek/core-system-prompt/README.md +14 -14
  145. package/node_modules/@xrkseek/core-tools/dist/session-query-prompt.d.ts.map +1 -1
  146. package/node_modules/@xrkseek/core-tools/dist/session-query-prompt.js +3 -2
  147. package/node_modules/@xrkseek/core-tools/dist/session-query-prompt.js.map +1 -1
  148. package/node_modules/@xrkseek/core-tools/dist/std-tools.d.ts.map +1 -1
  149. package/node_modules/@xrkseek/core-tools/dist/std-tools.js +1 -13
  150. package/node_modules/@xrkseek/core-tools/dist/std-tools.js.map +1 -1
  151. package/node_modules/@xrkseek/exec-computer-use/README.md +14 -14
  152. package/node_modules/@xrkseek/exec-computer-use/dist/windows-uia.js +402 -402
  153. package/node_modules/@xrkseek/exec-computer-use/package.json +26 -26
  154. package/node_modules/@xrkseek/exec-fs/README.md +12 -12
  155. package/node_modules/@xrkseek/exec-fs/dist/read-image.d.ts +7 -0
  156. package/node_modules/@xrkseek/exec-fs/dist/read-image.d.ts.map +1 -1
  157. package/node_modules/@xrkseek/exec-fs/dist/read-image.js +33 -15
  158. package/node_modules/@xrkseek/exec-fs/dist/read-image.js.map +1 -1
  159. package/node_modules/@xrkseek/exec-fs/dist/routing-prompt.js +1 -1
  160. package/node_modules/@xrkseek/exec-fs/dist/routing-prompt.js.map +1 -1
  161. package/node_modules/@xrkseek/exec-image-gen/README.md +13 -13
  162. package/node_modules/@xrkseek/exec-image-gen/package.json +28 -28
  163. package/node_modules/@xrkseek/exec-memory/README.md +14 -14
  164. package/node_modules/@xrkseek/exec-memory/dist/live-fragment.d.ts +11 -0
  165. package/node_modules/@xrkseek/exec-memory/dist/live-fragment.d.ts.map +1 -0
  166. package/node_modules/@xrkseek/exec-memory/dist/live-fragment.js +40 -0
  167. package/node_modules/@xrkseek/exec-memory/dist/live-fragment.js.map +1 -0
  168. package/node_modules/@xrkseek/exec-memory/package.json +28 -28
  169. package/node_modules/@xrkseek/exec-sandbox/README.md +15 -15
  170. package/node_modules/@xrkseek/exec-ssh/README.md +19 -19
  171. package/node_modules/@xrkseek/exec-subprocess/README.md +10 -10
  172. package/node_modules/@xrkseek/exec-video-analyze/README.md +11 -11
  173. package/node_modules/@xrkseek/exec-video-analyze/package.json +26 -26
  174. package/node_modules/@xrkseek/exec-video-gen/README.md +26 -26
  175. package/node_modules/@xrkseek/exec-voice/README.md +25 -25
  176. package/node_modules/@xrkseek/exec-web/README.md +11 -11
  177. package/node_modules/@xrkseek/exec-web/dist/fetch-http.d.ts +8 -0
  178. package/node_modules/@xrkseek/exec-web/dist/fetch-http.d.ts.map +1 -1
  179. package/node_modules/@xrkseek/exec-web/dist/fetch-http.js +5 -1
  180. package/node_modules/@xrkseek/exec-web/dist/fetch-http.js.map +1 -1
  181. package/node_modules/@xrkseek/exec-web/dist/format.d.ts.map +1 -1
  182. package/node_modules/@xrkseek/exec-web/dist/format.js +1 -0
  183. package/node_modules/@xrkseek/exec-web/dist/format.js.map +1 -1
  184. package/node_modules/@xrkseek/exec-web/dist/index.d.ts +2 -2
  185. package/node_modules/@xrkseek/exec-web/dist/index.d.ts.map +1 -1
  186. package/node_modules/@xrkseek/exec-web/dist/index.js +2 -2
  187. package/node_modules/@xrkseek/exec-web/dist/index.js.map +1 -1
  188. package/node_modules/@xrkseek/exec-web/dist/search-duckduckgo.d.ts.map +1 -1
  189. package/node_modules/@xrkseek/exec-web/dist/search-duckduckgo.js +15 -8
  190. package/node_modules/@xrkseek/exec-web/dist/search-duckduckgo.js.map +1 -1
  191. package/node_modules/@xrkseek/exec-web/dist/search-parallel-free.d.ts.map +1 -1
  192. package/node_modules/@xrkseek/exec-web/dist/search-parallel-free.js +21 -13
  193. package/node_modules/@xrkseek/exec-web/dist/search-parallel-free.js.map +1 -1
  194. package/node_modules/@xrkseek/exec-web/dist/search-providers.d.ts +16 -3
  195. package/node_modules/@xrkseek/exec-web/dist/search-providers.d.ts.map +1 -1
  196. package/node_modules/@xrkseek/exec-web/dist/search-providers.js +113 -7
  197. package/node_modules/@xrkseek/exec-web/dist/search-providers.js.map +1 -1
  198. package/node_modules/@xrkseek/exec-web/dist/tools.d.ts.map +1 -1
  199. package/node_modules/@xrkseek/exec-web/dist/tools.js +15 -2
  200. package/node_modules/@xrkseek/exec-web/dist/tools.js.map +1 -1
  201. package/node_modules/@xrkseek/exec-web/dist/types.d.ts +6 -0
  202. package/node_modules/@xrkseek/exec-web/dist/types.d.ts.map +1 -1
  203. package/node_modules/@xrkseek/llm-deepseek/README.md +22 -22
  204. package/node_modules/@xrkseek/llm-deepseek/package.json +30 -30
  205. package/node_modules/@xrkseek/llm-registry/dist/index.d.ts +2 -2
  206. package/node_modules/@xrkseek/llm-registry/dist/index.d.ts.map +1 -1
  207. package/node_modules/@xrkseek/llm-registry/dist/index.js +1 -1
  208. package/node_modules/@xrkseek/llm-registry/dist/index.js.map +1 -1
  209. package/node_modules/@xrkseek/llm-registry/dist/models-dev-catalog.d.ts.map +1 -1
  210. package/node_modules/@xrkseek/llm-registry/dist/models-dev-catalog.js +13 -2
  211. package/node_modules/@xrkseek/llm-registry/dist/models-dev-catalog.js.map +1 -1
  212. package/node_modules/@xrkseek/llm-registry/dist/registry.d.ts +6 -0
  213. package/node_modules/@xrkseek/llm-registry/dist/registry.d.ts.map +1 -1
  214. package/node_modules/@xrkseek/llm-registry/dist/registry.js +6 -0
  215. package/node_modules/@xrkseek/llm-registry/dist/registry.js.map +1 -1
  216. package/node_modules/@xrkseek/llm-registry/dist/types.d.ts +29 -0
  217. package/node_modules/@xrkseek/llm-registry/dist/types.d.ts.map +1 -1
  218. package/node_modules/@xrkseek/llm-registry/dist/types.js +21 -0
  219. package/node_modules/@xrkseek/llm-registry/dist/types.js.map +1 -1
  220. package/node_modules/@xrkseek/mcp/README.md +78 -78
  221. package/node_modules/@xrkseek/policy/README.md +18 -18
  222. package/node_modules/@xrkseek/policy/package.json +31 -31
  223. package/node_modules/@xrkseek/preset-harness/README.md +7 -7
  224. package/node_modules/@xrkseek/preset-harness/dist/mods.d.ts +68 -0
  225. package/node_modules/@xrkseek/preset-harness/dist/mods.d.ts.map +1 -0
  226. package/node_modules/@xrkseek/preset-harness/dist/mods.js +510 -0
  227. package/node_modules/@xrkseek/preset-harness/dist/mods.js.map +1 -0
  228. package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts +12 -1
  229. package/node_modules/@xrkseek/preset-harness/dist/preset.d.ts.map +1 -1
  230. package/node_modules/@xrkseek/preset-harness/dist/preset.js +73 -26
  231. package/node_modules/@xrkseek/preset-harness/dist/preset.js.map +1 -1
  232. package/node_modules/@xrkseek/preset-harness/dist/tsconfig.tsbuildinfo +1 -1
  233. package/node_modules/@xrkseek/preset-harness/package.json +9 -8
  234. package/node_modules/@xrkseek/preset-minimal/README.md +6 -6
  235. package/node_modules/@xrkseek/preset-minimal/dist/preset.d.ts.map +1 -1
  236. package/node_modules/@xrkseek/preset-minimal/dist/preset.js +9 -3
  237. package/node_modules/@xrkseek/preset-minimal/dist/preset.js.map +1 -1
  238. package/node_modules/@xrkseek/preset-minimal/dist/tsconfig.tsbuildinfo +1 -1
  239. package/node_modules/@xrkseek/preset-server/README.md +4 -4
  240. package/node_modules/@xrkseek/preset-server/dist/preset.d.ts.map +1 -1
  241. package/node_modules/@xrkseek/preset-server/dist/preset.js +2 -1
  242. package/node_modules/@xrkseek/preset-server/dist/preset.js.map +1 -1
  243. package/node_modules/@xrkseek/preset-server/dist/tsconfig.tsbuildinfo +1 -1
  244. package/node_modules/@xrkseek/protocol/README.md +34 -34
  245. package/node_modules/@xrkseek/protocol/dist/content.d.ts.map +1 -1
  246. package/node_modules/@xrkseek/protocol/dist/content.js +6 -1
  247. package/node_modules/@xrkseek/protocol/dist/content.js.map +1 -1
  248. package/node_modules/@xrkseek/protocol/dist/index.d.ts +3 -2
  249. package/node_modules/@xrkseek/protocol/dist/index.d.ts.map +1 -1
  250. package/node_modules/@xrkseek/protocol/dist/index.js +1 -0
  251. package/node_modules/@xrkseek/protocol/dist/index.js.map +1 -1
  252. package/node_modules/@xrkseek/protocol/dist/json-schema.d.ts +12 -0
  253. package/node_modules/@xrkseek/protocol/dist/json-schema.d.ts.map +1 -1
  254. package/node_modules/@xrkseek/protocol/dist/json-schema.js +9 -0
  255. package/node_modules/@xrkseek/protocol/dist/json-schema.js.map +1 -1
  256. package/node_modules/@xrkseek/protocol/dist/json-value.d.ts +25 -0
  257. package/node_modules/@xrkseek/protocol/dist/json-value.d.ts.map +1 -0
  258. package/node_modules/@xrkseek/protocol/dist/json-value.js +181 -0
  259. package/node_modules/@xrkseek/protocol/dist/json-value.js.map +1 -0
  260. package/node_modules/@xrkseek/protocol/dist/session-events.d.ts +21 -1
  261. package/node_modules/@xrkseek/protocol/dist/session-events.d.ts.map +1 -1
  262. package/node_modules/@xrkseek/protocol/dist/session-events.js +1 -0
  263. package/node_modules/@xrkseek/protocol/dist/session-events.js.map +1 -1
  264. package/node_modules/@xrkseek/protocol/dist/validate.d.ts +4 -1
  265. package/node_modules/@xrkseek/protocol/dist/validate.d.ts.map +1 -1
  266. package/node_modules/@xrkseek/protocol/dist/validate.js +28 -2
  267. package/node_modules/@xrkseek/protocol/dist/validate.js.map +1 -1
  268. package/node_modules/@xrkseek/schemastery/lib/index.cjs +597 -597
  269. package/node_modules/@xrkseek/schemastery/lib/index.mjs +597 -597
  270. package/node_modules/@xrkseek/schemastery/lib/types/index.d.ts +203 -203
  271. package/node_modules/@xrkseek/schemastery/src/index.d.ts +203 -203
  272. package/node_modules/@xrkseek/schemastery/src/index.ts +906 -906
  273. package/node_modules/@xrkseek/server-config/package.json +28 -28
  274. package/node_modules/@xrkseek/server-cron/README.md +12 -12
  275. package/node_modules/@xrkseek/server-cron/package.json +26 -26
  276. package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.d.ts +22 -0
  277. package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.d.ts.map +1 -1
  278. package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.js +40 -3
  279. package/node_modules/@xrkseek/server-face/dist/adapt/history-paginate.js.map +1 -1
  280. package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.d.ts.map +1 -1
  281. package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.js +2 -0
  282. package/node_modules/@xrkseek/server-face/dist/adapt/subagent-notice.js.map +1 -1
  283. package/node_modules/@xrkseek/server-face/dist/adapt/wire-event.d.ts +1 -0
  284. package/node_modules/@xrkseek/server-face/dist/adapt/wire-event.d.ts.map +1 -1
  285. package/node_modules/@xrkseek/server-face/dist/adapt/wire-event.js +2 -0
  286. package/node_modules/@xrkseek/server-face/dist/adapt/wire-event.js.map +1 -1
  287. package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.d.ts +5 -0
  288. package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.d.ts.map +1 -1
  289. package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.js +7 -0
  290. package/node_modules/@xrkseek/server-face/dist/adapt/wire-ids.js.map +1 -1
  291. package/node_modules/@xrkseek/server-face/dist/agent-home-boundary.d.ts +31 -0
  292. package/node_modules/@xrkseek/server-face/dist/agent-home-boundary.d.ts.map +1 -0
  293. package/node_modules/@xrkseek/server-face/dist/agent-home-boundary.js +71 -0
  294. package/node_modules/@xrkseek/server-face/dist/agent-home-boundary.js.map +1 -0
  295. package/node_modules/@xrkseek/server-face/dist/agent-home.d.ts +18 -0
  296. package/node_modules/@xrkseek/server-face/dist/agent-home.d.ts.map +1 -0
  297. package/node_modules/@xrkseek/server-face/dist/agent-home.js +64 -0
  298. package/node_modules/@xrkseek/server-face/dist/agent-home.js.map +1 -0
  299. package/node_modules/@xrkseek/server-face/dist/agent-roster-store.d.ts +41 -2
  300. package/node_modules/@xrkseek/server-face/dist/agent-roster-store.d.ts.map +1 -1
  301. package/node_modules/@xrkseek/server-face/dist/agent-roster-store.js +200 -28
  302. package/node_modules/@xrkseek/server-face/dist/agent-roster-store.js.map +1 -1
  303. package/node_modules/@xrkseek/server-face/dist/agent-team-roles.js +1 -1
  304. package/node_modules/@xrkseek/server-face/dist/agent-team-roles.js.map +1 -1
  305. package/node_modules/@xrkseek/server-face/dist/attach-http.d.ts.map +1 -1
  306. package/node_modules/@xrkseek/server-face/dist/attach-http.js +9 -0
  307. package/node_modules/@xrkseek/server-face/dist/attach-http.js.map +1 -1
  308. package/node_modules/@xrkseek/server-face/dist/boss-status-broadcast.d.ts +55 -0
  309. package/node_modules/@xrkseek/server-face/dist/boss-status-broadcast.d.ts.map +1 -0
  310. package/node_modules/@xrkseek/server-face/dist/boss-status-broadcast.js +167 -0
  311. package/node_modules/@xrkseek/server-face/dist/boss-status-broadcast.js.map +1 -0
  312. package/node_modules/@xrkseek/server-face/dist/collab-board.d.ts +12 -0
  313. package/node_modules/@xrkseek/server-face/dist/collab-board.d.ts.map +1 -1
  314. package/node_modules/@xrkseek/server-face/dist/collab-board.js +101 -19
  315. package/node_modules/@xrkseek/server-face/dist/collab-board.js.map +1 -1
  316. package/node_modules/@xrkseek/server-face/dist/community-llm-sync.d.ts +2 -2
  317. package/node_modules/@xrkseek/server-face/dist/community-llm-sync.d.ts.map +1 -1
  318. package/node_modules/@xrkseek/server-face/dist/community-llm-sync.js +19 -7
  319. package/node_modules/@xrkseek/server-face/dist/community-llm-sync.js.map +1 -1
  320. package/node_modules/@xrkseek/server-face/dist/context.d.ts +29 -0
  321. package/node_modules/@xrkseek/server-face/dist/context.d.ts.map +1 -1
  322. package/node_modules/@xrkseek/server-face/dist/dispatch.d.ts.map +1 -1
  323. package/node_modules/@xrkseek/server-face/dist/dispatch.js +4 -1
  324. package/node_modules/@xrkseek/server-face/dist/dispatch.js.map +1 -1
  325. package/node_modules/@xrkseek/server-face/dist/face-schema.d.ts.map +1 -1
  326. package/node_modules/@xrkseek/server-face/dist/face-schema.js +2 -1
  327. package/node_modules/@xrkseek/server-face/dist/face-schema.js.map +1 -1
  328. package/node_modules/@xrkseek/server-face/dist/fork-cut.d.ts.map +1 -1
  329. package/node_modules/@xrkseek/server-face/dist/fork-cut.js +15 -3
  330. package/node_modules/@xrkseek/server-face/dist/fork-cut.js.map +1 -1
  331. package/node_modules/@xrkseek/server-face/dist/fork-lineage.d.ts +7 -0
  332. package/node_modules/@xrkseek/server-face/dist/fork-lineage.d.ts.map +1 -1
  333. package/node_modules/@xrkseek/server-face/dist/fork-lineage.js +23 -8
  334. package/node_modules/@xrkseek/server-face/dist/fork-lineage.js.map +1 -1
  335. package/node_modules/@xrkseek/server-face/dist/handlers/band.d.ts +7 -0
  336. package/node_modules/@xrkseek/server-face/dist/handlers/band.d.ts.map +1 -0
  337. package/node_modules/@xrkseek/server-face/dist/handlers/band.js +40 -0
  338. package/node_modules/@xrkseek/server-face/dist/handlers/band.js.map +1 -0
  339. package/node_modules/@xrkseek/server-face/dist/handlers/checkpoint.d.ts.map +1 -1
  340. package/node_modules/@xrkseek/server-face/dist/handlers/checkpoint.js +81 -3
  341. package/node_modules/@xrkseek/server-face/dist/handlers/checkpoint.js.map +1 -1
  342. package/node_modules/@xrkseek/server-face/dist/handlers/remotes.d.ts.map +1 -1
  343. package/node_modules/@xrkseek/server-face/dist/handlers/remotes.js +20 -7
  344. package/node_modules/@xrkseek/server-face/dist/handlers/remotes.js.map +1 -1
  345. package/node_modules/@xrkseek/server-face/dist/handlers/session.d.ts +2 -0
  346. package/node_modules/@xrkseek/server-face/dist/handlers/session.d.ts.map +1 -1
  347. package/node_modules/@xrkseek/server-face/dist/handlers/session.js +236 -62
  348. package/node_modules/@xrkseek/server-face/dist/handlers/session.js.map +1 -1
  349. package/node_modules/@xrkseek/server-face/dist/handlers/team.d.ts.map +1 -1
  350. package/node_modules/@xrkseek/server-face/dist/handlers/team.js +100 -9
  351. package/node_modules/@xrkseek/server-face/dist/handlers/team.js.map +1 -1
  352. package/node_modules/@xrkseek/server-face/dist/host-open-in-app.d.ts.map +1 -1
  353. package/node_modules/@xrkseek/server-face/dist/host-open-in-app.js +9 -0
  354. package/node_modules/@xrkseek/server-face/dist/host-open-in-app.js.map +1 -1
  355. package/node_modules/@xrkseek/server-face/dist/host-open-path.d.ts +8 -3
  356. package/node_modules/@xrkseek/server-face/dist/host-open-path.d.ts.map +1 -1
  357. package/node_modules/@xrkseek/server-face/dist/host-open-path.js +61 -19
  358. package/node_modules/@xrkseek/server-face/dist/host-open-path.js.map +1 -1
  359. package/node_modules/@xrkseek/server-face/dist/host-pick-directory.d.ts +2 -1
  360. package/node_modules/@xrkseek/server-face/dist/host-pick-directory.d.ts.map +1 -1
  361. package/node_modules/@xrkseek/server-face/dist/host-pick-directory.js +12 -2
  362. package/node_modules/@xrkseek/server-face/dist/host-pick-directory.js.map +1 -1
  363. package/node_modules/@xrkseek/server-face/dist/index.d.ts +6 -2
  364. package/node_modules/@xrkseek/server-face/dist/index.d.ts.map +1 -1
  365. package/node_modules/@xrkseek/server-face/dist/index.js +6 -2
  366. package/node_modules/@xrkseek/server-face/dist/index.js.map +1 -1
  367. package/node_modules/@xrkseek/server-face/dist/instruction-authority-fragment.d.ts +19 -0
  368. package/node_modules/@xrkseek/server-face/dist/instruction-authority-fragment.d.ts.map +1 -0
  369. package/node_modules/@xrkseek/server-face/dist/instruction-authority-fragment.js +28 -0
  370. package/node_modules/@xrkseek/server-face/dist/instruction-authority-fragment.js.map +1 -0
  371. package/node_modules/@xrkseek/server-face/dist/log-cut-reset.d.ts +3 -0
  372. package/node_modules/@xrkseek/server-face/dist/log-cut-reset.d.ts.map +1 -0
  373. package/node_modules/@xrkseek/server-face/dist/log-cut-reset.js +22 -0
  374. package/node_modules/@xrkseek/server-face/dist/log-cut-reset.js.map +1 -0
  375. package/node_modules/@xrkseek/server-face/dist/model-catalog.d.ts.map +1 -1
  376. package/node_modules/@xrkseek/server-face/dist/model-catalog.js +60 -5
  377. package/node_modules/@xrkseek/server-face/dist/model-catalog.js.map +1 -1
  378. package/node_modules/@xrkseek/server-face/dist/projections/index.d.ts +2 -2
  379. package/node_modules/@xrkseek/server-face/dist/projections/index.d.ts.map +1 -1
  380. package/node_modules/@xrkseek/server-face/dist/projections/index.js +2 -2
  381. package/node_modules/@xrkseek/server-face/dist/projections/index.js.map +1 -1
  382. package/node_modules/@xrkseek/server-face/dist/projections/list-checkpoint-cache.d.ts +50 -4
  383. package/node_modules/@xrkseek/server-face/dist/projections/list-checkpoint-cache.d.ts.map +1 -1
  384. package/node_modules/@xrkseek/server-face/dist/projections/list-checkpoint-cache.js +167 -19
  385. package/node_modules/@xrkseek/server-face/dist/projections/list-checkpoint-cache.js.map +1 -1
  386. package/node_modules/@xrkseek/server-face/dist/projections/snapshot-keys.d.ts +21 -1
  387. package/node_modules/@xrkseek/server-face/dist/projections/snapshot-keys.d.ts.map +1 -1
  388. package/node_modules/@xrkseek/server-face/dist/projections/snapshot-keys.js +21 -1
  389. package/node_modules/@xrkseek/server-face/dist/projections/snapshot-keys.js.map +1 -1
  390. package/node_modules/@xrkseek/server-face/dist/projections/units/context-pressure.d.ts +8 -4
  391. package/node_modules/@xrkseek/server-face/dist/projections/units/context-pressure.d.ts.map +1 -1
  392. package/node_modules/@xrkseek/server-face/dist/projections/units/context-pressure.js +2 -7
  393. package/node_modules/@xrkseek/server-face/dist/projections/units/context-pressure.js.map +1 -1
  394. package/node_modules/@xrkseek/server-face/dist/projections/units/context-timeline.d.ts.map +1 -1
  395. package/node_modules/@xrkseek/server-face/dist/projections/units/context-timeline.js +58 -0
  396. package/node_modules/@xrkseek/server-face/dist/projections/units/context-timeline.js.map +1 -1
  397. package/node_modules/@xrkseek/server-face/dist/projections/units/cost-usage.d.ts.map +1 -1
  398. package/node_modules/@xrkseek/server-face/dist/projections/units/cost-usage.js +85 -0
  399. package/node_modules/@xrkseek/server-face/dist/projections/units/cost-usage.js.map +1 -1
  400. package/node_modules/@xrkseek/server-face/dist/projections/units/session-list-metadata.d.ts.map +1 -1
  401. package/node_modules/@xrkseek/server-face/dist/projections/units/session-list-metadata.js +14 -0
  402. package/node_modules/@xrkseek/server-face/dist/projections/units/session-list-metadata.js.map +1 -1
  403. package/node_modules/@xrkseek/server-face/dist/projections/units/title.d.ts.map +1 -1
  404. package/node_modules/@xrkseek/server-face/dist/projections/units/title.js +14 -0
  405. package/node_modules/@xrkseek/server-face/dist/projections/units/title.js.map +1 -1
  406. package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.d.ts.map +1 -1
  407. package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.js +24 -0
  408. package/node_modules/@xrkseek/server-face/dist/projections/units/turn-outline.js.map +1 -1
  409. package/node_modules/@xrkseek/server-face/dist/runtime.d.ts +11 -1
  410. package/node_modules/@xrkseek/server-face/dist/runtime.d.ts.map +1 -1
  411. package/node_modules/@xrkseek/server-face/dist/runtime.js +118 -15
  412. package/node_modules/@xrkseek/server-face/dist/runtime.js.map +1 -1
  413. package/node_modules/@xrkseek/server-face/dist/seat-identity.d.ts +26 -0
  414. package/node_modules/@xrkseek/server-face/dist/seat-identity.d.ts.map +1 -0
  415. package/node_modules/@xrkseek/server-face/dist/seat-identity.js +137 -0
  416. package/node_modules/@xrkseek/server-face/dist/seat-identity.js.map +1 -0
  417. package/node_modules/@xrkseek/server-face/dist/seat-titles.d.ts +29 -0
  418. package/node_modules/@xrkseek/server-face/dist/seat-titles.d.ts.map +1 -0
  419. package/node_modules/@xrkseek/server-face/dist/seat-titles.js +74 -0
  420. package/node_modules/@xrkseek/server-face/dist/seat-titles.js.map +1 -0
  421. package/node_modules/@xrkseek/server-face/dist/session-capability.d.ts.map +1 -1
  422. package/node_modules/@xrkseek/server-face/dist/session-capability.js +9 -6
  423. package/node_modules/@xrkseek/server-face/dist/session-capability.js.map +1 -1
  424. package/node_modules/@xrkseek/server-face/dist/session-event-window.d.ts +37 -0
  425. package/node_modules/@xrkseek/server-face/dist/session-event-window.d.ts.map +1 -0
  426. package/node_modules/@xrkseek/server-face/dist/session-event-window.js +88 -0
  427. package/node_modules/@xrkseek/server-face/dist/session-event-window.js.map +1 -0
  428. package/node_modules/@xrkseek/server-face/dist/session-identity-store.d.ts +20 -0
  429. package/node_modules/@xrkseek/server-face/dist/session-identity-store.d.ts.map +1 -0
  430. package/node_modules/@xrkseek/server-face/dist/session-identity-store.js +82 -0
  431. package/node_modules/@xrkseek/server-face/dist/session-identity-store.js.map +1 -0
  432. package/node_modules/@xrkseek/server-face/dist/session-posture.d.ts +1 -1
  433. package/node_modules/@xrkseek/server-face/dist/session-posture.d.ts.map +1 -1
  434. package/node_modules/@xrkseek/server-face/dist/session-posture.js +20 -5
  435. package/node_modules/@xrkseek/server-face/dist/session-posture.js.map +1 -1
  436. package/node_modules/@xrkseek/server-face/dist/session-query-tools.d.ts +1 -0
  437. package/node_modules/@xrkseek/server-face/dist/session-query-tools.d.ts.map +1 -1
  438. package/node_modules/@xrkseek/server-face/dist/session-query-tools.js +172 -25
  439. package/node_modules/@xrkseek/server-face/dist/session-query-tools.js.map +1 -1
  440. package/node_modules/@xrkseek/server-face/dist/session-search.d.ts +20 -2
  441. package/node_modules/@xrkseek/server-face/dist/session-search.d.ts.map +1 -1
  442. package/node_modules/@xrkseek/server-face/dist/session-search.js +125 -19
  443. package/node_modules/@xrkseek/server-face/dist/session-search.js.map +1 -1
  444. package/node_modules/@xrkseek/server-face/dist/session-status.d.ts +6 -0
  445. package/node_modules/@xrkseek/server-face/dist/session-status.d.ts.map +1 -1
  446. package/node_modules/@xrkseek/server-face/dist/session-status.js +161 -21
  447. package/node_modules/@xrkseek/server-face/dist/session-status.js.map +1 -1
  448. package/node_modules/@xrkseek/server-face/dist/session-thread-tools.d.ts.map +1 -1
  449. package/node_modules/@xrkseek/server-face/dist/session-thread-tools.js +5 -0
  450. package/node_modules/@xrkseek/server-face/dist/session-thread-tools.js.map +1 -1
  451. package/node_modules/@xrkseek/server-face/dist/session-tool-copy.d.ts.map +1 -1
  452. package/node_modules/@xrkseek/server-face/dist/session-tool-copy.js +2 -1
  453. package/node_modules/@xrkseek/server-face/dist/session-tool-copy.js.map +1 -1
  454. package/node_modules/@xrkseek/server-face/dist/settings-credentials.d.ts.map +1 -1
  455. package/node_modules/@xrkseek/server-face/dist/settings-credentials.js +43 -3
  456. package/node_modules/@xrkseek/server-face/dist/settings-credentials.js.map +1 -1
  457. package/node_modules/@xrkseek/server-face/dist/settings-document.d.ts.map +1 -1
  458. package/node_modules/@xrkseek/server-face/dist/settings-document.js +4 -0
  459. package/node_modules/@xrkseek/server-face/dist/settings-document.js.map +1 -1
  460. package/node_modules/@xrkseek/server-face/dist/settings-schemas.d.ts.map +1 -1
  461. package/node_modules/@xrkseek/server-face/dist/settings-schemas.js +76 -11
  462. package/node_modules/@xrkseek/server-face/dist/settings-schemas.js.map +1 -1
  463. package/node_modules/@xrkseek/server-face/dist/skill-documents.d.ts.map +1 -1
  464. package/node_modules/@xrkseek/server-face/dist/skill-documents.js +14 -4
  465. package/node_modules/@xrkseek/server-face/dist/skill-documents.js.map +1 -1
  466. package/node_modules/@xrkseek/server-face/dist/skill-list.d.ts +4 -2
  467. package/node_modules/@xrkseek/server-face/dist/skill-list.d.ts.map +1 -1
  468. package/node_modules/@xrkseek/server-face/dist/skill-list.js +10 -4
  469. package/node_modules/@xrkseek/server-face/dist/skill-list.js.map +1 -1
  470. package/node_modules/@xrkseek/server-face/dist/skill-read.d.ts.map +1 -1
  471. package/node_modules/@xrkseek/server-face/dist/skill-read.js +9 -2
  472. package/node_modules/@xrkseek/server-face/dist/skill-read.js.map +1 -1
  473. package/node_modules/@xrkseek/server-face/dist/skill-source.d.ts +2 -1
  474. package/node_modules/@xrkseek/server-face/dist/skill-source.d.ts.map +1 -1
  475. package/node_modules/@xrkseek/server-face/dist/skill-source.js +12 -2
  476. package/node_modules/@xrkseek/server-face/dist/skill-source.js.map +1 -1
  477. package/node_modules/@xrkseek/server-face/dist/slash.d.ts +10 -1
  478. package/node_modules/@xrkseek/server-face/dist/slash.d.ts.map +1 -1
  479. package/node_modules/@xrkseek/server-face/dist/slash.js +118 -26
  480. package/node_modules/@xrkseek/server-face/dist/slash.js.map +1 -1
  481. package/node_modules/@xrkseek/server-face/dist/status-snapshot-cache.d.ts.map +1 -1
  482. package/node_modules/@xrkseek/server-face/dist/status-snapshot-cache.js +53 -0
  483. package/node_modules/@xrkseek/server-face/dist/status-snapshot-cache.js.map +1 -1
  484. package/node_modules/@xrkseek/server-face/dist/subagent-tools.d.ts.map +1 -1
  485. package/node_modules/@xrkseek/server-face/dist/subagent-tools.js +7 -2
  486. package/node_modules/@xrkseek/server-face/dist/subagent-tools.js.map +1 -1
  487. package/node_modules/@xrkseek/server-face/dist/types.d.ts +23 -0
  488. package/node_modules/@xrkseek/server-face/dist/types.d.ts.map +1 -1
  489. package/node_modules/@xrkseek/server-face/dist/workspace-checkpoint.d.ts +17 -2
  490. package/node_modules/@xrkseek/server-face/dist/workspace-checkpoint.d.ts.map +1 -1
  491. package/node_modules/@xrkseek/server-face/dist/workspace-checkpoint.js +111 -10
  492. package/node_modules/@xrkseek/server-face/dist/workspace-checkpoint.js.map +1 -1
  493. package/node_modules/@xrkseek/server-face/dist/workspace-face.d.ts.map +1 -1
  494. package/node_modules/@xrkseek/server-face/dist/workspace-face.js +19 -14
  495. package/node_modules/@xrkseek/server-face/dist/workspace-face.js.map +1 -1
  496. package/node_modules/@xrkseek/server-face/dist/workspace-member-look.d.ts +22 -0
  497. package/node_modules/@xrkseek/server-face/dist/workspace-member-look.d.ts.map +1 -0
  498. package/node_modules/@xrkseek/server-face/dist/workspace-member-look.js +35 -0
  499. package/node_modules/@xrkseek/server-face/dist/workspace-member-look.js.map +1 -0
  500. package/node_modules/@xrkseek/server-face/dist/workspace-orchestrate-tools.d.ts +3 -2
  501. package/node_modules/@xrkseek/server-face/dist/workspace-orchestrate-tools.d.ts.map +1 -1
  502. package/node_modules/@xrkseek/server-face/dist/workspace-orchestrate-tools.js +74 -57
  503. package/node_modules/@xrkseek/server-face/dist/workspace-orchestrate-tools.js.map +1 -1
  504. package/node_modules/@xrkseek/server-face/dist/workspace-registry.d.ts +31 -0
  505. package/node_modules/@xrkseek/server-face/dist/workspace-registry.d.ts.map +1 -1
  506. package/node_modules/@xrkseek/server-face/dist/workspace-registry.js +109 -0
  507. package/node_modules/@xrkseek/server-face/dist/workspace-registry.js.map +1 -1
  508. package/node_modules/@xrkseek/server-face/dist/workspace-store.d.ts +2 -0
  509. package/node_modules/@xrkseek/server-face/dist/workspace-store.d.ts.map +1 -1
  510. package/node_modules/@xrkseek/server-face/dist/workspace-store.js +7 -0
  511. package/node_modules/@xrkseek/server-face/dist/workspace-store.js.map +1 -1
  512. package/node_modules/@xrkseek/server-face/package.json +60 -60
  513. package/node_modules/@xrkseek/server-host/dist/index.d.ts +37 -6
  514. package/node_modules/@xrkseek/server-host/dist/index.d.ts.map +1 -1
  515. package/node_modules/@xrkseek/server-host/dist/index.js +182 -28
  516. package/node_modules/@xrkseek/server-host/dist/index.js.map +1 -1
  517. package/node_modules/@xrkseek/server-host/dist/log.d.ts +6 -0
  518. package/node_modules/@xrkseek/server-host/dist/log.d.ts.map +1 -1
  519. package/node_modules/@xrkseek/server-host/dist/sidebar-face-bridge.d.ts.map +1 -1
  520. package/node_modules/@xrkseek/server-host/dist/sidebar-face-bridge.js +17 -2
  521. package/node_modules/@xrkseek/server-host/dist/sidebar-face-bridge.js.map +1 -1
  522. package/node_modules/@xrkseek/server-host/dist/standing-tools.d.ts.map +1 -1
  523. package/node_modules/@xrkseek/server-host/dist/standing-tools.js +3 -3
  524. package/node_modules/@xrkseek/server-host/dist/standing-tools.js.map +1 -1
  525. package/node_modules/@xrkseek/server-host/package.json +75 -75
  526. package/node_modules/@xrkseek/server-http/dist/dsh-compat/adapter-types.d.ts +5 -0
  527. package/node_modules/@xrkseek/server-http/dist/dsh-compat/adapter-types.d.ts.map +1 -1
  528. package/node_modules/@xrkseek/server-http/dist/dsh-compat/auto-review-tool-pre.d.ts +1 -1
  529. package/node_modules/@xrkseek/server-http/dist/dsh-compat/auto-review-tool-pre.d.ts.map +1 -1
  530. package/node_modules/@xrkseek/server-http/dist/dsh-compat/genui-browser-runtime.js +188 -188
  531. package/node_modules/@xrkseek/server-http/dist/dsh-compat/index.d.ts +1 -1
  532. package/node_modules/@xrkseek/server-http/dist/dsh-compat/index.d.ts.map +1 -1
  533. package/node_modules/@xrkseek/server-http/dist/dsh-compat/index.js +1 -1
  534. package/node_modules/@xrkseek/server-http/dist/dsh-compat/index.js.map +1 -1
  535. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-auth.d.ts.map +1 -1
  536. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-auth.js +292 -24
  537. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-auth.js.map +1 -1
  538. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-gate.d.ts.map +1 -1
  539. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-gate.js +12 -1
  540. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access-gate.js.map +1 -1
  541. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access.d.ts +16 -1
  542. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access.d.ts.map +1 -1
  543. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access.js +47 -2
  544. package/node_modules/@xrkseek/server-http/dist/dsh-compat/mobile-access.js.map +1 -1
  545. package/node_modules/@xrkseek/server-http/dist/dsh-compat/skin-center.d.ts +1 -1
  546. package/node_modules/@xrkseek/server-http/dist/dsh-compat/token-usage-stats-dash.js +53 -53
  547. package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/mobile-gate-kit.d.ts +9 -4
  548. package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/mobile-gate-kit.d.ts.map +1 -1
  549. package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/mobile-gate-kit.js +39 -20
  550. package/node_modules/@xrkseek/server-http/dist/dsh-compat/underlying/mobile-gate-kit.js.map +1 -1
  551. package/node_modules/@xrkseek/server-http/dist/index.d.ts +2 -1
  552. package/node_modules/@xrkseek/server-http/dist/index.d.ts.map +1 -1
  553. package/node_modules/@xrkseek/server-http/dist/index.js +2 -1
  554. package/node_modules/@xrkseek/server-http/dist/index.js.map +1 -1
  555. package/node_modules/@xrkseek/server-http/dist/sunflower-free/ensure.d.ts +55 -0
  556. package/node_modules/@xrkseek/server-http/dist/sunflower-free/ensure.d.ts.map +1 -0
  557. package/node_modules/@xrkseek/server-http/dist/sunflower-free/ensure.js +176 -0
  558. package/node_modules/@xrkseek/server-http/dist/sunflower-free/ensure.js.map +1 -0
  559. package/node_modules/@xrkseek/server-http/dist/xrk/plugin-mutate.d.ts +2 -0
  560. package/node_modules/@xrkseek/server-http/dist/xrk/plugin-mutate.d.ts.map +1 -1
  561. package/node_modules/@xrkseek/server-http/dist/xrk/plugin-mutate.js +7 -3
  562. package/node_modules/@xrkseek/server-http/dist/xrk/plugin-mutate.js.map +1 -1
  563. package/node_modules/@xrkseek/server-http/package.json +72 -72
  564. package/node_modules/@xrkseek/server-loader/dist/load.d.ts.map +1 -1
  565. package/node_modules/@xrkseek/server-loader/dist/load.js +132 -0
  566. package/node_modules/@xrkseek/server-loader/dist/load.js.map +1 -1
  567. package/node_modules/@xrkseek/session-projection/README.md +26 -26
  568. package/node_modules/@xrkseek/session-projection/dist/index.d.ts +31 -2
  569. package/node_modules/@xrkseek/session-projection/dist/index.d.ts.map +1 -1
  570. package/node_modules/@xrkseek/session-projection/dist/index.js +135 -19
  571. package/node_modules/@xrkseek/session-projection/dist/index.js.map +1 -1
  572. package/node_modules/@xrkseek/session-telemetry/README.md +11 -11
  573. package/node_modules/@xrkseek/session-telemetry/dist/index.d.ts +1 -0
  574. package/node_modules/@xrkseek/session-telemetry/dist/index.d.ts.map +1 -1
  575. package/node_modules/@xrkseek/session-telemetry/dist/index.js +1 -0
  576. package/node_modules/@xrkseek/session-telemetry/dist/index.js.map +1 -1
  577. package/node_modules/@xrkseek/session-telemetry/dist/redact.d.ts +14 -0
  578. package/node_modules/@xrkseek/session-telemetry/dist/redact.d.ts.map +1 -0
  579. package/node_modules/@xrkseek/session-telemetry/dist/redact.js +58 -0
  580. package/node_modules/@xrkseek/session-telemetry/dist/redact.js.map +1 -0
  581. package/node_modules/@xrkseek/session-telemetry/dist/wrap-store.d.ts +7 -0
  582. package/node_modules/@xrkseek/session-telemetry/dist/wrap-store.d.ts.map +1 -1
  583. package/node_modules/@xrkseek/session-telemetry/dist/wrap-store.js +43 -12
  584. package/node_modules/@xrkseek/session-telemetry/dist/wrap-store.js.map +1 -1
  585. package/node_modules/@xrkseek/session-telemetry/package.json +27 -27
  586. package/node_modules/@xrkseek/workspace/dist/durable-inject.d.ts +13 -0
  587. package/node_modules/@xrkseek/workspace/dist/durable-inject.d.ts.map +1 -1
  588. package/node_modules/@xrkseek/workspace/dist/durable-inject.js +40 -4
  589. package/node_modules/@xrkseek/workspace/dist/durable-inject.js.map +1 -1
  590. package/node_modules/@xrkseek/workspace/dist/ecosystem-instructions.d.ts +10 -9
  591. package/node_modules/@xrkseek/workspace/dist/ecosystem-instructions.d.ts.map +1 -1
  592. package/node_modules/@xrkseek/workspace/dist/ecosystem-instructions.js +67 -19
  593. package/node_modules/@xrkseek/workspace/dist/ecosystem-instructions.js.map +1 -1
  594. package/node_modules/@xrkseek/workspace/dist/index.d.ts +19 -20
  595. package/node_modules/@xrkseek/workspace/dist/index.d.ts.map +1 -1
  596. package/node_modules/@xrkseek/workspace/dist/index.js +43 -20
  597. package/node_modules/@xrkseek/workspace/dist/index.js.map +1 -1
  598. package/node_modules/@xrkseek/workspace/dist/inject-fingerprint.d.ts +2 -0
  599. package/node_modules/@xrkseek/workspace/dist/inject-fingerprint.d.ts.map +1 -1
  600. package/node_modules/@xrkseek/workspace/dist/inject-fingerprint.js +23 -12
  601. package/node_modules/@xrkseek/workspace/dist/inject-fingerprint.js.map +1 -1
  602. package/node_modules/@xrkseek/workspace/dist/inject-sources.d.ts +7 -4
  603. package/node_modules/@xrkseek/workspace/dist/inject-sources.d.ts.map +1 -1
  604. package/node_modules/@xrkseek/workspace/dist/inject-sources.js +10 -0
  605. package/node_modules/@xrkseek/workspace/dist/inject-sources.js.map +1 -1
  606. package/node_modules/@xrkseek/workspace/dist/instruction-authority.d.ts +27 -0
  607. package/node_modules/@xrkseek/workspace/dist/instruction-authority.d.ts.map +1 -0
  608. package/node_modules/@xrkseek/workspace/dist/instruction-authority.js +78 -0
  609. package/node_modules/@xrkseek/workspace/dist/instruction-authority.js.map +1 -0
  610. package/node_modules/@xrkseek/workspace/dist/skill-dirs.d.ts +7 -0
  611. package/node_modules/@xrkseek/workspace/dist/skill-dirs.d.ts.map +1 -1
  612. package/node_modules/@xrkseek/workspace/dist/skill-dirs.js +4 -2
  613. package/node_modules/@xrkseek/workspace/dist/skill-dirs.js.map +1 -1
  614. package/node_modules/@xrkseek/workspace/dist/skill-tools.js +1 -1
  615. package/node_modules/@xrkseek/workspace/dist/skill-tools.js.map +1 -1
  616. package/node_modules/@xrkseek/workspace/dist/skills.d.ts +13 -1
  617. package/node_modules/@xrkseek/workspace/dist/skills.d.ts.map +1 -1
  618. package/node_modules/@xrkseek/workspace/dist/skills.js +45 -5
  619. package/node_modules/@xrkseek/workspace/dist/skills.js.map +1 -1
  620. package/node_modules/@xrkseek/workspace/dist/standing-skill-dirs.d.ts +26 -0
  621. package/node_modules/@xrkseek/workspace/dist/standing-skill-dirs.d.ts.map +1 -0
  622. package/node_modules/@xrkseek/workspace/dist/standing-skill-dirs.js +80 -0
  623. package/node_modules/@xrkseek/workspace/dist/standing-skill-dirs.js.map +1 -0
  624. package/node_modules/@xrkseek/workspace/dist/workspace-anchor.d.ts +7 -1
  625. package/node_modules/@xrkseek/workspace/dist/workspace-anchor.d.ts.map +1 -1
  626. package/node_modules/@xrkseek/workspace/dist/workspace-anchor.js +21 -1
  627. package/node_modules/@xrkseek/workspace/dist/workspace-anchor.js.map +1 -1
  628. package/node_modules/@xrkseek/workspace/package.json +28 -28
  629. package/node_modules/@xrkseek/xrk-agent/lib/index.js +1 -793
  630. package/node_modules/@xrkseek/xrk-agent/lib/invariant.js +1 -23
  631. package/node_modules/@xrkseek/xrk-attachment/lib/index.js +1 -1
  632. package/node_modules/@xrkseek/xrk-attachment/lib/invariant.js +1 -0
  633. package/node_modules/@xrkseek/xrk-attachment/lib/types/brand.js +10 -0
  634. package/node_modules/@xrkseek/xrk-attachment/lib/types/error.js +48 -0
  635. package/node_modules/@xrkseek/xrk-attachment/lib/types/index.js +42 -0
  636. package/node_modules/@xrkseek/xrk-attachment/lib/types/invariant.js +16 -0
  637. package/node_modules/@xrkseek/xrk-attachment/lib/types/types.d.ts +6 -0
  638. package/node_modules/@xrkseek/xrk-attachment/lib/types/types.js +3 -0
  639. package/node_modules/@xrkseek/xrk-attachment/package.json +1 -0
  640. package/node_modules/@xrkseek/xrk-brand/lib/index.js +1 -1
  641. package/node_modules/@xrkseek/xrk-brand/lib/invariant.js +1 -0
  642. package/node_modules/@xrkseek/xrk-brand/lib/types/index.js +24 -0
  643. package/node_modules/@xrkseek/xrk-brand/lib/types/invariant.js +22 -0
  644. package/node_modules/@xrkseek/xrk-brand/package.json +1 -0
  645. package/node_modules/@xrkseek/xrk-commands/lib/index.js +1 -1
  646. package/node_modules/@xrkseek/xrk-commands/lib/invariant.js +1 -0
  647. package/node_modules/@xrkseek/xrk-file-reference-local/README.md +46 -46
  648. package/node_modules/@xrkseek/xrk-file-reference-local/README.zh.md +46 -46
  649. package/node_modules/@xrkseek/xrk-file-reference-local/package.json +30 -30
  650. package/node_modules/@xrkseek/xrk-invariants/lib/index.js +1 -1
  651. package/node_modules/@xrkseek/xrk-invariants/lib/invariant.js +1 -0
  652. package/node_modules/@xrkseek/xrk-invariants/lib/types/index.js +148 -0
  653. package/node_modules/@xrkseek/xrk-invariants/lib/types/invariant.js +22 -0
  654. package/node_modules/@xrkseek/xrk-invariants/package.json +1 -0
  655. package/node_modules/@xrkseek/xrk-llm/lib/index.js +1 -1
  656. package/node_modules/@xrkseek/xrk-llm/lib/invariant.js +1 -0
  657. package/node_modules/@xrkseek/xrk-llm/lib/types/index.js +4 -0
  658. package/node_modules/@xrkseek/xrk-llm/lib/types/types.d.ts +11 -0
  659. package/node_modules/@xrkseek/xrk-permission-presets/lib/index.js +1 -1
  660. package/node_modules/@xrkseek/xrk-permission-presets/lib/invariant.js +1 -0
  661. package/node_modules/@xrkseek/xrk-scope/lib/index.js +1 -0
  662. package/node_modules/@xrkseek/xrk-scope/lib/types/index.d.ts +129 -0
  663. package/node_modules/@xrkseek/xrk-scope/lib/types/index.js +243 -0
  664. package/node_modules/@xrkseek/xrk-scope/package.json +34 -0
  665. package/node_modules/@xrkseek/xrk-session/lib/index.js +1 -1
  666. package/node_modules/@xrkseek/xrk-session/lib/invariant.js +1 -0
  667. package/node_modules/@xrkseek/xrk-session-projection/lib/index.js +1 -1
  668. package/node_modules/@xrkseek/xrk-session-projection/lib/invariant.js +1 -0
  669. package/node_modules/@xrkseek/xrk-session-reference/README.md +50 -50
  670. package/node_modules/@xrkseek/xrk-session-reference/README.zh.md +50 -50
  671. package/node_modules/@xrkseek/xrk-session-reference/dist/prepare-face.js +13 -13
  672. package/node_modules/@xrkseek/xrk-session-reference/dist/spill.js +2 -2
  673. package/node_modules/@xrkseek/xrk-session-reference/package.json +56 -56
  674. package/node_modules/@xrkseek/xrk-settings/lib/index.js +1 -638
  675. package/node_modules/@xrkseek/xrk-settings/lib/invariant.js +1 -67
  676. package/node_modules/@xrkseek/xrk-system-prompt/package.json +15 -15
  677. package/node_modules/@xrkseek/xrk-system-prompt/src/index.ts +144 -144
  678. package/node_modules/@xrkseek/xrk-token-meter/README.i18n.yaml +6 -0
  679. package/node_modules/@xrkseek/xrk-token-meter/README.md +68 -0
  680. package/node_modules/@xrkseek/xrk-token-meter/README.zh.md +68 -0
  681. package/node_modules/@xrkseek/xrk-token-meter/lib/index.js +1 -0
  682. package/node_modules/@xrkseek/xrk-token-meter/lib/invariant.js +1 -0
  683. package/node_modules/@xrkseek/xrk-token-meter/lib/types/breakdown-projection.d.ts +29 -0
  684. package/node_modules/@xrkseek/xrk-token-meter/lib/types/breakdown-projection.js +56 -0
  685. package/node_modules/@xrkseek/xrk-token-meter/lib/types/client.d.ts +9 -0
  686. package/node_modules/@xrkseek/xrk-token-meter/lib/types/client.js +7 -0
  687. package/node_modules/@xrkseek/xrk-token-meter/lib/types/estimate.d.ts +42 -0
  688. package/node_modules/@xrkseek/xrk-token-meter/lib/types/estimate.js +79 -0
  689. package/node_modules/@xrkseek/xrk-token-meter/lib/types/index.d.ts +62 -0
  690. package/node_modules/@xrkseek/xrk-token-meter/lib/types/index.js +250 -0
  691. package/node_modules/@xrkseek/xrk-token-meter/lib/types/invariant.d.ts +16 -0
  692. package/node_modules/@xrkseek/xrk-token-meter/lib/types/invariant.js +30 -0
  693. package/node_modules/@xrkseek/xrk-token-meter/lib/types/projection.d.ts +74 -0
  694. package/node_modules/@xrkseek/xrk-token-meter/lib/types/projection.js +7 -0
  695. package/node_modules/@xrkseek/xrk-token-meter/lib/types/surface-fold.d.ts +38 -0
  696. package/node_modules/@xrkseek/xrk-token-meter/lib/types/surface-fold.js +47 -0
  697. package/node_modules/@xrkseek/xrk-token-meter/lib/types/surface-projection.d.ts +59 -0
  698. package/node_modules/@xrkseek/xrk-token-meter/lib/types/surface-projection.js +66 -0
  699. package/node_modules/@xrkseek/xrk-token-meter/lib/types/turn-usage.d.ts +33 -0
  700. package/node_modules/@xrkseek/xrk-token-meter/lib/types/turn-usage.js +247 -0
  701. package/node_modules/@xrkseek/xrk-token-meter/lib/types/types.d.ts +44 -0
  702. package/node_modules/@xrkseek/xrk-token-meter/lib/types/types.js +7 -0
  703. package/node_modules/@xrkseek/xrk-token-meter/lib/types/usage-projection.d.ts +64 -0
  704. package/node_modules/@xrkseek/xrk-token-meter/lib/types/usage-projection.js +161 -0
  705. package/node_modules/@xrkseek/xrk-token-meter/package.json +57 -0
  706. package/node_modules/@xrkseek/xrk-tools/lib/index.js +1 -1
  707. package/node_modules/@xrkseek/xrk-tools/lib/invariant.js +1 -1
  708. package/node_modules/@xrkseek/xrk-tools/src/presentation.ts +39 -39
  709. package/node_modules/@xrkseek/xrk-typert-protocol/lib/index.js +1 -1
  710. package/node_modules/@xrkseek/xrk-typert-protocol/lib/invariant.js +1 -0
  711. package/node_modules/@xrkseek/xrk-workflow/README.md +73 -73
  712. package/node_modules/@xrkseek/xrk-workflow/README.zh.md +72 -72
  713. package/node_modules/@xrkseek/xrk-workflow/lib/types/index.js +118 -118
  714. package/package.json +7 -1
  715. package/node_modules/@xrkseek/llm/dist/reasoning-effort.d.ts +0 -14
  716. package/node_modules/@xrkseek/llm/dist/reasoning-effort.d.ts.map +0 -1
  717. package/node_modules/@xrkseek/llm/dist/reasoning-effort.js +0 -21
  718. package/node_modules/@xrkseek/llm/dist/reasoning-effort.js.map +0 -1
  719. package/node_modules/@xrkseek/server-face/dist/index.d.mts +0 -3734
  720. package/node_modules/@xrkseek/server-face/dist/index.d.mts.map +0 -1
  721. package/node_modules/@xrkseek/server-face/dist/index.mjs +0 -22085
  722. package/node_modules/@xrkseek/server-face/dist/index.mjs.map +0 -1
  723. package/node_modules/@xrkseek/server-face/dist/model-reasoning.d.ts +0 -51
  724. package/node_modules/@xrkseek/server-face/dist/model-reasoning.d.ts.map +0 -1
  725. package/node_modules/@xrkseek/server-face/dist/model-reasoning.js +0 -104
  726. package/node_modules/@xrkseek/server-face/dist/model-reasoning.js.map +0 -1
  727. package/node_modules/@xrkseek/server-host/dist/sidebar-pty-agent.d.ts +0 -2
  728. package/node_modules/@xrkseek/server-host/dist/sidebar-pty-agent.d.ts.map +0 -1
  729. package/node_modules/@xrkseek/server-host/dist/sidebar-pty-agent.js +0 -98
  730. package/node_modules/@xrkseek/server-host/dist/sidebar-pty-agent.js.map +0 -1
  731. package/node_modules/@xrkseek/server-host/dist/sidebar-pty-worker.d.ts +0 -18
  732. package/node_modules/@xrkseek/server-host/dist/sidebar-pty-worker.d.ts.map +0 -1
  733. package/node_modules/@xrkseek/server-host/dist/sidebar-pty-worker.js +0 -141
  734. package/node_modules/@xrkseek/server-host/dist/sidebar-pty-worker.js.map +0 -1
  735. package/node_modules/@xrkseek/server-host/dist/win-fd-inherit.d.ts +0 -30
  736. package/node_modules/@xrkseek/server-host/dist/win-fd-inherit.d.ts.map +0 -1
  737. package/node_modules/@xrkseek/server-host/dist/win-fd-inherit.js +0 -96
  738. package/node_modules/@xrkseek/server-host/dist/win-fd-inherit.js.map +0 -1
@@ -1,8 +1,8 @@
1
1
  import { mkdirSync, statSync } from "node:fs";
2
2
  import path from "node:path";
3
- import { assertSessionEvent } from "@xrkseek/protocol";
3
+ import { assertSessionEvent, SessionEventParseError, } from "@xrkseek/protocol";
4
4
  import { expandPackedStorageRecords, isPackedChunkRow, isTextChunkRow, isToolCallChunkRow, packChunkRunsForExport, } from "./chunk-pack.js";
5
- import { deepFreeze, newSessionId } from "./freeze.js";
5
+ import { freezeSessionEvent, newSessionId } from "./freeze.js";
6
6
  import { repairOpenTurnEvents, sessionHasOpenTurn, } from "./repair-open-turn.js";
7
7
  import { extractEventSearchText } from "./search-text.js";
8
8
  import { snapshotEvents } from "./seq.js";
@@ -21,6 +21,11 @@ const ID_RE = /^[A-Za-z0-9._-]+$/;
21
21
  const DEBUG_WAL_CHECKPOINT = Boolean(process.env.XRK_DEBUG_WAL);
22
22
  /** Physical schema v3: durable rows may be packed chunk rows (expanded on load). */
23
23
  const SCHEMA_VERSION = SQLITE_SCHEMA_CURRENT;
24
+ /**
25
+ * Consecutive searches that had to fall back because the FTS index could not
26
+ * be read. Only used to throttle the diagnostic line.
27
+ */
28
+ let searchIndexFailures = 0;
24
29
  const DB_NAME = "sessions.db";
25
30
  /** Cold sibling of {@link DB_NAME}: archived session logs live here. */
26
31
  const ARCHIVE_DB_NAME = "sessions-archive.db";
@@ -40,6 +45,31 @@ function deleteSessionRows(db, id) {
40
45
  db.prepare("DELETE FROM events WHERE session_id = ?").run(id);
41
46
  db.prepare("DELETE FROM sessions WHERE id = ?").run(id);
42
47
  }
48
+ /**
49
+ * Run `fn` inside one `BEGIN IMMEDIATE … COMMIT`, rolling back on throw.
50
+ *
51
+ * The three deletes above are a single logical removal: they used to autocommit
52
+ * one by one, so a crash (or a locked FTS index) between them left "skull" rows
53
+ * — `events` gone while `search_fts` still matched, so search returned a
54
+ * sessionId that `has()` reports as missing. Callers that already hold a
55
+ * transaction (`copySessionRows`) must not wrap again.
56
+ */
57
+ function withImmediate(db, run) {
58
+ db.exec("BEGIN IMMEDIATE");
59
+ try {
60
+ run();
61
+ db.exec("COMMIT");
62
+ }
63
+ catch (err) {
64
+ try {
65
+ db.exec("ROLLBACK");
66
+ }
67
+ catch {
68
+ /* already rolled back / connection gone */
69
+ }
70
+ throw err;
71
+ }
72
+ }
43
73
  /** Copy one session's sessions/events/FTS rows from `from` into `to` (replace). */
44
74
  function copySessionRows(from, to, id) {
45
75
  const eventRows = from
@@ -48,10 +78,23 @@ function copySessionRows(from, to, id) {
48
78
  const ftsRows = from
49
79
  .prepare("SELECT seq, text FROM search_fts WHERE session_id = ?")
50
80
  .all(id);
81
+ // Hints travel with the rows. Inserting a bare `id` left every archived or
82
+ // restored session at event_count/last_ts 0 forever (the backfill only runs
83
+ // on a schema bump), which made `session.list` fall back to a full event scan
84
+ // and reported the session as blank. A missing row stays 0 on purpose: the
85
+ // hint reader treats <= 0 as "unknown" and rescans correctly.
86
+ const hints = from
87
+ .prepare("SELECT last_ts, event_count, has_turn_start, has_command_run FROM sessions WHERE id = ?")
88
+ .get(id);
51
89
  to.exec("BEGIN IMMEDIATE");
52
90
  try {
53
91
  deleteSessionRows(to, id);
54
- to.prepare("INSERT INTO sessions (id) VALUES (?)").run(id);
92
+ to.prepare("INSERT INTO sessions (id, last_ts, event_count, has_turn_start, has_command_run) VALUES (?, ?, ?, ?, ?)").run(id, hints?.last_ts ?? 0, hints?.event_count ?? 0, hints?.has_turn_start ?? 0, hints?.has_command_run ?? 0);
93
+ // One prepared statement reused per row beats chunked multi-value INSERTs
94
+ // here: measured on an 18,370-row / 45.8 MB session, batching made
95
+ // offload/restore ~25% *slower* (2,744 / 2,726 ms vs 2,197 / 2,116 ms),
96
+ // because every chunk needs a fresh `prepare` and SQLite's per-row path
97
+ // already reuses the compiled statement.
55
98
  const insertEvent = to.prepare("INSERT INTO events (session_id, seq, ts, payload) VALUES (?, ?, ?, ?)");
56
99
  for (const row of eventRows) {
57
100
  insertEvent.run(id, row.seq, row.ts, row.payload);
@@ -132,6 +175,19 @@ export function ftsMatchQuery(query) {
132
175
  return '""';
133
176
  return `"${trimmed.replace(/"/g, '""')}"`;
134
177
  }
178
+ export function planFtsQuery(query) {
179
+ const trimmed = query.trim();
180
+ if (!trimmed)
181
+ return null;
182
+ // Code points, not UTF-16 units: the tokenizer counts characters.
183
+ if ([...trimmed].length >= 3) {
184
+ return { kind: "match", value: ftsMatchQuery(trimmed) };
185
+ }
186
+ return {
187
+ kind: "like",
188
+ value: `%${trimmed.replace(/[\\%_]/g, (c) => `\\${c}`)}%`,
189
+ };
190
+ }
135
191
  /**
136
192
  * Join text chunks so a token split across indexes stays searchable after flush.
137
193
  * `prefix` is the nearest earlier text chunk before this batch (flush boundary).
@@ -180,13 +236,13 @@ function storageTs(record) {
180
236
  return isPackedChunkRow(record) ? record.ts0 : record.ts;
181
237
  }
182
238
  function ensureFts(db) {
183
- db.exec(`
184
- CREATE VIRTUAL TABLE IF NOT EXISTS search_fts USING fts5(
185
- session_id UNINDEXED,
186
- seq UNINDEXED,
187
- text,
188
- tokenize = 'trigram'
189
- );
239
+ db.exec(`
240
+ CREATE VIRTUAL TABLE IF NOT EXISTS search_fts USING fts5(
241
+ session_id UNINDEXED,
242
+ seq UNINDEXED,
243
+ text,
244
+ tokenize = 'trigram'
245
+ );
190
246
  `);
191
247
  }
192
248
  function schemaVersion(db) {
@@ -234,24 +290,24 @@ function addSessionHintColumns(db) {
234
290
  function backfillSessionHints(db) {
235
291
  db.exec("INSERT OR IGNORE INTO sessions (id) SELECT DISTINCT session_id FROM events");
236
292
  db.exec("DROP TABLE IF EXISTS temp._session_hint_agg");
237
- db.exec(`
238
- CREATE TEMP TABLE _session_hint_agg AS
239
- SELECT session_id,
240
- MAX(ts) AS last_ts,
241
- COUNT(*) AS event_count,
242
- MAX(CASE WHEN json_extract(payload, '$.type') = 'turn/start' THEN 1 ELSE 0 END) AS has_turn_start,
243
- MAX(CASE WHEN json_extract(payload, '$.type') = 'command/run' THEN 1 ELSE 0 END) AS has_command_run
244
- FROM events
245
- GROUP BY session_id
293
+ db.exec(`
294
+ CREATE TEMP TABLE _session_hint_agg AS
295
+ SELECT session_id,
296
+ MAX(ts) AS last_ts,
297
+ COUNT(*) AS event_count,
298
+ MAX(CASE WHEN json_extract(payload, '$.type') = 'turn/start' THEN 1 ELSE 0 END) AS has_turn_start,
299
+ MAX(CASE WHEN json_extract(payload, '$.type') = 'command/run' THEN 1 ELSE 0 END) AS has_command_run
300
+ FROM events
301
+ GROUP BY session_id
246
302
  `);
247
- db.exec(`
248
- UPDATE sessions SET
249
- last_ts = a.last_ts,
250
- event_count = a.event_count,
251
- has_turn_start = a.has_turn_start,
252
- has_command_run = a.has_command_run
253
- FROM _session_hint_agg a
254
- WHERE a.session_id = sessions.id
303
+ db.exec(`
304
+ UPDATE sessions SET
305
+ last_ts = a.last_ts,
306
+ event_count = a.event_count,
307
+ has_turn_start = a.has_turn_start,
308
+ has_command_run = a.has_command_run
309
+ FROM _session_hint_agg a
310
+ WHERE a.session_id = sessions.id
255
311
  `);
256
312
  db.exec("DROP TABLE temp._session_hint_agg");
257
313
  }
@@ -299,32 +355,32 @@ function initSchema(db, journalMode = "WAL") {
299
355
  db.exec("PRAGMA wal_autocheckpoint = 1000");
300
356
  db.exec("PRAGMA journal_size_limit = 67108864");
301
357
  }
302
- db.exec(`
303
- CREATE TABLE IF NOT EXISTS meta (
304
- key TEXT PRIMARY KEY,
305
- value TEXT NOT NULL
306
- );
358
+ db.exec(`
359
+ CREATE TABLE IF NOT EXISTS meta (
360
+ key TEXT PRIMARY KEY,
361
+ value TEXT NOT NULL
362
+ );
307
363
  `);
308
364
  const hooks = {
309
365
  ensureTables: () => {
310
- db.exec(`
311
- CREATE TABLE IF NOT EXISTS sessions (
312
- id TEXT PRIMARY KEY,
313
- last_ts INTEGER NOT NULL DEFAULT 0,
314
- event_count INTEGER NOT NULL DEFAULT 0,
315
- has_turn_start INTEGER NOT NULL DEFAULT 0,
316
- has_command_run INTEGER NOT NULL DEFAULT 0
317
- );
318
- CREATE TABLE IF NOT EXISTS events (
319
- session_id TEXT NOT NULL,
320
- seq INTEGER NOT NULL,
321
- ts INTEGER NOT NULL,
322
- payload TEXT NOT NULL,
323
- PRIMARY KEY (session_id, seq),
324
- FOREIGN KEY (session_id) REFERENCES sessions(id)
325
- );
326
- CREATE INDEX IF NOT EXISTS idx_events_session_seq
327
- ON events (session_id, seq);
366
+ db.exec(`
367
+ CREATE TABLE IF NOT EXISTS sessions (
368
+ id TEXT PRIMARY KEY,
369
+ last_ts INTEGER NOT NULL DEFAULT 0,
370
+ event_count INTEGER NOT NULL DEFAULT 0,
371
+ has_turn_start INTEGER NOT NULL DEFAULT 0,
372
+ has_command_run INTEGER NOT NULL DEFAULT 0
373
+ );
374
+ CREATE TABLE IF NOT EXISTS events (
375
+ session_id TEXT NOT NULL,
376
+ seq INTEGER NOT NULL,
377
+ ts INTEGER NOT NULL,
378
+ payload TEXT NOT NULL,
379
+ PRIMARY KEY (session_id, seq),
380
+ FOREIGN KEY (session_id) REFERENCES sessions(id)
381
+ );
382
+ CREATE INDEX IF NOT EXISTS idx_events_session_seq
383
+ ON events (session_id, seq);
328
384
  `);
329
385
  },
330
386
  ensureSessionHints: () => {
@@ -340,6 +396,14 @@ function initSchema(db, journalMode = "WAL") {
340
396
  },
341
397
  };
342
398
  const stored = schemaVersion(db);
399
+ if (stored > SCHEMA_VERSION) {
400
+ // Direction-aware refusal. A newer build already migrated this file and may
401
+ // have written rows this build would misread; opening it "successfully"
402
+ // would rewrite that data under the old shape — silent corruption instead
403
+ // of a message the user can act on.
404
+ throw new Error(`sessions.db schema v${stored} is newer than this build (v${SCHEMA_VERSION}):`
405
+ + " it was written by a newer XRK Harness — upgrade instead of opening it");
406
+ }
343
407
  if (stored >= SCHEMA_VERSION) {
344
408
  // A current schema_version means the migration chain already built every
345
409
  // table/index/FTS object. Re-running the full DDL on every Host start takes
@@ -361,21 +425,219 @@ function parseStoragePayload(payload) {
361
425
  }
362
426
  return [assertSessionEvent(raw)];
363
427
  }
428
+ /** True when `prefix` is `full[0..prefix.length)` (JSON-stable event equality). */
429
+ function logicalEventsEqualPrefix(full, prefix) {
430
+ if (prefix.length > full.length)
431
+ return false;
432
+ for (let i = 0; i < prefix.length; i++) {
433
+ // Truncate / edit-resubmit usually passes a `slice` of the resident log —
434
+ // same object identity. JSON.stringify of 16k events was dominating the
435
+ // R7 fast path (~hundreds of ms) before the cheap DELETE.
436
+ if (full[i] === prefix[i])
437
+ continue;
438
+ if (JSON.stringify(full[i]) !== JSON.stringify(prefix[i]))
439
+ return false;
440
+ }
441
+ return true;
442
+ }
443
+ /**
444
+ * Map a logical keep-count onto the first *physical* `events.seq` to delete.
445
+ * Packed chunk rows that straddle the cut force a full rewrite.
446
+ *
447
+ * When `totalLogical` is known (resident length / healed hints), walk **DESC**
448
+ * and only expand the discarded suffix — edit-resubmit / truncate usually drop
449
+ * a few hundred events off a multi-10k log; ASC-scanning the whole prefix was
450
+ * the R7 fast-path bottleneck (~1–2 s).
451
+ */
452
+ function physicalTailCutSeq(db, sessionId, keepLogical, totalLogical) {
453
+ if (keepLogical <= 0)
454
+ return "empty";
455
+ if (typeof totalLogical === "number"
456
+ && totalLogical >= keepLogical
457
+ && Number.isFinite(totalLogical)) {
458
+ const needDrop = totalLogical - keepLogical;
459
+ if (needDrop === 0)
460
+ return "noop";
461
+ const iter = db
462
+ .prepare("SELECT seq, payload FROM events WHERE session_id = ? ORDER BY seq DESC")
463
+ .iterate(sessionId);
464
+ let dropped = 0;
465
+ let sawRow = false;
466
+ for (const row of iter) {
467
+ sawRow = true;
468
+ let n;
469
+ try {
470
+ n = parseStoragePayload(row.payload).length;
471
+ }
472
+ catch {
473
+ return "rewrite";
474
+ }
475
+ if (dropped + n < needDrop) {
476
+ dropped += n;
477
+ continue;
478
+ }
479
+ if (dropped + n === needDrop) {
480
+ return row.seq;
481
+ }
482
+ // Packed row straddles the logical cut.
483
+ return "rewrite";
484
+ }
485
+ if (!sawRow)
486
+ return "noop";
487
+ return "rewrite";
488
+ }
489
+ const rows = db
490
+ .prepare("SELECT seq, payload FROM events WHERE session_id = ? ORDER BY seq ASC")
491
+ .all(sessionId);
492
+ if (rows.length === 0)
493
+ return "noop";
494
+ let logical = 0;
495
+ for (const row of rows) {
496
+ if (logical >= keepLogical)
497
+ return row.seq;
498
+ let n;
499
+ try {
500
+ n = parseStoragePayload(row.payload).length;
501
+ }
502
+ catch {
503
+ return "rewrite";
504
+ }
505
+ if (logical + n <= keepLogical) {
506
+ logical += n;
507
+ continue;
508
+ }
509
+ return "rewrite";
510
+ }
511
+ return logical === keepLogical ? "noop" : "rewrite";
512
+ }
513
+ /**
514
+ * A stored row this build cannot read: corrupt JSON, an unknown event type, or
515
+ * a row written by a newer format.
516
+ *
517
+ * Loading stops here instead of returning the rows that happened to work,
518
+ * because `ensureLoaded` feeds whatever it gets straight into crash repair: a
519
+ * silently truncated view makes the store append a synthetic `turn/end` into
520
+ * the real log, which pushes every surviving event behind a turn boundary that
521
+ * never existed. Refusing to load is the only failure that leaves the log
522
+ * intact, so the caller can tell the user to upgrade instead.
523
+ */
524
+ export class SessionLogUnreadableError extends Error {
525
+ sessionId;
526
+ seq;
527
+ reason;
528
+ constructor(sessionId,
529
+ /** Position of the first unreadable row. */
530
+ seq, reason) {
531
+ super(`session log unreadable: ${sessionId} seq ${seq} (${reason}) — refusing to load a partial log`);
532
+ this.sessionId = sessionId;
533
+ this.seq = seq;
534
+ this.reason = reason;
535
+ this.name = "SessionLogUnreadableError";
536
+ }
537
+ }
364
538
  function loadSessionEvents(db, id) {
365
539
  const rows = db
366
- .prepare("SELECT payload FROM events WHERE session_id = ? ORDER BY seq ASC")
540
+ .prepare("SELECT seq, payload FROM events WHERE session_id = ? ORDER BY seq ASC")
367
541
  .all(id);
368
542
  const events = [];
369
543
  for (const row of rows) {
370
544
  try {
371
545
  events.push(...parseStoragePayload(row.payload));
372
546
  }
373
- catch {
374
- break;
547
+ catch (error) {
548
+ // Newer Harness may write pure-info rows with `ignorable: true`. Skipping
549
+ // keeps the readable prefix intact; required unknowns still refuse load.
550
+ if (error instanceof SessionEventParseError
551
+ && error.code === "unknown-ignorable") {
552
+ continue;
553
+ }
554
+ throw new SessionLogUnreadableError(id, row.seq, error instanceof Error ? error.message : String(error));
375
555
  }
376
556
  }
377
557
  return events;
378
558
  }
559
+ /**
560
+ * Expand a physical suffix until at least `maxLogical` events (or the whole log).
561
+ * Rows are read newest-first then reversed so the result is a chronological suffix.
562
+ */
563
+ /**
564
+ * True when `hintedCount` is safe as a logical length for absolute seq.
565
+ * Packed logs with a stale physical backfill look like count === row count.
566
+ */
567
+ function eventCountLooksLogical(db, id, hintedCount) {
568
+ const physical = db
569
+ .prepare("SELECT COUNT(*) AS n FROM events WHERE session_id = ?")
570
+ .get(id)?.n ?? 0;
571
+ if (hintedCount > physical)
572
+ return true;
573
+ if (hintedCount < physical)
574
+ return false;
575
+ // Equal: only safe when no packed chunk rows (1 event per physical row).
576
+ const packed = db
577
+ .prepare(`SELECT 1 AS hit FROM events WHERE session_id = ? AND (
578
+ json_extract(payload, '$.type') = 'text-chunks'
579
+ OR json_extract(payload, '$.type') = 'tool-call-chunks'
580
+ ) LIMIT 1`)
581
+ .get(id);
582
+ return packed === undefined;
583
+ }
584
+ function loadSessionEventsTail(db, id, maxLogical) {
585
+ if (maxLogical <= 0)
586
+ return [];
587
+ const rows = db
588
+ .prepare("SELECT seq, payload FROM events WHERE session_id = ? ORDER BY seq DESC")
589
+ .all(id);
590
+ const newestFirst = [];
591
+ let logical = 0;
592
+ for (const row of rows) {
593
+ try {
594
+ const expanded = parseStoragePayload(row.payload);
595
+ newestFirst.push(expanded);
596
+ logical += expanded.length;
597
+ if (logical >= maxLogical)
598
+ break;
599
+ }
600
+ catch (error) {
601
+ if (error instanceof SessionEventParseError
602
+ && error.code === "unknown-ignorable") {
603
+ continue;
604
+ }
605
+ throw new SessionLogUnreadableError(id, row.seq, error instanceof Error ? error.message : String(error));
606
+ }
607
+ }
608
+ const out = [];
609
+ for (let i = newestFirst.length - 1; i >= 0; i--) {
610
+ out.push(...newestFirst[i]);
611
+ }
612
+ return out;
613
+ }
614
+ /** Visit non-packed durable events in seq order (no chunk expansion). */
615
+ function scanDurableSinglesFromDb(db, id, visit) {
616
+ const rows = db
617
+ .prepare("SELECT seq, payload FROM events WHERE session_id = ? ORDER BY seq ASC")
618
+ .all(id);
619
+ for (const row of rows) {
620
+ let raw;
621
+ try {
622
+ raw = JSON.parse(row.payload);
623
+ }
624
+ catch (error) {
625
+ throw new SessionLogUnreadableError(id, row.seq, error instanceof Error ? error.message : String(error));
626
+ }
627
+ if (isPackedChunkRow(raw))
628
+ continue;
629
+ try {
630
+ visit(assertSessionEvent(raw));
631
+ }
632
+ catch (error) {
633
+ if (error instanceof SessionEventParseError
634
+ && error.code === "unknown-ignorable") {
635
+ continue;
636
+ }
637
+ throw new SessionLogUnreadableError(id, row.seq, error instanceof Error ? error.message : String(error));
638
+ }
639
+ }
640
+ }
379
641
  function nextSeqFromDb(db, sessionId) {
380
642
  const row = db
381
643
  .prepare("SELECT COALESCE(MAX(seq), -1) AS maxSeq FROM events WHERE session_id = ?")
@@ -384,16 +646,16 @@ function nextSeqFromDb(db, sessionId) {
384
646
  }
385
647
  function hasTurnStartInDb(db, sessionId) {
386
648
  const row = db
387
- .prepare(`SELECT 1 AS hit FROM events
388
- WHERE session_id = ? AND json_extract(payload, '$.type') = 'turn/start'
649
+ .prepare(`SELECT 1 AS hit FROM events
650
+ WHERE session_id = ? AND json_extract(payload, '$.type') = 'turn/start'
389
651
  LIMIT 1`)
390
652
  .get(sessionId);
391
653
  return row !== undefined;
392
654
  }
393
655
  function hasCommandRunInDb(db, sessionId) {
394
656
  const row = db
395
- .prepare(`SELECT 1 AS hit FROM events
396
- WHERE session_id = ? AND json_extract(payload, '$.type') = 'command/run'
657
+ .prepare(`SELECT 1 AS hit FROM events
658
+ WHERE session_id = ? AND json_extract(payload, '$.type') = 'command/run'
397
659
  LIMIT 1`)
398
660
  .get(sessionId);
399
661
  return row !== undefined;
@@ -423,6 +685,7 @@ function sessionHintsFromDb(db, sessionId) {
423
685
  return undefined;
424
686
  return {
425
687
  lastEventTs: row.last_ts > 0 ? row.last_ts : null,
688
+ eventCount: row.event_count,
426
689
  hasTurnStart: row.has_turn_start === 1,
427
690
  hasCommandRun: row.has_command_run === 1,
428
691
  };
@@ -482,7 +745,7 @@ export function createPersistentSessionStore(dir, options = {}) {
482
745
  for (const id of [...coldIds]) {
483
746
  if (hotIds.has(id)) {
484
747
  try {
485
- deleteSessionRows(archiveDb, id);
748
+ withImmediate(archiveDb, () => deleteSessionRows(archiveDb, id));
486
749
  }
487
750
  catch {
488
751
  /* best-effort */
@@ -549,14 +812,18 @@ export function createPersistentSessionStore(dir, options = {}) {
549
812
  // newest ts and the sticky flags monotonic under out-of-order batches.
550
813
  const upsertSessionHints = shared
551
814
  ? undefined
552
- : db.prepare(`INSERT INTO sessions (id, last_ts, event_count, has_turn_start, has_command_run)
553
- VALUES (?, ?, ?, ?, ?)
554
- ON CONFLICT(id) DO UPDATE SET
555
- last_ts = MAX(sessions.last_ts, excluded.last_ts),
556
- event_count = sessions.event_count + excluded.event_count,
557
- has_turn_start = MAX(sessions.has_turn_start, excluded.has_turn_start),
815
+ : db.prepare(`INSERT INTO sessions (id, last_ts, event_count, has_turn_start, has_command_run)
816
+ VALUES (?, ?, ?, ?, ?)
817
+ ON CONFLICT(id) DO UPDATE SET
818
+ last_ts = MAX(sessions.last_ts, excluded.last_ts),
819
+ event_count = sessions.event_count + excluded.event_count,
820
+ has_turn_start = MAX(sessions.has_turn_start, excluded.has_turn_start),
558
821
  has_command_run = MAX(sessions.has_command_run, excluded.has_command_run)`);
559
- const updateSessionHints = (sessionId, events) => {
822
+ /**
823
+ * Append-only flush: **add** this batch's length to `event_count`.
824
+ * Do not use for seed / replacePrefix / repair (those need an absolute set).
825
+ */
826
+ const bumpSessionHints = (sessionId, events) => {
560
827
  if (upsertSessionHints === undefined)
561
828
  return;
562
829
  let lastTs = 0;
@@ -572,6 +839,26 @@ export function createPersistentSessionStore(dir, options = {}) {
572
839
  }
573
840
  upsertSessionHints.run(sessionId, lastTs, events.length, turnStart, commandRun);
574
841
  };
842
+ /**
843
+ * Absolute list hints from a full logical log (seed / truncate / hydrate repair).
844
+ * `bumpSessionHints` alone would ADD `events.length` onto a stale counter.
845
+ */
846
+ const setSessionHints = (sessionId, events) => {
847
+ if (shared)
848
+ return;
849
+ let lastTs = 0;
850
+ let turnStart = 0;
851
+ let commandRun = 0;
852
+ for (const event of events) {
853
+ if (event.ts > lastTs)
854
+ lastTs = event.ts;
855
+ if (event.type === "turn/start")
856
+ turnStart = 1;
857
+ else if (event.type === "command/run")
858
+ commandRun = 1;
859
+ }
860
+ db.prepare("UPDATE sessions SET last_ts = ?, event_count = ?, has_turn_start = ?, has_command_run = ? WHERE id = ?").run(lastTs, events.length, turnStart, commandRun, sessionId);
861
+ };
575
862
  const allocateSeq = (sessionId) => {
576
863
  let next = nextSeqBySession.get(sessionId);
577
864
  if (next === undefined) {
@@ -583,6 +870,15 @@ export function createPersistentSessionStore(dir, options = {}) {
583
870
  const writeRecord = (sessionId, record) => {
584
871
  const seq = allocateSeq(sessionId);
585
872
  insertEvent.run(sessionId, seq, storageTs(record), JSON.stringify(record));
873
+ // `text-chunks` rows are indexed by `indexJoinedTextChunks`, whose row
874
+ // carries the flush-boundary prefix and therefore the whole text of this
875
+ // row as a strict subset. Writing both stored the same conversation twice
876
+ // in `search_fts` (measured: 165 fully-overlapping (session_id, seq)
877
+ // pairs in one live session), doubling the index and every archive /
878
+ // restore / delete copy of it. `MATCH` recall is unchanged: the kept row
879
+ // is the superset, and search only returns DISTINCT session_id.
880
+ if (isTextChunkRow(record))
881
+ return;
586
882
  const text = extractStorageSearchText(record);
587
883
  if (text)
588
884
  insertFts.run(sessionId, seq, text);
@@ -716,11 +1012,13 @@ export function createPersistentSessionStore(dir, options = {}) {
716
1012
  // Human input is the one thing a power cut must not swallow: upgrade to
717
1013
  // FULL for the transaction carrying it, then fall back to NORMAL. PRAGMA
718
1014
  // synchronous cannot change inside a transaction, so it brackets BEGIN.
1015
+ // BEGIN (and the FULL pragma) must sit inside try: a busy/IO throw before
1016
+ // COMMIT would otherwise drop `batch` from `pending` with no restore.
719
1017
  const needsFullSync = batch.some((row) => row.event.type === "user/message");
720
- if (needsFullSync)
721
- db.exec("PRAGMA synchronous = FULL");
722
- db.exec("BEGIN IMMEDIATE");
723
1018
  try {
1019
+ if (needsFullSync)
1020
+ db.exec("PRAGMA synchronous = FULL");
1021
+ db.exec("BEGIN IMMEDIATE");
724
1022
  for (const sessionId of order) {
725
1023
  const events = bySession.get(sessionId);
726
1024
  const packed = packChunkRunsForExport(events);
@@ -728,7 +1026,7 @@ export function createPersistentSessionStore(dir, options = {}) {
728
1026
  writeRecord(sessionId, record);
729
1027
  }
730
1028
  indexJoinedTextChunks(sessionId, events);
731
- updateSessionHints(sessionId, events);
1029
+ bumpSessionHints(sessionId, events);
732
1030
  }
733
1031
  db.exec("COMMIT");
734
1032
  }
@@ -737,7 +1035,7 @@ export function createPersistentSessionStore(dir, options = {}) {
737
1035
  db.exec("ROLLBACK");
738
1036
  }
739
1037
  catch {
740
- /* already rolled back / closed */
1038
+ /* already rolled back / closed / never began */
741
1039
  }
742
1040
  restoreSeqMap(seqSnapshot);
743
1041
  // Prepend this flush's batch so later flush/close can retry; keep any
@@ -783,8 +1081,11 @@ export function createPersistentSessionStore(dir, options = {}) {
783
1081
  const flushMicrotaskIds = new Set();
784
1082
  let flushMicrotaskQueued = false;
785
1083
  let storeClosed = false;
1084
+ let backgroundFlushFailures = 0;
1085
+ let backgroundFlushPaused = false;
1086
+ let lastBackgroundFlushError;
786
1087
  const scheduleFlushPending = (sessionId) => {
787
- if (shared || storeClosed)
1088
+ if (shared || storeClosed || backgroundFlushPaused)
788
1089
  return;
789
1090
  flushMicrotaskIds.add(sessionId);
790
1091
  if (flushMicrotaskQueued)
@@ -792,7 +1093,7 @@ export function createPersistentSessionStore(dir, options = {}) {
792
1093
  flushMicrotaskQueued = true;
793
1094
  queueMicrotask(() => {
794
1095
  flushMicrotaskQueued = false;
795
- if (storeClosed) {
1096
+ if (storeClosed || backgroundFlushPaused) {
796
1097
  flushMicrotaskIds.clear();
797
1098
  return;
798
1099
  }
@@ -802,8 +1103,20 @@ export function createPersistentSessionStore(dir, options = {}) {
802
1103
  try {
803
1104
  flushPending(id);
804
1105
  }
805
- catch {
1106
+ catch (error) {
806
1107
  /* pending restored inside flushPending; close()/flush() retries */
1108
+ // A retry that never succeeds is data loss with no trail: the events
1109
+ // look saved in memory and vanish on exit. Pause auto-drain (DSH) so
1110
+ // the next explicit flush()/close() is the only path forward.
1111
+ backgroundFlushFailures += 1;
1112
+ backgroundFlushPaused = true;
1113
+ lastBackgroundFlushError =
1114
+ error instanceof Error ? error.message : String(error);
1115
+ if (backgroundFlushFailures <= 3 || backgroundFlushFailures % 100 === 0) {
1116
+ console.error(`[session-store] background flush failed #${backgroundFlushFailures}`
1117
+ + ` for ${id}; auto-drain paused, events stay queued: `
1118
+ + lastBackgroundFlushError);
1119
+ }
807
1120
  }
808
1121
  }
809
1122
  });
@@ -838,7 +1151,7 @@ export function createPersistentSessionStore(dir, options = {}) {
838
1151
  const events = loadSessionEvents(sourceDbFor(id), id);
839
1152
  const repairs = repairOpenTurnEvents(events);
840
1153
  if (repairs.length > 0) {
841
- const frozenRepairs = repairs.map((ev) => deepFreeze(structuredClone(assertSessionEvent(ev))));
1154
+ const frozenRepairs = repairs.map((ev) => freezeSessionEvent(ev));
842
1155
  // Cold / shared: memory-only repair (archive is read for turns; shared is RO).
843
1156
  if (!shared && !offloaded) {
844
1157
  const seqSnapshot = new Map(nextSeqBySession);
@@ -847,7 +1160,9 @@ export function createPersistentSessionStore(dir, options = {}) {
847
1160
  for (const frozen of frozenRepairs) {
848
1161
  persistImmediate(id, frozen);
849
1162
  }
850
- updateSessionHints(id, frozenRepairs);
1163
+ // Repairs are appends — bump; absolute set happens below against the
1164
+ // full logical log (also heals stale event_count from older builds).
1165
+ bumpSessionHints(id, frozenRepairs);
851
1166
  db.exec("COMMIT");
852
1167
  }
853
1168
  catch (err) {
@@ -867,6 +1182,19 @@ export function createPersistentSessionStore(dir, options = {}) {
867
1182
  }
868
1183
  sessions.set(id, events);
869
1184
  touchResident(id);
1185
+ // Heal durable event_count when it drifted (R7 ADD-bug / partial bump).
1186
+ // R8 cold tail keys absolute seq off this column.
1187
+ if (!shared && !offloaded) {
1188
+ const hinted = sessionHintsFromDb(sourceDbFor(id), id)?.eventCount;
1189
+ if (hinted !== events.length) {
1190
+ try {
1191
+ setSessionHints(id, events);
1192
+ }
1193
+ catch {
1194
+ /* RO / closed */
1195
+ }
1196
+ }
1197
+ }
870
1198
  return events;
871
1199
  };
872
1200
  const assertHotMutable = (id) => {
@@ -907,11 +1235,11 @@ export function createPersistentSessionStore(dir, options = {}) {
907
1235
  return;
908
1236
  flushPending(sid);
909
1237
  if (hotIds.has(sid)) {
910
- deleteSessionRows(db, sid);
1238
+ withImmediate(db, () => deleteSessionRows(db, sid));
911
1239
  hotIds.delete(sid);
912
1240
  }
913
1241
  if (coldIds.has(sid)) {
914
- deleteSessionRows(archiveDb, sid);
1242
+ withImmediate(archiveDb, () => deleteSessionRows(archiveDb, sid));
915
1243
  coldIds.delete(sid);
916
1244
  }
917
1245
  sessionIds.delete(sid);
@@ -942,7 +1270,7 @@ export function createPersistentSessionStore(dir, options = {}) {
942
1270
  return;
943
1271
  flushPending(sid);
944
1272
  copySessionRows(db, archiveDb, sid);
945
- deleteSessionRows(db, sid);
1273
+ withImmediate(db, () => deleteSessionRows(db, sid));
946
1274
  hotIds.delete(sid);
947
1275
  coldIds.add(sid);
948
1276
  dropResident(sid);
@@ -961,7 +1289,7 @@ export function createPersistentSessionStore(dir, options = {}) {
961
1289
  return;
962
1290
  flushPending(sid);
963
1291
  copySessionRows(archiveDb, db, sid);
964
- deleteSessionRows(archiveDb, sid);
1292
+ withImmediate(archiveDb, () => deleteSessionRows(archiveDb, sid));
965
1293
  coldIds.delete(sid);
966
1294
  hotIds.add(sid);
967
1295
  dropResident(sid);
@@ -980,8 +1308,7 @@ export function createPersistentSessionStore(dir, options = {}) {
980
1308
  }
981
1309
  assertHotMutable(id);
982
1310
  const events = ensureLoaded(id);
983
- const parsed = assertSessionEvent(event);
984
- const frozen = deepFreeze(structuredClone(parsed));
1311
+ const frozen = freezeSessionEvent(event);
985
1312
  events.push(frozen);
986
1313
  try {
987
1314
  persistEvent(id, frozen);
@@ -1009,7 +1336,7 @@ export function createPersistentSessionStore(dir, options = {}) {
1009
1336
  }
1010
1337
  const frozen = [];
1011
1338
  for (const event of eventsInput) {
1012
- frozen.push(deepFreeze(structuredClone(assertSessionEvent(event))));
1339
+ frozen.push(freezeSessionEvent(event));
1013
1340
  }
1014
1341
  // Create + one packed transaction (not N persistEvent flushes). Chunk
1015
1342
  // runs pack the same way as flushPending so fork seed matches live shape.
@@ -1031,6 +1358,12 @@ export function createPersistentSessionStore(dir, options = {}) {
1031
1358
  writeRecord(sid, record);
1032
1359
  }
1033
1360
  indexJoinedTextChunks(sid, frozen);
1361
+ // Same hints `replacePrefix` maintains. Without this a freshly forked
1362
+ // child sits at event_count 0 / has_turn_start 0 until its first
1363
+ // non-turn-start append, at which point the hint reader stops falling
1364
+ // back to an event scan and `blank` flips true — the sidebar then
1365
+ // offers the new-session button a 6-figure-event branch to reuse.
1366
+ setSessionHints(sid, frozen);
1034
1367
  db.exec("COMMIT");
1035
1368
  }
1036
1369
  catch (err) {
@@ -1054,6 +1387,89 @@ export function createPersistentSessionStore(dir, options = {}) {
1054
1387
  }
1055
1388
  return { id: sid, events: frozen };
1056
1389
  },
1390
+ /**
1391
+ * Fork R6: `INSERT…SELECT` the parent's durable prefix, then write only
1392
+ * `suffix` (closers + end-seed). Returns undefined → {@link forkSession}
1393
+ * falls back to full `seed` (packed row straddles the cut, or cold source).
1394
+ */
1395
+ seedFromSession(sourceId, keepLogical, childId, suffix) {
1396
+ assertWritable();
1397
+ const src = assertSafeId(sourceId);
1398
+ if (!sessionIds.has(src) || coldIds.has(src))
1399
+ return undefined;
1400
+ flushPending(src);
1401
+ assertHotMutable(src);
1402
+ const sourceEvents = ensureLoaded(src);
1403
+ if (keepLogical > sourceEvents.length)
1404
+ return undefined;
1405
+ const cut = physicalTailCutSeq(db, src, keepLogical, sourceEvents.length);
1406
+ if (cut === "rewrite")
1407
+ return undefined;
1408
+ const sid = assertSafeId(childId ?? newSessionId());
1409
+ if (sessionIds.has(sid)) {
1410
+ throw new Error(`session already exists: ${sid}`);
1411
+ }
1412
+ const prefix = sourceEvents.slice(0, keepLogical);
1413
+ const frozenSuffix = [];
1414
+ for (const event of suffix) {
1415
+ frozenSuffix.push(freezeSessionEvent(event));
1416
+ }
1417
+ const frozen = prefix.concat(frozenSuffix);
1418
+ const sourceNext = nextSeqBySession.get(src) ?? nextSeqFromDb(db, src);
1419
+ const nextAfterCopy = cut === "empty" ? 0 : cut === "noop" ? sourceNext : cut;
1420
+ sessionIds.add(sid);
1421
+ hotIds.add(sid);
1422
+ evictResidents(sid);
1423
+ sessions.set(sid, frozen);
1424
+ touchResident(sid);
1425
+ nextSeqBySession.set(sid, nextAfterCopy);
1426
+ insertSession.run(sid);
1427
+ const seqSnapshot = new Map(nextSeqBySession);
1428
+ db.exec("BEGIN IMMEDIATE");
1429
+ try {
1430
+ if (cut === "noop") {
1431
+ db.prepare("INSERT INTO events (session_id, seq, ts, payload) "
1432
+ + "SELECT ?, seq, ts, payload FROM events WHERE session_id = ?").run(sid, src);
1433
+ db.prepare("INSERT INTO search_fts (session_id, seq, text) "
1434
+ + "SELECT ?, seq, text FROM search_fts WHERE session_id = ?").run(sid, src);
1435
+ }
1436
+ else if (typeof cut === "number") {
1437
+ db.prepare("INSERT INTO events (session_id, seq, ts, payload) "
1438
+ + "SELECT ?, seq, ts, payload FROM events WHERE session_id = ? AND seq < ?").run(sid, src, cut);
1439
+ db.prepare("INSERT INTO search_fts (session_id, seq, text) "
1440
+ + "SELECT ?, seq, text FROM search_fts WHERE session_id = ? AND seq < ?").run(sid, src, cut);
1441
+ }
1442
+ if (frozenSuffix.length > 0) {
1443
+ const packed = packChunkRunsForExport(frozenSuffix);
1444
+ for (const record of packed) {
1445
+ writeRecord(sid, record);
1446
+ }
1447
+ indexJoinedTextChunks(sid, frozenSuffix);
1448
+ }
1449
+ setSessionHints(sid, frozen);
1450
+ db.exec("COMMIT");
1451
+ }
1452
+ catch (err) {
1453
+ try {
1454
+ db.exec("ROLLBACK");
1455
+ }
1456
+ catch {
1457
+ /* already rolled back / closed */
1458
+ }
1459
+ restoreSeqMap(seqSnapshot);
1460
+ sessionIds.delete(sid);
1461
+ hotIds.delete(sid);
1462
+ dropResident(sid);
1463
+ try {
1464
+ db.prepare("DELETE FROM sessions WHERE id = ?").run(sid);
1465
+ }
1466
+ catch {
1467
+ /* best-effort */
1468
+ }
1469
+ throw err;
1470
+ }
1471
+ return { id: sid, events: frozen };
1472
+ },
1057
1473
  replacePrefix(id, eventsInput = []) {
1058
1474
  assertWritable();
1059
1475
  const sid = assertSafeId(id);
@@ -1064,7 +1480,56 @@ export function createPersistentSessionStore(dir, options = {}) {
1064
1480
  flushPending(sid);
1065
1481
  const frozen = [];
1066
1482
  for (const event of eventsInput) {
1067
- frozen.push(deepFreeze(structuredClone(assertSessionEvent(event))));
1483
+ frozen.push(freezeSessionEvent(event));
1484
+ }
1485
+ // Fast path (edit-resubmit / truncate): prefix unchanged → DELETE tail
1486
+ // rows only. Full wipe+rewrite was ~1.6s on a 16k-event session.
1487
+ const current = ensureLoaded(sid);
1488
+ if (frozen.length <= current.length
1489
+ && logicalEventsEqualPrefix(current, frozen)) {
1490
+ const cut = physicalTailCutSeq(db, sid, frozen.length, current.length);
1491
+ if (cut === "noop") {
1492
+ sessions.set(sid, frozen);
1493
+ touchResident(sid);
1494
+ return { id: sid, events: frozen };
1495
+ }
1496
+ if (cut === "empty" || typeof cut === "number") {
1497
+ const seqSnapshot = new Map(nextSeqBySession);
1498
+ db.exec("BEGIN IMMEDIATE");
1499
+ try {
1500
+ if (cut === "empty") {
1501
+ db.prepare("DELETE FROM search_fts WHERE session_id = ?").run(sid);
1502
+ db.prepare("DELETE FROM events WHERE session_id = ?").run(sid);
1503
+ nextSeqBySession.set(sid, 0);
1504
+ }
1505
+ else {
1506
+ db.prepare("DELETE FROM search_fts WHERE session_id = ? AND seq >= ?").run(sid, cut);
1507
+ db.prepare("DELETE FROM events WHERE session_id = ? AND seq >= ?").run(sid, cut);
1508
+ nextSeqBySession.set(sid, cut);
1509
+ }
1510
+ if (frozen.length === 0) {
1511
+ db.prepare("UPDATE sessions SET last_ts = 0, event_count = 0, has_turn_start = 0, has_command_run = 0 WHERE id = ?").run(sid);
1512
+ }
1513
+ else {
1514
+ setSessionHints(sid, frozen);
1515
+ }
1516
+ db.exec("COMMIT");
1517
+ }
1518
+ catch (err) {
1519
+ try {
1520
+ db.exec("ROLLBACK");
1521
+ }
1522
+ catch {
1523
+ /* already rolled back / closed */
1524
+ }
1525
+ restoreSeqMap(seqSnapshot);
1526
+ throw err;
1527
+ }
1528
+ sessions.set(sid, frozen);
1529
+ touchResident(sid);
1530
+ return { id: sid, events: frozen };
1531
+ }
1532
+ // cut === "rewrite" (packed row straddles the logical boundary)
1068
1533
  }
1069
1534
  const seqSnapshot = new Map(nextSeqBySession);
1070
1535
  db.exec("BEGIN IMMEDIATE");
@@ -1079,7 +1544,7 @@ export function createPersistentSessionStore(dir, options = {}) {
1079
1544
  writeRecord(sid, record);
1080
1545
  }
1081
1546
  indexJoinedTextChunks(sid, frozen);
1082
- updateSessionHints(sid, frozen);
1547
+ setSessionHints(sid, frozen);
1083
1548
  }
1084
1549
  db.exec("COMMIT");
1085
1550
  }
@@ -1113,8 +1578,12 @@ export function createPersistentSessionStore(dir, options = {}) {
1113
1578
  if (hints !== undefined)
1114
1579
  return hints;
1115
1580
  // Pre-v4 rows (or a stripped archive) still fall back to the scans.
1581
+ const lastEventTs = lastEventTsFromDb(source, id);
1116
1582
  return {
1117
- lastEventTs: lastEventTsFromDb(source, id),
1583
+ lastEventTs,
1584
+ eventCount: source
1585
+ .prepare("SELECT COUNT(*) AS n FROM events WHERE session_id = ?")
1586
+ .get(id)?.n ?? 0,
1118
1587
  hasTurnStart: hasTurnStartInDb(source, id),
1119
1588
  hasCommandRun: hasCommandRunInDb(source, id),
1120
1589
  };
@@ -1122,28 +1591,108 @@ export function createPersistentSessionStore(dir, options = {}) {
1122
1591
  isLoaded(id) {
1123
1592
  return sessions.has(id);
1124
1593
  },
1594
+ readEventsTail(id, maxLogical) {
1595
+ if (!sessionIds.has(id)) {
1596
+ throw new Error(`session not found: ${id}`);
1597
+ }
1598
+ const cap = Math.max(0, Math.floor(maxLogical));
1599
+ if (cap <= 0) {
1600
+ return { events: [], baseIndex: 0 };
1601
+ }
1602
+ const cached = sessions.get(id);
1603
+ if (cached !== undefined) {
1604
+ touchResident(id);
1605
+ if (cached.length <= cap) {
1606
+ return { events: cached, baseIndex: 0 };
1607
+ }
1608
+ const baseIndex = cached.length - cap;
1609
+ return { events: cached.slice(baseIndex), baseIndex };
1610
+ }
1611
+ const source = sourceDbFor(id);
1612
+ const hints = sessionHintsFromDb(source, id);
1613
+ const total = hints?.eventCount;
1614
+ if (typeof total !== "number" || total <= 0)
1615
+ return undefined;
1616
+ // v4 hint backfill used physical COUNT(*). Packed sessions then report
1617
+ // event_count === row count while logical length is larger — refuse the
1618
+ // fast path so Face falls back to a full expand (correct absolute seq).
1619
+ if (!eventCountLooksLogical(source, id, total))
1620
+ return undefined;
1621
+ const events = loadSessionEventsTail(source, id, cap);
1622
+ if (events.length === 0)
1623
+ return { events: [], baseIndex: total };
1624
+ if (events.length > total)
1625
+ return undefined;
1626
+ return { events, baseIndex: total - events.length };
1627
+ },
1628
+ scanDurableSingles(id, visit) {
1629
+ if (!sessionIds.has(id)) {
1630
+ throw new Error(`session not found: ${id}`);
1631
+ }
1632
+ const cached = sessions.get(id);
1633
+ if (cached !== undefined) {
1634
+ touchResident(id);
1635
+ for (const event of cached)
1636
+ visit(event);
1637
+ return;
1638
+ }
1639
+ scanDurableSinglesFromDb(sourceDbFor(id), id, visit);
1640
+ },
1125
1641
  searchSessionIds(query) {
1126
- const match = ftsMatchQuery(query);
1127
- if (match === '""')
1642
+ const plan = planFtsQuery(query);
1643
+ if (plan === null)
1128
1644
  return [];
1129
1645
  const ids = new Set();
1646
+ // A common word ("session", "测试"→LIKE) matches thousands of rows. Face
1647
+ // shows 20 with a hasMore flag and then reads every candidate's full log,
1648
+ // so an uncapped candidate list pulls hundreds of sessions into the LRU
1649
+ // and evicts them again one by one.
1650
+ const CANDIDATE_LIMIT = 200;
1651
+ let ftsFailed = false;
1130
1652
  const run = (target) => {
1131
1653
  try {
1132
- const rows = target
1133
- .prepare("SELECT DISTINCT session_id AS id FROM search_fts WHERE search_fts MATCH ?")
1134
- .all(match);
1654
+ const rows = (plan.kind === "match"
1655
+ ? target
1656
+ .prepare("SELECT DISTINCT session_id AS id FROM search_fts WHERE search_fts MATCH ? LIMIT ?")
1657
+ .all(plan.value, CANDIDATE_LIMIT)
1658
+ : target
1659
+ .prepare("SELECT DISTINCT session_id AS id FROM search_fts WHERE text LIKE ? ESCAPE '\\' LIMIT ?")
1660
+ .all(plan.value, CANDIDATE_LIMIT));
1135
1661
  for (const row of rows)
1136
1662
  ids.add(row.id);
1137
1663
  }
1138
1664
  catch {
1139
- /* corrupt / missing FTS — skip that DB */
1665
+ /* corrupt / missing FTS — skip that DB, but say so below */
1666
+ ftsFailed = true;
1140
1667
  }
1141
1668
  };
1142
1669
  run(db);
1143
1670
  run(archiveDb);
1671
+ const needle = query.trim().toLowerCase();
1672
+ if (ftsFailed) {
1673
+ // A damaged index must not read as "no results": that is indistinguishable
1674
+ // from a real miss and sends the user hunting for content that is right
1675
+ // there. Scan the resident logs (the same text the index would hold) and
1676
+ // leave a throttled trace for diagnosis.
1677
+ for (const [id, events] of sessions) {
1678
+ if (ids.has(id))
1679
+ continue;
1680
+ for (const event of events) {
1681
+ const text = extractEventSearchText(event);
1682
+ if (text !== undefined && text.toLowerCase().includes(needle)) {
1683
+ ids.add(id);
1684
+ break;
1685
+ }
1686
+ }
1687
+ }
1688
+ searchIndexFailures += 1;
1689
+ if (searchIndexFailures <= 3 || searchIndexFailures % 100 === 0) {
1690
+ console.error(`[session-store] search index unavailable (#${searchIndexFailures});`
1691
+ + " falling back to resident logs — rebuild FTS to restore cold search");
1692
+ }
1693
+ }
1144
1694
  // Pending batches are not in FTS yet. Match them in memory so a search
1145
1695
  // does not COMMIT every other session's interior events.
1146
- const needle = query.trim().toLowerCase();
1147
1696
  const chunkText = new Map();
1148
1697
  for (const row of pending) {
1149
1698
  const text = extractEventSearchText(row.event);
@@ -1172,8 +1721,37 @@ export function createPersistentSessionStore(dir, options = {}) {
1172
1721
  }
1173
1722
  return [...ids];
1174
1723
  },
1724
+ releaseResident(sessionId) {
1725
+ const sid = sessionId;
1726
+ if (!sessionIds.has(sid))
1727
+ return false;
1728
+ const events = sessions.get(sid);
1729
+ if (events === undefined)
1730
+ return true;
1731
+ // Same pin as LRU eviction: re-hydrate mid-turn would re-run repair and
1732
+ // can insert a synthetic interrupted assistant while the live loop still
1733
+ // streams.
1734
+ if (sessionHasOpenTurn(events))
1735
+ return false;
1736
+ flushPending(sid);
1737
+ onEvict?.(sid);
1738
+ dropResident(sid);
1739
+ return true;
1740
+ },
1741
+ flushFailureReport() {
1742
+ return {
1743
+ failures: backgroundFlushFailures,
1744
+ paused: backgroundFlushPaused,
1745
+ ...(lastBackgroundFlushError !== undefined
1746
+ ? { lastError: lastBackgroundFlushError }
1747
+ : {}),
1748
+ };
1749
+ },
1175
1750
  flush(sessionId) {
1176
1751
  flushPending(sessionId);
1752
+ // Explicit barrier cleared the pause — resume microtask auto-drain.
1753
+ backgroundFlushPaused = false;
1754
+ lastBackgroundFlushError = undefined;
1177
1755
  },
1178
1756
  close() {
1179
1757
  storeClosed = true;