@astralyn/pi 1.4.11 → 1.5.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 (564) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/dist/bundle/chunks/anthropic-messages-G5ZGBHOH.js +6 -0
  3. package/dist/bundle/chunks/azure-openai-responses-EMPTMYNF.js +2 -0
  4. package/dist/bundle/chunks/bedrock-converse-stream.js +22 -15
  5. package/dist/bundle/chunks/{chunk-TH3QDDPD.js → chunk-3YGNXVKM.js} +1 -1
  6. package/dist/bundle/chunks/chunk-AXX7FFFD.js +2 -0
  7. package/dist/bundle/chunks/chunk-FNGB3ASD.js +2 -0
  8. package/dist/bundle/chunks/chunk-FPALVF3F.js +4 -0
  9. package/dist/bundle/chunks/chunk-H3UF54OB.js +9 -0
  10. package/dist/bundle/chunks/{chunk-NUQMVNKQ.js → chunk-HLVMLRZJ.js} +58 -62
  11. package/dist/bundle/chunks/chunk-IC6JXX2J.js +10 -0
  12. package/dist/bundle/chunks/{chunk-MZJC45TM.js → chunk-J7L6O5XA.js} +3 -3
  13. package/dist/bundle/chunks/{chunk-DLVLAQEG.js → chunk-KBFO53OG.js} +3 -3
  14. package/dist/bundle/chunks/chunk-M3D4ADUT.js +1503 -0
  15. package/dist/bundle/chunks/{chunk-TPVFPFJP.js → chunk-P7VXFB2M.js} +1 -1
  16. package/dist/bundle/chunks/chunk-PSYLMRL6.js +9 -0
  17. package/dist/bundle/chunks/chunk-QNZARXLE.js +82 -0
  18. package/dist/bundle/chunks/chunk-RAIYJ5FC.js +4 -0
  19. package/dist/bundle/chunks/{chunk-OV2VMHBX.js → chunk-SR6EWNPW.js} +1 -1
  20. package/dist/bundle/chunks/chunk-TA3YH2ZI.js +16 -0
  21. package/dist/bundle/chunks/{chunk-24FY4C5S.js → chunk-TRSJS3FM.js} +1 -1
  22. package/dist/bundle/chunks/chunk-ZRI3ICDE.js +2 -0
  23. package/dist/bundle/chunks/{cli-MBFCFGI2.js → cli-LAZQG54B.js} +11 -9
  24. package/dist/bundle/chunks/{cloudflare-workers-ai-system-one-7BKATOEJ.js → cloudflare-workers-ai-system-one-4L2ABUJE.js} +1 -1
  25. package/dist/bundle/chunks/{execute-VLAIP26K.js → execute-SSRW6NGS.js} +1 -1
  26. package/dist/bundle/chunks/github-copilot.js +1 -1
  27. package/dist/bundle/chunks/{google-generative-ai-HTUSU45F.js → google-generative-ai-OOVDGS5W.js} +1 -1
  28. package/dist/bundle/chunks/{google-vertex-AVQV4P76.js → google-vertex-IK5RNG7J.js} +1 -1
  29. package/dist/bundle/chunks/image-resize-worker.js +1 -1
  30. package/dist/bundle/chunks/kimi-coding.js +1 -1
  31. package/dist/bundle/chunks/{llama-cpp-classify-27QYLJZY.js → llama-cpp-classify-XHAVT37C.js} +1 -1
  32. package/dist/bundle/chunks/meta.js +1 -1
  33. package/dist/bundle/chunks/mistral-conversations-Z56KY4OJ.js +5 -0
  34. package/dist/bundle/chunks/{openai-codex-responses-Q25MHDFX.js → openai-codex-responses-5NAH3SK6.js} +1 -1
  35. package/dist/bundle/chunks/openai-completions-S7S6PO3J.js +7 -0
  36. package/dist/bundle/chunks/{openai-decisions-3WYFPGSK.js → openai-decisions-7A36EAHE.js} +1 -1
  37. package/dist/bundle/chunks/{openai-responses-E4BNZIQK.js → openai-responses-ZQRZJKH4.js} +1 -1
  38. package/dist/bundle/chunks/{openrouter-images-CBP3OPOD.js → openrouter-images-X7PX72ON.js} +1 -1
  39. package/dist/bundle/chunks/pi-messages-TXNWPLI4.js +8 -0
  40. package/dist/bundle/chunks/radius.js +1 -1
  41. package/dist/bundle/chunks/{runtime-3RPOJS5T.js → runtime-X3XOMNXQ.js} +1 -1
  42. package/dist/bundle/chunks/{typesafe-system-one-BNICP2LS.js → typesafe-system-one-XJGMSHWL.js} +1 -1
  43. package/dist/bundle/chunks/virtual-modules-NFDW2JKH.js +2 -0
  44. package/dist/bundle/cli.js +1 -1
  45. package/dist/bundle/index.js +1 -1
  46. package/dist/bundle/rpc-entry.js +1 -1
  47. package/dist/cli/args.d.ts.map +1 -1
  48. package/dist/cli/args.js +8 -7
  49. package/dist/cli/args.js.map +1 -1
  50. package/dist/config.d.ts +10 -0
  51. package/dist/config.d.ts.map +1 -1
  52. package/dist/config.js +24 -5
  53. package/dist/config.js.map +1 -1
  54. package/dist/core/agent-session-runtime.d.ts +0 -5
  55. package/dist/core/agent-session-runtime.d.ts.map +1 -1
  56. package/dist/core/agent-session-runtime.js +12 -28
  57. package/dist/core/agent-session-runtime.js.map +1 -1
  58. package/dist/core/agent-session.d.ts +21 -14
  59. package/dist/core/agent-session.d.ts.map +1 -1
  60. package/dist/core/agent-session.js +67 -93
  61. package/dist/core/agent-session.js.map +1 -1
  62. package/dist/core/compaction/branch-summarization.d.ts +4 -2
  63. package/dist/core/compaction/branch-summarization.d.ts.map +1 -1
  64. package/dist/core/compaction/branch-summarization.js +16 -4
  65. package/dist/core/compaction/branch-summarization.js.map +1 -1
  66. package/dist/core/exec.d.ts +9 -1
  67. package/dist/core/exec.d.ts.map +1 -1
  68. package/dist/core/exec.js +104 -60
  69. package/dist/core/exec.js.map +1 -1
  70. package/dist/core/export-html/template.css +9 -0
  71. package/dist/core/export-html/template.js +165 -45
  72. package/dist/core/export-html/tool-renderer.d.ts.map +1 -1
  73. package/dist/core/export-html/tool-renderer.js +5 -0
  74. package/dist/core/export-html/tool-renderer.js.map +1 -1
  75. package/dist/core/extensions/index.d.ts +1 -1
  76. package/dist/core/extensions/index.d.ts.map +1 -1
  77. package/dist/core/extensions/index.js.map +1 -1
  78. package/dist/core/extensions/loader.d.ts.map +1 -1
  79. package/dist/core/extensions/loader.js +7 -6
  80. package/dist/core/extensions/loader.js.map +1 -1
  81. package/dist/core/extensions/pi-ai-extension-view.d.ts +19 -0
  82. package/dist/core/extensions/pi-ai-extension-view.d.ts.map +1 -0
  83. package/dist/core/extensions/pi-ai-extension-view.js +22 -0
  84. package/dist/core/extensions/pi-ai-extension-view.js.map +1 -0
  85. package/dist/core/extensions/runner.d.ts +0 -1
  86. package/dist/core/extensions/runner.d.ts.map +1 -1
  87. package/dist/core/extensions/runner.js +7 -12
  88. package/dist/core/extensions/runner.js.map +1 -1
  89. package/dist/core/extensions/types.d.ts +41 -23
  90. package/dist/core/extensions/types.d.ts.map +1 -1
  91. package/dist/core/extensions/types.js.map +1 -1
  92. package/dist/core/extensions/virtual-modules.d.ts.map +1 -1
  93. package/dist/core/extensions/virtual-modules.js +8 -7
  94. package/dist/core/extensions/virtual-modules.js.map +1 -1
  95. package/dist/core/mcp-servers.d.ts +11 -4
  96. package/dist/core/mcp-servers.d.ts.map +1 -1
  97. package/dist/core/mcp-servers.js +15 -5
  98. package/dist/core/mcp-servers.js.map +1 -1
  99. package/dist/core/model-config.d.ts +1678 -2029
  100. package/dist/core/model-config.d.ts.map +1 -1
  101. package/dist/core/model-config.js +2 -3
  102. package/dist/core/model-config.js.map +1 -1
  103. package/dist/core/model-resolver.d.ts.map +1 -1
  104. package/dist/core/model-resolver.js +16 -10
  105. package/dist/core/model-resolver.js.map +1 -1
  106. package/dist/core/package-manager.d.ts +14 -0
  107. package/dist/core/package-manager.d.ts.map +1 -1
  108. package/dist/core/package-manager.js +160 -46
  109. package/dist/core/package-manager.js.map +1 -1
  110. package/dist/core/pi-ai-schemas.d.ts +163 -0
  111. package/dist/core/pi-ai-schemas.d.ts.map +1 -0
  112. package/dist/core/pi-ai-schemas.js +21 -0
  113. package/dist/core/pi-ai-schemas.js.map +1 -0
  114. package/dist/core/pi-manifest.d.ts +1 -0
  115. package/dist/core/pi-manifest.d.ts.map +1 -1
  116. package/dist/core/pi-manifest.js +4 -0
  117. package/dist/core/pi-manifest.js.map +1 -1
  118. package/dist/core/project-trust.js +1 -1
  119. package/dist/core/project-trust.js.map +1 -1
  120. package/dist/core/quiescence.d.ts +24 -0
  121. package/dist/core/quiescence.d.ts.map +1 -0
  122. package/dist/core/quiescence.js +81 -0
  123. package/dist/core/quiescence.js.map +1 -0
  124. package/dist/core/resource-loader.d.ts +4 -1
  125. package/dist/core/resource-loader.d.ts.map +1 -1
  126. package/dist/core/resource-loader.js +41 -28
  127. package/dist/core/resource-loader.js.map +1 -1
  128. package/dist/core/sdk.d.ts.map +1 -1
  129. package/dist/core/sdk.js +3 -1
  130. package/dist/core/sdk.js.map +1 -1
  131. package/dist/core/session-manager.d.ts +7 -0
  132. package/dist/core/session-manager.d.ts.map +1 -1
  133. package/dist/core/session-manager.js +32 -13
  134. package/dist/core/session-manager.js.map +1 -1
  135. package/dist/core/settings-manager.d.ts +2 -0
  136. package/dist/core/settings-manager.d.ts.map +1 -1
  137. package/dist/core/settings-manager.js +11 -0
  138. package/dist/core/settings-manager.js.map +1 -1
  139. package/dist/core/settings-schema.d.ts +4 -2
  140. package/dist/core/settings-schema.d.ts.map +1 -1
  141. package/dist/core/settings-schema.js +8 -1
  142. package/dist/core/settings-schema.js.map +1 -1
  143. package/dist/core/skills.d.ts.map +1 -1
  144. package/dist/core/skills.js +6 -14
  145. package/dist/core/skills.js.map +1 -1
  146. package/dist/core/slash-command-name.d.ts +6 -0
  147. package/dist/core/slash-command-name.d.ts.map +1 -0
  148. package/dist/core/slash-command-name.js +11 -0
  149. package/dist/core/slash-command-name.js.map +1 -0
  150. package/dist/core/slash-commands.js +2 -2
  151. package/dist/core/slash-commands.js.map +1 -1
  152. package/dist/core/source-info.d.ts +9 -0
  153. package/dist/core/source-info.d.ts.map +1 -1
  154. package/dist/core/source-info.js +13 -0
  155. package/dist/core/source-info.js.map +1 -1
  156. package/dist/core/system-prompt.d.ts.map +1 -1
  157. package/dist/core/system-prompt.js +5 -6
  158. package/dist/core/system-prompt.js.map +1 -1
  159. package/dist/core/tasks/activity.d.ts +14 -0
  160. package/dist/core/tasks/activity.d.ts.map +1 -0
  161. package/dist/core/tasks/activity.js +58 -0
  162. package/dist/core/tasks/activity.js.map +1 -0
  163. package/dist/core/tasks/codec.d.ts +14 -0
  164. package/dist/core/tasks/codec.d.ts.map +1 -1
  165. package/dist/core/tasks/codec.js +57 -4
  166. package/dist/core/tasks/codec.js.map +1 -1
  167. package/dist/core/tasks/execution.d.ts.map +1 -1
  168. package/dist/core/tasks/execution.js +2 -2
  169. package/dist/core/tasks/execution.js.map +1 -1
  170. package/dist/core/tasks/output.d.ts +4 -1
  171. package/dist/core/tasks/output.d.ts.map +1 -1
  172. package/dist/core/tasks/output.js +33 -0
  173. package/dist/core/tasks/output.js.map +1 -1
  174. package/dist/core/tasks/record.d.ts +1 -7
  175. package/dist/core/tasks/record.d.ts.map +1 -1
  176. package/dist/core/tasks/record.js +0 -18
  177. package/dist/core/tasks/record.js.map +1 -1
  178. package/dist/core/tasks/reminder.d.ts +3 -2
  179. package/dist/core/tasks/reminder.d.ts.map +1 -1
  180. package/dist/core/tasks/reminder.js +4 -3
  181. package/dist/core/tasks/reminder.js.map +1 -1
  182. package/dist/core/tasks/runtime.d.ts +0 -2
  183. package/dist/core/tasks/runtime.d.ts.map +1 -1
  184. package/dist/core/tasks/runtime.js +2 -15
  185. package/dist/core/tasks/runtime.js.map +1 -1
  186. package/dist/core/tasks/session.d.ts +9 -2
  187. package/dist/core/tasks/session.d.ts.map +1 -1
  188. package/dist/core/tasks/session.js +23 -9
  189. package/dist/core/tasks/session.js.map +1 -1
  190. package/dist/core/tasks/types.d.ts +20 -20
  191. package/dist/core/tasks/types.d.ts.map +1 -1
  192. package/dist/core/tasks/types.js +1 -1
  193. package/dist/core/tasks/types.js.map +1 -1
  194. package/dist/core/tools/bash.d.ts +8 -7
  195. package/dist/core/tools/bash.d.ts.map +1 -1
  196. package/dist/core/tools/bash.js +6 -5
  197. package/dist/core/tools/bash.js.map +1 -1
  198. package/dist/core/tools/edit.d.ts +3 -3
  199. package/dist/core/tools/edit.d.ts.map +1 -1
  200. package/dist/core/tools/edit.js +2 -4
  201. package/dist/core/tools/edit.js.map +1 -1
  202. package/dist/core/tools/find.d.ts +2 -2
  203. package/dist/core/tools/find.d.ts.map +1 -1
  204. package/dist/core/tools/find.js.map +1 -1
  205. package/dist/core/tools/grep.d.ts +2 -2
  206. package/dist/core/tools/grep.d.ts.map +1 -1
  207. package/dist/core/tools/grep.js +1 -1
  208. package/dist/core/tools/grep.js.map +1 -1
  209. package/dist/core/tools/ls.d.ts +2 -2
  210. package/dist/core/tools/ls.d.ts.map +1 -1
  211. package/dist/core/tools/ls.js.map +1 -1
  212. package/dist/core/tools/powershell.d.ts +1 -5
  213. package/dist/core/tools/powershell.d.ts.map +1 -1
  214. package/dist/core/tools/read.d.ts +2 -2
  215. package/dist/core/tools/read.d.ts.map +1 -1
  216. package/dist/core/tools/read.js.map +1 -1
  217. package/dist/core/tools/render-utils.d.ts +4 -6
  218. package/dist/core/tools/render-utils.d.ts.map +1 -1
  219. package/dist/core/tools/render-utils.js +19 -41
  220. package/dist/core/tools/render-utils.js.map +1 -1
  221. package/dist/core/tools/renderers/bash.d.ts.map +1 -1
  222. package/dist/core/tools/renderers/bash.js +3 -25
  223. package/dist/core/tools/renderers/bash.js.map +1 -1
  224. package/dist/core/tools/renderers/write.d.ts.map +1 -1
  225. package/dist/core/tools/renderers/write.js +18 -19
  226. package/dist/core/tools/renderers/write.js.map +1 -1
  227. package/dist/core/tools/shell-execution.d.ts +20 -13
  228. package/dist/core/tools/shell-execution.d.ts.map +1 -1
  229. package/dist/core/tools/shell-execution.js +165 -183
  230. package/dist/core/tools/shell-execution.js.map +1 -1
  231. package/dist/core/tools/shell-tool.d.ts +9 -14
  232. package/dist/core/tools/shell-tool.d.ts.map +1 -1
  233. package/dist/core/tools/shell-tool.js +38 -66
  234. package/dist/core/tools/shell-tool.js.map +1 -1
  235. package/dist/core/tools/tool-definition-wrapper.d.ts +14 -4
  236. package/dist/core/tools/tool-definition-wrapper.d.ts.map +1 -1
  237. package/dist/core/tools/tool-definition-wrapper.js +2 -3
  238. package/dist/core/tools/tool-definition-wrapper.js.map +1 -1
  239. package/dist/core/tools/write.d.ts +2 -2
  240. package/dist/core/tools/write.d.ts.map +1 -1
  241. package/dist/core/tools/write.js.map +1 -1
  242. package/dist/core/trust-manager.d.ts.map +1 -1
  243. package/dist/core/trust-manager.js +30 -13
  244. package/dist/core/trust-manager.js.map +1 -1
  245. package/dist/core/usage-totals.d.ts +0 -9
  246. package/dist/core/usage-totals.d.ts.map +1 -1
  247. package/dist/core/usage-totals.js +24 -91
  248. package/dist/core/usage-totals.js.map +1 -1
  249. package/dist/extensions/agent/activity-lines.d.ts +2 -7
  250. package/dist/extensions/agent/activity-lines.d.ts.map +1 -1
  251. package/dist/extensions/agent/activity-lines.js +6 -74
  252. package/dist/extensions/agent/activity-lines.js.map +1 -1
  253. package/dist/extensions/agent/activity.d.ts +0 -21
  254. package/dist/extensions/agent/activity.d.ts.map +1 -1
  255. package/dist/extensions/agent/activity.js +0 -63
  256. package/dist/extensions/agent/activity.js.map +1 -1
  257. package/dist/extensions/agent/progress.d.ts +0 -3
  258. package/dist/extensions/agent/progress.d.ts.map +1 -1
  259. package/dist/extensions/agent/progress.js +11 -10
  260. package/dist/extensions/agent/progress.js.map +1 -1
  261. package/dist/extensions/agent/render.js +1 -1
  262. package/dist/extensions/agent/render.js.map +1 -1
  263. package/dist/extensions/agent/tool.d.ts.map +1 -1
  264. package/dist/extensions/agent/tool.js +0 -6
  265. package/dist/extensions/agent/tool.js.map +1 -1
  266. package/dist/extensions/agent/types.d.ts +3 -11
  267. package/dist/extensions/agent/types.d.ts.map +1 -1
  268. package/dist/extensions/agent/types.js.map +1 -1
  269. package/dist/{core/isolated-session.d.ts → extensions/agent/worker-session.d.ts} +6 -6
  270. package/dist/extensions/agent/worker-session.d.ts.map +1 -0
  271. package/dist/{core/isolated-session.js → extensions/agent/worker-session.js} +9 -9
  272. package/dist/extensions/agent/worker-session.js.map +1 -0
  273. package/dist/extensions/agent/worker.d.ts +0 -3
  274. package/dist/extensions/agent/worker.d.ts.map +1 -1
  275. package/dist/extensions/agent/worker.js +2 -3
  276. package/dist/extensions/agent/worker.js.map +1 -1
  277. package/dist/extensions/btw/agent.d.ts.map +1 -1
  278. package/dist/extensions/btw/agent.js +2 -1
  279. package/dist/extensions/btw/agent.js.map +1 -1
  280. package/dist/extensions/cached-compaction/render.d.ts.map +1 -1
  281. package/dist/extensions/cached-compaction/render.js +3 -3
  282. package/dist/extensions/cached-compaction/render.js.map +1 -1
  283. package/dist/extensions/codemode/renderer.d.ts.map +1 -1
  284. package/dist/extensions/codemode/renderer.js +6 -2
  285. package/dist/extensions/codemode/renderer.js.map +1 -1
  286. package/dist/extensions/codemode/tool.d.ts +2 -1
  287. package/dist/extensions/codemode/tool.d.ts.map +1 -1
  288. package/dist/extensions/codemode/tool.js +33 -8
  289. package/dist/extensions/codemode/tool.js.map +1 -1
  290. package/dist/extensions/deepwiki/schema.d.ts.map +1 -1
  291. package/dist/extensions/deepwiki/schema.js +1 -1
  292. package/dist/extensions/deepwiki/schema.js.map +1 -1
  293. package/dist/extensions/llama/ui.d.ts.map +1 -1
  294. package/dist/extensions/llama/ui.js +16 -4
  295. package/dist/extensions/llama/ui.js.map +1 -1
  296. package/dist/extensions/mcp/cli.d.ts.map +1 -1
  297. package/dist/extensions/mcp/cli.js +34 -8
  298. package/dist/extensions/mcp/cli.js.map +1 -1
  299. package/dist/extensions/mcp/oauth.d.ts +1 -1
  300. package/dist/extensions/mcp/oauth.d.ts.map +1 -1
  301. package/dist/extensions/mcp/oauth.js +36 -13
  302. package/dist/extensions/mcp/oauth.js.map +1 -1
  303. package/dist/extensions/mcp/ui.d.ts +1 -0
  304. package/dist/extensions/mcp/ui.d.ts.map +1 -1
  305. package/dist/extensions/mcp/ui.js +33 -24
  306. package/dist/extensions/mcp/ui.js.map +1 -1
  307. package/dist/extensions/run-summary/index.d.ts +1 -1
  308. package/dist/extensions/run-summary/index.d.ts.map +1 -1
  309. package/dist/extensions/run-summary/index.js +11 -23
  310. package/dist/extensions/run-summary/index.js.map +1 -1
  311. package/dist/extensions/statusline/usage.d.ts.map +1 -1
  312. package/dist/extensions/statusline/usage.js +2 -1
  313. package/dist/extensions/statusline/usage.js.map +1 -1
  314. package/dist/extensions/tasks/tool/schema.d.ts.map +1 -1
  315. package/dist/extensions/tasks/tool/schema.js +1 -1
  316. package/dist/extensions/tasks/tool/schema.js.map +1 -1
  317. package/dist/extensions/tasks/ui/completion-render.d.ts +5 -1
  318. package/dist/extensions/tasks/ui/completion-render.d.ts.map +1 -1
  319. package/dist/extensions/tasks/ui/completion-render.js +25 -70
  320. package/dist/extensions/tasks/ui/completion-render.js.map +1 -1
  321. package/dist/extensions/tasks/ui/inspector.d.ts +1 -1
  322. package/dist/extensions/tasks/ui/inspector.d.ts.map +1 -1
  323. package/dist/extensions/tasks/ui/inspector.js +3 -7
  324. package/dist/extensions/tasks/ui/inspector.js.map +1 -1
  325. package/dist/extensions/tasks/ui/manager.d.ts +1 -1
  326. package/dist/extensions/tasks/ui/manager.d.ts.map +1 -1
  327. package/dist/extensions/tasks/ui/manager.js.map +1 -1
  328. package/dist/extensions/tasks/ui/views.d.ts +3 -4
  329. package/dist/extensions/tasks/ui/views.d.ts.map +1 -1
  330. package/dist/extensions/tasks/ui/views.js +15 -14
  331. package/dist/extensions/tasks/ui/views.js.map +1 -1
  332. package/dist/extensions/tool-presentation/fallback.d.ts.map +1 -0
  333. package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/fallback.js +5 -5
  334. package/dist/extensions/tool-presentation/fallback.js.map +1 -0
  335. package/dist/extensions/tool-presentation/index.js +1 -1
  336. package/dist/extensions/tool-presentation/index.js.map +1 -1
  337. package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/shell.d.ts +1 -1
  338. package/dist/extensions/tool-presentation/shell.d.ts.map +1 -0
  339. package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/shell.js +3 -3
  340. package/dist/extensions/tool-presentation/shell.js.map +1 -0
  341. package/dist/extensions/tool-search/tool.d.ts +21 -6
  342. package/dist/extensions/tool-search/tool.d.ts.map +1 -1
  343. package/dist/extensions/tool-search/tool.js +104 -36
  344. package/dist/extensions/tool-search/tool.js.map +1 -1
  345. package/dist/index.d.ts +3 -3
  346. package/dist/index.d.ts.map +1 -1
  347. package/dist/index.js.map +1 -1
  348. package/dist/main.d.ts.map +1 -1
  349. package/dist/main.js +15 -8
  350. package/dist/main.js.map +1 -1
  351. package/dist/modes/interactive/components/assistant-message.d.ts +5 -3
  352. package/dist/modes/interactive/components/assistant-message.d.ts.map +1 -1
  353. package/dist/modes/interactive/components/assistant-message.js +61 -45
  354. package/dist/modes/interactive/components/assistant-message.js.map +1 -1
  355. package/dist/modes/interactive/components/config-selector-skills.d.ts +54 -0
  356. package/dist/modes/interactive/components/config-selector-skills.d.ts.map +1 -0
  357. package/dist/modes/interactive/components/config-selector-skills.js +178 -0
  358. package/dist/modes/interactive/components/config-selector-skills.js.map +1 -0
  359. package/dist/modes/interactive/components/config-selector.d.ts +2 -11
  360. package/dist/modes/interactive/components/config-selector.d.ts.map +1 -1
  361. package/dist/modes/interactive/components/config-selector.js +31 -181
  362. package/dist/modes/interactive/components/config-selector.js.map +1 -1
  363. package/dist/modes/interactive/components/custom-editor.d.ts.map +1 -1
  364. package/dist/modes/interactive/components/custom-editor.js +7 -0
  365. package/dist/modes/interactive/components/custom-editor.js.map +1 -1
  366. package/dist/modes/interactive/components/custom-entry.d.ts.map +1 -1
  367. package/dist/modes/interactive/components/custom-entry.js +2 -1
  368. package/dist/modes/interactive/components/custom-entry.js.map +1 -1
  369. package/dist/modes/interactive/components/custom-message.d.ts.map +1 -1
  370. package/dist/modes/interactive/components/custom-message.js +2 -1
  371. package/dist/modes/interactive/components/custom-message.js.map +1 -1
  372. package/dist/modes/interactive/components/extension-editor.d.ts +2 -0
  373. package/dist/modes/interactive/components/extension-editor.d.ts.map +1 -1
  374. package/dist/modes/interactive/components/extension-editor.js +4 -0
  375. package/dist/modes/interactive/components/extension-editor.js.map +1 -1
  376. package/dist/modes/interactive/components/login-dialog.d.ts +5 -0
  377. package/dist/modes/interactive/components/login-dialog.d.ts.map +1 -1
  378. package/dist/modes/interactive/components/login-dialog.js +103 -10
  379. package/dist/modes/interactive/components/login-dialog.js.map +1 -1
  380. package/dist/modes/interactive/components/markdown-transform.d.ts +2 -1
  381. package/dist/modes/interactive/components/markdown-transform.d.ts.map +1 -1
  382. package/dist/modes/interactive/components/markdown-transform.js +3 -2
  383. package/dist/modes/interactive/components/markdown-transform.js.map +1 -1
  384. package/dist/modes/interactive/components/model-selector.d.ts +1 -0
  385. package/dist/modes/interactive/components/model-selector.d.ts.map +1 -1
  386. package/dist/modes/interactive/components/model-selector.js +17 -6
  387. package/dist/modes/interactive/components/model-selector.js.map +1 -1
  388. package/dist/modes/interactive/components/oauth-selector.d.ts +1 -0
  389. package/dist/modes/interactive/components/oauth-selector.d.ts.map +1 -1
  390. package/dist/modes/interactive/components/oauth-selector.js +13 -4
  391. package/dist/modes/interactive/components/oauth-selector.js.map +1 -1
  392. package/dist/modes/interactive/components/scoped-models-selector.d.ts +1 -0
  393. package/dist/modes/interactive/components/scoped-models-selector.d.ts.map +1 -1
  394. package/dist/modes/interactive/components/scoped-models-selector.js +14 -3
  395. package/dist/modes/interactive/components/scoped-models-selector.js.map +1 -1
  396. package/dist/modes/interactive/components/session-selector-search.d.ts +4 -0
  397. package/dist/modes/interactive/components/session-selector-search.d.ts.map +1 -1
  398. package/dist/modes/interactive/components/session-selector-search.js +86 -22
  399. package/dist/modes/interactive/components/session-selector-search.js.map +1 -1
  400. package/dist/modes/interactive/components/session-selector.d.ts +2 -1
  401. package/dist/modes/interactive/components/session-selector.d.ts.map +1 -1
  402. package/dist/modes/interactive/components/session-selector.js +15 -23
  403. package/dist/modes/interactive/components/session-selector.js.map +1 -1
  404. package/dist/modes/interactive/components/settings-submenu.d.ts.map +1 -1
  405. package/dist/modes/interactive/components/settings-submenu.js +2 -0
  406. package/dist/modes/interactive/components/settings-submenu.js.map +1 -1
  407. package/dist/modes/interactive/components/task-activity-list.d.ts +5 -0
  408. package/dist/modes/interactive/components/task-activity-list.d.ts.map +1 -0
  409. package/dist/modes/interactive/components/task-activity-list.js +68 -0
  410. package/dist/modes/interactive/components/task-activity-list.js.map +1 -0
  411. package/dist/modes/interactive/components/tool-execution.d.ts +7 -0
  412. package/dist/modes/interactive/components/tool-execution.d.ts.map +1 -1
  413. package/dist/modes/interactive/components/tool-execution.js +48 -9
  414. package/dist/modes/interactive/components/tool-execution.js.map +1 -1
  415. package/dist/modes/interactive/components/tree-selector.d.ts +1 -0
  416. package/dist/modes/interactive/components/tree-selector.d.ts.map +1 -1
  417. package/dist/modes/interactive/components/tree-selector.js +5 -6
  418. package/dist/modes/interactive/components/tree-selector.js.map +1 -1
  419. package/dist/modes/interactive/components/user-message-selector.d.ts +1 -0
  420. package/dist/modes/interactive/components/user-message-selector.d.ts.map +1 -1
  421. package/dist/modes/interactive/components/user-message-selector.js +9 -1
  422. package/dist/modes/interactive/components/user-message-selector.js.map +1 -1
  423. package/dist/modes/interactive/components/user-message.d.ts +3 -1
  424. package/dist/modes/interactive/components/user-message.d.ts.map +1 -1
  425. package/dist/modes/interactive/components/user-message.js +4 -2
  426. package/dist/modes/interactive/components/user-message.js.map +1 -1
  427. package/dist/modes/interactive/editor-host.d.ts.map +1 -1
  428. package/dist/modes/interactive/editor-host.js +3 -2
  429. package/dist/modes/interactive/editor-host.js.map +1 -1
  430. package/dist/modes/interactive/external-editor.d.ts +1 -0
  431. package/dist/modes/interactive/external-editor.d.ts.map +1 -1
  432. package/dist/modes/interactive/external-editor.js +17 -5
  433. package/dist/modes/interactive/external-editor.js.map +1 -1
  434. package/dist/modes/interactive/interactive-mode.d.ts +8 -12
  435. package/dist/modes/interactive/interactive-mode.d.ts.map +1 -1
  436. package/dist/modes/interactive/interactive-mode.js +169 -112
  437. package/dist/modes/interactive/interactive-mode.js.map +1 -1
  438. package/dist/modes/interactive/model-search.d.ts +10 -0
  439. package/dist/modes/interactive/model-search.d.ts.map +1 -1
  440. package/dist/modes/interactive/model-search.js +21 -0
  441. package/dist/modes/interactive/model-search.js.map +1 -1
  442. package/dist/modes/interactive/theme/theme.d.ts +10 -0
  443. package/dist/modes/interactive/theme/theme.d.ts.map +1 -1
  444. package/dist/modes/interactive/theme/theme.js +30 -23
  445. package/dist/modes/interactive/theme/theme.js.map +1 -1
  446. package/dist/modes/interactive/tool-view/chat.d.ts +2 -2
  447. package/dist/modes/interactive/tool-view/chat.d.ts.map +1 -1
  448. package/dist/modes/interactive/tool-view/chat.js +22 -19
  449. package/dist/modes/interactive/tool-view/chat.js.map +1 -1
  450. package/dist/modes/interactive/transcript-layout.d.ts +2 -0
  451. package/dist/modes/interactive/transcript-layout.d.ts.map +1 -1
  452. package/dist/modes/interactive/transcript-layout.js +5 -2
  453. package/dist/modes/interactive/transcript-layout.js.map +1 -1
  454. package/dist/modes/rpc/rpc-client.d.ts +9 -1
  455. package/dist/modes/rpc/rpc-client.d.ts.map +1 -1
  456. package/dist/modes/rpc/rpc-client.js +23 -23
  457. package/dist/modes/rpc/rpc-client.js.map +1 -1
  458. package/dist/modes/rpc/rpc-mode.d.ts.map +1 -1
  459. package/dist/modes/rpc/rpc-mode.js +0 -3
  460. package/dist/modes/rpc/rpc-mode.js.map +1 -1
  461. package/dist/package-manager-cli.d.ts.map +1 -1
  462. package/dist/package-manager-cli.js +55 -4
  463. package/dist/package-manager-cli.js.map +1 -1
  464. package/dist/utils/ansi.d.ts.map +1 -1
  465. package/dist/utils/ansi.js +5 -2
  466. package/dist/utils/ansi.js.map +1 -1
  467. package/dist/utils/clipboard-command.d.ts.map +1 -1
  468. package/dist/utils/clipboard-command.js +4 -0
  469. package/dist/utils/clipboard-command.js.map +1 -1
  470. package/dist/utils/git.d.ts +1 -1
  471. package/dist/utils/git.d.ts.map +1 -1
  472. package/dist/utils/git.js.map +1 -1
  473. package/dist/utils/image-resize-core.d.ts.map +1 -1
  474. package/dist/utils/image-resize-core.js +5 -3
  475. package/dist/utils/image-resize-core.js.map +1 -1
  476. package/dist/utils/open-browser.d.ts.map +1 -1
  477. package/dist/utils/open-browser.js +4 -1
  478. package/dist/utils/open-browser.js.map +1 -1
  479. package/dist/utils/paths.d.ts +17 -0
  480. package/dist/utils/paths.d.ts.map +1 -1
  481. package/dist/utils/paths.js +42 -1
  482. package/dist/utils/paths.js.map +1 -1
  483. package/dist/utils/shell.d.ts.map +1 -1
  484. package/dist/utils/shell.js +14 -0
  485. package/dist/utils/shell.js.map +1 -1
  486. package/dist/utils/syntax-highlight.d.ts +5 -0
  487. package/dist/utils/syntax-highlight.d.ts.map +1 -1
  488. package/dist/utils/syntax-highlight.js +7 -0
  489. package/dist/utils/syntax-highlight.js.map +1 -1
  490. package/dist/utils/tools-manager.d.ts.map +1 -1
  491. package/dist/utils/tools-manager.js +30 -35
  492. package/dist/utils/tools-manager.js.map +1 -1
  493. package/dist/utils/usage.d.ts +5 -0
  494. package/dist/utils/usage.d.ts.map +1 -0
  495. package/dist/utils/usage.js +16 -0
  496. package/dist/utils/usage.js.map +1 -0
  497. package/docs/bundled/README.md +1 -1
  498. package/docs/bundled/extensions/agent.md +5 -5
  499. package/docs/bundled/extensions/run-summary.md +4 -4
  500. package/docs/bundled/tasks.md +2 -4
  501. package/docs/bundled/tool-presentation.md +2 -2
  502. package/docs/custom-provider.md +1 -1
  503. package/docs/environment-variables.md +2 -0
  504. package/docs/extensions.md +38 -21
  505. package/docs/keybindings.md +1 -1
  506. package/docs/llama-cpp.md +17 -12
  507. package/docs/mcp.md +6 -4
  508. package/docs/packages.md +26 -1
  509. package/docs/rpc.md +1 -1
  510. package/docs/sdk.md +7 -5
  511. package/docs/session-format.md +2 -2
  512. package/docs/sessions.md +10 -0
  513. package/docs/settings.md +5 -4
  514. package/docs/terminal-setup.md +2 -2
  515. package/docs/tmux.md +6 -0
  516. package/docs/tui.md +12 -7
  517. package/docs/usage.md +19 -9
  518. package/docs/windows.md +29 -0
  519. package/examples/extensions/README.md +2 -1
  520. package/examples/extensions/custom-provider-anthropic/index.ts +27 -31
  521. package/examples/extensions/custom-provider-anthropic/package-lock.json +2 -2
  522. package/examples/extensions/custom-provider-anthropic/package.json +1 -1
  523. package/examples/extensions/custom-provider-gitlab-duo/package.json +1 -1
  524. package/examples/extensions/debug-provider.ts +2 -2
  525. package/examples/extensions/gondolin/package-lock.json +19 -29
  526. package/examples/extensions/gondolin/package.json +2 -2
  527. package/examples/extensions/preset.ts +2 -0
  528. package/examples/extensions/reload-runtime.ts +17 -5
  529. package/examples/extensions/tools.ts +2 -0
  530. package/examples/extensions/with-deps/package-lock.json +2 -2
  531. package/examples/extensions/with-deps/package.json +1 -1
  532. package/package.json +9 -9
  533. package/schemas/models.schema.json +36 -36
  534. package/schemas/settings.schema.json +17 -0
  535. package/dist/bundle/chunks/anthropic-messages-HWL6AS7T.js +0 -6
  536. package/dist/bundle/chunks/azure-openai-responses-4YYPDYV5.js +0 -2
  537. package/dist/bundle/chunks/chunk-6JS2SOFO.js +0 -11
  538. package/dist/bundle/chunks/chunk-ANCZPKX7.js +0 -2
  539. package/dist/bundle/chunks/chunk-FEZ5RM2B.js +0 -2
  540. package/dist/bundle/chunks/chunk-LPF7HQ3S.js +0 -4
  541. package/dist/bundle/chunks/chunk-MMNIHCU7.js +0 -2
  542. package/dist/bundle/chunks/chunk-PUU43PDV.js +0 -1484
  543. package/dist/bundle/chunks/chunk-R267VV5T.js +0 -82
  544. package/dist/bundle/chunks/chunk-RVKT7OUB.js +0 -9
  545. package/dist/bundle/chunks/chunk-SA2AQYEI.js +0 -7
  546. package/dist/bundle/chunks/chunk-ZAIGBRV5.js +0 -16
  547. package/dist/bundle/chunks/mistral-conversations-V2JJTMJ5.js +0 -5
  548. package/dist/bundle/chunks/openai-completions-TXZXILJR.js +0 -7
  549. package/dist/bundle/chunks/pi-messages-LBJQ4NGP.js +0 -8
  550. package/dist/bundle/chunks/virtual-modules-63XNTSVN.js +0 -2
  551. package/dist/core/isolated-session.d.ts.map +0 -1
  552. package/dist/core/isolated-session.js.map +0 -1
  553. package/dist/modes/interactive/tool-view/fallback.d.ts.map +0 -1
  554. package/dist/modes/interactive/tool-view/fallback.js.map +0 -1
  555. package/dist/modes/interactive/tool-view/shell.d.ts.map +0 -1
  556. package/dist/modes/interactive/tool-view/shell.js.map +0 -1
  557. package/dist/utils/path-identity.d.ts +0 -12
  558. package/dist/utils/path-identity.d.ts.map +0 -1
  559. package/dist/utils/path-identity.js +0 -63
  560. package/dist/utils/path-identity.js.map +0 -1
  561. package/examples/extensions/sandbox/index.ts +0 -321
  562. package/examples/extensions/sandbox/package-lock.json +0 -92
  563. package/examples/extensions/sandbox/package.json +0 -19
  564. /package/dist/{modes/interactive/tool-view → extensions/tool-presentation}/fallback.d.ts +0 -0
