pulseed 0.5.3 → 0.5.4

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 (512) hide show
  1. package/dist/base/state/state-manager-goal-state.d.ts +40 -0
  2. package/dist/base/state/state-manager-goal-state.d.ts.map +1 -0
  3. package/dist/base/state/state-manager-goal-state.js +235 -0
  4. package/dist/base/state/state-manager-goal-state.js.map +1 -0
  5. package/dist/base/state/state-manager.d.ts +0 -5
  6. package/dist/base/state/state-manager.d.ts.map +1 -1
  7. package/dist/base/state/state-manager.js +27 -273
  8. package/dist/base/state/state-manager.js.map +1 -1
  9. package/dist/base/types/goal-activation.d.ts +25 -0
  10. package/dist/base/types/goal-activation.d.ts.map +1 -0
  11. package/dist/base/types/goal-activation.js +9 -0
  12. package/dist/base/types/goal-activation.js.map +1 -0
  13. package/dist/interface/chat/chat-history.d.ts +129 -0
  14. package/dist/interface/chat/chat-history.d.ts.map +1 -1
  15. package/dist/interface/chat/chat-history.js +135 -0
  16. package/dist/interface/chat/chat-history.js.map +1 -1
  17. package/dist/interface/chat/chat-runner-command-helpers.d.ts +50 -0
  18. package/dist/interface/chat/chat-runner-command-helpers.d.ts.map +1 -0
  19. package/dist/interface/chat/chat-runner-command-helpers.js +189 -0
  20. package/dist/interface/chat/chat-runner-command-helpers.js.map +1 -0
  21. package/dist/interface/chat/chat-runner-commands.d.ts +76 -0
  22. package/dist/interface/chat/chat-runner-commands.d.ts.map +1 -0
  23. package/dist/interface/chat/chat-runner-commands.js +814 -0
  24. package/dist/interface/chat/chat-runner-commands.js.map +1 -0
  25. package/dist/interface/chat/chat-runner-event-bridge.d.ts +53 -0
  26. package/dist/interface/chat/chat-runner-event-bridge.d.ts.map +1 -0
  27. package/dist/interface/chat/chat-runner-event-bridge.js +311 -0
  28. package/dist/interface/chat/chat-runner-event-bridge.js.map +1 -0
  29. package/dist/interface/chat/chat-runner-routes.d.ts +67 -0
  30. package/dist/interface/chat/chat-runner-routes.d.ts.map +1 -0
  31. package/dist/interface/chat/chat-runner-routes.js +594 -0
  32. package/dist/interface/chat/chat-runner-routes.js.map +1 -0
  33. package/dist/interface/chat/chat-runner-runtime.d.ts +37 -0
  34. package/dist/interface/chat/chat-runner-runtime.d.ts.map +1 -0
  35. package/dist/interface/chat/chat-runner-runtime.js +236 -0
  36. package/dist/interface/chat/chat-runner-runtime.js.map +1 -0
  37. package/dist/interface/chat/chat-runner-state.d.ts +20 -0
  38. package/dist/interface/chat/chat-runner-state.d.ts.map +1 -0
  39. package/dist/interface/chat/chat-runner-state.js +157 -0
  40. package/dist/interface/chat/chat-runner-state.js.map +1 -0
  41. package/dist/interface/chat/chat-runner-support.d.ts +15 -0
  42. package/dist/interface/chat/chat-runner-support.d.ts.map +1 -0
  43. package/dist/interface/chat/chat-runner-support.js +116 -0
  44. package/dist/interface/chat/chat-runner-support.js.map +1 -0
  45. package/dist/interface/chat/chat-runner.d.ts +10 -153
  46. package/dist/interface/chat/chat-runner.d.ts.map +1 -1
  47. package/dist/interface/chat/chat-runner.js +299 -2642
  48. package/dist/interface/chat/chat-runner.js.map +1 -1
  49. package/dist/interface/chat/chat-session-store.d.ts +32 -0
  50. package/dist/interface/chat/chat-session-store.d.ts.map +1 -1
  51. package/dist/interface/chat/chat-session-store.js +100 -10
  52. package/dist/interface/chat/chat-session-store.js.map +1 -1
  53. package/dist/interface/chat/cross-platform-session.d.ts.map +1 -1
  54. package/dist/interface/chat/cross-platform-session.js +2 -5
  55. package/dist/interface/chat/cross-platform-session.js.map +1 -1
  56. package/dist/interface/chat/event-subscriber.d.ts.map +1 -1
  57. package/dist/interface/chat/event-subscriber.js +41 -0
  58. package/dist/interface/chat/event-subscriber.js.map +1 -1
  59. package/dist/interface/chat/ingress-router.d.ts +0 -25
  60. package/dist/interface/chat/ingress-router.d.ts.map +1 -1
  61. package/dist/interface/chat/ingress-router.js +12 -85
  62. package/dist/interface/chat/ingress-router.js.map +1 -1
  63. package/dist/interface/chat/tend-command.d.ts.map +1 -1
  64. package/dist/interface/chat/tend-command.js +2 -0
  65. package/dist/interface/chat/tend-command.js.map +1 -1
  66. package/dist/interface/cli/commands/daemon-shared.d.ts +32 -0
  67. package/dist/interface/cli/commands/daemon-shared.d.ts.map +1 -0
  68. package/dist/interface/cli/commands/daemon-shared.js +120 -0
  69. package/dist/interface/cli/commands/daemon-shared.js.map +1 -0
  70. package/dist/interface/cli/commands/daemon.d.ts +2 -2
  71. package/dist/interface/cli/commands/daemon.d.ts.map +1 -1
  72. package/dist/interface/cli/commands/daemon.js +4 -120
  73. package/dist/interface/cli/commands/daemon.js.map +1 -1
  74. package/dist/interface/cli/commands/schedule/history.d.ts.map +1 -1
  75. package/dist/interface/cli/commands/schedule/history.js +5 -1
  76. package/dist/interface/cli/commands/schedule/history.js.map +1 -1
  77. package/dist/interface/cli/commands/schedule.js +34 -4
  78. package/dist/interface/cli/commands/schedule.js.map +1 -1
  79. package/dist/interface/tui/app.d.ts.map +1 -1
  80. package/dist/interface/tui/app.js +14 -1
  81. package/dist/interface/tui/app.js.map +1 -1
  82. package/dist/interface/tui/chat/suggestions.d.ts.map +1 -1
  83. package/dist/interface/tui/chat/suggestions.js +118 -4
  84. package/dist/interface/tui/chat/suggestions.js.map +1 -1
  85. package/dist/interface/tui/entry-approval.d.ts +8 -0
  86. package/dist/interface/tui/entry-approval.d.ts.map +1 -0
  87. package/dist/interface/tui/entry-approval.js +59 -0
  88. package/dist/interface/tui/entry-approval.js.map +1 -0
  89. package/dist/interface/tui/entry-daemon.d.ts +12 -0
  90. package/dist/interface/tui/entry-daemon.d.ts.map +1 -0
  91. package/dist/interface/tui/entry-daemon.js +74 -0
  92. package/dist/interface/tui/entry-daemon.js.map +1 -0
  93. package/dist/interface/tui/entry-deps.d.ts +22 -0
  94. package/dist/interface/tui/entry-deps.d.ts.map +1 -0
  95. package/dist/interface/tui/entry-deps.js +409 -0
  96. package/dist/interface/tui/entry-deps.js.map +1 -0
  97. package/dist/interface/tui/entry.d.ts +2 -4
  98. package/dist/interface/tui/entry.d.ts.map +1 -1
  99. package/dist/interface/tui/entry.js +10 -557
  100. package/dist/interface/tui/entry.js.map +1 -1
  101. package/dist/interface/tui/fullscreen-chat-render.d.ts +127 -0
  102. package/dist/interface/tui/fullscreen-chat-render.d.ts.map +1 -0
  103. package/dist/interface/tui/fullscreen-chat-render.js +667 -0
  104. package/dist/interface/tui/fullscreen-chat-render.js.map +1 -0
  105. package/dist/interface/tui/fullscreen-chat.d.ts +2 -111
  106. package/dist/interface/tui/fullscreen-chat.d.ts.map +1 -1
  107. package/dist/interface/tui/fullscreen-chat.js +4 -663
  108. package/dist/interface/tui/fullscreen-chat.js.map +1 -1
  109. package/dist/interface/tui/help-overlay.d.ts.map +1 -1
  110. package/dist/interface/tui/help-overlay.js +1 -1
  111. package/dist/interface/tui/help-overlay.js.map +1 -1
  112. package/dist/interface/tui/intent-recognizer.js +2 -2
  113. package/dist/interface/tui/intent-recognizer.js.map +1 -1
  114. package/dist/orchestrator/execution/agent-loop/agent-loop-default-profile.d.ts.map +1 -1
  115. package/dist/orchestrator/execution/agent-loop/agent-loop-default-profile.js +8 -0
  116. package/dist/orchestrator/execution/agent-loop/agent-loop-default-profile.js.map +1 -1
  117. package/dist/orchestrator/execution/agent-loop/agent-loop-tool-router.d.ts.map +1 -1
  118. package/dist/orchestrator/execution/agent-loop/agent-loop-tool-router.js +2 -1
  119. package/dist/orchestrator/execution/agent-loop/agent-loop-tool-router.js.map +1 -1
  120. package/dist/orchestrator/execution/agent-loop/agent-loop-tool-runtime.d.ts +2 -0
  121. package/dist/orchestrator/execution/agent-loop/agent-loop-tool-runtime.d.ts.map +1 -1
  122. package/dist/orchestrator/execution/agent-loop/agent-loop-tool-runtime.js +31 -0
  123. package/dist/orchestrator/execution/agent-loop/agent-loop-tool-runtime.js.map +1 -1
  124. package/dist/orchestrator/execution/agent-loop/agent-loop-turn-context.d.ts +1 -0
  125. package/dist/orchestrator/execution/agent-loop/agent-loop-turn-context.d.ts.map +1 -1
  126. package/dist/orchestrator/execution/agent-loop/agent-loop-turn-context.js.map +1 -1
  127. package/dist/orchestrator/execution/agent-loop/bounded-agent-loop-runner.d.ts +1 -0
  128. package/dist/orchestrator/execution/agent-loop/bounded-agent-loop-runner.d.ts.map +1 -1
  129. package/dist/orchestrator/execution/agent-loop/bounded-agent-loop-runner.js +36 -2
  130. package/dist/orchestrator/execution/agent-loop/bounded-agent-loop-runner.js.map +1 -1
  131. package/dist/orchestrator/execution/agent-loop/chat-agent-loop-runner.d.ts.map +1 -1
  132. package/dist/orchestrator/execution/agent-loop/chat-agent-loop-runner.js +2 -1
  133. package/dist/orchestrator/execution/agent-loop/chat-agent-loop-runner.js.map +1 -1
  134. package/dist/orchestrator/execution/agent-loop/core-loop-control-tools.d.ts +19 -0
  135. package/dist/orchestrator/execution/agent-loop/core-loop-control-tools.d.ts.map +1 -1
  136. package/dist/orchestrator/execution/agent-loop/core-loop-control-tools.js +164 -14
  137. package/dist/orchestrator/execution/agent-loop/core-loop-control-tools.js.map +1 -1
  138. package/dist/orchestrator/execution/reflection-generator.d.ts +1 -0
  139. package/dist/orchestrator/execution/reflection-generator.d.ts.map +1 -1
  140. package/dist/orchestrator/execution/reflection-generator.js +10 -1
  141. package/dist/orchestrator/execution/reflection-generator.js.map +1 -1
  142. package/dist/orchestrator/execution/task/task-context-enricher.d.ts +2 -0
  143. package/dist/orchestrator/execution/task/task-context-enricher.d.ts.map +1 -1
  144. package/dist/orchestrator/execution/task/task-context-enricher.js +9 -4
  145. package/dist/orchestrator/execution/task/task-context-enricher.js.map +1 -1
  146. package/dist/orchestrator/execution/task/task-execution-helpers-internal.d.ts +5 -0
  147. package/dist/orchestrator/execution/task/task-execution-helpers-internal.d.ts.map +1 -0
  148. package/dist/orchestrator/execution/task/task-execution-helpers-internal.js +6 -0
  149. package/dist/orchestrator/execution/task/task-execution-helpers-internal.js.map +1 -0
  150. package/dist/orchestrator/execution/task/task-generation.d.ts.map +1 -1
  151. package/dist/orchestrator/execution/task/task-generation.js +8 -3
  152. package/dist/orchestrator/execution/task/task-generation.js.map +1 -1
  153. package/dist/orchestrator/execution/task/task-lifecycle-runner.d.ts +73 -0
  154. package/dist/orchestrator/execution/task/task-lifecycle-runner.d.ts.map +1 -0
  155. package/dist/orchestrator/execution/task/task-lifecycle-runner.js +184 -0
  156. package/dist/orchestrator/execution/task/task-lifecycle-runner.js.map +1 -0
  157. package/dist/orchestrator/execution/task/task-lifecycle.d.ts +7 -7
  158. package/dist/orchestrator/execution/task/task-lifecycle.d.ts.map +1 -1
  159. package/dist/orchestrator/execution/task/task-lifecycle.js +37 -181
  160. package/dist/orchestrator/execution/task/task-lifecycle.js.map +1 -1
  161. package/dist/orchestrator/execution/task/task-verifier-internal.d.ts +2 -0
  162. package/dist/orchestrator/execution/task/task-verifier-internal.d.ts.map +1 -0
  163. package/dist/orchestrator/execution/task/task-verifier-internal.js +2 -0
  164. package/dist/orchestrator/execution/task/task-verifier-internal.js.map +1 -0
  165. package/dist/orchestrator/goal/goal-negotiator.d.ts.map +1 -1
  166. package/dist/orchestrator/goal/goal-negotiator.js +23 -3
  167. package/dist/orchestrator/goal/goal-negotiator.js.map +1 -1
  168. package/dist/orchestrator/loop/core-loop/contracts.d.ts +1 -0
  169. package/dist/orchestrator/loop/core-loop/contracts.d.ts.map +1 -1
  170. package/dist/orchestrator/loop/core-loop/contracts.js.map +1 -1
  171. package/dist/orchestrator/loop/core-loop/iteration-kernel-knowledge.d.ts +7 -0
  172. package/dist/orchestrator/loop/core-loop/iteration-kernel-knowledge.d.ts.map +1 -0
  173. package/dist/orchestrator/loop/core-loop/iteration-kernel-knowledge.js +43 -0
  174. package/dist/orchestrator/loop/core-loop/iteration-kernel-knowledge.js.map +1 -0
  175. package/dist/orchestrator/loop/core-loop/iteration-kernel-wait.d.ts +14 -0
  176. package/dist/orchestrator/loop/core-loop/iteration-kernel-wait.d.ts.map +1 -0
  177. package/dist/orchestrator/loop/core-loop/iteration-kernel-wait.js +41 -0
  178. package/dist/orchestrator/loop/core-loop/iteration-kernel-wait.js.map +1 -0
  179. package/dist/orchestrator/loop/core-loop/iteration-kernel.d.ts +3 -2
  180. package/dist/orchestrator/loop/core-loop/iteration-kernel.d.ts.map +1 -1
  181. package/dist/orchestrator/loop/core-loop/iteration-kernel.js +16 -87
  182. package/dist/orchestrator/loop/core-loop/iteration-kernel.js.map +1 -1
  183. package/dist/orchestrator/loop/core-loop/phase-policy.js +5 -5
  184. package/dist/orchestrator/loop/core-loop/task-cycle-stall.d.ts +9 -0
  185. package/dist/orchestrator/loop/core-loop/task-cycle-stall.d.ts.map +1 -0
  186. package/dist/orchestrator/loop/core-loop/task-cycle-stall.js +297 -0
  187. package/dist/orchestrator/loop/core-loop/task-cycle-stall.js.map +1 -0
  188. package/dist/orchestrator/loop/core-loop/task-cycle-wait.d.ts +11 -0
  189. package/dist/orchestrator/loop/core-loop/task-cycle-wait.d.ts.map +1 -0
  190. package/dist/orchestrator/loop/core-loop/task-cycle-wait.js +176 -0
  191. package/dist/orchestrator/loop/core-loop/task-cycle-wait.js.map +1 -0
  192. package/dist/orchestrator/loop/core-loop/task-cycle.d.ts +3 -15
  193. package/dist/orchestrator/loop/core-loop/task-cycle.d.ts.map +1 -1
  194. package/dist/orchestrator/loop/core-loop/task-cycle.js +10 -444
  195. package/dist/orchestrator/loop/core-loop/task-cycle.js.map +1 -1
  196. package/dist/orchestrator/loop/core-loop.d.ts +3 -0
  197. package/dist/orchestrator/loop/core-loop.d.ts.map +1 -1
  198. package/dist/orchestrator/loop/core-loop.js +4 -0
  199. package/dist/orchestrator/loop/core-loop.js.map +1 -1
  200. package/dist/orchestrator/strategy/portfolio-manager.d.ts +3 -2
  201. package/dist/orchestrator/strategy/portfolio-manager.d.ts.map +1 -1
  202. package/dist/orchestrator/strategy/portfolio-manager.js +16 -11
  203. package/dist/orchestrator/strategy/portfolio-manager.js.map +1 -1
  204. package/dist/orchestrator/strategy/portfolio-rebalance.d.ts +1 -1
  205. package/dist/orchestrator/strategy/portfolio-rebalance.d.ts.map +1 -1
  206. package/dist/orchestrator/strategy/portfolio-rebalance.js +31 -9
  207. package/dist/orchestrator/strategy/portfolio-rebalance.js.map +1 -1
  208. package/dist/orchestrator/strategy/strategy-manager-base.d.ts +12 -2
  209. package/dist/orchestrator/strategy/strategy-manager-base.d.ts.map +1 -1
  210. package/dist/orchestrator/strategy/strategy-manager-base.js +23 -7
  211. package/dist/orchestrator/strategy/strategy-manager-base.js.map +1 -1
  212. package/dist/orchestrator/strategy/strategy-manager.d.ts +1 -11
  213. package/dist/orchestrator/strategy/strategy-manager.d.ts.map +1 -1
  214. package/dist/orchestrator/strategy/strategy-manager.js +78 -19
  215. package/dist/orchestrator/strategy/strategy-manager.js.map +1 -1
  216. package/dist/platform/dream/dream-consolidator/fs-metrics.d.ts +18 -0
  217. package/dist/platform/dream/dream-consolidator/fs-metrics.d.ts.map +1 -0
  218. package/dist/platform/dream/dream-consolidator/fs-metrics.js +130 -0
  219. package/dist/platform/dream/dream-consolidator/fs-metrics.js.map +1 -0
  220. package/dist/platform/dream/dream-consolidator.d.ts +4 -14
  221. package/dist/platform/dream/dream-consolidator.d.ts.map +1 -1
  222. package/dist/platform/dream/dream-consolidator.js +46 -166
  223. package/dist/platform/dream/dream-consolidator.js.map +1 -1
  224. package/dist/platform/dream/dream-soil-sync.d.ts +1 -0
  225. package/dist/platform/dream/dream-soil-sync.d.ts.map +1 -1
  226. package/dist/platform/dream/dream-soil-sync.js +8 -1
  227. package/dist/platform/dream/dream-soil-sync.js.map +1 -1
  228. package/dist/platform/dream/dream-types.d.ts +5 -0
  229. package/dist/platform/dream/dream-types.d.ts.map +1 -1
  230. package/dist/platform/dream/dream-types.js +1 -0
  231. package/dist/platform/dream/dream-types.js.map +1 -1
  232. package/dist/platform/dream/playbook-memory.d.ts +4 -4
  233. package/dist/platform/drive/stall-detector/analysis.d.ts +5 -0
  234. package/dist/platform/drive/stall-detector/analysis.d.ts.map +1 -0
  235. package/dist/platform/drive/stall-detector/analysis.js +55 -0
  236. package/dist/platform/drive/stall-detector/analysis.js.map +1 -0
  237. package/dist/platform/drive/stall-detector/repetitive.d.ts +3 -0
  238. package/dist/platform/drive/stall-detector/repetitive.d.ts.map +1 -0
  239. package/dist/platform/drive/stall-detector/repetitive.js +72 -0
  240. package/dist/platform/drive/stall-detector/repetitive.js.map +1 -0
  241. package/dist/platform/drive/stall-detector/thresholds.d.ts +10 -0
  242. package/dist/platform/drive/stall-detector/thresholds.d.ts.map +1 -0
  243. package/dist/platform/drive/stall-detector/thresholds.js +61 -0
  244. package/dist/platform/drive/stall-detector/thresholds.js.map +1 -0
  245. package/dist/platform/drive/stall-detector.d.ts +2 -20
  246. package/dist/platform/drive/stall-detector.d.ts.map +1 -1
  247. package/dist/platform/drive/stall-detector.js +9 -202
  248. package/dist/platform/drive/stall-detector.js.map +1 -1
  249. package/dist/platform/knowledge/knowledge-manager-agent-memory.d.ts +55 -0
  250. package/dist/platform/knowledge/knowledge-manager-agent-memory.d.ts.map +1 -0
  251. package/dist/platform/knowledge/knowledge-manager-agent-memory.js +232 -0
  252. package/dist/platform/knowledge/knowledge-manager-agent-memory.js.map +1 -0
  253. package/dist/platform/knowledge/knowledge-manager-internals.d.ts +10 -0
  254. package/dist/platform/knowledge/knowledge-manager-internals.d.ts.map +1 -0
  255. package/dist/platform/knowledge/knowledge-manager-internals.js +43 -0
  256. package/dist/platform/knowledge/knowledge-manager-internals.js.map +1 -0
  257. package/dist/platform/knowledge/knowledge-manager-store.d.ts +13 -0
  258. package/dist/platform/knowledge/knowledge-manager-store.d.ts.map +1 -0
  259. package/dist/platform/knowledge/knowledge-manager-store.js +67 -0
  260. package/dist/platform/knowledge/knowledge-manager-store.js.map +1 -0
  261. package/dist/platform/knowledge/knowledge-manager.d.ts +6 -2
  262. package/dist/platform/knowledge/knowledge-manager.d.ts.map +1 -1
  263. package/dist/platform/knowledge/knowledge-manager.js +43 -344
  264. package/dist/platform/knowledge/knowledge-manager.js.map +1 -1
  265. package/dist/platform/knowledge/memory/memory-lifecycle-storage.d.ts +4 -0
  266. package/dist/platform/knowledge/memory/memory-lifecycle-storage.d.ts.map +1 -0
  267. package/dist/platform/knowledge/memory/memory-lifecycle-storage.js +106 -0
  268. package/dist/platform/knowledge/memory/memory-lifecycle-storage.js.map +1 -0
  269. package/dist/platform/knowledge/memory/memory-lifecycle.d.ts.map +1 -1
  270. package/dist/platform/knowledge/memory/memory-lifecycle.js +6 -112
  271. package/dist/platform/knowledge/memory/memory-lifecycle.js.map +1 -1
  272. package/dist/platform/observation/capability-detector/prompts.d.ts +18 -0
  273. package/dist/platform/observation/capability-detector/prompts.d.ts.map +1 -0
  274. package/dist/platform/observation/capability-detector/prompts.js +80 -0
  275. package/dist/platform/observation/capability-detector/prompts.js.map +1 -0
  276. package/dist/platform/observation/capability-detector/recommendations.d.ts +5 -0
  277. package/dist/platform/observation/capability-detector/recommendations.d.ts.map +1 -0
  278. package/dist/platform/observation/capability-detector/recommendations.js +76 -0
  279. package/dist/platform/observation/capability-detector/recommendations.js.map +1 -0
  280. package/dist/platform/observation/capability-detector/types.d.ts +112 -0
  281. package/dist/platform/observation/capability-detector/types.d.ts.map +1 -0
  282. package/dist/platform/observation/capability-detector/types.js +75 -0
  283. package/dist/platform/observation/capability-detector/types.js.map +1 -0
  284. package/dist/platform/observation/capability-detector.d.ts +4 -9
  285. package/dist/platform/observation/capability-detector.d.ts.map +1 -1
  286. package/dist/platform/observation/capability-detector.js +12 -212
  287. package/dist/platform/observation/capability-detector.js.map +1 -1
  288. package/dist/platform/observation/context-provider/collector.d.ts +13 -0
  289. package/dist/platform/observation/context-provider/collector.d.ts.map +1 -0
  290. package/dist/platform/observation/context-provider/collector.js +259 -0
  291. package/dist/platform/observation/context-provider/collector.js.map +1 -0
  292. package/dist/platform/observation/context-provider/search-terms.d.ts +2 -0
  293. package/dist/platform/observation/context-provider/search-terms.d.ts.map +1 -0
  294. package/dist/platform/observation/context-provider/search-terms.js +24 -0
  295. package/dist/platform/observation/context-provider/search-terms.js.map +1 -0
  296. package/dist/platform/observation/context-provider/shared.d.ts +17 -0
  297. package/dist/platform/observation/context-provider/shared.d.ts.map +1 -0
  298. package/dist/platform/observation/context-provider/shared.js +87 -0
  299. package/dist/platform/observation/context-provider/shared.js.map +1 -0
  300. package/dist/platform/observation/context-provider.d.ts +3 -28
  301. package/dist/platform/observation/context-provider.d.ts.map +1 -1
  302. package/dist/platform/observation/context-provider.js +7 -395
  303. package/dist/platform/observation/context-provider.js.map +1 -1
  304. package/dist/platform/soil/compiled-memory-projections.d.ts +2 -0
  305. package/dist/platform/soil/compiled-memory-projections.d.ts.map +1 -1
  306. package/dist/platform/soil/compiled-memory-projections.js +59 -0
  307. package/dist/platform/soil/compiled-memory-projections.js.map +1 -1
  308. package/dist/platform/soil/contracts.d.ts +2 -2
  309. package/dist/platform/soil/retriever.d.ts +25 -0
  310. package/dist/platform/soil/retriever.d.ts.map +1 -1
  311. package/dist/platform/soil/retriever.js +94 -5
  312. package/dist/platform/soil/retriever.js.map +1 -1
  313. package/dist/platform/soil/sqlite-repository-helpers.d.ts +80 -0
  314. package/dist/platform/soil/sqlite-repository-helpers.d.ts.map +1 -0
  315. package/dist/platform/soil/sqlite-repository-helpers.js +143 -0
  316. package/dist/platform/soil/sqlite-repository-helpers.js.map +1 -0
  317. package/dist/platform/soil/sqlite-repository-search.d.ts +8 -0
  318. package/dist/platform/soil/sqlite-repository-search.d.ts.map +1 -0
  319. package/dist/platform/soil/sqlite-repository-search.js +367 -0
  320. package/dist/platform/soil/sqlite-repository-search.js.map +1 -0
  321. package/dist/platform/soil/sqlite-repository-storage.d.ts +8 -0
  322. package/dist/platform/soil/sqlite-repository-storage.d.ts.map +1 -0
  323. package/dist/platform/soil/sqlite-repository-storage.js +278 -0
  324. package/dist/platform/soil/sqlite-repository-storage.js.map +1 -0
  325. package/dist/platform/soil/sqlite-repository.d.ts +1 -4
  326. package/dist/platform/soil/sqlite-repository.d.ts.map +1 -1
  327. package/dist/platform/soil/sqlite-repository.js +26 -820
  328. package/dist/platform/soil/sqlite-repository.js.map +1 -1
  329. package/dist/runtime/daemon/index.d.ts +1 -1
  330. package/dist/runtime/daemon/index.d.ts.map +1 -1
  331. package/dist/runtime/daemon/index.js +1 -1
  332. package/dist/runtime/daemon/index.js.map +1 -1
  333. package/dist/runtime/daemon/maintenance.d.ts +2 -10
  334. package/dist/runtime/daemon/maintenance.d.ts.map +1 -1
  335. package/dist/runtime/daemon/maintenance.js +14 -45
  336. package/dist/runtime/daemon/maintenance.js.map +1 -1
  337. package/dist/runtime/daemon/runner-bootstrap.d.ts +25 -0
  338. package/dist/runtime/daemon/runner-bootstrap.d.ts.map +1 -0
  339. package/dist/runtime/daemon/runner-bootstrap.js +77 -0
  340. package/dist/runtime/daemon/runner-bootstrap.js.map +1 -0
  341. package/dist/runtime/daemon/runner-commands.d.ts +7 -7
  342. package/dist/runtime/daemon/runner-commands.d.ts.map +1 -1
  343. package/dist/runtime/daemon/runner-commands.js +35 -20
  344. package/dist/runtime/daemon/runner-commands.js.map +1 -1
  345. package/dist/runtime/daemon/runner-goal-cycle.d.ts.map +1 -1
  346. package/dist/runtime/daemon/runner-goal-cycle.js +3 -5
  347. package/dist/runtime/daemon/runner-goal-cycle.js.map +1 -1
  348. package/dist/runtime/daemon/runner-resident-curiosity.d.ts +12 -0
  349. package/dist/runtime/daemon/runner-resident-curiosity.d.ts.map +1 -0
  350. package/dist/runtime/daemon/runner-resident-curiosity.js +155 -0
  351. package/dist/runtime/daemon/runner-resident-curiosity.js.map +1 -0
  352. package/dist/runtime/daemon/runner-resident-dream.d.ts +20 -0
  353. package/dist/runtime/daemon/runner-resident-dream.d.ts.map +1 -0
  354. package/dist/runtime/daemon/runner-resident-dream.js +148 -0
  355. package/dist/runtime/daemon/runner-resident-dream.js.map +1 -0
  356. package/dist/runtime/daemon/runner-resident-proactive.d.ts +4 -0
  357. package/dist/runtime/daemon/runner-resident-proactive.d.ts.map +1 -0
  358. package/dist/runtime/daemon/runner-resident-proactive.js +113 -0
  359. package/dist/runtime/daemon/runner-resident-proactive.js.map +1 -0
  360. package/dist/runtime/daemon/runner-resident-shared.d.ts +40 -0
  361. package/dist/runtime/daemon/runner-resident-shared.d.ts.map +1 -0
  362. package/dist/runtime/daemon/runner-resident-shared.js +101 -0
  363. package/dist/runtime/daemon/runner-resident-shared.js.map +1 -0
  364. package/dist/runtime/daemon/runner-resident.d.ts +4 -68
  365. package/dist/runtime/daemon/runner-resident.d.ts.map +1 -1
  366. package/dist/runtime/daemon/runner-resident.js +4 -506
  367. package/dist/runtime/daemon/runner-resident.js.map +1 -1
  368. package/dist/runtime/daemon/runner-runtime.d.ts +12 -0
  369. package/dist/runtime/daemon/runner-runtime.d.ts.map +1 -0
  370. package/dist/runtime/daemon/runner-runtime.js +43 -0
  371. package/dist/runtime/daemon/runner-runtime.js.map +1 -0
  372. package/dist/runtime/daemon/runner-startup.js +3 -4
  373. package/dist/runtime/daemon/runner-startup.js.map +1 -1
  374. package/dist/runtime/daemon/runner.d.ts +10 -23
  375. package/dist/runtime/daemon/runner.d.ts.map +1 -1
  376. package/dist/runtime/daemon/runner.js +27 -110
  377. package/dist/runtime/daemon/runner.js.map +1 -1
  378. package/dist/runtime/daemon/wait-deadline-resolver.d.ts +5 -2
  379. package/dist/runtime/daemon/wait-deadline-resolver.d.ts.map +1 -1
  380. package/dist/runtime/daemon/wait-deadline-resolver.js +55 -35
  381. package/dist/runtime/daemon/wait-deadline-resolver.js.map +1 -1
  382. package/dist/runtime/event/dispatcher.d.ts +0 -2
  383. package/dist/runtime/event/dispatcher.d.ts.map +1 -1
  384. package/dist/runtime/event/dispatcher.js +0 -4
  385. package/dist/runtime/event/dispatcher.js.map +1 -1
  386. package/dist/runtime/executor/goal-worker.d.ts +2 -1
  387. package/dist/runtime/executor/goal-worker.d.ts.map +1 -1
  388. package/dist/runtime/executor/goal-worker.js +2 -1
  389. package/dist/runtime/executor/goal-worker.js.map +1 -1
  390. package/dist/runtime/executor/loop-supervisor.d.ts +3 -0
  391. package/dist/runtime/executor/loop-supervisor.d.ts.map +1 -1
  392. package/dist/runtime/executor/loop-supervisor.js +37 -11
  393. package/dist/runtime/executor/loop-supervisor.js.map +1 -1
  394. package/dist/runtime/schedule/engine-cron-reflection.d.ts +31 -0
  395. package/dist/runtime/schedule/engine-cron-reflection.d.ts.map +1 -0
  396. package/dist/runtime/schedule/engine-cron-reflection.js +229 -0
  397. package/dist/runtime/schedule/engine-cron-reflection.js.map +1 -0
  398. package/dist/runtime/schedule/engine-execution.d.ts +47 -0
  399. package/dist/runtime/schedule/engine-execution.d.ts.map +1 -0
  400. package/dist/runtime/schedule/engine-execution.js +424 -0
  401. package/dist/runtime/schedule/engine-execution.js.map +1 -0
  402. package/dist/runtime/schedule/engine-heartbeat.d.ts +5 -0
  403. package/dist/runtime/schedule/engine-heartbeat.d.ts.map +1 -0
  404. package/dist/runtime/schedule/engine-heartbeat.js +104 -0
  405. package/dist/runtime/schedule/engine-heartbeat.js.map +1 -0
  406. package/dist/runtime/schedule/engine-layers.d.ts +2 -0
  407. package/dist/runtime/schedule/engine-layers.d.ts.map +1 -1
  408. package/dist/runtime/schedule/engine-layers.js +12 -228
  409. package/dist/runtime/schedule/engine-layers.js.map +1 -1
  410. package/dist/runtime/schedule/engine-mutations.d.ts +37 -0
  411. package/dist/runtime/schedule/engine-mutations.d.ts.map +1 -0
  412. package/dist/runtime/schedule/engine-mutations.js +263 -0
  413. package/dist/runtime/schedule/engine-mutations.js.map +1 -0
  414. package/dist/runtime/schedule/engine.d.ts +11 -38
  415. package/dist/runtime/schedule/engine.d.ts.map +1 -1
  416. package/dist/runtime/schedule/engine.js +65 -810
  417. package/dist/runtime/schedule/engine.js.map +1 -1
  418. package/dist/runtime/schedule/history.d.ts +16 -0
  419. package/dist/runtime/schedule/history.d.ts.map +1 -1
  420. package/dist/runtime/schedule/history.js +8 -0
  421. package/dist/runtime/schedule/history.js.map +1 -1
  422. package/dist/runtime/schedule/index.d.ts +1 -0
  423. package/dist/runtime/schedule/index.d.ts.map +1 -1
  424. package/dist/runtime/schedule/index.js +1 -0
  425. package/dist/runtime/schedule/index.js.map +1 -1
  426. package/dist/runtime/schedule/legacy-cron-migration.d.ts +9 -0
  427. package/dist/runtime/schedule/legacy-cron-migration.d.ts.map +1 -0
  428. package/dist/runtime/schedule/legacy-cron-migration.js +89 -0
  429. package/dist/runtime/schedule/legacy-cron-migration.js.map +1 -0
  430. package/dist/runtime/schedule/wait-projection.d.ts +6 -0
  431. package/dist/runtime/schedule/wait-projection.d.ts.map +1 -0
  432. package/dist/runtime/schedule/wait-projection.js +102 -0
  433. package/dist/runtime/schedule/wait-projection.js.map +1 -0
  434. package/dist/runtime/session-registry/registry-helpers.d.ts +34 -0
  435. package/dist/runtime/session-registry/registry-helpers.d.ts.map +1 -0
  436. package/dist/runtime/session-registry/registry-helpers.js +241 -0
  437. package/dist/runtime/session-registry/registry-helpers.js.map +1 -0
  438. package/dist/runtime/session-registry/registry.d.ts.map +1 -1
  439. package/dist/runtime/session-registry/registry.js +14 -243
  440. package/dist/runtime/session-registry/registry.js.map +1 -1
  441. package/dist/runtime/session-registry/types.d.ts +36 -36
  442. package/dist/runtime/store/runtime-operation-schemas.d.ts +36 -36
  443. package/dist/runtime/store/runtime-schemas.d.ts +2 -2
  444. package/dist/runtime/types/daemon.d.ts +10 -0
  445. package/dist/runtime/types/daemon.d.ts.map +1 -1
  446. package/dist/runtime/types/daemon.js +2 -0
  447. package/dist/runtime/types/daemon.js.map +1 -1
  448. package/dist/runtime/types/schedule.d.ts +65 -0
  449. package/dist/runtime/types/schedule.d.ts.map +1 -1
  450. package/dist/runtime/types/schedule.js +5 -0
  451. package/dist/runtime/types/schedule.js.map +1 -1
  452. package/dist/tools/builtin/exports.d.ts +1 -0
  453. package/dist/tools/builtin/exports.d.ts.map +1 -1
  454. package/dist/tools/builtin/exports.js +1 -0
  455. package/dist/tools/builtin/exports.js.map +1 -1
  456. package/dist/tools/builtin/factory.d.ts +2 -0
  457. package/dist/tools/builtin/factory.d.ts.map +1 -1
  458. package/dist/tools/builtin/factory.js +8 -1
  459. package/dist/tools/builtin/factory.js.map +1 -1
  460. package/dist/tools/fs/FileValidationTool/protected-path-policy.d.ts +1 -0
  461. package/dist/tools/fs/FileValidationTool/protected-path-policy.d.ts.map +1 -1
  462. package/dist/tools/fs/FileValidationTool/protected-path-policy.js +17 -4
  463. package/dist/tools/fs/FileValidationTool/protected-path-policy.js.map +1 -1
  464. package/dist/tools/fs/ListDirTool/ListDirTool.js +1 -1
  465. package/dist/tools/fs/ListDirTool/ListDirTool.js.map +1 -1
  466. package/dist/tools/kaggle/paths.d.ts.map +1 -1
  467. package/dist/tools/kaggle/paths.js +6 -0
  468. package/dist/tools/kaggle/paths.js.map +1 -1
  469. package/dist/tools/query/CodeSearchRepairTool/CodeSearchRepairTool.d.ts.map +1 -1
  470. package/dist/tools/query/CodeSearchRepairTool/CodeSearchRepairTool.js +23 -2
  471. package/dist/tools/query/CodeSearchRepairTool/CodeSearchRepairTool.js.map +1 -1
  472. package/dist/tools/query/CodeSearchTool/CodeSearchTool.d.ts.map +1 -1
  473. package/dist/tools/query/CodeSearchTool/CodeSearchTool.js +24 -2
  474. package/dist/tools/query/CodeSearchTool/CodeSearchTool.js.map +1 -1
  475. package/dist/tools/query/SoilQueryTool/SoilQueryTool.d.ts.map +1 -1
  476. package/dist/tools/query/SoilQueryTool/SoilQueryTool.js +43 -9
  477. package/dist/tools/query/SoilQueryTool/SoilQueryTool.js.map +1 -1
  478. package/dist/tools/query/code-search-root.d.ts +8 -0
  479. package/dist/tools/query/code-search-root.d.ts.map +1 -0
  480. package/dist/tools/query/code-search-root.js +41 -0
  481. package/dist/tools/query/code-search-root.js.map +1 -0
  482. package/dist/tools/query/runtime-session-tools.d.ts +560 -0
  483. package/dist/tools/query/runtime-session-tools.d.ts.map +1 -0
  484. package/dist/tools/query/runtime-session-tools.js +1015 -0
  485. package/dist/tools/query/runtime-session-tools.js.map +1 -0
  486. package/dist/tools/runtime/LongRunningRuntimeTools.d.ts +821 -0
  487. package/dist/tools/runtime/LongRunningRuntimeTools.d.ts.map +1 -0
  488. package/dist/tools/runtime/LongRunningRuntimeTools.js +845 -0
  489. package/dist/tools/runtime/LongRunningRuntimeTools.js.map +1 -0
  490. package/dist/tools/system/ProcessSessionTool/ProcessSessionTool.d.ts +1 -0
  491. package/dist/tools/system/ProcessSessionTool/ProcessSessionTool.d.ts.map +1 -1
  492. package/dist/tools/system/ProcessSessionTool/ProcessSessionTool.js +11 -0
  493. package/dist/tools/system/ProcessSessionTool/ProcessSessionTool.js.map +1 -1
  494. package/dist/tools/system/ShellTool/ShellTool.d.ts.map +1 -1
  495. package/dist/tools/system/ShellTool/ShellTool.js +2 -1
  496. package/dist/tools/system/ShellTool/ShellTool.js.map +1 -1
  497. package/dist/tools/types.d.ts +2 -0
  498. package/dist/tools/types.d.ts.map +1 -1
  499. package/dist/tools/types.js.map +1 -1
  500. package/package.json +1 -1
  501. package/dist/base/types/cron.d.ts +0 -2
  502. package/dist/base/types/cron.d.ts.map +0 -1
  503. package/dist/base/types/cron.js +0 -3
  504. package/dist/base/types/cron.js.map +0 -1
  505. package/dist/runtime/cron-scheduler.d.ts +0 -13
  506. package/dist/runtime/cron-scheduler.d.ts.map +0 -1
  507. package/dist/runtime/cron-scheduler.js +0 -90
  508. package/dist/runtime/cron-scheduler.js.map +0 -1
  509. package/dist/runtime/types/cron.d.ts +0 -59
  510. package/dist/runtime/types/cron.d.ts.map +0 -1
  511. package/dist/runtime/types/cron.js +0 -13
  512. package/dist/runtime/types/cron.js.map +0 -1
