@qduc/term2 0.21.0 → 0.22.1

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 (681) hide show
  1. package/dist/agent.d.ts +2 -0
  2. package/dist/agent.d.ts.map +1 -1
  3. package/dist/agent.js +32 -10
  4. package/dist/agent.js.map +1 -1
  5. package/dist/app.d.ts.map +1 -1
  6. package/dist/app.js +83 -6
  7. package/dist/app.js.map +1 -1
  8. package/dist/cli.js +84 -2
  9. package/dist/cli.js.map +1 -1
  10. package/dist/components/InputBox.js +2 -3
  11. package/dist/components/InputBox.js.map +1 -1
  12. package/dist/components/common/MenuContainer.d.ts +15 -0
  13. package/dist/components/common/MenuContainer.d.ts.map +1 -1
  14. package/dist/components/common/MenuContainer.js +66 -32
  15. package/dist/components/common/MenuContainer.js.map +1 -1
  16. package/dist/components/input/MentorPoolMenuSession.d.ts.map +1 -1
  17. package/dist/components/input/MentorPoolMenuSession.js +5 -8
  18. package/dist/components/input/MentorPoolMenuSession.js.map +1 -1
  19. package/dist/components/input/MenuSurface.d.ts.map +1 -1
  20. package/dist/components/input/MenuSurface.js +12 -2
  21. package/dist/components/input/MenuSurface.js.map +1 -1
  22. package/dist/components/input/ModelMenuSession.d.ts.map +1 -1
  23. package/dist/components/input/ModelMenuSession.js +71 -34
  24. package/dist/components/input/ModelMenuSession.js.map +1 -1
  25. package/dist/components/input/SettingsMenuSession.d.ts.map +1 -1
  26. package/dist/components/input/SettingsMenuSession.js +56 -17
  27. package/dist/components/input/SettingsMenuSession.js.map +1 -1
  28. package/dist/components/input/SettingsValueMenuSession.d.ts.map +1 -1
  29. package/dist/components/input/SettingsValueMenuSession.js +33 -3
  30. package/dist/components/input/SettingsValueMenuSession.js.map +1 -1
  31. package/dist/components/input/menu-types.d.ts +1 -1
  32. package/dist/components/input/menu-types.d.ts.map +1 -1
  33. package/dist/components/input/triggers.js +2 -2
  34. package/dist/components/input/triggers.js.map +1 -1
  35. package/dist/components/layout/BackgroundTasksPanel.d.ts +0 -1
  36. package/dist/components/layout/BackgroundTasksPanel.d.ts.map +1 -1
  37. package/dist/components/layout/BackgroundTasksPanel.js +4 -112
  38. package/dist/components/layout/BackgroundTasksPanel.js.map +1 -1
  39. package/dist/components/menu/ModelSelectionMenu.d.ts +10 -0
  40. package/dist/components/menu/ModelSelectionMenu.d.ts.map +1 -1
  41. package/dist/components/menu/ModelSelectionMenu.js +86 -17
  42. package/dist/components/menu/ModelSelectionMenu.js.map +1 -1
  43. package/dist/components/menu/ProfileSelectionMenu.d.ts.map +1 -1
  44. package/dist/components/menu/ProfileSelectionMenu.js +15 -14
  45. package/dist/components/menu/ProfileSelectionMenu.js.map +1 -1
  46. package/dist/components/menu/ResumeSelectionMenu.d.ts.map +1 -1
  47. package/dist/components/menu/ResumeSelectionMenu.js +13 -15
  48. package/dist/components/menu/ResumeSelectionMenu.js.map +1 -1
  49. package/dist/components/menu/SettingsSelectionMenu.d.ts.map +1 -1
  50. package/dist/components/menu/SettingsSelectionMenu.js +4 -32
  51. package/dist/components/menu/SettingsSelectionMenu.js.map +1 -1
  52. package/dist/components/menu/SettingsValueSelectionMenu.d.ts.map +1 -1
  53. package/dist/components/menu/SettingsValueSelectionMenu.js +12 -5
  54. package/dist/components/menu/SettingsValueSelectionMenu.js.map +1 -1
  55. package/dist/components/menu/SkillSelectionMenu.d.ts.map +1 -1
  56. package/dist/components/menu/SkillSelectionMenu.js +13 -16
  57. package/dist/components/menu/SkillSelectionMenu.js.map +1 -1
  58. package/dist/components/menu/SlashCommandMenu.d.ts +8 -0
  59. package/dist/components/menu/SlashCommandMenu.d.ts.map +1 -1
  60. package/dist/components/menu/SlashCommandMenu.js +16 -6
  61. package/dist/components/menu/SlashCommandMenu.js.map +1 -1
  62. package/dist/components/menu/StandaloneModelPickerApp.d.ts +40 -0
  63. package/dist/components/menu/StandaloneModelPickerApp.d.ts.map +1 -0
  64. package/dist/components/menu/StandaloneModelPickerApp.js +105 -0
  65. package/dist/components/menu/StandaloneModelPickerApp.js.map +1 -0
  66. package/dist/components/menu/settings-value-formatter.d.ts +11 -0
  67. package/dist/components/menu/settings-value-formatter.d.ts.map +1 -0
  68. package/dist/components/menu/settings-value-formatter.js +214 -0
  69. package/dist/components/menu/settings-value-formatter.js.map +1 -0
  70. package/dist/components/message/CommandMessage.d.ts.map +1 -1
  71. package/dist/components/message/CommandMessage.js +22 -17
  72. package/dist/components/message/CommandMessage.js.map +1 -1
  73. package/dist/components/message/MessageList.d.ts +2 -1
  74. package/dist/components/message/MessageList.d.ts.map +1 -1
  75. package/dist/components/message/MessageList.js +25 -40
  76. package/dist/components/message/MessageList.js.map +1 -1
  77. package/dist/components/message/RunCodeRenderer.d.ts +16 -0
  78. package/dist/components/message/RunCodeRenderer.d.ts.map +1 -0
  79. package/dist/components/message/RunCodeRenderer.js +25 -0
  80. package/dist/components/message/RunCodeRenderer.js.map +1 -0
  81. package/dist/components/message/command-message-helpers.d.ts +30 -0
  82. package/dist/components/message/command-message-helpers.d.ts.map +1 -1
  83. package/dist/components/message/command-message-helpers.js +85 -0
  84. package/dist/components/message/command-message-helpers.js.map +1 -1
  85. package/dist/components/prompt/ApprovalPrompt.d.ts.map +1 -1
  86. package/dist/components/prompt/ApprovalPrompt.js +12 -21
  87. package/dist/components/prompt/ApprovalPrompt.js.map +1 -1
  88. package/dist/components/theme.d.ts +1 -0
  89. package/dist/components/theme.d.ts.map +1 -1
  90. package/dist/components/theme.js +1 -0
  91. package/dist/components/theme.js.map +1 -1
  92. package/dist/contracts/streamed-model-turn.d.ts +6 -0
  93. package/dist/contracts/streamed-model-turn.d.ts.map +1 -1
  94. package/dist/hooks/conversation-ui-reducer.d.ts.map +1 -1
  95. package/dist/hooks/conversation-ui-reducer.js +5 -2
  96. package/dist/hooks/conversation-ui-reducer.js.map +1 -1
  97. package/dist/hooks/settings-completion-config.d.ts +1 -1
  98. package/dist/hooks/settings-completion-config.d.ts.map +1 -1
  99. package/dist/hooks/settings-completion-config.js +4 -122
  100. package/dist/hooks/settings-completion-config.js.map +1 -1
  101. package/dist/hooks/settings-completion-logic.d.ts +1 -1
  102. package/dist/hooks/settings-completion-logic.d.ts.map +1 -1
  103. package/dist/hooks/settings-completion-logic.js.map +1 -1
  104. package/dist/hooks/use-app-keyboard-shortcuts.d.ts.map +1 -1
  105. package/dist/hooks/use-app-keyboard-shortcuts.js +33 -20
  106. package/dist/hooks/use-app-keyboard-shortcuts.js.map +1 -1
  107. package/dist/hooks/use-conversation.d.ts +3 -0
  108. package/dist/hooks/use-conversation.d.ts.map +1 -1
  109. package/dist/hooks/use-conversation.js +107 -16
  110. package/dist/hooks/use-conversation.js.map +1 -1
  111. package/dist/hooks/use-mentor-pool-selection.d.ts +5 -3
  112. package/dist/hooks/use-mentor-pool-selection.d.ts.map +1 -1
  113. package/dist/hooks/use-mentor-pool-selection.js +63 -51
  114. package/dist/hooks/use-mentor-pool-selection.js.map +1 -1
  115. package/dist/hooks/use-model-selection.d.ts +33 -4
  116. package/dist/hooks/use-model-selection.d.ts.map +1 -1
  117. package/dist/hooks/use-model-selection.js +204 -114
  118. package/dist/hooks/use-model-selection.js.map +1 -1
  119. package/dist/hooks/use-settings-completion.d.ts.map +1 -1
  120. package/dist/hooks/use-settings-completion.js +1 -6
  121. package/dist/hooks/use-settings-completion.js.map +1 -1
  122. package/dist/hooks/use-settings-value-completion.d.ts +1 -8
  123. package/dist/hooks/use-settings-value-completion.d.ts.map +1 -1
  124. package/dist/hooks/use-settings-value-completion.js +10 -100
  125. package/dist/hooks/use-settings-value-completion.js.map +1 -1
  126. package/dist/hooks/use-slash-commands.d.ts.map +1 -1
  127. package/dist/hooks/use-slash-commands.js +19 -13
  128. package/dist/hooks/use-slash-commands.js.map +1 -1
  129. package/dist/hooks/use-standalone-model-picker.d.ts +64 -0
  130. package/dist/hooks/use-standalone-model-picker.d.ts.map +1 -0
  131. package/dist/hooks/use-standalone-model-picker.js +310 -0
  132. package/dist/hooks/use-standalone-model-picker.js.map +1 -0
  133. package/dist/lib/agent-client.d.ts +17 -1
  134. package/dist/lib/agent-client.d.ts.map +1 -1
  135. package/dist/lib/agent-client.js +173 -53
  136. package/dist/lib/agent-client.js.map +1 -1
  137. package/dist/lib/agent-configuration.d.ts +12 -3
  138. package/dist/lib/agent-configuration.d.ts.map +1 -1
  139. package/dist/lib/agent-configuration.js +26 -7
  140. package/dist/lib/agent-configuration.js.map +1 -1
  141. package/dist/lib/agent-factory.d.ts +3 -0
  142. package/dist/lib/agent-factory.d.ts.map +1 -1
  143. package/dist/lib/agent-factory.js +49 -7
  144. package/dist/lib/agent-factory.js.map +1 -1
  145. package/dist/lib/ask-user-answer-store.d.ts +1 -0
  146. package/dist/lib/ask-user-answer-store.d.ts.map +1 -1
  147. package/dist/lib/ask-user-answer-store.js +3 -0
  148. package/dist/lib/ask-user-answer-store.js.map +1 -1
  149. package/dist/lib/tool-invoke.d.ts +1 -0
  150. package/dist/lib/tool-invoke.d.ts.map +1 -1
  151. package/dist/lib/tool-invoke.js +1 -0
  152. package/dist/lib/tool-invoke.js.map +1 -1
  153. package/dist/non-interactive.d.ts +23 -0
  154. package/dist/non-interactive.d.ts.map +1 -1
  155. package/dist/non-interactive.js +225 -31
  156. package/dist/non-interactive.js.map +1 -1
  157. package/dist/prompts/background-shell.d.ts.map +1 -1
  158. package/dist/prompts/background-shell.js +4 -2
  159. package/dist/prompts/background-shell.js.map +1 -1
  160. package/dist/prompts/background-shell.ts +4 -2
  161. package/dist/prompts/codex.md +1 -3
  162. package/dist/prompts/fragments/gpt-6-astra.md +13 -0
  163. package/dist/prompts/gpt-5-modern.md +1 -3
  164. package/dist/prompts/gpt-5.4-mini.md +0 -2
  165. package/dist/prompts/gpt-5.5.md +0 -2
  166. package/dist/prompts/gpt-5.6.md +0 -1
  167. package/dist/prompts/lite.md +1 -6
  168. package/dist/prompts/memory.md +2 -2
  169. package/dist/prompts/orchestrator.md +4 -4
  170. package/dist/prompts/prompt-constructor.d.ts +2 -0
  171. package/dist/prompts/prompt-constructor.d.ts.map +1 -1
  172. package/dist/prompts/prompt-constructor.js +4 -2
  173. package/dist/prompts/prompt-constructor.js.map +1 -1
  174. package/dist/prompts/prompt-constructor.test.ts +178 -5
  175. package/dist/prompts/prompt-constructor.ts +7 -1
  176. package/dist/prompts/prompt-profiles.d.ts.map +1 -1
  177. package/dist/prompts/prompt-profiles.js +6 -0
  178. package/dist/prompts/prompt-profiles.js.map +1 -1
  179. package/dist/prompts/prompt-profiles.test.ts +6 -4
  180. package/dist/prompts/prompt-profiles.ts +6 -0
  181. package/dist/prompts/session-browser.md +4 -2
  182. package/dist/prompts/shell-auto-approval.d.ts +1 -1
  183. package/dist/prompts/shell-auto-approval.d.ts.map +1 -1
  184. package/dist/prompts/shell-auto-approval.js +2 -2
  185. package/dist/prompts/shell-auto-approval.ts +2 -2
  186. package/dist/prompts/subagent-delegation.js +3 -3
  187. package/dist/prompts/subagent-delegation.js.map +1 -1
  188. package/dist/prompts/subagent-delegation.test.ts +3 -3
  189. package/dist/prompts/subagent-delegation.ts +3 -3
  190. package/dist/prompts/subagents/librarian.md +4 -4
  191. package/dist/prompts/subagents/worker-prompt.test.ts +7 -0
  192. package/dist/prompts/tool-surface-guidance.d.ts +4 -0
  193. package/dist/prompts/tool-surface-guidance.d.ts.map +1 -0
  194. package/dist/prompts/tool-surface-guidance.js +19 -0
  195. package/dist/prompts/tool-surface-guidance.js.map +1 -0
  196. package/dist/prompts/tool-surface-guidance.ts +20 -0
  197. package/dist/providers/codex-compact.d.ts +2 -0
  198. package/dist/providers/codex-compact.d.ts.map +1 -1
  199. package/dist/providers/codex-compact.js +14 -0
  200. package/dist/providers/codex-compact.js.map +1 -1
  201. package/dist/providers/codex-responses-model.d.ts +23 -3
  202. package/dist/providers/codex-responses-model.d.ts.map +1 -1
  203. package/dist/providers/codex-responses-model.js +121 -33
  204. package/dist/providers/codex-responses-model.js.map +1 -1
  205. package/dist/providers/codex.provider.d.ts +2 -0
  206. package/dist/providers/codex.provider.d.ts.map +1 -1
  207. package/dist/providers/codex.provider.js +3 -2
  208. package/dist/providers/codex.provider.js.map +1 -1
  209. package/dist/providers/grok.provider.d.ts.map +1 -1
  210. package/dist/providers/grok.provider.js +5 -2
  211. package/dist/providers/grok.provider.js.map +1 -1
  212. package/dist/providers/model-catalog/catalog.generated.d.ts +453 -309
  213. package/dist/providers/model-catalog/catalog.generated.d.ts.map +1 -1
  214. package/dist/providers/model-catalog/catalog.generated.js +453 -309
  215. package/dist/providers/model-catalog/catalog.generated.js.map +1 -1
  216. package/dist/providers/opencode-session.d.ts.map +1 -1
  217. package/dist/providers/opencode-session.js +5 -0
  218. package/dist/providers/opencode-session.js.map +1 -1
  219. package/dist/providers/openrouter.provider.js +8 -1
  220. package/dist/providers/openrouter.provider.js.map +1 -1
  221. package/dist/providers/responses-websocket-sessions.d.ts +10 -0
  222. package/dist/providers/responses-websocket-sessions.d.ts.map +1 -1
  223. package/dist/providers/responses-websocket-sessions.js +9 -4
  224. package/dist/providers/responses-websocket-sessions.js.map +1 -1
  225. package/dist/providers/retrying-model.d.ts +2 -1
  226. package/dist/providers/retrying-model.d.ts.map +1 -1
  227. package/dist/providers/retrying-model.js +3 -0
  228. package/dist/providers/retrying-model.js.map +1 -1
  229. package/dist/services/agent-runtime/application-run-loop.d.ts +8 -1
  230. package/dist/services/agent-runtime/application-run-loop.d.ts.map +1 -1
  231. package/dist/services/agent-runtime/application-run-loop.js +30 -6
  232. package/dist/services/agent-runtime/application-run-loop.js.map +1 -1
  233. package/dist/services/agent-runtime/context-compaction/index.d.ts +2 -0
  234. package/dist/services/agent-runtime/context-compaction/index.d.ts.map +1 -1
  235. package/dist/services/agent-runtime/context-compaction/index.js +30 -4
  236. package/dist/services/agent-runtime/context-compaction/index.js.map +1 -1
  237. package/dist/services/agent-runtime/context-compaction/local-context-compactor.d.ts +3 -0
  238. package/dist/services/agent-runtime/context-compaction/local-context-compactor.d.ts.map +1 -1
  239. package/dist/services/agent-runtime/context-compaction/local-context-compactor.js +15 -9
  240. package/dist/services/agent-runtime/context-compaction/local-context-compactor.js.map +1 -1
  241. package/dist/services/agent-runtime/model-resolver.d.ts.map +1 -1
  242. package/dist/services/agent-runtime/model-resolver.js +1 -23
  243. package/dist/services/agent-runtime/model-resolver.js.map +1 -1
  244. package/dist/services/agent-runtime/tool-invocation-context.d.ts +12 -0
  245. package/dist/services/agent-runtime/tool-invocation-context.d.ts.map +1 -1
  246. package/dist/services/agent-runtime/workflow/workflow-evaluator.d.ts +7 -1
  247. package/dist/services/agent-runtime/workflow/workflow-evaluator.d.ts.map +1 -1
  248. package/dist/services/agent-runtime/workflow/workflow-evaluator.js +78 -183
  249. package/dist/services/agent-runtime/workflow/workflow-evaluator.js.map +1 -1
  250. package/dist/services/agent-runtime/workflow/workflow-sandbox.d.ts +4 -3
  251. package/dist/services/agent-runtime/workflow/workflow-sandbox.d.ts.map +1 -1
  252. package/dist/services/agent-runtime/workflow/workflow-sandbox.js +9 -7
  253. package/dist/services/agent-runtime/workflow/workflow-sandbox.js.map +1 -1
  254. package/dist/services/agent-runtime/workflow/workflow-types.d.ts +1 -1
  255. package/dist/services/agent-runtime/workflow/workflow-types.d.ts.map +1 -1
  256. package/dist/services/agent-runtime/workflow/workflow-types.js.map +1 -1
  257. package/dist/services/approval/approval-decision-executor.d.ts +2 -1
  258. package/dist/services/approval/approval-decision-executor.d.ts.map +1 -1
  259. package/dist/services/approval/approval-decision-executor.js +22 -116
  260. package/dist/services/approval/approval-decision-executor.js.map +1 -1
  261. package/dist/services/approval/approval-descriptor.d.ts +10 -0
  262. package/dist/services/approval/approval-descriptor.d.ts.map +1 -0
  263. package/dist/services/approval/approval-descriptor.js +23 -0
  264. package/dist/services/approval/approval-descriptor.js.map +1 -0
  265. package/dist/services/approval/approval-flow-coordinator.d.ts +2 -1
  266. package/dist/services/approval/approval-flow-coordinator.d.ts.map +1 -1
  267. package/dist/services/approval/approval-flow-coordinator.js +2 -1
  268. package/dist/services/approval/approval-flow-coordinator.js.map +1 -1
  269. package/dist/services/approval/approval-grant-executor.d.ts +25 -0
  270. package/dist/services/approval/approval-grant-executor.d.ts.map +1 -0
  271. package/dist/services/approval/approval-grant-executor.js +125 -0
  272. package/dist/services/approval/approval-grant-executor.js.map +1 -0
  273. package/dist/services/approval/background-subagent-approval-controller.d.ts +2 -1
  274. package/dist/services/approval/background-subagent-approval-controller.d.ts.map +1 -1
  275. package/dist/services/approval/background-subagent-approval-controller.js.map +1 -1
  276. package/dist/services/approval/nested-approval-owner.d.ts +52 -0
  277. package/dist/services/approval/nested-approval-owner.d.ts.map +1 -0
  278. package/dist/services/approval/nested-approval-owner.js +194 -0
  279. package/dist/services/approval/nested-approval-owner.js.map +1 -0
  280. package/dist/services/approval/non-interactive-approval-policy.js +1 -1
  281. package/dist/services/approval/non-interactive-approval-policy.js.map +1 -1
  282. package/dist/services/approval/shell-auto-approval-evaluator.d.ts.map +1 -1
  283. package/dist/services/approval/shell-auto-approval-evaluator.js +2 -4
  284. package/dist/services/approval/shell-auto-approval-evaluator.js.map +1 -1
  285. package/dist/services/approval/shell-auto-approval-resolver.d.ts.map +1 -1
  286. package/dist/services/approval/shell-auto-approval-resolver.js +4 -0
  287. package/dist/services/approval/shell-auto-approval-resolver.js.map +1 -1
  288. package/dist/services/approval/tool-approval-batch-coordinator.d.ts +10 -3
  289. package/dist/services/approval/tool-approval-batch-coordinator.d.ts.map +1 -1
  290. package/dist/services/approval/tool-approval-batch-coordinator.js +16 -5
  291. package/dist/services/approval/tool-approval-batch-coordinator.js.map +1 -1
  292. package/dist/services/approval/tool-approval-policy-registry.d.ts +13 -0
  293. package/dist/services/approval/tool-approval-policy-registry.d.ts.map +1 -1
  294. package/dist/services/approval/tool-approval-policy-registry.js +16 -1
  295. package/dist/services/approval/tool-approval-policy-registry.js.map +1 -1
  296. package/dist/services/conversation/conversation-adapter-factory.d.ts +3 -1
  297. package/dist/services/conversation/conversation-adapter-factory.d.ts.map +1 -1
  298. package/dist/services/conversation/conversation-adapter-factory.js +3 -3
  299. package/dist/services/conversation/conversation-adapter-factory.js.map +1 -1
  300. package/dist/services/conversation/conversation-adapter.d.ts +3 -2
  301. package/dist/services/conversation/conversation-adapter.d.ts.map +1 -1
  302. package/dist/services/conversation/conversation-adapter.js +32 -23
  303. package/dist/services/conversation/conversation-adapter.js.map +1 -1
  304. package/dist/services/conversation/conversation-orchestrator.d.ts +11 -0
  305. package/dist/services/conversation/conversation-orchestrator.d.ts.map +1 -1
  306. package/dist/services/conversation/conversation-orchestrator.js +107 -64
  307. package/dist/services/conversation/conversation-orchestrator.js.map +1 -1
  308. package/dist/services/conversation/conversation-persistence.d.ts +6 -1
  309. package/dist/services/conversation/conversation-persistence.d.ts.map +1 -1
  310. package/dist/services/conversation/conversation-persistence.js +68 -19
  311. package/dist/services/conversation/conversation-persistence.js.map +1 -1
  312. package/dist/services/conversation/conversation-result-builder.d.ts +3 -0
  313. package/dist/services/conversation/conversation-result-builder.d.ts.map +1 -1
  314. package/dist/services/conversation/conversation-result-builder.js +27 -23
  315. package/dist/services/conversation/conversation-result-builder.js.map +1 -1
  316. package/dist/services/conversation/conversation-runtime-factory.d.ts +5 -0
  317. package/dist/services/conversation/conversation-runtime-factory.d.ts.map +1 -1
  318. package/dist/services/conversation/conversation-runtime-factory.js +1 -0
  319. package/dist/services/conversation/conversation-runtime-factory.js.map +1 -1
  320. package/dist/services/conversation/conversation-service.d.ts +11 -1
  321. package/dist/services/conversation/conversation-service.d.ts.map +1 -1
  322. package/dist/services/conversation/conversation-service.js +68 -17
  323. package/dist/services/conversation/conversation-service.js.map +1 -1
  324. package/dist/services/conversation/session-browser.d.ts +34 -27
  325. package/dist/services/conversation/session-browser.d.ts.map +1 -1
  326. package/dist/services/conversation/session-browser.js +221 -60
  327. package/dist/services/conversation/session-browser.js.map +1 -1
  328. package/dist/services/conversation/session-index/session-index-database.d.ts +138 -0
  329. package/dist/services/conversation/session-index/session-index-database.d.ts.map +1 -0
  330. package/dist/services/conversation/session-index/session-index-database.js +684 -0
  331. package/dist/services/conversation/session-index/session-index-database.js.map +1 -0
  332. package/dist/services/conversation/session-index/session-index-schema.d.ts +35 -0
  333. package/dist/services/conversation/session-index/session-index-schema.d.ts.map +1 -0
  334. package/dist/services/conversation/session-index/session-index-schema.js +156 -0
  335. package/dist/services/conversation/session-index/session-index-schema.js.map +1 -0
  336. package/dist/services/conversation/session-index/session-index-service.d.ts +30 -0
  337. package/dist/services/conversation/session-index/session-index-service.d.ts.map +1 -0
  338. package/dist/services/conversation/session-index/session-index-service.js +234 -0
  339. package/dist/services/conversation/session-index/session-index-service.js.map +1 -0
  340. package/dist/services/conversation/session-index/session-index-worker-client.d.ts +36 -0
  341. package/dist/services/conversation/session-index/session-index-worker-client.d.ts.map +1 -0
  342. package/dist/services/conversation/session-index/session-index-worker-client.js +143 -0
  343. package/dist/services/conversation/session-index/session-index-worker-client.js.map +1 -0
  344. package/dist/services/conversation/session-index/session-index-worker.d.ts +56 -0
  345. package/dist/services/conversation/session-index/session-index-worker.d.ts.map +1 -0
  346. package/dist/services/conversation/session-index/session-index-worker.js +96 -0
  347. package/dist/services/conversation/session-index/session-index-worker.js.map +1 -0
  348. package/dist/services/conversation/session-search-helpers.d.ts +4 -0
  349. package/dist/services/conversation/session-search-helpers.d.ts.map +1 -0
  350. package/dist/services/conversation/session-search-helpers.js +13 -0
  351. package/dist/services/conversation/session-search-helpers.js.map +1 -0
  352. package/dist/services/conversation-agent-client.d.ts +8 -0
  353. package/dist/services/conversation-agent-client.d.ts.map +1 -1
  354. package/dist/services/execution-context.js +2 -2
  355. package/dist/services/execution-context.js.map +1 -1
  356. package/dist/services/hooks/hook-event-factory.d.ts +2 -1
  357. package/dist/services/hooks/hook-event-factory.d.ts.map +1 -1
  358. package/dist/services/hooks/hook-event-factory.js +2 -1
  359. package/dist/services/hooks/hook-event-factory.js.map +1 -1
  360. package/dist/services/logging/conversation-log-writer.d.ts.map +1 -1
  361. package/dist/services/logging/conversation-log-writer.js +50 -26
  362. package/dist/services/logging/conversation-log-writer.js.map +1 -1
  363. package/dist/services/logging/logging-service.d.ts.map +1 -1
  364. package/dist/services/logging/logging-service.js +1 -0
  365. package/dist/services/logging/logging-service.js.map +1 -1
  366. package/dist/services/logging/provider-traffic.d.ts +22 -2
  367. package/dist/services/logging/provider-traffic.d.ts.map +1 -1
  368. package/dist/services/logging/provider-traffic.js +147 -12
  369. package/dist/services/logging/provider-traffic.js.map +1 -1
  370. package/dist/services/model-service.d.ts +42 -0
  371. package/dist/services/model-service.d.ts.map +1 -1
  372. package/dist/services/model-service.js +161 -26
  373. package/dist/services/model-service.js.map +1 -1
  374. package/dist/services/models/model-catalog-session.d.ts.map +1 -1
  375. package/dist/services/models/model-catalog-session.js +11 -7
  376. package/dist/services/models/model-catalog-session.js.map +1 -1
  377. package/dist/services/models/model-favorites.d.ts +56 -0
  378. package/dist/services/models/model-favorites.d.ts.map +1 -0
  379. package/dist/services/models/model-favorites.js +93 -0
  380. package/dist/services/models/model-favorites.js.map +1 -0
  381. package/dist/services/models/model-listing.d.ts +40 -0
  382. package/dist/services/models/model-listing.d.ts.map +1 -1
  383. package/dist/services/models/model-listing.js +35 -2
  384. package/dist/services/models/model-listing.js.map +1 -1
  385. package/dist/services/models/model-nicknames.d.ts +113 -0
  386. package/dist/services/models/model-nicknames.d.ts.map +1 -0
  387. package/dist/services/models/model-nicknames.js +182 -0
  388. package/dist/services/models/model-nicknames.js.map +1 -0
  389. package/dist/services/models/model-picker-host.d.ts +72 -0
  390. package/dist/services/models/model-picker-host.d.ts.map +1 -0
  391. package/dist/services/models/model-picker-host.js +86 -0
  392. package/dist/services/models/model-picker-host.js.map +1 -0
  393. package/dist/services/models/model-resolution.d.ts +35 -3
  394. package/dist/services/models/model-resolution.d.ts.map +1 -1
  395. package/dist/services/models/model-resolution.js +276 -47
  396. package/dist/services/models/model-resolution.js.map +1 -1
  397. package/dist/services/models/reasoning-effort.d.ts +20 -0
  398. package/dist/services/models/reasoning-effort.d.ts.map +1 -0
  399. package/dist/services/models/reasoning-effort.js +28 -0
  400. package/dist/services/models/reasoning-effort.js.map +1 -0
  401. package/dist/services/models/unified-model-catalog.d.ts +4 -0
  402. package/dist/services/models/unified-model-catalog.d.ts.map +1 -0
  403. package/dist/services/models/unified-model-catalog.js +54 -0
  404. package/dist/services/models/unified-model-catalog.js.map +1 -0
  405. package/dist/services/retry/provider-failure-classification.d.ts +16 -0
  406. package/dist/services/retry/provider-failure-classification.d.ts.map +1 -1
  407. package/dist/services/retry/provider-failure-classification.js +45 -0
  408. package/dist/services/retry/provider-failure-classification.js.map +1 -1
  409. package/dist/services/retry/retry-recovery-budget.d.ts +26 -1
  410. package/dist/services/retry/retry-recovery-budget.d.ts.map +1 -1
  411. package/dist/services/retry/retry-recovery-budget.js +33 -1
  412. package/dist/services/retry/retry-recovery-budget.js.map +1 -1
  413. package/dist/services/sandboxed-code-host/host-types.d.ts +135 -0
  414. package/dist/services/sandboxed-code-host/host-types.d.ts.map +1 -0
  415. package/dist/services/sandboxed-code-host/host-types.js +6 -0
  416. package/dist/services/sandboxed-code-host/host-types.js.map +1 -0
  417. package/dist/services/sandboxed-code-host/host-worker.d.ts +9 -0
  418. package/dist/services/sandboxed-code-host/host-worker.d.ts.map +1 -0
  419. package/dist/services/sandboxed-code-host/host-worker.js +351 -0
  420. package/dist/services/sandboxed-code-host/host-worker.js.map +1 -0
  421. package/dist/services/sandboxed-code-host/sandbox.d.ts +16 -0
  422. package/dist/services/sandboxed-code-host/sandbox.d.ts.map +1 -0
  423. package/dist/services/sandboxed-code-host/sandbox.js +21 -0
  424. package/dist/services/sandboxed-code-host/sandbox.js.map +1 -0
  425. package/dist/services/sandboxed-code-host/sandboxed-code-host.d.ts +17 -0
  426. package/dist/services/sandboxed-code-host/sandboxed-code-host.d.ts.map +1 -0
  427. package/dist/services/sandboxed-code-host/sandboxed-code-host.js +347 -0
  428. package/dist/services/sandboxed-code-host/sandboxed-code-host.js.map +1 -0
  429. package/dist/services/service-interfaces.d.ts +32 -0
  430. package/dist/services/service-interfaces.d.ts.map +1 -1
  431. package/dist/services/session/background-task-control.d.ts +3 -1
  432. package/dist/services/session/background-task-control.d.ts.map +1 -1
  433. package/dist/services/session/background-task-control.js +4 -0
  434. package/dist/services/session/background-task-control.js.map +1 -1
  435. package/dist/services/session/continuation-plan-applier.d.ts +2 -1
  436. package/dist/services/session/continuation-plan-applier.d.ts.map +1 -1
  437. package/dist/services/session/continuation-plan-applier.js.map +1 -1
  438. package/dist/services/session/continuation-recovery-handler.d.ts +2 -1
  439. package/dist/services/session/continuation-recovery-handler.d.ts.map +1 -1
  440. package/dist/services/session/continuation-recovery-handler.js +49 -5
  441. package/dist/services/session/continuation-recovery-handler.js.map +1 -1
  442. package/dist/services/session/initial-input-preparer.d.ts +2 -1
  443. package/dist/services/session/initial-input-preparer.d.ts.map +1 -1
  444. package/dist/services/session/initial-input-preparer.js +2 -1
  445. package/dist/services/session/initial-input-preparer.js.map +1 -1
  446. package/dist/services/session/initial-turn-recovery-handler.d.ts +2 -1
  447. package/dist/services/session/initial-turn-recovery-handler.d.ts.map +1 -1
  448. package/dist/services/session/initial-turn-recovery-handler.js +51 -16
  449. package/dist/services/session/initial-turn-recovery-handler.js.map +1 -1
  450. package/dist/services/session/post-execute-pending-registry.d.ts +2 -1
  451. package/dist/services/session/post-execute-pending-registry.d.ts.map +1 -1
  452. package/dist/services/session/post-execute-pending-registry.js +3 -2
  453. package/dist/services/session/post-execute-pending-registry.js.map +1 -1
  454. package/dist/services/session/session-client-factory.d.ts +4 -0
  455. package/dist/services/session/session-client-factory.d.ts.map +1 -1
  456. package/dist/services/session/session-client-factory.js +12 -4
  457. package/dist/services/session/session-client-factory.js.map +1 -1
  458. package/dist/services/session/session-composition.d.ts +26 -2
  459. package/dist/services/session/session-composition.d.ts.map +1 -1
  460. package/dist/services/session/session-composition.js +97 -18
  461. package/dist/services/session/session-composition.js.map +1 -1
  462. package/dist/services/session/session-continuity-reset.d.ts +2 -1
  463. package/dist/services/session/session-continuity-reset.d.ts.map +1 -1
  464. package/dist/services/session/session-continuity-reset.js +5 -2
  465. package/dist/services/session/session-continuity-reset.js.map +1 -1
  466. package/dist/services/session/session-identity.d.ts +20 -0
  467. package/dist/services/session/session-identity.d.ts.map +1 -0
  468. package/dist/services/session/session-identity.js +43 -0
  469. package/dist/services/session/session-identity.js.map +1 -0
  470. package/dist/services/session/session-lifecycle.d.ts +5 -1
  471. package/dist/services/session/session-lifecycle.d.ts.map +1 -1
  472. package/dist/services/session/session-lifecycle.js +5 -1
  473. package/dist/services/session/session-lifecycle.js.map +1 -1
  474. package/dist/services/session/session-stream-processor.d.ts +2 -1
  475. package/dist/services/session/session-stream-processor.d.ts.map +1 -1
  476. package/dist/services/session/session-stream-processor.js +5 -4
  477. package/dist/services/session/session-stream-processor.js.map +1 -1
  478. package/dist/services/session/test-helpers/conversation-session-fixtures.d.ts.map +1 -1
  479. package/dist/services/session/test-helpers/conversation-session-fixtures.js +14 -9
  480. package/dist/services/session/test-helpers/conversation-session-fixtures.js.map +1 -1
  481. package/dist/services/session/turn-coordinator.d.ts +2 -1
  482. package/dist/services/session/turn-coordinator.d.ts.map +1 -1
  483. package/dist/services/session/turn-coordinator.js +3 -0
  484. package/dist/services/session/turn-coordinator.js.map +1 -1
  485. package/dist/services/session/turn-workflow.d.ts +4 -1
  486. package/dist/services/session/turn-workflow.d.ts.map +1 -1
  487. package/dist/services/session/turn-workflow.js +58 -21
  488. package/dist/services/session/turn-workflow.js.map +1 -1
  489. package/dist/services/session-rollover/session-rollover-brief.d.ts +8 -1
  490. package/dist/services/session-rollover/session-rollover-brief.d.ts.map +1 -1
  491. package/dist/services/session-rollover/session-rollover-brief.js +14 -1
  492. package/dist/services/session-rollover/session-rollover-brief.js.map +1 -1
  493. package/dist/services/settings/setting-schema-utils.d.ts +2 -0
  494. package/dist/services/settings/setting-schema-utils.d.ts.map +1 -1
  495. package/dist/services/settings/setting-schema-utils.js +15 -27
  496. package/dist/services/settings/setting-schema-utils.js.map +1 -1
  497. package/dist/services/settings/settings-schema.d.ts +8 -0
  498. package/dist/services/settings/settings-schema.d.ts.map +1 -1
  499. package/dist/services/settings/settings-schema.js +23 -6
  500. package/dist/services/settings/settings-schema.js.map +1 -1
  501. package/dist/services/settings/settings-sources.d.ts +207 -0
  502. package/dist/services/settings/settings-sources.d.ts.map +1 -1
  503. package/dist/services/settings/settings-sources.js +48 -1
  504. package/dist/services/settings/settings-sources.js.map +1 -1
  505. package/dist/services/settings/settings-ui-metadata.d.ts +27 -0
  506. package/dist/services/settings/settings-ui-metadata.d.ts.map +1 -0
  507. package/dist/services/settings/settings-ui-metadata.js +283 -0
  508. package/dist/services/settings/settings-ui-metadata.js.map +1 -0
  509. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts +10 -0
  510. package/dist/services/settings/test-helpers/settings-consumer-inventory.d.ts.map +1 -1
  511. package/dist/services/settings/test-helpers/settings-consumer-inventory.js +46 -0
  512. package/dist/services/settings/test-helpers/settings-consumer-inventory.js.map +1 -1
  513. package/dist/services/subagents/execution-runner.d.ts.map +1 -1
  514. package/dist/services/subagents/execution-runner.js +8 -0
  515. package/dist/services/subagents/execution-runner.js.map +1 -1
  516. package/dist/services/subagents/role-loader.d.ts.map +1 -1
  517. package/dist/services/subagents/role-loader.js +4 -0
  518. package/dist/services/subagents/role-loader.js.map +1 -1
  519. package/dist/services/subagents/subagent-client-types.d.ts +7 -0
  520. package/dist/services/subagents/subagent-client-types.d.ts.map +1 -1
  521. package/dist/services/subagents/subagent-manager.d.ts.map +1 -1
  522. package/dist/services/subagents/subagent-manager.js +4 -1
  523. package/dist/services/subagents/subagent-manager.js.map +1 -1
  524. package/dist/services/subagents/subagent-notification-store.d.ts +2 -0
  525. package/dist/services/subagents/subagent-notification-store.d.ts.map +1 -1
  526. package/dist/services/subagents/subagent-notification-store.js +4 -0
  527. package/dist/services/subagents/subagent-notification-store.js.map +1 -1
  528. package/dist/services/subagents/test-helpers/subagent-manager-fixtures.d.ts.map +1 -1
  529. package/dist/services/subagents/test-helpers/subagent-manager-fixtures.js +2 -1
  530. package/dist/services/subagents/test-helpers/subagent-manager-fixtures.js.map +1 -1
  531. package/dist/services/subagents/tool-policy.d.ts +8 -0
  532. package/dist/services/subagents/tool-policy.d.ts.map +1 -1
  533. package/dist/services/subagents/tool-policy.js +289 -41
  534. package/dist/services/subagents/tool-policy.js.map +1 -1
  535. package/dist/services/subagents/types.d.ts +2 -1
  536. package/dist/services/subagents/types.d.ts.map +1 -1
  537. package/dist/services/subagents/types.js.map +1 -1
  538. package/dist/test-helpers/conversation-session-with-adapter.d.ts +1 -1
  539. package/dist/test-helpers/conversation-session-with-adapter.d.ts.map +1 -1
  540. package/dist/test-helpers/conversation-session-with-adapter.js +6 -1
  541. package/dist/test-helpers/conversation-session-with-adapter.js.map +1 -1
  542. package/dist/test-helpers/vitest-cache-isolation.d.ts +2 -0
  543. package/dist/test-helpers/vitest-cache-isolation.d.ts.map +1 -0
  544. package/dist/test-helpers/vitest-cache-isolation.js +17 -0
  545. package/dist/test-helpers/vitest-cache-isolation.js.map +1 -0
  546. package/dist/tools/agent/activate-skill.d.ts.map +1 -1
  547. package/dist/tools/agent/activate-skill.js +1 -0
  548. package/dist/tools/agent/activate-skill.js.map +1 -1
  549. package/dist/tools/agent/configure-task-check-in.d.ts.map +1 -1
  550. package/dist/tools/agent/configure-task-check-in.js +1 -0
  551. package/dist/tools/agent/configure-task-check-in.js.map +1 -1
  552. package/dist/tools/agent/run-subagent-async.d.ts.map +1 -1
  553. package/dist/tools/agent/run-subagent-async.js +16 -12
  554. package/dist/tools/agent/run-subagent-async.js.map +1 -1
  555. package/dist/tools/file/apply-patch.d.ts.map +1 -1
  556. package/dist/tools/file/apply-patch.js +9 -11
  557. package/dist/tools/file/apply-patch.js.map +1 -1
  558. package/dist/tools/file/code-context.d.ts.map +1 -1
  559. package/dist/tools/file/code-context.js +40 -5
  560. package/dist/tools/file/code-context.js.map +1 -1
  561. package/dist/tools/file/create-file.d.ts.map +1 -1
  562. package/dist/tools/file/create-file.js +13 -8
  563. package/dist/tools/file/create-file.js.map +1 -1
  564. package/dist/tools/file/edit-healing.d.ts.map +1 -1
  565. package/dist/tools/file/edit-healing.js +1 -4
  566. package/dist/tools/file/edit-healing.js.map +1 -1
  567. package/dist/tools/file/glob.d.ts.map +1 -1
  568. package/dist/tools/file/glob.js +49 -11
  569. package/dist/tools/file/glob.js.map +1 -1
  570. package/dist/tools/file/grep.d.ts.map +1 -1
  571. package/dist/tools/file/grep.js +32 -8
  572. package/dist/tools/file/grep.js.map +1 -1
  573. package/dist/tools/file/patch-healing.d.ts.map +1 -1
  574. package/dist/tools/file/patch-healing.js +1 -4
  575. package/dist/tools/file/patch-healing.js.map +1 -1
  576. package/dist/tools/file/read-file.d.ts.map +1 -1
  577. package/dist/tools/file/read-file.js +109 -6
  578. package/dist/tools/file/read-file.js.map +1 -1
  579. package/dist/tools/file/search-replace.d.ts.map +1 -1
  580. package/dist/tools/file/search-replace.js +5 -7
  581. package/dist/tools/file/search-replace.js.map +1 -1
  582. package/dist/tools/file/upstream-apply-patch.d.ts.map +1 -1
  583. package/dist/tools/file/upstream-apply-patch.js +4 -1
  584. package/dist/tools/file/upstream-apply-patch.js.map +1 -1
  585. package/dist/tools/memory/memory-tools.d.ts.map +1 -1
  586. package/dist/tools/memory/memory-tools.js +19 -1
  587. package/dist/tools/memory/memory-tools.js.map +1 -1
  588. package/dist/tools/session-browser/session-browser-tools.d.ts.map +1 -1
  589. package/dist/tools/session-browser/session-browser-tools.js +24 -8
  590. package/dist/tools/session-browser/session-browser-tools.js.map +1 -1
  591. package/dist/tools/session-rollover/session-rollover-tool.d.ts.map +1 -1
  592. package/dist/tools/session-rollover/session-rollover-tool.js +8 -2
  593. package/dist/tools/session-rollover/session-rollover-tool.js.map +1 -1
  594. package/dist/tools/system/run-code/index.d.ts +2 -0
  595. package/dist/tools/system/run-code/index.d.ts.map +1 -0
  596. package/dist/tools/system/run-code/index.js +2 -0
  597. package/dist/tools/system/run-code/index.js.map +1 -0
  598. package/dist/tools/system/run-code/run-code-telemetry.d.ts +92 -0
  599. package/dist/tools/system/run-code/run-code-telemetry.d.ts.map +1 -0
  600. package/dist/tools/system/run-code/run-code-telemetry.js +189 -0
  601. package/dist/tools/system/run-code/run-code-telemetry.js.map +1 -0
  602. package/dist/tools/system/run-code/run-code.d.ts +98 -0
  603. package/dist/tools/system/run-code/run-code.d.ts.map +1 -0
  604. package/dist/tools/system/run-code/run-code.js +1078 -0
  605. package/dist/tools/system/run-code/run-code.js.map +1 -0
  606. package/dist/tools/system/run-code/tools-header.d.ts +25 -0
  607. package/dist/tools/system/run-code/tools-header.d.ts.map +1 -0
  608. package/dist/tools/system/run-code/tools-header.js +136 -0
  609. package/dist/tools/system/run-code/tools-header.js.map +1 -0
  610. package/dist/tools/system/shell.d.ts.map +1 -1
  611. package/dist/tools/system/shell.js +58 -9
  612. package/dist/tools/system/shell.js.map +1 -1
  613. package/dist/tools/system/worktree.js +2 -2
  614. package/dist/tools/system/worktree.js.map +1 -1
  615. package/dist/tools/types.d.ts +24 -0
  616. package/dist/tools/types.d.ts.map +1 -1
  617. package/dist/tools/types.js.map +1 -1
  618. package/dist/tools/utils.d.ts +10 -0
  619. package/dist/tools/utils.d.ts.map +1 -1
  620. package/dist/tools/utils.js +13 -0
  621. package/dist/tools/utils.js.map +1 -1
  622. package/dist/tools/web/web-fetch.d.ts.map +1 -1
  623. package/dist/tools/web/web-fetch.js +14 -6
  624. package/dist/tools/web/web-fetch.js.map +1 -1
  625. package/dist/tools/web/web-search.d.ts.map +1 -1
  626. package/dist/tools/web/web-search.js +2 -1
  627. package/dist/tools/web/web-search.js.map +1 -1
  628. package/dist/utils/ai/model-settings.d.ts.map +1 -1
  629. package/dist/utils/ai/model-settings.js +0 -47
  630. package/dist/utils/ai/model-settings.js.map +1 -1
  631. package/dist/utils/conversation/apply-conversation-result.d.ts.map +1 -1
  632. package/dist/utils/conversation/apply-conversation-result.js +13 -0
  633. package/dist/utils/conversation/apply-conversation-result.js.map +1 -1
  634. package/dist/utils/conversation/conversation-utils.d.ts.map +1 -1
  635. package/dist/utils/conversation/conversation-utils.js +14 -0
  636. package/dist/utils/conversation/conversation-utils.js.map +1 -1
  637. package/dist/utils/conversation/static-commit-policy.d.ts +38 -0
  638. package/dist/utils/conversation/static-commit-policy.d.ts.map +1 -0
  639. package/dist/utils/conversation/static-commit-policy.js +76 -0
  640. package/dist/utils/conversation/static-commit-policy.js.map +1 -0
  641. package/dist/utils/output/bound-tool-result.d.ts +23 -0
  642. package/dist/utils/output/bound-tool-result.d.ts.map +1 -1
  643. package/dist/utils/output/bound-tool-result.js +27 -0
  644. package/dist/utils/output/bound-tool-result.js.map +1 -1
  645. package/dist/utils/settings-command.d.ts +8 -0
  646. package/dist/utils/settings-command.d.ts.map +1 -1
  647. package/dist/utils/settings-command.js +45 -30
  648. package/dist/utils/settings-command.js.map +1 -1
  649. package/dist/utils/shell/execute-shell.d.ts +18 -0
  650. package/dist/utils/shell/execute-shell.d.ts.map +1 -1
  651. package/dist/utils/shell/execute-shell.js +48 -6
  652. package/dist/utils/shell/execute-shell.js.map +1 -1
  653. package/dist/utils/shell/shell-output.d.ts +7 -1
  654. package/dist/utils/shell/shell-output.d.ts.map +1 -1
  655. package/dist/utils/shell/shell-output.js +37 -7
  656. package/dist/utils/shell/shell-output.js.map +1 -1
  657. package/dist/utils/streaming/streaming-session-factory.d.ts +9 -0
  658. package/dist/utils/streaming/streaming-session-factory.d.ts.map +1 -1
  659. package/dist/utils/streaming/streaming-session-factory.js +1 -1
  660. package/dist/utils/streaming/streaming-session-factory.js.map +1 -1
  661. package/dist/utils/tool-args-display.d.ts +21 -0
  662. package/dist/utils/tool-args-display.d.ts.map +1 -0
  663. package/dist/utils/tool-args-display.js +34 -0
  664. package/dist/utils/tool-args-display.js.map +1 -0
  665. package/dist/utils/value-suggestions.d.ts +4 -10
  666. package/dist/utils/value-suggestions.d.ts.map +1 -1
  667. package/dist/utils/value-suggestions.js +77 -144
  668. package/dist/utils/value-suggestions.js.map +1 -1
  669. package/dist/utils/worker-bootstrap.d.ts +3 -0
  670. package/dist/utils/worker-bootstrap.d.ts.map +1 -0
  671. package/dist/utils/worker-bootstrap.js +7 -0
  672. package/dist/utils/worker-bootstrap.js.map +1 -0
  673. package/dist/utils/worker-cwd-preload.cjs +23 -0
  674. package/dist/utils/worker-cwd-preload.cjs.map +1 -0
  675. package/dist/utils/worker-cwd-preload.d.cts +2 -0
  676. package/dist/utils/worker-cwd-preload.d.cts.map +1 -0
  677. package/package.json +5 -2
  678. package/dist/services/agent-runtime/workflow/workflow-worker.d.ts +0 -4
  679. package/dist/services/agent-runtime/workflow/workflow-worker.d.ts.map +0 -1
  680. package/dist/services/agent-runtime/workflow/workflow-worker.js +0 -55
  681. package/dist/services/agent-runtime/workflow/workflow-worker.js.map +0 -1