@@ -2,8 +2,79 @@ import { fuzzyMatch } from "@earendil-works/pi-tui";
2
2
  function normalizeWhitespaceLower(text) {
3
3
  return text.toLowerCase().replace(/\s+/g, " ").trim();
4
4
  }
5
- function getSessionSearchText(session) {
6
- return `${session.id} ${session.name ?? ""} ${session.allMessagesText} ${session.cwd}`;
5
+ /**
6
+ * Match tiers, best first. Each token is scored by the best field it matches; tiers dominate
7
+ * fuzzy scores so an exact hit anywhere beats a scattered subsequence in a short field.
8
+ */
9
+ const TIER_NAME = 0; // query text appears in the session name
10
+ const TIER_TEXT = 1; // query text appears in the session id, messages, or cwd
11
+ const TIER_FUZZY = 2; // query characters appear scattered in the session name or cwd
12
+ const TIER_WEIGHT = 1_000_000;
13
+ /**
14
+ * Lowercased message text per session. allMessagesText holds every user/assistant message and
15
+ * can be megabytes, so lowercase it once instead of on every keystroke.
16
+ */
17
+ const messageTextCache = new WeakMap();
18
+ function getMessageText(session) {
19
+ let cached = messageTextCache.get(session);
20
+ if (!cached || cached.source !== session.allMessagesText) {
21
+ cached = { source: session.allMessagesText, lower: session.allMessagesText.toLowerCase() };
22
+ messageTextCache.set(session, cached);
23
+ }
24
+ return cached;
25
+ }
26
+ function getNormalizedMessageText(session) {
27
+ const cached = getMessageText(session);
28
+ cached.normalized ??= cached.lower.replace(/\s+/g, " ").trim();
29
+ return cached.normalized;
30
+ }
31
+ function tierScore(tier, score = 0) {
32
+ return tier * TIER_WEIGHT + score;
33
+ }
34
+ /** Exact (case-insensitive) text match. Messages and ids are only matched exactly: scattered matches in them are noise. */
35
+ function matchLiteralToken(session, value) {
36
+ const name = session.name?.toLowerCase() ?? "";
37
+ if (name.includes(value))
38
+ return tierScore(TIER_NAME, fuzzyMatch(value, name).score);
39
+ if (session.id.toLowerCase().includes(value))
40
+ return tierScore(TIER_TEXT);
41
+ if (getMessageText(session).lower.includes(value))
42
+ return tierScore(TIER_TEXT);
43
+ if (session.cwd.toLowerCase().includes(value))
44
+ return tierScore(TIER_TEXT);
45
+ return undefined;
46
+ }
47
+ function matchFuzzyToken(session, value) {
48
+ const literal = matchLiteralToken(session, value.toLowerCase());
49
+ if (literal !== undefined)
50
+ return literal;
51
+ let best;
52
+ for (const field of [session.name ?? "", session.cwd]) {
53
+ const m = fuzzyMatch(value, field);
54
+ if (m.matches && (best === undefined || m.score < best))
55
+ best = m.score;
56
+ }
57
+ return best === undefined ? undefined : tierScore(TIER_FUZZY, best);
58
+ }
59
+ function matchPhraseToken(session, phrase) {
60
+ const name = normalizeWhitespaceLower(session.name ?? "");
61
+ if (name.includes(phrase))
62
+ return tierScore(TIER_NAME, fuzzyMatch(phrase, name).score);
63
+ if (session.id.toLowerCase().includes(phrase))
64
+ return tierScore(TIER_TEXT);
65
+ if (getNormalizedMessageText(session).includes(phrase))
66
+ return tierScore(TIER_TEXT);
67
+ if (normalizeWhitespaceLower(session.cwd).includes(phrase))
68
+ return tierScore(TIER_TEXT);
69
+ return undefined;
70
+ }
71
+ function matchRegex(session, regex) {
72
+ if (session.name && regex.test(session.name))
73
+ return tierScore(TIER_NAME);
74
+ if (regex.test(session.id) || regex.test(session.allMessagesText) || regex.test(session.cwd)) {
75
+ return tierScore(TIER_TEXT);
76
+ }
77
+ return undefined;
7
78
  }
8
79
  export function hasSessionName(session) {
9
80
  return Boolean(session.name?.trim());
@@ -82,40 +153,33 @@ export function parseSearchQuery(query) {
82
153
  flush(inQuote ? "phrase" : "fuzzy");
83
154
  return { mode: "tokens", tokens, regex: null };
84
155
  }
156
+ /**
157
+ * Each field is matched separately, so a token never matches across field boundaries.
158
+ * Different tokens may match different fields.
159
+ */
85
160
  export function matchSession(session, parsed) {
86
- const text = getSessionSearchText(session);
87
161
  if (parsed.mode === "regex") {
88
162
  if (!parsed.regex) {
89
163
  return { matches: false, score: 0 };
90
164
  }
91
- const idx = text.search(parsed.regex);
92
- if (idx < 0)
93
- return { matches: false, score: 0 };
94
- return { matches: true, score: idx * 0.1 };
95
- }
96
- if (parsed.tokens.length === 0) {
97
- return { matches: true, score: 0 };
165
+ const score = matchRegex(session, parsed.regex);
166
+ return score === undefined ? { matches: false, score: 0 } : { matches: true, score };
98
167
  }
99
168
  let totalScore = 0;
100
- let normalizedText = null;
101
169
  for (const token of parsed.tokens) {
170
+ let score;
102
171
  if (token.kind === "phrase") {
103
- if (normalizedText === null) {
104
- normalizedText = normalizeWhitespaceLower(text);
105
- }
106
172
  const phrase = normalizeWhitespaceLower(token.value);
107
173
  if (!phrase)
108
174
  continue;
109
- const idx = normalizedText.indexOf(phrase);
110
- if (idx < 0)
111
- return { matches: false, score: 0 };
112
- totalScore += idx * 0.1;
113
- continue;
175
+ score = matchPhraseToken(session, phrase);
176
+ }
177
+ else {
178
+ score = matchFuzzyToken(session, token.value);
114
179
  }
115
- const m = fuzzyMatch(token.value, text);
116
- if (!m.matches)
180
+ if (score === undefined)
117
181
  return { matches: false, score: 0 };
118
- totalScore += m.score;
182
+ totalScore += score;
119
183
  }
120
184
  return { matches: true, score: totalScore };
121
185
  }
@@ -1 +1 @@
1
- {"version":3,"file":"session-selector-search.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/session-selector-search.ts"],"names":[],"mappings":"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","sourcesContent":["import { fuzzyMatch } from \"@earendil-works/pi-tui\";\nimport type { SessionInfo } from \"../../../core/session-manager.ts\";\n\nexport type SortMode = \"threaded\" | \"recent\" | \"relevance\";\n\nexport type NameFilter = \"all\" | \"named\";\n\nexport interface ParsedSearchQuery {\n\tmode: \"tokens\" | \"regex\";\n\ttokens: { kind: \"fuzzy\" | \"phrase\"; value: string }[];\n\tregex: RegExp | null;\n\t/** If set, parsing failed and we should treat query as non-matching. */\n\terror?: string;\n}\n\nexport interface MatchResult {\n\tmatches: boolean;\n\t/** Lower is better; only meaningful when matches === true */\n\tscore: number;\n}\n\nfunction normalizeWhitespaceLower(text: string): string {\n\treturn text.toLowerCase().replace(/\\s+/g, \" \").trim();\n}\n\nfunction getSessionSearchText(session: SessionInfo): string {\n\treturn `${session.id} ${session.name ?? \"\"} ${session.allMessagesText} ${session.cwd}`;\n}\n\nexport function hasSessionName(session: SessionInfo): boolean {\n\treturn Boolean(session.name?.trim());\n}\n\nfunction matchesNameFilter(session: SessionInfo, filter: NameFilter): boolean {\n\tif (filter === \"all\") return true;\n\treturn hasSessionName(session);\n}\n\nexport function parseSearchQuery(query: string): ParsedSearchQuery {\n\tconst trimmed = query.trim();\n\tif (!trimmed) {\n\t\treturn { mode: \"tokens\", tokens: [], regex: null };\n\t}\n\n\t// Regex mode: re:<pattern>\n\tif (trimmed.startsWith(\"re:\")) {\n\t\tconst pattern = trimmed.slice(3).trim();\n\t\tif (!pattern) {\n\t\t\treturn { mode: \"regex\", tokens: [], regex: null, error: \"Empty regex\" };\n\t\t}\n\t\ttry {\n\t\t\treturn { mode: \"regex\", tokens: [], regex: new RegExp(pattern, \"i\") };\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\treturn { mode: \"regex\", tokens: [], regex: null, error: msg };\n\t\t}\n\t}\n\n\t// Token mode with quote support.\n\t// Example: foo \"node cve\" bar\n\tconst tokens: { kind: \"fuzzy\" | \"phrase\"; value: string }[] = [];\n\tlet buf = \"\";\n\tlet inQuote = false;\n\tlet hadUnclosedQuote = false;\n\n\tconst flush = (kind: \"fuzzy\" | \"phrase\"): void => {\n\t\tconst v = buf.trim();\n\t\tbuf = \"\";\n\t\tif (!v) return;\n\t\ttokens.push({ kind, value: v });\n\t};\n\n\tfor (let i = 0; i < trimmed.length; i++) {\n\t\tconst ch = trimmed[i]!;\n\t\tif (ch === '\"') {\n\t\t\tif (inQuote) {\n\t\t\t\tflush(\"phrase\");\n\t\t\t\tinQuote = false;\n\t\t\t} else {\n\t\t\t\tflush(\"fuzzy\");\n\t\t\t\tinQuote = true;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!inQuote && /\\s/.test(ch)) {\n\t\t\tflush(\"fuzzy\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tbuf += ch;\n\t}\n\n\tif (inQuote) {\n\t\thadUnclosedQuote = true;\n\t}\n\n\t// If quotes were unbalanced, fall back to plain whitespace tokenization.\n\tif (hadUnclosedQuote) {\n\t\treturn {\n\t\t\tmode: \"tokens\",\n\t\t\ttokens: trimmed\n\t\t\t\t.split(/\\s+/)\n\t\t\t\t.map((t) => t.trim())\n\t\t\t\t.filter((t) => t.length > 0)\n\t\t\t\t.map((t) => ({ kind: \"fuzzy\" as const, value: t })),\n\t\t\tregex: null,\n\t\t};\n\t}\n\n\tflush(inQuote ? \"phrase\" : \"fuzzy\");\n\n\treturn { mode: \"tokens\", tokens, regex: null };\n}\n\nexport function matchSession(session: SessionInfo, parsed: ParsedSearchQuery): MatchResult {\n\tconst text = getSessionSearchText(session);\n\n\tif (parsed.mode === \"regex\") {\n\t\tif (!parsed.regex) {\n\t\t\treturn { matches: false, score: 0 };\n\t\t}\n\t\tconst idx = text.search(parsed.regex);\n\t\tif (idx < 0) return { matches: false, score: 0 };\n\t\treturn { matches: true, score: idx * 0.1 };\n\t}\n\n\tif (parsed.tokens.length === 0) {\n\t\treturn { matches: true, score: 0 };\n\t}\n\n\tlet totalScore = 0;\n\tlet normalizedText: string | null = null;\n\n\tfor (const token of parsed.tokens) {\n\t\tif (token.kind === \"phrase\") {\n\t\t\tif (normalizedText === null) {\n\t\t\t\tnormalizedText = normalizeWhitespaceLower(text);\n\t\t\t}\n\t\t\tconst phrase = normalizeWhitespaceLower(token.value);\n\t\t\tif (!phrase) continue;\n\t\t\tconst idx = normalizedText.indexOf(phrase);\n\t\t\tif (idx < 0) return { matches: false, score: 0 };\n\t\t\ttotalScore += idx * 0.1;\n\t\t\tcontinue;\n\t\t}\n\n\t\tconst m = fuzzyMatch(token.value, text);\n\t\tif (!m.matches) return { matches: false, score: 0 };\n\t\ttotalScore += m.score;\n\t}\n\n\treturn { matches: true, score: totalScore };\n}\n\nexport function filterAndSortSessions(\n\tsessions: SessionInfo[],\n\tquery: string,\n\tsortMode: SortMode,\n\tnameFilter: NameFilter = \"all\",\n): SessionInfo[] {\n\tconst nameFiltered =\n\t\tnameFilter === \"all\" ? sessions : sessions.filter((session) => matchesNameFilter(session, nameFilter));\n\tconst trimmed = query.trim();\n\tif (!trimmed) return nameFiltered;\n\n\tconst parsed = parseSearchQuery(query);\n\tif (parsed.error) return [];\n\n\t// Recent mode: filter only, keep incoming order.\n\tif (sortMode === \"recent\") {\n\t\tconst filtered: SessionInfo[] = [];\n\t\tfor (const s of nameFiltered) {\n\t\t\tconst res = matchSession(s, parsed);\n\t\t\tif (res.matches) filtered.push(s);\n\t\t}\n\t\treturn filtered;\n\t}\n\n\t// Relevance mode: sort by score, tie-break by modified desc.\n\tconst scored: { session: SessionInfo; score: number }[] = [];\n\tfor (const s of nameFiltered) {\n\t\tconst res = matchSession(s, parsed);\n\t\tif (!res.matches) continue;\n\t\tscored.push({ session: s, score: res.score });\n\t}\n\n\tscored.sort((a, b) => {\n\t\tif (a.score !== b.score) return a.score - b.score;\n\t\treturn b.session.modified.getTime() - a.session.modified.getTime();\n\t});\n\n\treturn scored.map((r) => r.session);\n}\n"]}
1
+ {"version":3,"file":"session-selector-search.js","sourceRoot":"","sources":["../../../../src/modes/interactive/components/session-selector-search.ts"],"names":[],"mappings":"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","sourcesContent":["import { fuzzyMatch } from \"@earendil-works/pi-tui\";\nimport type { SessionInfo } from \"../../../core/session-manager.ts\";\n\nexport type SortMode = \"threaded\" | \"recent\" | \"relevance\";\n\nexport type NameFilter = \"all\" | \"named\";\n\nexport interface ParsedSearchQuery {\n\tmode: \"tokens\" | \"regex\";\n\ttokens: { kind: \"fuzzy\" | \"phrase\"; value: string }[];\n\tregex: RegExp | null;\n\t/** If set, parsing failed and we should treat query as non-matching. */\n\terror?: string;\n}\n\nexport interface MatchResult {\n\tmatches: boolean;\n\t/** Lower is better; only meaningful when matches === true */\n\tscore: number;\n}\n\nfunction normalizeWhitespaceLower(text: string): string {\n\treturn text.toLowerCase().replace(/\\s+/g, \" \").trim();\n}\n\n/**\n * Match tiers, best first. Each token is scored by the best field it matches; tiers dominate\n * fuzzy scores so an exact hit anywhere beats a scattered subsequence in a short field.\n */\nconst TIER_NAME = 0; // query text appears in the session name\nconst TIER_TEXT = 1; // query text appears in the session id, messages, or cwd\nconst TIER_FUZZY = 2; // query characters appear scattered in the session name or cwd\nconst TIER_WEIGHT = 1_000_000;\n\ninterface LowercaseCache {\n\tsource: string;\n\tlower: string;\n\tnormalized?: string;\n}\n\n/**\n * Lowercased message text per session. allMessagesText holds every user/assistant message and\n * can be megabytes, so lowercase it once instead of on every keystroke.\n */\nconst messageTextCache = new WeakMap<SessionInfo, LowercaseCache>();\n\nfunction getMessageText(session: SessionInfo): LowercaseCache {\n\tlet cached = messageTextCache.get(session);\n\tif (!cached || cached.source !== session.allMessagesText) {\n\t\tcached = { source: session.allMessagesText, lower: session.allMessagesText.toLowerCase() };\n\t\tmessageTextCache.set(session, cached);\n\t}\n\treturn cached;\n}\n\nfunction getNormalizedMessageText(session: SessionInfo): string {\n\tconst cached = getMessageText(session);\n\tcached.normalized ??= cached.lower.replace(/\\s+/g, \" \").trim();\n\treturn cached.normalized;\n}\n\nfunction tierScore(tier: number, score = 0): number {\n\treturn tier * TIER_WEIGHT + score;\n}\n\n/** Exact (case-insensitive) text match. Messages and ids are only matched exactly: scattered matches in them are noise. */\nfunction matchLiteralToken(session: SessionInfo, value: string): number | undefined {\n\tconst name = session.name?.toLowerCase() ?? \"\";\n\tif (name.includes(value)) return tierScore(TIER_NAME, fuzzyMatch(value, name).score);\n\tif (session.id.toLowerCase().includes(value)) return tierScore(TIER_TEXT);\n\tif (getMessageText(session).lower.includes(value)) return tierScore(TIER_TEXT);\n\tif (session.cwd.toLowerCase().includes(value)) return tierScore(TIER_TEXT);\n\treturn undefined;\n}\n\nfunction matchFuzzyToken(session: SessionInfo, value: string): number | undefined {\n\tconst literal = matchLiteralToken(session, value.toLowerCase());\n\tif (literal !== undefined) return literal;\n\n\tlet best: number | undefined;\n\tfor (const field of [session.name ?? \"\", session.cwd]) {\n\t\tconst m = fuzzyMatch(value, field);\n\t\tif (m.matches && (best === undefined || m.score < best)) best = m.score;\n\t}\n\treturn best === undefined ? undefined : tierScore(TIER_FUZZY, best);\n}\n\nfunction matchPhraseToken(session: SessionInfo, phrase: string): number | undefined {\n\tconst name = normalizeWhitespaceLower(session.name ?? \"\");\n\tif (name.includes(phrase)) return tierScore(TIER_NAME, fuzzyMatch(phrase, name).score);\n\tif (session.id.toLowerCase().includes(phrase)) return tierScore(TIER_TEXT);\n\tif (getNormalizedMessageText(session).includes(phrase)) return tierScore(TIER_TEXT);\n\tif (normalizeWhitespaceLower(session.cwd).includes(phrase)) return tierScore(TIER_TEXT);\n\treturn undefined;\n}\n\nfunction matchRegex(session: SessionInfo, regex: RegExp): number | undefined {\n\tif (session.name && regex.test(session.name)) return tierScore(TIER_NAME);\n\tif (regex.test(session.id) || regex.test(session.allMessagesText) || regex.test(session.cwd)) {\n\t\treturn tierScore(TIER_TEXT);\n\t}\n\treturn undefined;\n}\n\nexport function hasSessionName(session: SessionInfo): boolean {\n\treturn Boolean(session.name?.trim());\n}\n\nfunction matchesNameFilter(session: SessionInfo, filter: NameFilter): boolean {\n\tif (filter === \"all\") return true;\n\treturn hasSessionName(session);\n}\n\nexport function parseSearchQuery(query: string): ParsedSearchQuery {\n\tconst trimmed = query.trim();\n\tif (!trimmed) {\n\t\treturn { mode: \"tokens\", tokens: [], regex: null };\n\t}\n\n\t// Regex mode: re:<pattern>\n\tif (trimmed.startsWith(\"re:\")) {\n\t\tconst pattern = trimmed.slice(3).trim();\n\t\tif (!pattern) {\n\t\t\treturn { mode: \"regex\", tokens: [], regex: null, error: \"Empty regex\" };\n\t\t}\n\t\ttry {\n\t\t\treturn { mode: \"regex\", tokens: [], regex: new RegExp(pattern, \"i\") };\n\t\t} catch (err) {\n\t\t\tconst msg = err instanceof Error ? err.message : String(err);\n\t\t\treturn { mode: \"regex\", tokens: [], regex: null, error: msg };\n\t\t}\n\t}\n\n\t// Token mode with quote support.\n\t// Example: foo \"node cve\" bar\n\tconst tokens: { kind: \"fuzzy\" | \"phrase\"; value: string }[] = [];\n\tlet buf = \"\";\n\tlet inQuote = false;\n\tlet hadUnclosedQuote = false;\n\n\tconst flush = (kind: \"fuzzy\" | \"phrase\"): void => {\n\t\tconst v = buf.trim();\n\t\tbuf = \"\";\n\t\tif (!v) return;\n\t\ttokens.push({ kind, value: v });\n\t};\n\n\tfor (let i = 0; i < trimmed.length; i++) {\n\t\tconst ch = trimmed[i]!;\n\t\tif (ch === '\"') {\n\t\t\tif (inQuote) {\n\t\t\t\tflush(\"phrase\");\n\t\t\t\tinQuote = false;\n\t\t\t} else {\n\t\t\t\tflush(\"fuzzy\");\n\t\t\t\tinQuote = true;\n\t\t\t}\n\t\t\tcontinue;\n\t\t}\n\n\t\tif (!inQuote && /\\s/.test(ch)) {\n\t\t\tflush(\"fuzzy\");\n\t\t\tcontinue;\n\t\t}\n\n\t\tbuf += ch;\n\t}\n\n\tif (inQuote) {\n\t\thadUnclosedQuote = true;\n\t}\n\n\t// If quotes were unbalanced, fall back to plain whitespace tokenization.\n\tif (hadUnclosedQuote) {\n\t\treturn {\n\t\t\tmode: \"tokens\",\n\t\t\ttokens: trimmed\n\t\t\t\t.split(/\\s+/)\n\t\t\t\t.map((t) => t.trim())\n\t\t\t\t.filter((t) => t.length > 0)\n\t\t\t\t.map((t) => ({ kind: \"fuzzy\" as const, value: t })),\n\t\t\tregex: null,\n\t\t};\n\t}\n\n\tflush(inQuote ? \"phrase\" : \"fuzzy\");\n\n\treturn { mode: \"tokens\", tokens, regex: null };\n}\n\n/**\n * Each field is matched separately, so a token never matches across field boundaries.\n * Different tokens may match different fields.\n */\nexport function matchSession(session: SessionInfo, parsed: ParsedSearchQuery): MatchResult {\n\tif (parsed.mode === \"regex\") {\n\t\tif (!parsed.regex) {\n\t\t\treturn { matches: false, score: 0 };\n\t\t}\n\t\tconst score = matchRegex(session, parsed.regex);\n\t\treturn score === undefined ? { matches: false, score: 0 } : { matches: true, score };\n\t}\n\n\tlet totalScore = 0;\n\n\tfor (const token of parsed.tokens) {\n\t\tlet score: number | undefined;\n\t\tif (token.kind === \"phrase\") {\n\t\t\tconst phrase = normalizeWhitespaceLower(token.value);\n\t\t\tif (!phrase) continue;\n\t\t\tscore = matchPhraseToken(session, phrase);\n\t\t} else {\n\t\t\tscore = matchFuzzyToken(session, token.value);\n\t\t}\n\t\tif (score === undefined) return { matches: false, score: 0 };\n\t\ttotalScore += score;\n\t}\n\n\treturn { matches: true, score: totalScore };\n}\n\nexport function filterAndSortSessions(\n\tsessions: SessionInfo[],\n\tquery: string,\n\tsortMode: SortMode,\n\tnameFilter: NameFilter = \"all\",\n): SessionInfo[] {\n\tconst nameFiltered =\n\t\tnameFilter === \"all\" ? sessions : sessions.filter((session) => matchesNameFilter(session, nameFilter));\n\tconst trimmed = query.trim();\n\tif (!trimmed) return nameFiltered;\n\n\tconst parsed = parseSearchQuery(query);\n\tif (parsed.error) return [];\n\n\t// Recent mode: filter only, keep incoming order.\n\tif (sortMode === \"recent\") {\n\t\tconst filtered: SessionInfo[] = [];\n\t\tfor (const s of nameFiltered) {\n\t\t\tconst res = matchSession(s, parsed);\n\t\t\tif (res.matches) filtered.push(s);\n\t\t}\n\t\treturn filtered;\n\t}\n\n\t// Relevance mode: sort by score, tie-break by modified desc.\n\tconst scored: { session: SessionInfo; score: number }[] = [];\n\tfor (const s of nameFiltered) {\n\t\tconst res = matchSession(s, parsed);\n\t\tif (!res.matches) continue;\n\t\tscored.push({ session: s, score: res.score });\n\t}\n\n\tscored.sort((a, b) => {\n\t\tif (a.score !== b.score) return a.score - b.score;\n\t\treturn b.session.modified.getTime() - a.session.modified.getTime();\n\t});\n\n\treturn scored.map((r) => r.session);\n}\n"]}
@@ -18,7 +18,7 @@ declare class SessionList implements Component, Focusable {
18
18
  private keybindings;
19
19
  private showPath;
20
20
  private confirmingDeletePath;
21
- private currentSessionCanonicalPath?;
21
+ private currentSessionPathKey?;
22
22
  onSelect?: (sessionPath: string) => void;
23
23
  onCancel?: () => void;
24
24
  onExit: () => void;
@@ -62,6 +62,7 @@ export declare function deleteSessionFile(sessionPath: string): Promise<{
62
62
  * Component that renders a session selector
63
63
  */
64
64
  export declare class SessionSelectorComponent extends Container implements Focusable {
65
+ get capturesViewportInput(): boolean;
65
66
  handleInput(data: string): void;
66
67
  private canRename;
67
68
  private sessionList;
@@ -1 +1 @@
1
- {"version":3,"file":"session-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/session-selector.ts"],"names":[],"mappings":"AAIA,OAAO,EACN,KAAK,SAAS,EACd,SAAS,EACT,KAAK,SAAS,EAOd,MAAM,wBAAwB,CAAC;AAChC,OAAO,EAAE,kBAAkB,EAAE,MAAM,8BAA8B,CAAC;AAClE,OAAO,EAGN,KAAK,WAAW,EAChB,KAAK,mBAAmB,EACxB,MAAM,kCAAkC,CAAC;AAK1C,OAAO,EAAyC,KAAK,UAAU,EAAE,KAAK,QAAQ,EAAE,MAAM,8BAA8B,CAAC;AAkQrH;;GAEG;AACH,cAAM,WAAY,YAAW,SAAS,EAAE,SAAS;IACzC,sBAAsB,IAAI,MAAM,GAAG,SAAS;IAInD,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,gBAAgB,CAAyB;IACjD,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,gBAAgB,CAAS;IACjC,OAAO,CAAC,WAAW,CAAQ;IAC3B,OAAO,CAAC,OAAO,CAAS;IACxB,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,QAAQ,CAAS;IACzB,OAAO,CAAC,oBAAoB,CAAuB;IACnD,OAAO,CAAC,2BAA2B,CAAC,CAAS;IACtC,QAAQ,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IACzC,QAAQ,CAAC,EAAE,MAAM,IAAI,CAAC;IACtB,MAAM,EAAE,MAAM,IAAI,CAAY;IAC9B,aAAa,CAAC,EAAE,MAAM,IAAI,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,IAAI,CAAC;IAC1B,kBAAkB,CAAC,EAAE,MAAM,IAAI,CAAC;IAChC,YAAY,CAAC,EAAE,CAAC,QAAQ,EAAE,OAAO,KAAK,IAAI,CAAC;IAC3C,0BAA0B,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,KAAK,IAAI,CAAC;IAC3D,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IACzD,eAAe,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,CAAC;IAChD,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3C,OAAO,CAAC,UAAU,CAAc;IAGhC,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAGzB;gBAGA,QAAQ,EAAE,WAAW,EAAE,EACvB,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,UAAU,EAAE,UAAU,EACtB,WAAW,EAAE,kBAAkB,EAC/B,sBAAsB,CAAC,EAAE,MAAM;IAuBhC,WAAW,CAAC,QAAQ,EAAE,QAAQ,GAAG,IAAI;IAKrC,aAAa,CAAC,UAAU,EAAE,UAAU,GAAG,IAAI;IAK3C,WAAW,CAAC,QAAQ,EAAE,WAAW,EAAE,EAAE,OAAO,EAAE,OAAO,GAAG,IAAI;IAa5D,OAAO,CAAC,cAAc;IAsBtB,OAAO,CAAC,uBAAuB;IAK/B,OAAO,CAAC,yCAAyC;IAajD,OAAO,CAAC,oBAAoB;IAK5B,UAAU,IAAI,IAAI;IAElB,MAAM,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,EAAE;IA4G/B,OAAO,CAAC,eAAe;IAUvB,WAAW,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI;CA2GlC;AAED,KAAK,cAAc,GAAG,CAAC,UAAU,CAAC,EAAE,mBAAmB,EAAE,MAAM,CAAC,EAAE,WAAW,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;AAEzG;;;;GAIG;AACH,wBAAsB,iBAAiB,CACtC,WAAW,EAAE,MAAM,GACjB,OAAO,CAAC;IAAE,EAAE,EAAE,OAAO,CAAC;IAAC,MAAM,EAAE,OAAO,GAAG,QAAQ,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAgDtE;AAED;;GAEG;AACH,qBAAa,wBAAyB,SAAQ,SAAU,YAAW,SAAS;IAC3E,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI;IAc/B,OAAO,CAAC,SAAS,CAAQ;IACzB,OAAO,CAAC,WAAW,CAAc;IACjC,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,WAAW,CAAqB;IACxC,OAAO,CAAC,KAAK,CAA2B;IACxC,OAAO,CAAC,QAAQ,CAAwB;IACxC,OAAO,CAAC,UAAU,CAAqB;IACvC,OAAO,CAAC,eAAe,CAA8B;IACrD,OAAO,CAAC,WAAW,CAA8B;IACjD,OAAO,CAAC,qBAAqB,CAAiB;IAC9C,OAAO,CAAC,iBAAiB,CAAiB;IAC1C,OAAO,CAAC,aAAa,CAAa;IAClC,OAAO,CAAC,aAAa,CAAC,CAA0E;IAChG,OAAO,CAAC,WAAW,CAAgC;IACnD,OAAO,CAAC,OAAO,CAAgC;IAE/C,OAAO,CAAC,IAAI,CAA6B;IACzC,OAAO,CAAC,WAAW,CAAe;IAClC,OAAO,CAAC,gBAAgB,CAAuB;IAG/C,OAAO,CAAC,QAAQ,CAAS;IACzB,IAAI,OAAO,IAAI,OAAO,CAErB;IACD,IAAI,OAAO,CAAC,KAAK,EAAE,OAAO,EAOzB;IAED,OAAO,CAAC,eAAe;gBAetB,qBAAqB,EAAE,cAAc,EACrC,iBAAiB,EAAE,cAAc,EACjC,QAAQ,EAAE,CAAC,WAAW,EAAE,MAAM,KAAK,IAAI,EACvC,QAAQ,EAAE,MAAM,IAAI,EACpB,MAAM,EAAE,MAAM,IAAI,EAClB,aAAa,EAAE,MAAM,IAAI,EACzB,OAAO,CAAC,EAAE;QACT,aAAa,CAAC,EAAE,CAAC,WAAW,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,SAAS,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;QACxF,cAAc,CAAC,EAAE,OAAO,CAAC;QACzB,WAAW,CAAC,EAAE,kBAAkB,CAAC;KACjC,EACD,sBAAsB,CAAC,EAAE,MAAM;IA4GhC,OAAO,CAAC,WAAW;IAanB,OAAO,CAAC,eAAe;IAuBvB,OAAO,CAAC,cAAc;YASR,aAAa;YAwBb,SAAS;IAoEvB,OAAO,CAAC,cAAc;IAQtB,OAAO,CAAC,gBAAgB;YAOV,4BAA4B;IAO1C,OAAO,CAAC,WAAW;IAWnB,cAAc,IAAI,WAAW;CAG7B"}
1
+ {"version":3,"file":"session-selector.d.ts","sourceRoot":"","sources":["../../../../src/modes/interactive/components/session-selector.ts"],"names":[],"mappings":"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"}
@@ -1,24 +1,14 @@
1
1
  import { spawnSync } from "node:child_process";
2
2
  import { existsSync } from "node:fs";
3
3
  import { rm, unlink } from "node:fs/promises";
4
- import * as os from "node:os";
5
4
  import { Container, getKeybindings, Input, Spacer, Text, truncateToWidth, visibleWidth, } from "@earendil-works/pi-tui";
6
5
  import { KeybindingsManager } from "../../../core/keybindings.js";
7
6
  import { getSessionArtifactDir, listSessionOwnedPaths, } from "../../../core/session-manager.js";
8
- import { canonicalizePath as _canonicalizePath } from "../../../utils/paths.js";
7
+ import { canonicalizePath, getPathComparisonKey, shortenHomePath } from "../../../utils/paths.js";
9
8
  import { theme } from "../theme/theme.js";
10
9
  import { DynamicBorder } from "./dynamic-border.js";
11
10
  import { keyHint, keyText } from "./keybinding-hints.js";
12
11
  import { filterAndSortSessions, hasSessionName } from "./session-selector-search.js";
13
- function shortenPath(path) {
14
- const home = os.homedir();
15
- if (!path)
16
- return path;
17
- if (path.startsWith(home)) {
18
- return `~${path.slice(home.length)}`;
19
- }
20
- return path;
21
- }
22
12
  function formatSessionDate(date) {
23
13
  const now = new Date();
24
14
  const diffMs = now.getTime() - date.getTime();
@@ -39,10 +29,9 @@ function formatSessionDate(date) {
39
29
  return `${Math.floor(diffDays / 30)}mo`;
40
30
  return `${Math.floor(diffDays / 365)}y`;
41
31
  }
42
- function canonicalizePath(path) {
43
- if (!path)
44
- return path;
45
- return _canonicalizePath(path);
32
+ /** Comparison key for a session file path; follows symlinks and ignores case on Windows. */
33
+ function getSessionPathKey(path) {
34
+ return getPathComparisonKey(canonicalizePath(path));
46
35
  }
47
36
  class SessionSelectorHeader {
48
37
  constructor(scope, sortMode, nameFilter, requestRender) {
@@ -164,14 +153,14 @@ class SessionSelectorHeader {
164
153
  function buildSessionTree(sessions) {
165
154
  const byPath = new Map();
166
155
  for (const session of sessions) {
167
- const sessionPath = canonicalizePath(session.path) ?? session.path;
156
+ const sessionPath = getSessionPathKey(session.path);
168
157
  byPath.set(sessionPath, { session, children: [], latestActivity: session.modified.getTime() });
169
158
  }
170
159
  const roots = [];
171
160
  for (const session of sessions) {
172
- const sessionPath = canonicalizePath(session.path) ?? session.path;
161
+ const sessionPath = getSessionPathKey(session.path);
173
162
  const node = byPath.get(sessionPath);
174
- const parentPath = canonicalizePath(session.parentSessionPath);
163
+ const parentPath = session.parentSessionPath ? getSessionPathKey(session.parentSessionPath) : undefined;
175
164
  if (parentPath && byPath.has(parentPath)) {
176
165
  byPath.get(parentPath).children.push(node);
177
166
  }
@@ -255,7 +244,7 @@ class SessionList {
255
244
  this.sortMode = sortMode;
256
245
  this.nameFilter = nameFilter;
257
246
  this.keybindings = keybindings;
258
- this.currentSessionCanonicalPath = canonicalizePath(currentSessionFilePath);
247
+ this.currentSessionPathKey = currentSessionFilePath ? getSessionPathKey(currentSessionFilePath) : undefined;
259
248
  this.filterSessions("");
260
249
  // Handle Enter in search input - select current item
261
250
  this.searchInput.onSubmit = () => {
@@ -325,9 +314,9 @@ class SessionList {
325
314
  this.setConfirmingDeletePath(selected.session.path);
326
315
  }
327
316
  isCurrentSessionPath(path) {
328
- if (!this.currentSessionCanonicalPath)
317
+ if (!this.currentSessionPathKey)
329
318
  return false;
330
- return (canonicalizePath(path) ?? path) === this.currentSessionCanonicalPath;
319
+ return getSessionPathKey(path) === this.currentSessionPathKey;
331
320
  }
332
321
  invalidate() { }
333
322
  render(width) {
@@ -378,10 +367,10 @@ class SessionList {
378
367
  const msgCount = String(session.messageCount);
379
368
  let rightPart = `${msgCount} ${age}`;
380
369
  if (this.showCwd && session.cwd) {
381
- rightPart = `${shortenPath(session.cwd)} ${rightPart}`;
370
+ rightPart = `${shortenHomePath(session.cwd)} ${rightPart}`;
382
371
  }
383
372
  if (this.showPath) {
384
- rightPart = `${shortenPath(session.path)} ${rightPart}`;
373
+ rightPart = `${shortenHomePath(session.path)} ${rightPart}`;
385
374
  }
386
375
  // Cursor
387
376
  const cursor = isSelected ? theme.fg("accent", "› ") : " ";
@@ -591,6 +580,9 @@ export async function deleteSessionFile(sessionPath) {
591
580
  * Component that renders a session selector
592
581
  */
593
582
  export class SessionSelectorComponent extends Container {
583
+ get capturesViewportInput() {
584
+ return this.mode !== "rename";
585
+ }
594
586
  handleInput(data) {
595
587
  if (this.mode === "rename") {
596
588
  const kb = getKeybindings();