@@ -2,336 +2,11 @@ import * as fsp from "node:fs/promises";
2
2
  import * as path from "node:path";
3
3
  import { randomUUID } from "node:crypto";
4
4
  import Database from "better-sqlite3";
5
- import { cosineSimilarity } from "../knowledge/embedding-client.js";
6
5
  import { getDefaultSoilSqliteIndexPath, resolveSoilRootDir } from "./config.js";
7
- import { SoilEmbeddingSchema, SoilMutationSchema, SoilPageMemberSchema, SoilPageSchema, SoilRecordFilterSchema, SoilRecordSchema, SoilSearchRequestSchema, } from "./contracts.js";
8
- import { SOIL_SCHEMA_SQL } from "./ddl.js";
9
- function buildSnippet(text, query) {
10
- const haystack = text.trim();
11
- if (!haystack)
12
- return "";
13
- const tokens = query.toLowerCase().split(/\s+/).filter(Boolean);
14
- const lower = haystack.toLowerCase();
15
- for (const token of tokens) {
16
- const index = lower.indexOf(token);
17
- if (index >= 0) {
18
- const start = Math.max(0, index - 50);
19
- const end = Math.min(haystack.length, index + token.length + 100);
20
- return haystack.slice(start, end);
21
- }
22
- }
23
- return haystack.slice(0, 160);
24
- }
25
- function serializeJson(value) {
26
- return JSON.stringify(value ?? {});
27
- }
28
- function parseJsonObject(input) {
29
- try {
30
- const parsed = JSON.parse(input);
31
- return typeof parsed === "object" && parsed !== null && !Array.isArray(parsed)
32
- ? parsed
33
- : {};
34
- }
35
- catch {
36
- return {};
37
- }
38
- }
39
- function parseJsonArray(input) {
40
- try {
41
- const parsed = JSON.parse(input);
42
- return Array.isArray(parsed) ? parsed.filter((item) => typeof item === "string") : [];
43
- }
44
- catch {
45
- return [];
46
- }
47
- }
48
- function parseReindexRecordIds(input) {
49
- try {
50
- const payload = JSON.parse(input);
51
- if (typeof payload !== "object" || payload === null || Array.isArray(payload)) {
52
- return [];
53
- }
54
- const value = payload.record_ids;
55
- return Array.isArray(value)
56
- ? value.filter((recordId) => typeof recordId === "string" && recordId.length > 0)
57
- : [];
58
- }
59
- catch {
60
- return [];
61
- }
62
- }
63
- function encodeEmbedding(entry) {
64
- if (entry.encoding === "f32le") {
65
- const floats = entry.embedding instanceof Uint8Array
66
- ? new Float32Array(entry.embedding.buffer.slice(entry.embedding.byteOffset, entry.embedding.byteOffset + entry.embedding.byteLength))
67
- : Float32Array.from(entry.embedding);
68
- return Buffer.from(floats.buffer.slice(floats.byteOffset, floats.byteOffset + floats.byteLength));
69
- }
70
- const payload = entry.embedding instanceof Uint8Array
71
- ? Array.from(entry.embedding.values())
72
- : entry.embedding;
73
- return Buffer.from(JSON.stringify(payload), "utf8");
74
- }
75
- function decodeEmbedding(row) {
76
- if (row.encoding === "f32le") {
77
- const copy = row.embedding.buffer.slice(row.embedding.byteOffset, row.embedding.byteOffset + row.embedding.byteLength);
78
- return Array.from(new Float32Array(copy));
79
- }
80
- return JSON.parse(row.embedding.toString("utf8"));
81
- }
82
- function toRecord(row) {
83
- return SoilRecordSchema.parse({
84
- ...row,
85
- is_active: Boolean(row.is_active),
86
- metadata_json: parseJsonObject(row.metadata_json),
87
- });
88
- }
89
- function toPage(row) {
90
- return SoilPageSchema.parse(row);
91
- }
92
- function toPageMember(row) {
93
- return SoilPageMemberSchema.parse(row);
94
- }
95
- function unique(values) {
96
- return [...new Set(values.filter((value) => value.length > 0))];
97
- }
98
- function dedupeCandidates(candidates, limit) {
99
- const byChunkId = new Map();
100
- for (const candidate of candidates) {
101
- const current = byChunkId.get(candidate.chunk_id);
102
- if (!current ||
103
- candidate.score > current.score ||
104
- (candidate.score === current.score && current.page_id === null && candidate.page_id !== null)) {
105
- byChunkId.set(candidate.chunk_id, candidate);
106
- }
107
- }
108
- return [...byChunkId.values()]
109
- .sort((left, right) => right.score - left.score || left.chunk_id.localeCompare(right.chunk_id))
110
- .slice(0, limit)
111
- .map((candidate, index) => ({ ...candidate, rank: index + 1 }));
112
- }
113
- function fuseCandidates(lexical, dense, limit, rrfK = 60) {
114
- const byChunkId = new Map();
115
- for (const [lane, weight, candidates] of [
116
- ["lexical", 1, lexical],
117
- ["dense", 0.85, dense],
118
- ]) {
119
- for (const candidate of candidates) {
120
- const prior = byChunkId.get(candidate.chunk_id);
121
- const laneScore = weight / (rrfK + candidate.rank);
122
- const metadata_json = {
123
- ...(prior?.metadata_json ?? candidate.metadata_json),
124
- [`${lane}_rank`]: candidate.rank,
125
- [`${lane}_score`]: candidate.score,
126
- };
127
- if (!prior) {
128
- byChunkId.set(candidate.chunk_id, {
129
- ...candidate,
130
- lane: "hybrid",
131
- score: laneScore,
132
- metadata_json,
133
- });
134
- continue;
135
- }
136
- byChunkId.set(candidate.chunk_id, {
137
- ...prior,
138
- page_id: prior.page_id ?? candidate.page_id,
139
- snippet: prior.snippet ?? candidate.snippet,
140
- score: prior.score + laneScore,
141
- metadata_json,
142
- });
143
- }
144
- }
145
- return [...byChunkId.values()]
146
- .sort((left, right) => right.score - left.score || left.chunk_id.localeCompare(right.chunk_id))
147
- .slice(0, limit)
148
- .map((candidate, index) => ({ ...candidate, rank: index + 1 }));
149
- }
150
- function hasExplicitMetadataFilter(request) {
151
- const recordFilter = request.record_filter;
152
- const pageFilter = request.page_filter;
153
- return Boolean(recordFilter.record_ids?.length ||
154
- recordFilter.record_keys?.length ||
155
- recordFilter.record_types?.length ||
156
- recordFilter.statuses?.length ||
157
- recordFilter.goal_ids?.length ||
158
- recordFilter.task_ids?.length ||
159
- recordFilter.source_types?.length ||
160
- recordFilter.source_ids?.length ||
161
- recordFilter.valid_at ||
162
- recordFilter.updated_after ||
163
- recordFilter.updated_before ||
164
- pageFilter.page_ids?.length ||
165
- pageFilter.soil_ids?.length ||
166
- pageFilter.routes?.length ||
167
- pageFilter.kinds?.length ||
168
- pageFilter.page_statuses?.length ||
169
- pageFilter.relative_paths?.length);
170
- }
171
- function buildRecordFilterSql(request, params) {
172
- const clauses = [];
173
- const filter = request.record_filter;
174
- if (filter.active_only) {
175
- clauses.push("r.is_active = 1");
176
- }
177
- if (filter.record_ids?.length) {
178
- clauses.push(`r.record_id IN (${filter.record_ids.map(() => "?").join(", ")})`);
179
- params.push(...filter.record_ids);
180
- }
181
- if (filter.record_keys?.length) {
182
- clauses.push(`r.record_key IN (${filter.record_keys.map(() => "?").join(", ")})`);
183
- params.push(...filter.record_keys);
184
- }
185
- if (filter.record_types?.length) {
186
- clauses.push(`r.record_type IN (${filter.record_types.map(() => "?").join(", ")})`);
187
- params.push(...filter.record_types);
188
- }
189
- if (filter.statuses?.length) {
190
- clauses.push(`r.status IN (${filter.statuses.map(() => "?").join(", ")})`);
191
- params.push(...filter.statuses);
192
- }
193
- if (filter.goal_ids?.length) {
194
- clauses.push(`r.goal_id IN (${filter.goal_ids.map(() => "?").join(", ")})`);
195
- params.push(...filter.goal_ids);
196
- }
197
- if (filter.task_ids?.length) {
198
- clauses.push(`r.task_id IN (${filter.task_ids.map(() => "?").join(", ")})`);
199
- params.push(...filter.task_ids);
200
- }
201
- if (filter.source_types?.length) {
202
- clauses.push(`r.source_type IN (${filter.source_types.map(() => "?").join(", ")})`);
203
- params.push(...filter.source_types);
204
- }
205
- if (filter.source_ids?.length) {
206
- clauses.push(`r.source_id IN (${filter.source_ids.map(() => "?").join(", ")})`);
207
- params.push(...filter.source_ids);
208
- }
209
- if (filter.valid_at) {
210
- clauses.push("(r.valid_from IS NULL OR r.valid_from <= ?)");
211
- clauses.push("(r.valid_to IS NULL OR r.valid_to > ?)");
212
- params.push(filter.valid_at, filter.valid_at);
213
- }
214
- if (filter.updated_after) {
215
- clauses.push("r.updated_at >= ?");
216
- params.push(filter.updated_after);
217
- }
218
- if (filter.updated_before) {
219
- clauses.push("r.updated_at <= ?");
220
- params.push(filter.updated_before);
221
- }
222
- return clauses;
223
- }
224
- function buildPageFilterSql(request, params) {
225
- const clauses = [];
226
- const filter = request.page_filter;
227
- if (filter.page_ids?.length) {
228
- clauses.push(`p.page_id IN (${filter.page_ids.map(() => "?").join(", ")})`);
229
- params.push(...filter.page_ids);
230
- }
231
- if (filter.soil_ids?.length) {
232
- clauses.push(`p.soil_id IN (${filter.soil_ids.map(() => "?").join(", ")})`);
233
- params.push(...filter.soil_ids);
234
- }
235
- if (filter.routes?.length) {
236
- clauses.push(`p.route IN (${filter.routes.map(() => "?").join(", ")})`);
237
- params.push(...filter.routes);
238
- }
239
- if (filter.kinds?.length) {
240
- clauses.push(`p.kind IN (${filter.kinds.map(() => "?").join(", ")})`);
241
- params.push(...filter.kinds);
242
- }
243
- if (filter.page_statuses?.length) {
244
- clauses.push(`p.status IN (${filter.page_statuses.map(() => "?").join(", ")})`);
245
- params.push(...filter.page_statuses);
246
- }
247
- if (filter.relative_paths?.length) {
248
- clauses.push(`p.relative_path IN (${filter.relative_paths.map(() => "?").join(", ")})`);
249
- params.push(...filter.relative_paths);
250
- }
251
- return clauses;
252
- }
253
- function buildPageExistsSql(recordIdExpr, request, params) {
254
- const filter = request.page_filter;
255
- const pagePredicates = [];
256
- if (filter.page_ids?.length) {
257
- pagePredicates.push(`p.page_id IN (${filter.page_ids.map(() => "?").join(", ")})`);
258
- params.push(...filter.page_ids);
259
- }
260
- if (filter.soil_ids?.length) {
261
- pagePredicates.push(`p.soil_id IN (${filter.soil_ids.map(() => "?").join(", ")})`);
262
- params.push(...filter.soil_ids);
263
- }
264
- if (filter.routes?.length) {
265
- pagePredicates.push(`p.route IN (${filter.routes.map(() => "?").join(", ")})`);
266
- params.push(...filter.routes);
267
- }
268
- if (filter.kinds?.length) {
269
- pagePredicates.push(`p.kind IN (${filter.kinds.map(() => "?").join(", ")})`);
270
- params.push(...filter.kinds);
271
- }
272
- if (filter.page_statuses?.length) {
273
- pagePredicates.push(`p.status IN (${filter.page_statuses.map(() => "?").join(", ")})`);
274
- params.push(...filter.page_statuses);
275
- }
276
- if (filter.relative_paths?.length) {
277
- pagePredicates.push(`p.relative_path IN (${filter.relative_paths.map(() => "?").join(", ")})`);
278
- params.push(...filter.relative_paths);
279
- }
280
- if (pagePredicates.length === 0) {
281
- return [];
282
- }
283
- return [
284
- `EXISTS (
285
- SELECT 1
286
- FROM soil_page_members spm
287
- JOIN soil_pages p ON p.page_id = spm.page_id
288
- WHERE spm.record_id = ${recordIdExpr}
289
- AND ${pagePredicates.join(" AND ")}
290
- )`,
291
- ];
292
- }
293
- function buildCandidatePageIdSql(recordIdExpr, request, params) {
294
- const filter = request.page_filter;
295
- const pagePredicates = [];
296
- if (filter.page_ids?.length) {
297
- pagePredicates.push(`p.page_id IN (${filter.page_ids.map(() => "?").join(", ")})`);
298
- params.push(...filter.page_ids);
299
- }
300
- if (filter.soil_ids?.length) {
301
- pagePredicates.push(`p.soil_id IN (${filter.soil_ids.map(() => "?").join(", ")})`);
302
- params.push(...filter.soil_ids);
303
- }
304
- if (filter.routes?.length) {
305
- pagePredicates.push(`p.route IN (${filter.routes.map(() => "?").join(", ")})`);
306
- params.push(...filter.routes);
307
- }
308
- if (filter.kinds?.length) {
309
- pagePredicates.push(`p.kind IN (${filter.kinds.map(() => "?").join(", ")})`);
310
- params.push(...filter.kinds);
311
- }
312
- if (filter.page_statuses?.length) {
313
- pagePredicates.push(`p.status IN (${filter.page_statuses.map(() => "?").join(", ")})`);
314
- params.push(...filter.page_statuses);
315
- }
316
- if (filter.relative_paths?.length) {
317
- pagePredicates.push(`p.relative_path IN (${filter.relative_paths.map(() => "?").join(", ")})`);
318
- params.push(...filter.relative_paths);
319
- }
320
- const baseQuery = pagePredicates.length > 0
321
- ? `SELECT spm.page_id
322
- FROM soil_page_members spm
323
- JOIN soil_pages p ON p.page_id = spm.page_id
324
- WHERE spm.record_id = ${recordIdExpr}
325
- AND ${pagePredicates.join(" AND ")}
326
- ORDER BY CASE WHEN spm.role = 'primary' THEN 0 ELSE 1 END, spm.ordinal, p.relative_path, spm.page_id
327
- LIMIT 1`
328
- : `SELECT spm.page_id
329
- FROM soil_page_members spm
330
- WHERE spm.record_id = ${recordIdExpr}
331
- ORDER BY CASE WHEN spm.role = 'primary' THEN 0 ELSE 1 END, spm.ordinal, spm.page_id
332
- LIMIT 1`;
333
- return `(${baseQuery})`;
334
- }
6
+ import { SoilRecordFilterSchema, SoilSearchRequestSchema, } from "./contracts.js";
7
+ import { fuseCandidates, toPage, toPageMember, toRecord, unique } from "./sqlite-repository-helpers.js";
8
+ import { buildRecordFilterSql, lookupDirectCandidates, searchDenseCandidates, searchLexicalCandidates, shouldRunDenseSearch, } from "./sqlite-repository-search.js";
9
+ import { applySoilMutation, initializeReadonlySoilSqlite, initializeSoilSqlite, loadOpenEmbeddingReindexRecordIds, replaceSoilPageMembers, } from "./sqlite-repository-storage.js";
335
10
  export class SqliteSoilRepository {
336
11
  db;
337
12
  dbPath;
@@ -344,195 +19,27 @@ export class SqliteSoilRepository {
344
19
  const indexPath = configInput.indexPath ? path.resolve(configInput.indexPath) : getDefaultSoilSqliteIndexPath(rootDir);
345
20
  await fsp.mkdir(path.dirname(indexPath), { recursive: true });
346
21
  const db = new Database(indexPath);
347
- db.pragma("journal_mode = WAL");
348
- db.pragma("foreign_keys = ON");
349
- db.exec(SOIL_SCHEMA_SQL);
22
+ initializeSoilSqlite(db);
23
+ return new SqliteSoilRepository(db, indexPath);
24
+ }
25
+ static async openExisting(configInput = {}) {
26
+ const rootDir = resolveSoilRootDir(configInput.rootDir);
27
+ const indexPath = configInput.indexPath ? path.resolve(configInput.indexPath) : getDefaultSoilSqliteIndexPath(rootDir);
28
+ try {
29
+ await fsp.access(indexPath);
30
+ }
31
+ catch {
32
+ return null;
33
+ }
34
+ const db = new Database(indexPath, { readonly: true, fileMustExist: true });
35
+ initializeReadonlySoilSqlite(db);
350
36
  return new SqliteSoilRepository(db, indexPath);
351
37
  }
352
38
  close() {
353
39
  this.db.close();
354
40
  }
355
41
  async applyMutation(input) {
356
- const mutation = SoilMutationSchema.parse(input);
357
- const contentMutatedRecordIds = new Set();
358
- const embeddedChunkIds = new Set();
359
- const embeddedRecordIds = new Set();
360
- const tx = this.db.transaction(() => {
361
- for (const record of mutation.records) {
362
- if (record.is_active) {
363
- this.db
364
- .prepare("UPDATE soil_records SET is_active = 0 WHERE record_key = ? AND record_id != ? AND is_active = 1")
365
- .run(record.record_key, record.record_id);
366
- }
367
- this.db.prepare(`
368
- INSERT INTO soil_records (
369
- record_id, record_key, version, record_type, soil_id, title, summary, canonical_text,
370
- goal_id, task_id, status, confidence, importance, source_reliability,
371
- valid_from, valid_to, supersedes_record_id, is_active, source_type, source_id,
372
- metadata_json, created_at, updated_at
373
- ) VALUES (
374
- @record_id, @record_key, @version, @record_type, @soil_id, @title, @summary, @canonical_text,
375
- @goal_id, @task_id, @status, @confidence, @importance, @source_reliability,
376
- @valid_from, @valid_to, @supersedes_record_id, @is_active, @source_type, @source_id,
377
- @metadata_json, @created_at, @updated_at
378
- )
379
- ON CONFLICT(record_id) DO UPDATE SET
380
- record_key = excluded.record_key,
381
- version = excluded.version,
382
- record_type = excluded.record_type,
383
- soil_id = excluded.soil_id,
384
- title = excluded.title,
385
- summary = excluded.summary,
386
- canonical_text = excluded.canonical_text,
387
- goal_id = excluded.goal_id,
388
- task_id = excluded.task_id,
389
- status = excluded.status,
390
- confidence = excluded.confidence,
391
- importance = excluded.importance,
392
- source_reliability = excluded.source_reliability,
393
- valid_from = excluded.valid_from,
394
- valid_to = excluded.valid_to,
395
- supersedes_record_id = excluded.supersedes_record_id,
396
- is_active = excluded.is_active,
397
- source_type = excluded.source_type,
398
- source_id = excluded.source_id,
399
- metadata_json = excluded.metadata_json,
400
- created_at = excluded.created_at,
401
- updated_at = excluded.updated_at
402
- `).run({
403
- ...record,
404
- is_active: record.is_active ? 1 : 0,
405
- metadata_json: serializeJson(record.metadata_json),
406
- });
407
- contentMutatedRecordIds.add(record.record_id);
408
- }
409
- for (const chunk of mutation.chunks) {
410
- this.db.prepare(`
411
- INSERT INTO soil_chunks (
412
- chunk_id, record_id, soil_id, chunk_index, chunk_kind, heading_path_json,
413
- chunk_text, token_count, checksum, created_at
414
- ) VALUES (
415
- @chunk_id, @record_id, @soil_id, @chunk_index, @chunk_kind, @heading_path_json,
416
- @chunk_text, @token_count, @checksum, @created_at
417
- )
418
- ON CONFLICT(chunk_id) DO UPDATE SET
419
- record_id = excluded.record_id,
420
- soil_id = excluded.soil_id,
421
- chunk_index = excluded.chunk_index,
422
- chunk_kind = excluded.chunk_kind,
423
- heading_path_json = excluded.heading_path_json,
424
- chunk_text = excluded.chunk_text,
425
- token_count = excluded.token_count,
426
- checksum = excluded.checksum,
427
- created_at = excluded.created_at
428
- `).run({
429
- ...chunk,
430
- heading_path_json: serializeJson(chunk.heading_path_json),
431
- });
432
- contentMutatedRecordIds.add(chunk.record_id);
433
- }
434
- for (const page of mutation.pages) {
435
- this.db.prepare(`
436
- INSERT INTO soil_pages (
437
- page_id, soil_id, relative_path, route, kind, status, markdown, checksum, projected_at
438
- ) VALUES (
439
- @page_id, @soil_id, @relative_path, @route, @kind, @status, @markdown, @checksum, @projected_at
440
- )
441
- ON CONFLICT(page_id) DO UPDATE SET
442
- soil_id = excluded.soil_id,
443
- relative_path = excluded.relative_path,
444
- route = excluded.route,
445
- kind = excluded.kind,
446
- status = excluded.status,
447
- markdown = excluded.markdown,
448
- checksum = excluded.checksum,
449
- projected_at = excluded.projected_at
450
- `).run(page);
451
- }
452
- for (const member of mutation.page_members) {
453
- this.db.prepare(`
454
- INSERT INTO soil_page_members (page_id, record_id, ordinal, role, confidence)
455
- VALUES (@page_id, @record_id, @ordinal, @role, @confidence)
456
- ON CONFLICT(page_id, record_id, role) DO UPDATE SET
457
- ordinal = excluded.ordinal,
458
- confidence = excluded.confidence
459
- `).run(member);
460
- }
461
- for (const embedding of mutation.embeddings) {
462
- const parsed = SoilEmbeddingSchema.parse(embedding);
463
- this.db.prepare(`
464
- INSERT INTO soil_embeddings (
465
- chunk_id, model, embedding_version, encoding, embedding, embedded_at
466
- ) VALUES (
467
- @chunk_id, @model, @embedding_version, @encoding, @embedding, @embedded_at
468
- )
469
- ON CONFLICT(chunk_id, model, embedding_version) DO UPDATE SET
470
- encoding = excluded.encoding,
471
- embedding = excluded.embedding,
472
- embedded_at = excluded.embedded_at
473
- `).run({
474
- chunk_id: parsed.chunk_id,
475
- model: parsed.model,
476
- embedding_version: parsed.embedding_version,
477
- encoding: parsed.encoding,
478
- embedding: encodeEmbedding(parsed),
479
- embedded_at: parsed.embedded_at,
480
- });
481
- const chunk = this.db
482
- .prepare("SELECT record_id FROM soil_chunks WHERE chunk_id = ?")
483
- .get(parsed.chunk_id);
484
- if (chunk) {
485
- embeddedChunkIds.add(parsed.chunk_id);
486
- embeddedRecordIds.add(chunk.record_id);
487
- }
488
- }
489
- for (const edge of mutation.edges) {
490
- this.db.prepare(`
491
- INSERT INTO soil_edges (src_record_id, edge_type, dst_record_id, confidence)
492
- VALUES (@src_record_id, @edge_type, @dst_record_id, @confidence)
493
- ON CONFLICT(src_record_id, edge_type, dst_record_id) DO UPDATE SET
494
- confidence = excluded.confidence
495
- `).run(edge);
496
- }
497
- for (const tombstone of mutation.tombstones) {
498
- this.db.prepare(`
499
- INSERT INTO soil_tombstones (tombstone_id, record_id, record_key, version, reason, deleted_at)
500
- VALUES (?, ?, ?, ?, ?, ?)
501
- `).run(randomUUID(), tombstone.record_id, tombstone.record_key, tombstone.version, tombstone.reason, tombstone.deleted_at);
502
- if (tombstone.record_id) {
503
- this.db
504
- .prepare("UPDATE soil_records SET is_active = 0 WHERE record_id = ?")
505
- .run(tombstone.record_id);
506
- contentMutatedRecordIds.add(tombstone.record_id);
507
- }
508
- if (tombstone.record_key) {
509
- this.db
510
- .prepare("UPDATE soil_records SET is_active = 0 WHERE record_key = ?")
511
- .run(tombstone.record_key);
512
- const rows = this.db
513
- .prepare("SELECT record_id FROM soil_records WHERE record_key = ?")
514
- .all(tombstone.record_key);
515
- for (const row of rows) {
516
- contentMutatedRecordIds.add(row.record_id);
517
- }
518
- }
519
- }
520
- this.syncFts(unique([...contentMutatedRecordIds]));
521
- const fullyEmbeddedRecordIds = new Set(unique([...embeddedRecordIds]).filter((recordId) => this.recordHasCompleteEmbeddingMutation(recordId, embeddedChunkIds)));
522
- this.completeOpenEmbeddingJobs(fullyEmbeddedRecordIds);
523
- if (contentMutatedRecordIds.size > 0) {
524
- const openEmbeddingRecordIds = new Set(this.loadOpenEmbeddingReindexRecordIds());
525
- const insertJob = this.db.prepare(`
526
- INSERT INTO soil_reindex_jobs (
527
- job_id, scope, reason, status, payload_json, created_at
528
- ) VALUES (?, ?, ?, ?, ?, ?)
529
- `);
530
- for (const recordId of unique([...contentMutatedRecordIds]).filter((id) => !fullyEmbeddedRecordIds.has(id) && !openEmbeddingRecordIds.has(id))) {
531
- insertJob.run(randomUUID(), "embedding", "content mutation invalidated embeddings", "pending", JSON.stringify({ record_ids: [recordId] }), new Date().toISOString());
532
- }
533
- }
534
- });
535
- tx();
42
+ applySoilMutation(this.db, input);
536
43
  }
537
44
  async loadRecords(input = {}) {
538
45
  const record_filter = SoilRecordFilterSchema.parse(input);
@@ -560,122 +67,10 @@ export class SqliteSoilRepository {
560
67
  await this.applyMutation({ pages });
561
68
  }
562
69
  async replacePageMembers(pageId, members) {
563
- const parsed = members.map((member) => SoilPageMemberSchema.parse({ ...member, page_id: pageId }));
564
- const tx = this.db.transaction(() => {
565
- this.db.prepare("DELETE FROM soil_page_members WHERE page_id = ?").run(pageId);
566
- for (const member of parsed) {
567
- this.db.prepare(`
568
- INSERT INTO soil_page_members (page_id, record_id, ordinal, role, confidence)
569
- VALUES (@page_id, @record_id, @ordinal, @role, @confidence)
570
- `).run(member);
571
- }
572
- });
573
- tx();
70
+ replaceSoilPageMembers(this.db, pageId, members);
574
71
  }
575
72
  async lookupDirect(input) {
576
- const request = SoilSearchRequestSchema.parse(input);
577
- if (!request.direct_lookup) {
578
- return { request, candidates: [] };
579
- }
580
- const pageParams = [request.query, request.query, request.query];
581
- const pageWhere = ["(soil_id = ? OR relative_path = ? OR page_id = ?)"];
582
- pageWhere.push(...buildPageFilterSql(request, pageParams));
583
- pageParams.push(request.limit);
584
- const pageMatches = this.db.prepare(`
585
- SELECT page_id, soil_id
586
- FROM soil_pages p
587
- WHERE ${pageWhere.join(" AND ")}
588
- LIMIT ?
589
- `).all(...pageParams);
590
- const recordParams = [request.query, request.query, request.query, request.query];
591
- const recordWhere = ["(r.record_id = ? OR r.record_key = ? OR r.soil_id = ? OR r.source_id = ?)"];
592
- recordWhere.push(...buildRecordFilterSql(request, recordParams));
593
- recordParams.push(request.limit);
594
- const recordRows = this.db.prepare(`
595
- SELECT *
596
- FROM soil_records r
597
- WHERE ${recordWhere.join(" AND ")}
598
- LIMIT ?
599
- `).all(...recordParams);
600
- const pageIdBySoilId = new Map();
601
- for (const page of pageMatches) {
602
- if (!pageIdBySoilId.has(page.soil_id)) {
603
- pageIdBySoilId.set(page.soil_id, page.page_id);
604
- }
605
- }
606
- const firstChunkByRecordId = new Map();
607
- const recordIds = unique(recordRows.map((row) => row.record_id));
608
- if (recordIds.length > 0) {
609
- const chunkRows = this.db
610
- .prepare(`
611
- SELECT *
612
- FROM soil_chunks
613
- WHERE record_id IN (${recordIds.map(() => "?").join(", ")})
614
- ORDER BY record_id, chunk_index
615
- `)
616
- .all(...recordIds);
617
- for (const chunk of chunkRows) {
618
- if (!firstChunkByRecordId.has(chunk.record_id)) {
619
- firstChunkByRecordId.set(chunk.record_id, chunk);
620
- }
621
- }
622
- }
623
- const firstPageMemberByPageId = new Map();
624
- const pageIds = unique(pageMatches.map((page) => page.page_id));
625
- if (pageIds.length > 0) {
626
- const pageMemberRows = this.db
627
- .prepare(`
628
- SELECT spm.page_id, spm.record_id, sc.chunk_id, sc.chunk_text
629
- FROM soil_page_members spm
630
- LEFT JOIN soil_chunks sc ON sc.record_id = spm.record_id
631
- WHERE spm.page_id IN (${pageIds.map(() => "?").join(", ")})
632
- ORDER BY spm.page_id, spm.ordinal, sc.chunk_index
633
- `)
634
- .all(...pageIds);
635
- for (const row of pageMemberRows) {
636
- if (!firstPageMemberByPageId.has(row.page_id)) {
637
- firstPageMemberByPageId.set(row.page_id, row);
638
- }
639
- }
640
- }
641
- const candidates = [];
642
- const representedPageIds = new Set();
643
- for (const row of recordRows) {
644
- const chunk = firstChunkByRecordId.get(row.record_id);
645
- const page_id = pageIdBySoilId.get(row.soil_id) ?? null;
646
- if (page_id) {
647
- representedPageIds.add(page_id);
648
- }
649
- candidates.push({
650
- chunk_id: chunk?.chunk_id ?? `record:${row.record_id}`,
651
- record_id: row.record_id,
652
- soil_id: row.soil_id,
653
- lane: "direct",
654
- rank: candidates.length + 1,
655
- score: 1,
656
- snippet: chunk ? buildSnippet(chunk.chunk_text, request.query) : row.summary ?? row.title,
657
- page_id,
658
- metadata_json: parseJsonObject(row.metadata_json),
659
- });
660
- }
661
- for (const page of pageMatches) {
662
- if (representedPageIds.has(page.page_id))
663
- continue;
664
- representedPageIds.add(page.page_id);
665
- const member = firstPageMemberByPageId.get(page.page_id);
666
- candidates.push({
667
- chunk_id: member?.chunk_id ?? `page:${page.page_id}`,
668
- record_id: member?.record_id ?? `page:${page.page_id}`,
669
- soil_id: page.soil_id,
670
- lane: "direct",
671
- rank: candidates.length + 1,
672
- score: 1,
673
- snippet: member?.chunk_text ? buildSnippet(member.chunk_text, request.query) : page.soil_id,
674
- page_id: page.page_id,
675
- metadata_json: {},
676
- });
677
- }
678
- return { request, candidates: candidates.slice(0, request.limit) };
73
+ return lookupDirectCandidates(this.db, input);
679
74
  }
680
75
  async searchHybrid(input) {
681
76
  const request = SoilSearchRequestSchema.parse(input);
@@ -690,174 +85,20 @@ export class SqliteSoilRepository {
690
85
  return lexical;
691
86
  }
692
87
  const lexicalRecordIds = unique(lexical.map((candidate) => candidate.record_id));
693
- const dense = lexicalRecordIds.length > 0
88
+ const dense = shouldRunDenseSearch(request, lexicalRecordIds)
694
89
  ? await this.searchDense({
695
90
  ...request,
696
91
  direct_lookup: false,
697
- dense_candidate_record_ids: lexicalRecordIds,
92
+ ...(lexicalRecordIds.length > 0 ? { dense_candidate_record_ids: lexicalRecordIds } : {}),
698
93
  })
699
- : hasExplicitMetadataFilter(request)
700
- ? await this.searchDense({ ...request, direct_lookup: false })
701
- : [];
94
+ : [];
702
95
  return fuseCandidates(lexical, dense, request.limit);
703
96
  }
704
97
  async searchLexical(input) {
705
- const request = SoilSearchRequestSchema.parse(input);
706
- const pageIdParams = [];
707
- const pageIdSql = buildCandidatePageIdSql("r.record_id", request, pageIdParams);
708
- const whereParams = [];
709
- const where = ["soil_chunk_fts MATCH ?"];
710
- where.push(...buildRecordFilterSql(request, whereParams));
711
- where.push(...buildPageExistsSql("r.record_id", request, whereParams));
712
- const params = [...pageIdParams, request.query, ...whereParams, request.lexical_top_k];
713
- const rows = this.db.prepare(`
714
- SELECT
715
- soil_chunk_fts.chunk_id AS chunk_id,
716
- soil_chunk_fts.record_id AS record_id,
717
- soil_chunk_fts.soil_id AS soil_id,
718
- ${pageIdSql} AS page_id,
719
- r.title AS title,
720
- r.summary AS summary,
721
- sc.chunk_text AS chunk_text,
722
- bm25(soil_chunk_fts, 8.0, 5.0, 3.0, 1.0) AS score
723
- FROM soil_chunk_fts
724
- JOIN soil_chunks sc ON sc.chunk_id = soil_chunk_fts.chunk_id
725
- JOIN soil_records r ON r.record_id = soil_chunk_fts.record_id
726
- WHERE ${where.join(" AND ")}
727
- ORDER BY score
728
- LIMIT ?
729
- `).all(...params);
730
- const candidates = rows.map((row, index) => ({
731
- chunk_id: row.chunk_id,
732
- record_id: row.record_id,
733
- soil_id: row.soil_id,
734
- page_id: row.page_id,
735
- lane: "lexical",
736
- rank: index + 1,
737
- score: -1 * row.score,
738
- snippet: buildSnippet(row.chunk_text, request.query),
739
- metadata_json: { title: row.title, summary: row.summary },
740
- }));
741
- return dedupeCandidates(candidates, request.limit);
98
+ return searchLexicalCandidates(this.db, input);
742
99
  }
743
100
  async searchDense(input) {
744
- const request = SoilSearchRequestSchema.parse(input);
745
- if (!request.query_embedding?.length) {
746
- return [];
747
- }
748
- const pageIdParams = [];
749
- const pageIdSql = buildCandidatePageIdSql("r.record_id", request, pageIdParams);
750
- const params = [];
751
- const where = buildRecordFilterSql(request, params);
752
- where.push(...buildPageExistsSql("r.record_id", request, params));
753
- const denseCandidateRecordIds = request.dense_candidate_record_ids ? unique(request.dense_candidate_record_ids) : null;
754
- if (denseCandidateRecordIds?.length === 0) {
755
- return [];
756
- }
757
- if (denseCandidateRecordIds) {
758
- where.push(`r.record_id IN (${denseCandidateRecordIds.map(() => "?").join(", ")})`);
759
- params.push(...denseCandidateRecordIds);
760
- }
761
- const excludedRecordIds = this.loadOpenEmbeddingReindexRecordIds();
762
- if (excludedRecordIds.length > 0) {
763
- where.push(`r.record_id NOT IN (${excludedRecordIds.map(() => "?").join(", ")})`);
764
- params.push(...excludedRecordIds);
765
- }
766
- if (request.query_embedding_model) {
767
- where.push("se.model = ?");
768
- params.push(request.query_embedding_model);
769
- }
770
- where.push(`
771
- NOT EXISTS (
772
- SELECT 1
773
- FROM soil_embeddings newer
774
- WHERE newer.chunk_id = se.chunk_id
775
- AND newer.model = se.model
776
- AND newer.embedding_version > se.embedding_version
777
- )
778
- `);
779
- const queryParams = [...pageIdParams, ...params];
780
- const rows = this.db.prepare(`
781
- SELECT
782
- se.chunk_id,
783
- se.model,
784
- se.embedding_version,
785
- se.encoding,
786
- se.embedding,
787
- se.embedded_at,
788
- sc.record_id,
789
- sc.soil_id,
790
- sc.chunk_text,
791
- r.title,
792
- r.summary,
793
- ${pageIdSql} AS page_id
794
- FROM soil_embeddings se
795
- JOIN soil_chunks sc ON sc.chunk_id = se.chunk_id
796
- JOIN soil_records r ON r.record_id = sc.record_id
797
- ${where.length > 0 ? `WHERE ${where.join(" AND ")}` : ""}
798
- `).all(...queryParams);
799
- const scored = [];
800
- for (const row of rows) {
801
- try {
802
- scored.push({
803
- row,
804
- similarity: cosineSimilarity(request.query_embedding, decodeEmbedding(row)),
805
- });
806
- }
807
- catch {
808
- continue;
809
- }
810
- }
811
- scored.sort((left, right) => right.similarity - left.similarity);
812
- const candidates = scored.slice(0, request.dense_top_k).map(({ row, similarity }, index) => ({
813
- chunk_id: row.chunk_id,
814
- record_id: row.record_id,
815
- soil_id: row.soil_id,
816
- page_id: row.page_id,
817
- lane: "dense",
818
- rank: index + 1,
819
- score: similarity,
820
- snippet: buildSnippet(row.chunk_text, request.query),
821
- metadata_json: { model: row.model, embedding_version: row.embedding_version, title: row.title, summary: row.summary },
822
- }));
823
- return dedupeCandidates(candidates, request.limit);
824
- }
825
- recordHasCompleteEmbeddingMutation(recordId, embeddedChunkIds) {
826
- const chunks = this.db
827
- .prepare("SELECT chunk_id FROM soil_chunks WHERE record_id = ?")
828
- .all(recordId);
829
- return chunks.length > 0 && chunks.every((chunk) => embeddedChunkIds.has(chunk.chunk_id));
830
- }
831
- completeOpenEmbeddingJobs(recordIds) {
832
- if (recordIds.size === 0)
833
- return;
834
- const jobs = this.db.prepare(`
835
- SELECT job_id, payload_json
836
- FROM soil_reindex_jobs
837
- WHERE scope = 'embedding'
838
- AND status IN ('pending', 'running')
839
- `).all();
840
- const complete = this.db.prepare("UPDATE soil_reindex_jobs SET status = 'completed', completed_at = ? WHERE job_id = ?");
841
- const completedAt = new Date().toISOString();
842
- for (const job of jobs) {
843
- const jobRecordIds = parseReindexRecordIds(job.payload_json);
844
- if (jobRecordIds.length > 0 && jobRecordIds.every((recordId) => recordIds.has(recordId))) {
845
- complete.run(completedAt, job.job_id);
846
- }
847
- }
848
- }
849
- loadOpenEmbeddingReindexRecordIds() {
850
- const rows = this.db.prepare(`
851
- SELECT payload_json
852
- FROM soil_reindex_jobs
853
- WHERE scope = 'embedding'
854
- AND status IN ('pending', 'running')
855
- `).all();
856
- const recordIds = [];
857
- for (const row of rows) {
858
- recordIds.push(...parseReindexRecordIds(row.payload_json));
859
- }
860
- return unique(recordIds);
101
+ return searchDenseCandidates(this.db, input, loadOpenEmbeddingReindexRecordIds(this.db));
861
102
  }
862
103
  async loadPagesForRecords(recordIds) {
863
104
  const ids = unique(recordIds);
@@ -890,40 +131,5 @@ export class SqliteSoilRepository {
890
131
  `).all(...ids);
891
132
  return rows.map((row) => toPageMember(row));
892
133
  }
893
- syncFts(recordIds) {
894
- if (recordIds.length === 0)
895
- return;
896
- if (recordIds.length > 0) {
897
- this.db.prepare(`DELETE FROM soil_chunk_fts WHERE record_id IN (${recordIds.map(() => "?").join(", ")})`).run(...recordIds);
898
- }
899
- const rows = this.db.prepare(`
900
- SELECT
901
- sc.chunk_id,
902
- sc.record_id,
903
- sc.soil_id,
904
- (
905
- SELECT spm.page_id
906
- FROM soil_page_members spm
907
- WHERE spm.record_id = r.record_id
908
- ORDER BY CASE WHEN spm.role = 'primary' THEN 0 ELSE 1 END, spm.ordinal, spm.page_id
909
- LIMIT 1
910
- ) AS page_id,
911
- r.title AS title_context,
912
- COALESCE(r.summary, '') AS summary_context,
913
- sc.heading_path_json,
914
- sc.chunk_text
915
- FROM soil_chunks sc
916
- JOIN soil_records r ON r.record_id = sc.record_id
917
- WHERE sc.record_id IN (${recordIds.map(() => "?").join(", ")})
918
- `).all(...recordIds);
919
- const insert = this.db.prepare(`
920
- INSERT INTO soil_chunk_fts (
921
- chunk_id, record_id, soil_id, page_id, title_context, summary_context, heading_context, chunk_text
922
- ) VALUES (?, ?, ?, ?, ?, ?, ?, ?)
923
- `);
924
- for (const row of rows) {
925
- insert.run(row.chunk_id, row.record_id, row.soil_id, row.page_id, row.title_context, row.summary_context, parseJsonArray(row.heading_path_json).join(" / "), row.chunk_text);
926
- }
927
- }
928
134
  }
929
135
  //# sourceMappingURL=sqlite-repository.js.map