@@ -0,0 +1,684 @@
1
+ import Database from 'better-sqlite3';
2
+ import fs from 'node:fs';
3
+ import path from 'node:path';
4
+ import { createSchema, dropSchema, isSchemaCurrent, probeFts5TrigramCapability, writeMetadata, } from './session-index-schema.js';
5
+ import { loadConversationUnscopedForIndex, normalizeProjectPath, normalizeSshHost, resolveConversationReference, uniqueConversationShortRefs, } from '../conversation-persistence.js';
6
+ import { deltaSidecarPathFor } from '../../logging/conversation-log-events.js';
7
+ import { isBrowsableSession, prefixSnippet, projectMessages, sessionRevision, sessionUpdatedAt, } from '../session-browser.js';
8
+ import { SNIPPET_CHARS, scoreText, termsFor } from '../session-search-helpers.js';
9
+ import { matchCenteredSnippet } from '../../../utils/output/text-snippet.js';
10
+ const SAFE_SESSION_ID = /^[A-Za-z0-9][A-Za-z0-9_-]*$/;
11
+ export class SessionIndexDatabase {
12
+ #db;
13
+ #sourceDirectory;
14
+ constructor(dbPath, sourceDirectory, options) {
15
+ this.#sourceDirectory = sourceDirectory;
16
+ this.#db = new Database(dbPath, { timeout: options?.timeout ?? 5000 });
17
+ this.#configurePragmas();
18
+ }
19
+ get database() {
20
+ return this.#db;
21
+ }
22
+ #configurePragmas() {
23
+ try {
24
+ this.#db.pragma('journal_mode = WAL');
25
+ }
26
+ catch {
27
+ // Ignored for in-memory or read-only databases
28
+ }
29
+ this.#db.pragma('busy_timeout = 5000');
30
+ this.#db.pragma('foreign_keys = ON');
31
+ try {
32
+ this.#db.pragma('synchronous = NORMAL');
33
+ }
34
+ catch {
35
+ // Best-effort
36
+ }
37
+ }
38
+ probeCapability() {
39
+ return probeFts5TrigramCapability(this.#db);
40
+ }
41
+ #statVersion(filePath) {
42
+ try {
43
+ const stat = fs.statSync(filePath);
44
+ return JSON.stringify([stat.dev, stat.ino, stat.mode, stat.size, stat.mtimeMs, stat.ctimeMs]);
45
+ }
46
+ catch {
47
+ return null;
48
+ }
49
+ }
50
+ #getSourceVersion(id) {
51
+ if (!SAFE_SESSION_ID.test(id))
52
+ return null;
53
+ const filePath = path.join(this.#sourceDirectory, `${id}.jsonl`);
54
+ const fileVersion = this.#statVersion(filePath);
55
+ if (!fileVersion)
56
+ return null;
57
+ const sidecarPath = deltaSidecarPathFor(filePath);
58
+ const sidecarVersion = fs.existsSync(sidecarPath) ? this.#statVersion(sidecarPath) : 'absent';
59
+ if (!sidecarVersion)
60
+ return null;
61
+ return JSON.stringify([fileVersion, sidecarVersion]);
62
+ }
63
+ initialize() {
64
+ if (isSchemaCurrent(this.#db, this.#sourceDirectory)) {
65
+ return;
66
+ }
67
+ const initTx = this.#db.transaction(() => {
68
+ if (isSchemaCurrent(this.#db, this.#sourceDirectory)) {
69
+ return;
70
+ }
71
+ dropSchema(this.#db);
72
+ createSchema(this.#db);
73
+ writeMetadata(this.#db, this.#sourceDirectory);
74
+ });
75
+ initTx.immediate();
76
+ }
77
+ reconcile() {
78
+ this.initialize();
79
+ let files = [];
80
+ try {
81
+ if (fs.existsSync(this.#sourceDirectory)) {
82
+ files = fs.readdirSync(this.#sourceDirectory).filter((f) => f.endsWith('.jsonl'));
83
+ }
84
+ }
85
+ catch (error) {
86
+ return {
87
+ ok: false,
88
+ replayedCount: 0,
89
+ deletedCount: 0,
90
+ stable: false,
91
+ error: `Failed to read source directory: ${error instanceof Error ? error.message : String(error)}`,
92
+ };
93
+ }
94
+ const liveIds = new Set();
95
+ for (const file of files) {
96
+ const id = file.slice(0, -'.jsonl'.length);
97
+ if (SAFE_SESSION_ID.test(id)) {
98
+ liveIds.add(id);
99
+ }
100
+ }
101
+ // 1. Remove deleted sessions from inventory
102
+ const existingInventoryRows = this.#db
103
+ .prepare('SELECT session_id, source_version FROM source_inventory')
104
+ .all();
105
+ let deletedCount = 0;
106
+ const deleteInventoryStmt = this.#db.prepare('DELETE FROM source_inventory WHERE session_id = ?');
107
+ const deleteSessionStmt = this.#db.prepare('DELETE FROM sessions WHERE id = ?');
108
+ const deleteMessageStmt = this.#db.prepare('DELETE FROM messages WHERE session_id = ?');
109
+ const deleteTx = this.#db.transaction((toDelete) => {
110
+ for (const id of toDelete) {
111
+ deleteMessageStmt.run(id);
112
+ deleteSessionStmt.run(id);
113
+ deleteInventoryStmt.run(id);
114
+ }
115
+ });
116
+ const toDeleteIds = [];
117
+ const existingVersionMap = new Map();
118
+ for (const row of existingInventoryRows) {
119
+ if (!liveIds.has(row.session_id)) {
120
+ toDeleteIds.push(row.session_id);
121
+ }
122
+ else {
123
+ existingVersionMap.set(row.session_id, row.source_version);
124
+ }
125
+ }
126
+ if (toDeleteIds.length > 0) {
127
+ deleteTx.immediate(toDeleteIds);
128
+ deletedCount = toDeleteIds.length;
129
+ }
130
+ // 2. Identify sessions requiring refresh
131
+ const toRefreshIds = [];
132
+ for (const id of liveIds) {
133
+ const currentVersion = this.#getSourceVersion(id);
134
+ if (currentVersion === null)
135
+ continue;
136
+ if (existingVersionMap.get(id) !== currentVersion) {
137
+ toRefreshIds.push(id);
138
+ }
139
+ }
140
+ let replayedCount = 0;
141
+ const changedDuringReplay = [];
142
+ // Prepared statements for insertion
143
+ const insertInventoryStmt = this.#db.prepare(`
144
+ INSERT INTO source_inventory (session_id, source_version, classification, project_path, ssh_host, updated_at)
145
+ VALUES (?, ?, ?, ?, ?, ?)
146
+ ON CONFLICT(session_id) DO UPDATE SET
147
+ source_version = excluded.source_version,
148
+ classification = excluded.classification,
149
+ project_path = excluded.project_path,
150
+ ssh_host = excluded.ssh_host,
151
+ updated_at = excluded.updated_at
152
+ `);
153
+ const insertSessionStmt = this.#db.prepare(`
154
+ INSERT INTO sessions (
155
+ id, project_path, ssh_host, created_at, updated_at, predecessor_id,
156
+ model, provider, first_user_snippet, projected_count, skipped_count, projection_revision
157
+ ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)
158
+ `);
159
+ const insertMessageStmt = this.#db.prepare(`
160
+ INSERT INTO messages (
161
+ session_id, projected_ordinal, original_message_index, kind, original_text, normalized_text
162
+ ) VALUES (?, ?, ?, ?, ?, ?)
163
+ `);
164
+ // Refresh each changed session
165
+ for (const id of toRefreshIds) {
166
+ const sourceVersionBefore = this.#getSourceVersion(id);
167
+ if (sourceVersionBefore === null)
168
+ continue;
169
+ replayedCount++;
170
+ // Replay and project using unscoped load for index
171
+ const loaded = loadConversationUnscopedForIndex(id, this.#sourceDirectory);
172
+ let classification;
173
+ let sessionProjectPath = null;
174
+ let sessionSshHost = null;
175
+ let sessionRowData = null;
176
+ let messageRowsData = [];
177
+ if (loaded.status !== 'loaded' || !loaded.conversation.createdAt || loaded.conversation.id !== id) {
178
+ if (loaded.status === 'loaded' && !loaded.conversation.projectPath) {
179
+ // A malformed/scope-less log that replayed without throwing but has no projectPath.
180
+ // In canonical loadConversationForProjectReadOnly, project check fails and returns 'project_mismatch',
181
+ // which canonical does NOT count in unavailable for any scope.
182
+ // Classifying as 'invalid' with project_path = NULL ensures it is never counted dir-wide.
183
+ classification = 'invalid';
184
+ }
185
+ else if (loaded.status === 'loaded' && loaded.conversation.projectPath) {
186
+ // Replayed with a projectPath, but invalid id or createdAt:
187
+ // Scoped invalid session for that specific projectPath/sshHost.
188
+ sessionProjectPath = normalizeProjectPath(loaded.conversation.projectPath);
189
+ if (loaded.conversation.sshHost) {
190
+ sessionSshHost = normalizeSshHost(loaded.conversation.sshHost);
191
+ }
192
+ classification = 'invalid';
193
+ }
194
+ else {
195
+ // Throwing/unreadable file on disk -> dir-wide unreadable
196
+ classification = 'unreadable';
197
+ }
198
+ }
199
+ else {
200
+ const conversation = loaded.conversation;
201
+ if (conversation.projectPath) {
202
+ sessionProjectPath = normalizeProjectPath(conversation.projectPath);
203
+ }
204
+ if (conversation.sshHost) {
205
+ sessionSshHost = normalizeSshHost(conversation.sshHost);
206
+ }
207
+ if (!isBrowsableSession(conversation)) {
208
+ classification = 'invalid';
209
+ }
210
+ else {
211
+ const projection = projectMessages(conversation);
212
+ if (!projection) {
213
+ classification = 'invalid';
214
+ }
215
+ else {
216
+ classification = 'loaded';
217
+ const updatedAt = sessionUpdatedAt(conversation);
218
+ const revision = sessionRevision(conversation, projection);
219
+ const firstUser = projection.records.find((r) => r.kind === 'user' && r.text);
220
+ sessionRowData = {
221
+ id: conversation.id,
222
+ projectPath: sessionProjectPath,
223
+ sshHost: sessionSshHost,
224
+ createdAt: conversation.createdAt,
225
+ updatedAt,
226
+ predecessorId: conversation.rolloverFrom ?? null,
227
+ model: conversation.model ?? null,
228
+ provider: conversation.provider ?? null,
229
+ firstUserSnippet: firstUser ? prefixSnippet(firstUser.text) : null,
230
+ projectedCount: projection.records.length,
231
+ skippedCount: projection.skipped,
232
+ projectionRevision: revision,
233
+ };
234
+ messageRowsData = projection.records.map((r, ordinal) => ({
235
+ projectedOrdinal: ordinal,
236
+ originalMessageIndex: r.index,
237
+ kind: r.kind,
238
+ originalText: r.text,
239
+ normalizedText: r.text.toLowerCase(),
240
+ }));
241
+ }
242
+ }
243
+ }
244
+ // Stable publication check: ensure source did not change during replay
245
+ const sourceVersionAfter = this.#getSourceVersion(id);
246
+ if (sourceVersionBefore !== sourceVersionAfter) {
247
+ changedDuringReplay.push(id);
248
+ continue;
249
+ }
250
+ // Atomic commit per session with recheck inside transaction
251
+ let committed = false;
252
+ const commitSessionTx = this.#db.transaction(() => {
253
+ // Re-STAT the source file from disk inside the serialized write transaction!
254
+ const diskVersionInTx = this.#getSourceVersion(id);
255
+ if (diskVersionInTx !== sourceVersionAfter) {
256
+ // Source file was changed on disk after replay; abort stale commit!
257
+ return;
258
+ }
259
+ // Recheck DB: if another process already committed this version or newer, skip
260
+ const currentInDb = this.#db
261
+ .prepare('SELECT source_version FROM source_inventory WHERE session_id = ?')
262
+ .get(id);
263
+ if (currentInDb && currentInDb.source_version === sourceVersionAfter) {
264
+ return;
265
+ }
266
+ // Clean previous session and message rows
267
+ deleteMessageStmt.run(id);
268
+ deleteSessionStmt.run(id);
269
+ // Update inventory with scope info
270
+ insertInventoryStmt.run(id, sourceVersionAfter, classification, sessionProjectPath, sessionSshHost, Date.now());
271
+ // Insert session and messages if loaded
272
+ if (classification === 'loaded' && sessionRowData) {
273
+ insertSessionStmt.run(sessionRowData.id, sessionRowData.projectPath, sessionRowData.sshHost, sessionRowData.createdAt, sessionRowData.updatedAt, sessionRowData.predecessorId, sessionRowData.model, sessionRowData.provider, sessionRowData.firstUserSnippet, sessionRowData.projectedCount, sessionRowData.skippedCount, sessionRowData.projectionRevision);
274
+ for (const msg of messageRowsData) {
275
+ insertMessageStmt.run(id, msg.projectedOrdinal, msg.originalMessageIndex, msg.kind, msg.originalText, msg.normalizedText);
276
+ }
277
+ }
278
+ committed = true;
279
+ });
280
+ commitSessionTx.immediate();
281
+ if (!committed) {
282
+ const diskVersionNow = this.#getSourceVersion(id);
283
+ if (diskVersionNow !== sourceVersionAfter) {
284
+ changedDuringReplay.push(id);
285
+ }
286
+ }
287
+ }
288
+ return {
289
+ ok: true,
290
+ replayedCount,
291
+ deletedCount,
292
+ stable: changedDuringReplay.length === 0,
293
+ ...(changedDuringReplay.length > 0 ? { changedDuringReplay } : {}),
294
+ };
295
+ }
296
+ list(options) {
297
+ this.initialize();
298
+ const normalizedProject = normalizeProjectPath(options.projectPath);
299
+ const normalizedHost = options.sshHost ? normalizeSshHost(options.sshHost) : null;
300
+ const rows = this.#db
301
+ .prepare(`
302
+ SELECT id, created_at, updated_at, model, provider, first_user_snippet, projected_count
303
+ FROM sessions
304
+ WHERE (project_path IS NOT NULL AND project_path = ?)
305
+ AND (
306
+ (? IS NULL AND ssh_host IS NULL)
307
+ OR
308
+ (ssh_host IS NOT NULL AND ssh_host = ?)
309
+ )
310
+ ORDER BY updated_at DESC, id ASC
311
+ `)
312
+ .all(normalizedProject, normalizedHost, normalizedHost);
313
+ // Directory-wide unreadable files (corrupt JSON lines)
314
+ const unreadableRow = this.#db
315
+ .prepare(`
316
+ SELECT COUNT(*) as count
317
+ FROM source_inventory
318
+ WHERE classification = 'unreadable'
319
+ `)
320
+ .get();
321
+ // Invalid sessions scoped to current project/SSH context
322
+ const invalidInScopeRow = this.#db
323
+ .prepare(`
324
+ SELECT COUNT(*) as count
325
+ FROM source_inventory
326
+ WHERE classification = 'invalid'
327
+ AND (project_path IS NOT NULL AND project_path = ?)
328
+ AND (
329
+ (? IS NULL AND ssh_host IS NULL)
330
+ OR
331
+ (ssh_host IS NOT NULL AND ssh_host = ?)
332
+ )
333
+ `)
334
+ .get(normalizedProject, normalizedHost, normalizedHost);
335
+ const unavailable = (unreadableRow?.count ?? 0) + (invalidInScopeRow?.count ?? 0);
336
+ const shortRefs = uniqueConversationShortRefs(rows.map((r) => ({ id: r.id })));
337
+ const sessions = rows.map((r) => ({
338
+ id: r.id,
339
+ shortRef: shortRefs.get(r.id) ?? r.id,
340
+ createdAt: r.created_at,
341
+ updatedAt: r.updated_at,
342
+ ...(r.first_user_snippet ? { firstUserMessage: r.first_user_snippet } : {}),
343
+ ...(r.model ? { model: r.model } : {}),
344
+ ...(r.provider ? { provider: r.provider } : {}),
345
+ messageCount: r.projected_count,
346
+ }));
347
+ return {
348
+ sessions,
349
+ scope: options.projectPath,
350
+ total: sessions.length,
351
+ unavailable,
352
+ };
353
+ }
354
+ resolveReference(reference, options) {
355
+ this.initialize();
356
+ const normalizedProject = normalizeProjectPath(options.projectPath);
357
+ const normalizedHost = options.sshHost ? normalizeSshHost(options.sshHost) : null;
358
+ const rows = this.#db
359
+ .prepare(`
360
+ SELECT id
361
+ FROM sessions
362
+ WHERE (project_path IS NOT NULL AND project_path = ?)
363
+ AND (
364
+ (? IS NULL AND ssh_host IS NULL)
365
+ OR
366
+ (ssh_host IS NOT NULL AND ssh_host = ?)
367
+ )
368
+ `)
369
+ .all(normalizedProject, normalizedHost, normalizedHost);
370
+ const shortRefs = uniqueConversationShortRefs(rows);
371
+ if (reference === 'previous') {
372
+ if (!options.currentSessionId) {
373
+ return { kind: 'not_found', message: 'This session has no persisted rollover predecessor.' };
374
+ }
375
+ const current = this.#db
376
+ .prepare('SELECT predecessor_id FROM sessions WHERE id = ?')
377
+ .get(options.currentSessionId);
378
+ if (!current?.predecessor_id) {
379
+ return { kind: 'not_found', message: 'This session has no persisted rollover predecessor.' };
380
+ }
381
+ return {
382
+ kind: 'resolved',
383
+ id: current.predecessor_id,
384
+ shortRef: shortRefs.get(current.predecessor_id) ?? current.predecessor_id,
385
+ };
386
+ }
387
+ const resolution = resolveConversationReference(reference, rows);
388
+ if (resolution.kind === 'ambiguous') {
389
+ return { kind: 'ambiguous', candidates: resolution.candidates };
390
+ }
391
+ // Check if the resolved id exists in the scoped sessions
392
+ const exists = rows.some((r) => r.id === resolution.id);
393
+ if (!exists) {
394
+ return { kind: 'not_found', message: `Session was not found in scope ${options.projectPath}.` };
395
+ }
396
+ return {
397
+ kind: 'resolved',
398
+ id: resolution.id,
399
+ shortRef: shortRefs.get(resolution.id) ?? resolution.id,
400
+ };
401
+ }
402
+ readSession(sessionId, options) {
403
+ this.initialize();
404
+ const inv = this.#db
405
+ .prepare(`SELECT session_id, source_version, classification, project_path, ssh_host
406
+ FROM source_inventory
407
+ WHERE session_id = ?`)
408
+ .get(sessionId);
409
+ if (!inv) {
410
+ return { kind: 'not_found' };
411
+ }
412
+ const normalizedProject = normalizeProjectPath(options.projectPath);
413
+ const normalizedHost = options.sshHost ? normalizeSshHost(options.sshHost) : null;
414
+ if (inv.classification === 'unreadable') {
415
+ return { kind: 'unavailable' };
416
+ }
417
+ // For invalid and loaded rows, check project / SSH scope if project_path is recorded
418
+ if (inv.project_path !== null) {
419
+ const scopeMatches = inv.project_path === normalizedProject &&
420
+ ((normalizedHost === null && inv.ssh_host === null) ||
421
+ (normalizedHost !== null && inv.ssh_host === normalizedHost));
422
+ if (!scopeMatches) {
423
+ return { kind: 'project_mismatch', projectPath: inv.project_path };
424
+ }
425
+ }
426
+ else if (inv.classification === 'invalid') {
427
+ // Scope-less invalid file (e.g. malformed JSON with no projectPath):
428
+ // Canonical returns project_mismatch against any requested scope.
429
+ return { kind: 'project_mismatch', projectPath: null };
430
+ }
431
+ if (inv.classification === 'invalid') {
432
+ return { kind: 'unavailable' };
433
+ }
434
+ const sess = this.#db
435
+ .prepare(`SELECT
436
+ id, project_path, ssh_host, created_at, updated_at, predecessor_id,
437
+ model, provider, projected_count, skipped_count, projection_revision
438
+ FROM sessions
439
+ WHERE id = ?`)
440
+ .get(sessionId);
441
+ if (!sess) {
442
+ return { kind: 'unavailable' };
443
+ }
444
+ if (sess.project_path !== null) {
445
+ const scopeMatches = sess.project_path === normalizedProject &&
446
+ ((normalizedHost === null && sess.ssh_host === null) ||
447
+ (normalizedHost !== null && sess.ssh_host === normalizedHost));
448
+ if (!scopeMatches) {
449
+ return { kind: 'project_mismatch', projectPath: sess.project_path };
450
+ }
451
+ }
452
+ const messageRows = this.#db
453
+ .prepare(`SELECT projected_ordinal, original_message_index, kind, original_text
454
+ FROM messages
455
+ WHERE session_id = ?
456
+ ORDER BY projected_ordinal ASC`)
457
+ .all(sessionId);
458
+ const records = messageRows.map((m) => ({
459
+ index: m.original_message_index,
460
+ kind: m.kind,
461
+ text: m.original_text,
462
+ }));
463
+ return {
464
+ kind: 'loaded',
465
+ session: {
466
+ id: sess.id,
467
+ projectPath: sess.project_path,
468
+ sshHost: sess.ssh_host,
469
+ createdAt: sess.created_at,
470
+ updatedAt: sess.updated_at,
471
+ predecessorId: sess.predecessor_id,
472
+ model: sess.model,
473
+ provider: sess.provider,
474
+ projectedCount: sess.projected_count,
475
+ skippedCount: sess.skipped_count,
476
+ projectionRevision: sess.projection_revision,
477
+ sourceVersion: inv.source_version,
478
+ records,
479
+ },
480
+ };
481
+ }
482
+ search(options) {
483
+ this.initialize();
484
+ const normalizedProject = normalizeProjectPath(options.projectPath);
485
+ const normalizedHost = options.sshHost ? normalizeSshHost(options.sshHost) : null;
486
+ // 1. Directory-wide unreadable files
487
+ const unreadableRow = this.#db
488
+ .prepare(`
489
+ SELECT COUNT(*) as count
490
+ FROM source_inventory
491
+ WHERE classification = 'unreadable'
492
+ `)
493
+ .get();
494
+ // 2. Invalid sessions scoped to current project/SSH context
495
+ const invalidInScopeRow = this.#db
496
+ .prepare(`
497
+ SELECT COUNT(*) as count
498
+ FROM source_inventory
499
+ WHERE classification = 'invalid'
500
+ AND (project_path IS NOT NULL AND project_path = ?)
501
+ AND (
502
+ (? IS NULL AND ssh_host IS NULL)
503
+ OR
504
+ (ssh_host IS NOT NULL AND ssh_host = ?)
505
+ )
506
+ `)
507
+ .get(normalizedProject, normalizedHost, normalizedHost);
508
+ const unavailable = (unreadableRow?.count ?? 0) + (invalidInScopeRow?.count ?? 0);
509
+ // 3. Skipped message count for all sessions in scope
510
+ const skippedRow = this.#db
511
+ .prepare(`
512
+ SELECT COALESCE(SUM(skipped_count), 0) as total
513
+ FROM sessions
514
+ WHERE (project_path IS NOT NULL AND project_path = ?)
515
+ AND (
516
+ (? IS NULL AND ssh_host IS NULL)
517
+ OR
518
+ (ssh_host IS NOT NULL AND ssh_host = ?)
519
+ )
520
+ `)
521
+ .get(normalizedProject, normalizedHost, normalizedHost);
522
+ const skippedMessageCount = skippedRow?.total ?? 0;
523
+ // 4. Session rows in scope to compute shortRefs
524
+ const sessionRows = this.#db
525
+ .prepare(`
526
+ SELECT id
527
+ FROM sessions
528
+ WHERE (project_path IS NOT NULL AND project_path = ?)
529
+ AND (
530
+ (? IS NULL AND ssh_host IS NULL)
531
+ OR
532
+ (ssh_host IS NOT NULL AND ssh_host = ?)
533
+ )
534
+ ORDER BY updated_at DESC, id ASC
535
+ `)
536
+ .all(normalizedProject, normalizedHost, normalizedHost);
537
+ const shortRefs = uniqueConversationShortRefs(sessionRows);
538
+ // 5. Parse search query into terms
539
+ const terms = termsFor(options.query);
540
+ if (terms.length === 0) {
541
+ return {
542
+ matches: [],
543
+ scope: options.projectPath,
544
+ unavailable,
545
+ skippedMessageCount,
546
+ };
547
+ }
548
+ // 6. Check if FTS5 trigram can be used
549
+ const canUseFts = terms.every((t) => t.length >= 3);
550
+ let candidateRows = [];
551
+ if (canUseFts) {
552
+ try {
553
+ const escapeFtsTerm = (term) => '"' + term.replace(/"/g, '""') + '"';
554
+ const ftsQuery = terms.map(escapeFtsTerm).join(' OR ');
555
+ candidateRows = this.#db
556
+ .prepare(`
557
+ SELECT m.session_id, s.updated_at, m.kind, m.original_message_index, m.original_text
558
+ FROM messages_fts f
559
+ JOIN messages m ON m.id = f.rowid
560
+ JOIN sessions s ON s.id = m.session_id
561
+ WHERE messages_fts MATCH ?
562
+ AND (s.project_path IS NOT NULL AND s.project_path = ?)
563
+ AND (
564
+ (? IS NULL AND s.ssh_host IS NULL)
565
+ OR
566
+ (s.ssh_host IS NOT NULL AND s.ssh_host = ?)
567
+ )
568
+ `)
569
+ .all(ftsQuery, normalizedProject, normalizedHost, normalizedHost);
570
+ }
571
+ catch {
572
+ candidateRows = this.#scopedTextCandidateQuery(terms, normalizedProject, normalizedHost);
573
+ }
574
+ }
575
+ else {
576
+ candidateRows = this.#scopedTextCandidateQuery(terms, normalizedProject, normalizedHost);
577
+ }
578
+ // 7. Exact scoring and snippet generation on top of candidates
579
+ const matches = [];
580
+ for (const row of candidateRows) {
581
+ if (!row.original_text)
582
+ continue;
583
+ const score = scoreText(row.original_text, terms);
584
+ if (score > 0) {
585
+ matches.push({
586
+ sessionId: row.session_id,
587
+ shortRef: shortRefs.get(row.session_id) ?? row.session_id,
588
+ kind: row.kind,
589
+ messageIndex: row.original_message_index,
590
+ snippet: matchCenteredSnippet(row.original_text, terms, SNIPPET_CHARS),
591
+ updatedAt: row.updated_at,
592
+ score,
593
+ });
594
+ }
595
+ }
596
+ return {
597
+ matches,
598
+ scope: options.projectPath,
599
+ unavailable,
600
+ skippedMessageCount,
601
+ };
602
+ }
603
+ #scopedTextCandidateQuery(terms, normalizedProject, normalizedHost) {
604
+ const instrConditions = terms.map(() => 'instr(m.normalized_text, ?) > 0').join(' OR ');
605
+ return this.#db
606
+ .prepare(`
607
+ SELECT m.session_id, s.updated_at, m.kind, m.original_message_index, m.original_text
608
+ FROM messages m
609
+ JOIN sessions s ON s.id = m.session_id
610
+ WHERE (s.project_path IS NOT NULL AND s.project_path = ?)
611
+ AND (
612
+ (? IS NULL AND s.ssh_host IS NULL)
613
+ OR
614
+ (s.ssh_host IS NOT NULL AND s.ssh_host = ?)
615
+ )
616
+ AND (${instrConditions})
617
+ `)
618
+ .all(normalizedProject, normalizedHost, normalizedHost, ...terms);
619
+ }
620
+ /**
621
+ * Diagnostic and test surface: returns the chosen candidate search strategy
622
+ * ('fts5' vs 'scoped_text') and the SQLite EXPLAIN QUERY PLAN rows without executing
623
+ * the candidate or scoring query.
624
+ */
625
+ explainQueryPlan(query, options) {
626
+ this.initialize();
627
+ const normalizedProject = normalizeProjectPath(options.projectPath);
628
+ const normalizedHost = options.sshHost ? normalizeSshHost(options.sshHost) : null;
629
+ const terms = termsFor(query);
630
+ const canUseFts = terms.length > 0 && terms.every((t) => t.length >= 3);
631
+ if (canUseFts) {
632
+ const escapeFtsTerm = (term) => '"' + term.replace(/"/g, '""') + '"';
633
+ const ftsQuery = terms.map(escapeFtsTerm).join(' OR ');
634
+ const plan = this.#db
635
+ .prepare(`
636
+ EXPLAIN QUERY PLAN
637
+ SELECT m.session_id, s.updated_at, m.kind, m.original_message_index, m.original_text
638
+ FROM messages_fts f
639
+ JOIN messages m ON m.id = f.rowid
640
+ JOIN sessions s ON s.id = m.session_id
641
+ WHERE messages_fts MATCH ?
642
+ AND (s.project_path IS NOT NULL AND s.project_path = ?)
643
+ AND (
644
+ (? IS NULL AND s.ssh_host IS NULL)
645
+ OR
646
+ (s.ssh_host IS NOT NULL AND s.ssh_host = ?)
647
+ )
648
+ `)
649
+ .all(ftsQuery, normalizedProject, normalizedHost, normalizedHost);
650
+ return { strategy: 'fts5', plan };
651
+ }
652
+ const instrConditions = terms.length > 0 ? terms.map(() => 'instr(m.normalized_text, ?) > 0').join(' OR ') : '1 = 0';
653
+ const plan = this.#db
654
+ .prepare(`
655
+ EXPLAIN QUERY PLAN
656
+ SELECT m.session_id, s.updated_at, m.kind, m.original_message_index, m.original_text
657
+ FROM messages m
658
+ JOIN sessions s ON s.id = m.session_id
659
+ WHERE (s.project_path IS NOT NULL AND s.project_path = ?)
660
+ AND (
661
+ (? IS NULL AND s.ssh_host IS NULL)
662
+ OR
663
+ (s.ssh_host IS NOT NULL AND s.ssh_host = ?)
664
+ )
665
+ AND (${instrConditions})
666
+ `)
667
+ .all(normalizedProject, normalizedHost, normalizedHost, ...terms);
668
+ return { strategy: 'scoped_text', plan };
669
+ }
670
+ getRevision(sessionId) {
671
+ this.initialize();
672
+ const row = this.#db.prepare('SELECT projection_revision FROM sessions WHERE id = ?').get(sessionId);
673
+ return row?.projection_revision ?? null;
674
+ }
675
+ close() {
676
+ try {
677
+ this.#db.close();
678
+ }
679
+ catch {
680
+ // Ignore if already closed
681
+ }
682
+ }
683
+ }
684
+ //# sourceMappingURL=session-index-database.js.map